# Copyright (C) 2008-2016 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
}

standard_testfile

set libfile  "py-shared-sl"
set libsrc   ${libfile}.c
set library  [standard_output_file ${libfile}.sl]

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.
clean_restart $testfile
gdb_load_shlib ${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
if { $gdb_py_is_py3k == 1 } {
  gdb_py_test_silent_cmd "python long = int" "" 0
}
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"

if {[is_lp64_target]} {
    gdb_test "python print (len(\[gdb.solib_name(0xffffffffffffffff)\]))" "1"
}
