# Copyright (C) 2010-2026 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.  It tests the mechanism
# exposing values to Python.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile py-symbol.c

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

if {![runto_main]} {
    return 0
}

set debug_types [debug_types]

global hex decimal

# Setup and get the symbol table.
set line_no [gdb_get_line_number "Block break here."]
gdb_breakpoint $line_no
gdb_continue_to_breakpoint "Block break here."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python sal = frame.find_sal()" "Get block" 0
gdb_py_test_silent_cmd "python symtab = sal.symtab" "Get block" 0
gdb_py_test_silent_cmd "python global_block = symtab.global_block()" "Get global block" 0
gdb_py_test_silent_cmd "python static_block = symtab.static_block()" "Get static block" 0
gdb_py_test_silent_cmd "python global_symbols = \[\]; static_symbols = \[\]" "Set up symbol name lists" 0
gdb_py_test_silent_cmd "python for sym in global_block: global_symbols.append(sym.name)" "Get global symbol names" 0
gdb_py_test_silent_cmd "python for sym in static_block: static_symbols.append(sym.name)" "Get static symbol names" 0
gdb_py_test_silent_cmd "step" "Step to the next line" 0
gdb_py_test_silent_cmd "python new_pc = gdb.selected_frame().find_sal().pc" "Get new PC" 0

# Test sal.
if { [is_remote host] } {
    set py_symbol_c [string_to_regexp $srcfile]
    set full_py_symbol_c $py_symbol_c
} else {
    set py_symbol_c [string_to_regexp ${srcdir}/${subdir}/${srcfile}]
    set full_py_symbol_c [string_to_regexp testsuite/${subdir}/${srcfile}]
}

gdb_test "python print (sal.symtab)" ".*${py_symbol_c}" "test symtab"
gdb_test "python print (sal.pc)" "${decimal}" "test sal.pc"
gdb_test "python print (sal.last == (new_pc - 1))" "True" "test sal.last"
gdb_test "python print (sal.line)" "$line_no" "test sal.line"
gdb_test "python print (sal.is_valid())" "True" "test sal.is_valid"

# Test symbol table.
gdb_test "python print (symtab.filename)" ".*${py_symbol_c}" "test symtab.filename"
gdb_test "python print (symtab.objfile)" \
    "<gdb.Objfile filename=.*${testfile}.*>" "test symtab.objfile"
gdb_test "python print (symtab.fullname())" ".*${full_py_symbol_c}" "test symtab.fullname"
gdb_test "python print (symtab.is_valid())" "True" "test symtab.is_valid()"
gdb_test "python print (\"qq\" in global_symbols)" "True" "test qq in global symbols"
gdb_test "python print (\"func\" in global_symbols)" "True" "test func in global symbols"
gdb_test "python print (\"main\" in global_symbols)" "True" "test main in global symbols"
gdb_test "python print (\"int\" in static_symbols)" "True" "test int in static symbols"
gdb_test "python print (\"char\" in static_symbols)" "True" "test char in static symbols"
gdb_test_multiple "python print (\"simple_struct\" in static_symbols)" \
    "test simple_struct in static symbols" {
	-re -wrap "True" {
	    pass $gdb_test_name
	}
	-re -wrap "False" {
	    if { $debug_types } {
		# Xfail for PR gcc/90232.
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }

# Test symtab identity
gdb_test "python print (symtab is symtab)"\
    "True" \
    "test symtab identity 1"
gdb_test "python print (symtab is gdb.selected_frame().find_sal().symtab)"\
    "True" \
    "test symtab identity 2"
gdb_test "python print (sal.symtab is gdb.selected_frame().find_sal().symtab)"\
    "True" \
    "test symtab identity 3"
gdb_test "python print (symtab is not \"xxx\")"\
    "True" \
    "test symtab non-identity with non-symtab"

# Test symtab equality
gdb_test "python print (symtab == symtab)"\
    "True" \
    "test symtab equality 1"
gdb_test "python print (symtab == gdb.selected_frame().find_sal().symtab)"\
    "True" \
    "test symtab equality 2"
gdb_test "python print (sal.symtab == gdb.selected_frame().find_sal().symtab)"\
    "True" \
    "test symtab equality 3"
gdb_test "python print (symtab != \"xxx\")"\
    "True" \
    "test symtab non-equality with non-symtab"

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
gdb_unload
gdb_test "python print (sal.is_valid())" "False" \
    "test sal.is_valid after unload"
gdb_test "python print (symtab.is_valid())" "False" \
    "test symtab.is_valid() after unload"

gdb_test_no_output "python sal = None" "test sal destructor"
gdb_test_no_output "python symtab = None" "test symtab destructor"
