This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
RFA: fix PR python/13599
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 31 Jan 2012 15:01:43 -0700
- Subject: RFA: fix PR python/13599
This fixes PR python/13599.
The bug is that there is no way to get the line number in the source at
which a symbol was defined, even though gdb tracks this information.
This patch changes gdb.Symbol to add a new 'line' attribute.
This requires a doc review.
Built and regtested on x86-64 Fedora 15.
Tom
2012-01-31 Tom Tromey <tromey@redhat.com>
PR python/13599:
* python/py-symbol.c (sympy_line): New function.
(symbol_object_getset): Add "line".
2012-01-31 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Symbols In Python): Document Symbol.line.
2012-01-31 Tom Tromey <tromey@redhat.com>
* gdb.python/py-symbol.c (qq): New global.
* gdb.python/py-symbol.exp: Add test for frame-less
lookup_symbol.
* gdb.python/py-symtab.exp: Fix line number.
>From bec0d20aa5b8e1e61de4c2d001d492c9d7b2bbd1 Mon Sep 17 00:00:00 2001
From: Tom Tromey <tromey@redhat.com>
Date: Tue, 31 Jan 2012 14:02:20 -0700
Subject: [PATCH 2/3] fix PR 13599 - find line number of symbol
---
gdb/ChangeLog | 6 ++++++
gdb/NEWS | 5 +++++
gdb/doc/ChangeLog | 4 ++++
gdb/doc/gdb.texinfo | 5 +++++
gdb/python/py-symbol.c | 15 +++++++++++++++
gdb/testsuite/ChangeLog | 2 ++
gdb/testsuite/gdb.python/py-symbol.c | 2 ++
gdb/testsuite/gdb.python/py-symbol.exp | 4 ++++
gdb/testsuite/gdb.python/py-symtab.exp | 5 +++--
9 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index 4798b7b..bb9429f 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -10,6 +10,11 @@
** A new class, gdb.printing.FlagEnumerationPrinter, can be used to
apply "flag enum"-style pretty-printing to any enum.
+ ** gdb.lookup_symbol can now work when there is no current frame.
+
+ ** gdb.Symbol now has a 'line' attribute, holding the line number in
+ the source at which the symbol was defined.
+
* GDBserver now supports stdio connections.
E.g. (gdb) target remote | ssh myhost gdbserver - hello
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 86fa88f..9fa4b4e 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -23968,6 +23968,11 @@ represented as a @code{gdb.Symtab} object. @xref{Symbol Tables In
Python}. This attribute is not writable.
@end defvar
+@defvar Symbol.line
+The line number in the source code at which the symbol was defined.
+This is an integer.
+@end defvar
+
@defvar Symbol.name
The name of the symbol as a string. This attribute is not writable.
@end defvar
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index f93a35a..d9dae47 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -183,6 +183,19 @@ sympy_is_variable (PyObject *self, void *closure)
|| class == LOC_OPTIMIZED_OUT));
}
+/* Implementation of gdb.Symbol.line -> int.
+ Returns the line number at which the symbol was defined. */
+
+static PyObject *
+sympy_line (PyObject *self, void *closure)
+{
+ struct symbol *symbol = NULL;
+
+ SYMPY_REQUIRE_VALID (self, symbol);
+
+ return PyInt_FromLong (SYMBOL_LINE (symbol));
+}
+
/* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
Returns True if this Symbol still exists in GDB. */
@@ -461,6 +474,8 @@ to display demangled or mangled names.", NULL },
"True if the symbol is a function or method." },
{ "is_variable", sympy_is_variable, NULL,
"True if the symbol is a variable." },
+ { "line", sympy_line, NULL,
+ "The source line number at which the symbol was defined." },
{ NULL } /* Sentinel */
};
diff --git a/gdb/testsuite/gdb.python/py-symbol.c b/gdb/testsuite/gdb.python/py-symbol.c
index 72469be..d29849b 100644
--- a/gdb/testsuite/gdb.python/py-symbol.c
+++ b/gdb/testsuite/gdb.python/py-symbol.c
@@ -35,6 +35,8 @@ class SimpleClass
};
#endif
+int qq; /* line of qq */
+
int func (int arg)
{
int i = 2;
diff --git a/gdb/testsuite/gdb.python/py-symbol.exp b/gdb/testsuite/gdb.python/py-symbol.exp
index 91bfd51..36d7bfd 100644
--- a/gdb/testsuite/gdb.python/py-symbol.exp
+++ b/gdb/testsuite/gdb.python/py-symbol.exp
@@ -45,6 +45,10 @@ gdb_test "python print gdb.lookup_global_symbol(\"junk\")" "None" "Test lookup_g
gdb_test "python print gdb.lookup_symbol('main')\[0\].is_function" "True" \
"Lookup main using lookup_symbol"
+set qq_line [gdb_get_line_number "line of qq"]
+gdb_test "python print gdb.lookup_symbol('qq')\[0\].line" "$qq_line" \
+ "print line number of qq"
+
if ![runto_main] then {
fail "Can't run to main"
return 0
diff --git a/gdb/testsuite/gdb.python/py-symtab.exp b/gdb/testsuite/gdb.python/py-symtab.exp
index f64cb57..490a891 100644
--- a/gdb/testsuite/gdb.python/py-symtab.exp
+++ b/gdb/testsuite/gdb.python/py-symtab.exp
@@ -43,7 +43,8 @@ if ![runto_main] then {
global hex decimal
# Setup and get the symbol table.
-gdb_breakpoint [gdb_get_line_number "Block break here."]
+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
@@ -52,7 +53,7 @@ gdb_py_test_silent_cmd "python symtab = sal.symtab" "Get block" 0
# Test sal.
gdb_test "python print sal.symtab" ".*gdb.python/py-symbol.c.*" "Test symtab"
gdb_test "python print sal.pc" "${decimal}" "Test sal.pc"
-gdb_test "python print sal.line" "42" "Test sal.line"
+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.
--
1.7.6.5