Index: NEWS =================================================================== RCS file: /cvs/src/src/gdb/NEWS,v retrieving revision 1.514 diff -u -p -r1.514 NEWS --- NEWS 3 May 2012 07:07:24 -0000 1.514 +++ NEWS 9 May 2012 06:23:26 -0000 @@ -43,6 +43,9 @@ which return the global and static blocks (as gdb.Block objects), of the underlying symbol table, respectively. + ** New function gdb.find_pc_line which returns the gdb.Symtab_and_line + object associated with a PC value. + * Go language support. GDB now supports debugging programs written in the Go programming language. Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.955 diff -u -p -r1.955 gdb.texinfo --- doc/gdb.texinfo 6 May 2012 15:31:04 -0000 1.955 +++ doc/gdb.texinfo 9 May 2012 06:23:32 -0000 @@ -22392,6 +22392,12 @@ compute values, for example, it is the o convenience variable (@pxref{Convenience Vars}) as a @code{gdb.Value}. @end defun +@findex gdb.find_pc_line +@defun gdb.find_pc_line (pc) +Return the @code{gdb.Symtab_and_line} object corresponding to the +@var{pc} value. @xref{Symbol Tables In Python}. +@end defun + @findex gdb.post_event @defun gdb.post_event (event) Put @var{event}, a callable object taking no arguments, into Index: python/python.c =================================================================== RCS file: /cvs/src/src/gdb/python/python.c,v retrieving revision 1.86 diff -u -p -r1.86 python.c --- python/python.c 30 Mar 2012 20:05:55 -0000 1.86 +++ python/python.c 9 May 2012 06:23:32 -0000 @@ -631,6 +631,25 @@ gdbpy_parse_and_eval (PyObject *self, Py return value_to_value_object (result); } +/* Implementation of gdb.find_pc_line function. + Returns the gdb.Symtab_and_line object corresponding to a PC value. */ + +static PyObject * +gdbpy_find_pc_line (PyObject *self, PyObject *args) +{ + struct symtab_and_line sal; + CORE_ADDR pc; + unsigned long long pc_llu; + PyObject *actual = NULL; + + if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc_llu)) + return NULL; + + pc = (CORE_ADDR) pc_llu; + sal = find_pc_line (pc, 0); + return symtab_and_line_to_sal_object (sal); +} + /* Read a file as Python code. FILE is the file to run. FILENAME is name of the file FILE. This does not throw any errors. If an exception occurs python will print @@ -1458,6 +1477,9 @@ gdb.Symtab_and_line objects (or None)."} "parse_and_eval (String) -> Value.\n\ Parse String as an expression, evaluate it, and return the result as a Value." }, + { "find_pc_line", gdbpy_find_pc_line, METH_VARARGS, + "find_pc_line (pc) -> Symtab_and_line.\n\ +Return the gdb.Symtab_and_line object corresponding to the pc value." }, { "post_event", gdbpy_post_event, METH_VARARGS, "Post an event into gdb's event loop." }, Index: testsuite/gdb.python/python.c =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/python.c,v retrieving revision 1.4 diff -u -p -r1.4 python.c --- testsuite/gdb.python/python.c 4 Jan 2012 08:27:49 -0000 1.4 +++ testsuite/gdb.python/python.c 9 May 2012 06:23:32 -0000 @@ -23,6 +23,6 @@ int main (int argc, char *argv[]) { func1 (); - func2 (); + func2 (); /* Break at func2 call site. */ return 0; /* Break to end. */ } Index: testsuite/gdb.python/python.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/python.exp,v retrieving revision 1.32 diff -u -p -r1.32 python.exp --- testsuite/gdb.python/python.exp 30 Mar 2012 19:16:52 -0000 1.32 +++ testsuite/gdb.python/python.exp 9 May 2012 06:23:32 -0000 @@ -367,3 +367,23 @@ gdb_test_multiple "python gdb.prompt_hoo gdb_py_test_silent_cmd "python gdb.prompt_hook = None" \ "set the hook to default" 1 + +# Start with a fresh gdb. +clean_restart ${testfile} + +# The following tests require execution. + +if ![runto_main] then { + fail "Can't run to main" + return 0 +} + +runto [gdb_get_line_number "Break at func2 call site."] + +gdb_py_test_silent_cmd "python line = gdb.selected_frame().find_sal().line" "Get line number of func2 call site" 1 +gdb_test "python print gdb.find_pc_line(gdb.selected_frame().pc()).line == line" "True" "Test find_pc_line at func2 call site" + +gdb_py_test_silent_cmd "step" "Step into func2" 1 +gdb_py_test_silent_cmd "up" "Step out of func2" 1 + +gdb_test "python print gdb.find_pc_line(gdb.selected_frame().pc()).line > line" "True" "Test find_pc_line with resume address"