+2019-11-10 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * python/py-symbol.c (gdbpy_lookup_static_symbol): Lookup in
+ static block of current object file first. Also fix typo in
+ header comment.
+
2019-11-10 Andrew Burgess <andrew.burgess@embecosm.com>
* stack.c (set_last_displayed_sal): Delete.
+2019-11-10 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * python.texi (Symbols In Python): Extend documentation for
+ gdb.lookup_static_symbol.
+
2019-10-31 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.texinfo (Symbols): Document new 'info module variables' and
up such variables, iterate over the variables of the function's
@code{gdb.Block} and check that @code{block.addr_class} is
@code{gdb.SYMBOL_LOC_STATIC}.
+
+There can be multiple global symbols with static linkage with the same
+name. This function will only return the first matching symbol that
+it finds. Which symbol is found depends on where @value{GDBN} is
+currently stopped, as @value{GDBN} will first search for matching
+symbols in the current object file, and then search all other object
+files. If the application is not yet running then @value{GDBN} will
+search all object files in the order they appear in the debug
+information.
@end defun
A @code{gdb.Symbol} object has the following attributes:
}
/* Implementation of
- gdb.lookup_static_symbol (name [, domain) -> symbol or None. */
+ gdb.lookup_static_symbol (name [, domain]) -> symbol or None. */
PyObject *
gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
&domain))
return NULL;
+ /* In order to find static symbols associated with the "current" object
+ file ahead of those from other object files, we first need to see if
+ we can acquire a current block. If this fails however, then we still
+ want to search all static symbols, so don't throw an exception just
+ yet. */
+ const struct block *block = NULL;
try
{
- symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
+ struct frame_info *selected_frame
+ = get_selected_frame (_("No frame selected."));
+ block = get_frame_block (selected_frame, NULL);
+ }
+ catch (const gdb_exception &except)
+ {
+ /* Nothing. */
+ }
+
+ try
+ {
+ if (block != nullptr)
+ symbol
+ = lookup_symbol_in_static_block (name, block,
+ (domain_enum) domain).symbol;
+
+ if (symbol == nullptr)
+ symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
}
catch (const gdb_exception &except)
{
+2019-11-10 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.python/py-symbol.c: Declare and call function from new
+ py-symbol-2.c file.
+ * gdb.python/py-symbol.exp: Compile both source files, and add new
+ tests for gdb.lookup_static_symbol.
+ * gdb.python/py-symbol-2.c: New file.
+
2019-11-02 Tom de Vries <tdevries@suse.de>
* gdb.base/advance.exp: Drop superfluous 3rd argument to gdb_test.
--- /dev/null
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2019 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/>. */
+
+static int rr = 99; /* line of other rr */
+
+void
+function_in_other_file (void)
+{
+ /* Nothing. */
+}
};
#endif
+#ifdef USE_TWO_FILES
+extern void function_in_other_file (void);
+#endif
+
int qq = 72; /* line of qq */
static int rr = 42; /* line of rr */
sclass.seti (42);
sclass.valueofi ();
#endif
+
+#ifdef USE_TWO_FILES
+ function_in_other_file ();
+#endif
+
return 0; /* Break at end. */
}
load_lib gdb-python.exp
-standard_testfile
+standard_testfile py-symbol.c py-symbol-2.c
-if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+set opts { debug additional_flags=-DUSE_TWO_FILES }
+if {[prepare_for_testing "failed to prepare" $testfile \
+ [list $srcfile $srcfile2] $opts]} {
return -1
}
"False" \
"print whether qq needs a frame"
+# Similarly, test looking up a static symbol before we runto_main.
set rr_line [gdb_get_line_number "line of rr"]
gdb_test "python print (gdb.lookup_global_symbol ('rr') is None)" "True" \
"lookup_global_symbol for static var"
gdb_test "python print (func.linkage_name)" "func" "test func.linkage_name"
gdb_test "python print (func.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test func.addr_class"
-gdb_breakpoint [gdb_get_line_number "Break at end."]
+# Stop in a second file and ensure we find its local static symbol.
+gdb_breakpoint "function_in_other_file"
+gdb_continue_to_breakpoint "function_in_other_file"
+gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "99" \
+ "print value of rr from other file"
+
+# Now continue back to the first source file.
+set linenum [gdb_get_line_number "Break at end."]
+gdb_breakpoint "$srcfile:$linenum"
gdb_continue_to_breakpoint "Break at end for variable a" ".*Break at end.*"
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
+# Check that we find the static sybol local to this file over the
+# static symbol from the second source file.
+gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "42" \
+ "print value of rr from main file"
+
# Test is_variable attribute.
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_variable)" "True" "test a.is_variable"
# C++ tests
# Recompile binary.
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" executable "debug c++"] != "" } {
- untested "failed to compile in C++ mode"
+lappend opts c++
+if {[prepare_for_testing "failed to prepare" "${binfile}-cxx" \
+ [list $srcfile $srcfile2] $opts]} {
return -1
}
-# Start with a fresh gdb.
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}-cxx
-
gdb_test "python print (gdb.lookup_global_symbol ('(anonymous namespace)::anon') is None)" \
"True" "anon is None"
gdb_test "python print (gdb.lookup_static_symbol ('(anonymous namespace)::anon').value ())" \
# Test is_valid when the objfile is unloaded. This must be the last
# test as it unloads the object file in GDB.
# Start with a fresh gdb.
-clean_restart ${testfile}
+clean_restart ${binfile}
if ![runto_main] then {
fail "cannot run to main."
return 0