# Copyright (C) 2008-2018 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 "failed to compile shared library"
    return -1
}

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

if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $exec_opts] != "" } {
    untested "failed to compile"
    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"
}
