# Copyright (C) 2008-2012 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# This file is part of the GDB testsuite.

load_lib gdb-python.exp

if {[skip_shlib_tests]} {
    return 0
}

set testfile "py-shared"
set srcfile  ${testfile}.c
set libfile  "py-shared-sl"
set libsrc   ${libfile}.c
set library  ${objdir}/${subdir}/${libfile}.sl
set binfile  ${objdir}/${subdir}/${testfile}

if { [gdb_compile_shlib ${srcdir}/${subdir}/${libsrc} ${library} "debug"] != "" } {
    untested "Could not compile shared library."
    return -1
}

set exec_opts [list debug shlib=${library}]

if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $exec_opts] != "" } {
    untested "Could not compile $binfile."
    return -1
}

# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
gdb_load_shlibs ${library}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

# The following tests require execution.

if ![runto_main] then {
    fail "Can't run to main"
    return 0
}

runto [gdb_get_line_number "Break to end."]

# Test gdb.solib_name
gdb_test "p &func1" "" "func1 address"
gdb_py_test_silent_cmd "python func1 = gdb.history(0)" "Aquire func1 address" 1
gdb_test "python print gdb.solib_name(long(func1))" "py-shared-sl.sl" "test func1 solib location"

gdb_test "p &main" "" "main address"
gdb_py_test_silent_cmd "python main = gdb.history(0)" "Aquire main address" 1
gdb_test "python print gdb.solib_name(long(main))" "None" "test main solib location"
