From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24185 invoked by alias); 18 Feb 2011 23:59:56 -0000 Received: (qmail 24174 invoked by uid 22791); 18 Feb 2011 23:59:54 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_PASS,TW_BJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 18 Feb 2011 23:59:48 +0000 Received: from kpbe16.cbf.corp.google.com (kpbe16.cbf.corp.google.com [172.25.105.80]) by smtp-out.google.com with ESMTP id p1INxkpo018541 for ; Fri, 18 Feb 2011 15:59:47 -0800 Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.18.118.116]) by kpbe16.cbf.corp.google.com with ESMTP id p1INxjYk026296 for ; Fri, 18 Feb 2011 15:59:46 -0800 Received: by ruffy.mtv.corp.google.com (Postfix, from userid 67641) id 997602461AA; Fri, 18 Feb 2011 15:59:45 -0800 (PST) To: gdb-patches@sourceware.org Subject: [patch, doc RFA]: New python function lookup_global_symbol Message-Id: <20110218235945.997602461AA@ruffy.mtv.corp.google.com> Date: Sat, 19 Feb 2011 01:04:00 -0000 From: dje@google.com (Doug Evans) X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-02/txt/msg00504.txt.bz2 Hi. I couldn't figure out how to lookup up a global symbol without having a running program and without knowing the block it is in. Plus lookup_symbol already has a specified behaviour when the `block' argument is elided: use the current frame. So it seemed best to add a new function. If there's an existing way to lookup a symbol without requiring a running program, please let me know ... I'll at least improve the docs ... :-) Otherwise I will check this in next week pending doc RFA. 2011-02-18 Doug Evans Add gdb.lookup_global_symbol python function. * NEWS: Add entry. * python/py-symbol.c (gdbpy_lookup_global_symbol): New function. * python/python-internal.h (gdbpy_lookup_global_symbol): Declare it. * python/python.c (GdbMethods): Add entry for lookup_global_symbol. doc/ * gdb.texinfo (Symbols In Python): Document lookup_global_symbol. Clarify behaviour of lookup_symbol when `block' argument is elided. testsuite/ * gdb.python/py-symbol.exp: Test lookup_global_symbol. Index: NEWS =================================================================== RCS file: /cvs/src/src/gdb/NEWS,v retrieving revision 1.426 diff -u -p -r1.426 NEWS --- NEWS 15 Feb 2011 21:17:52 -0000 1.426 +++ NEWS 18 Feb 2011 23:48:45 -0000 @@ -38,6 +38,8 @@ * Python scripting + ** New function gdb.lookup_global_symbol looks up a global symbol. + ** GDB values in Python are now callable if the value represents a function. For example, if 'some_value' represents a function that takes two integer parameters and returns a value, you can call Index: doc/gdb.texinfo =================================================================== RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v retrieving revision 1.800 diff -u -p -r1.800 gdb.texinfo --- doc/gdb.texinfo 15 Feb 2011 21:17:52 -0000 1.800 +++ doc/gdb.texinfo 18 Feb 2011 23:48:45 -0000 @@ -22831,12 +22831,24 @@ arguments. @var{name} is the name of the symbol. It must be a string. The optional @var{block} argument restricts the search to symbols visible in that @var{block}. The @var{block} argument must be a -@code{gdb.Block} object. The optional @var{domain} argument restricts +@code{gdb.Block} object. If elided, the block for the current frame +is used. The optional @var{domain} argument restricts the search to the domain type. The @var{domain} argument must be a domain constant defined in the @code{gdb} module and described later in this chapter. @end defun +@findex gdb.lookup_global_symbol +@defun lookup_symbol name [domain] +This function searches for a global symbol by name. +The search scope can be restricted to by the domain argument. + +@var{name} is the name of the symbol. It must be a string. +The optional @var{domain} argument restricts the search to the domain type. +The @var{domain} argument must be a domain constant defined in the @code{gdb} +module and described later in this chapter. +@end defun + A @code{gdb.Symbol} object has the following attributes: @table @code Index: python/py-symbol.c =================================================================== RCS file: /cvs/src/src/gdb/python/py-symbol.c,v retrieving revision 1.3 diff -u -p -r1.3 py-symbol.c --- python/py-symbol.c 6 Jan 2011 00:57:04 -0000 1.3 +++ python/py-symbol.c 18 Feb 2011 23:48:45 -0000 @@ -236,6 +236,7 @@ sympy_dealloc (PyObject *obj) A tuple with 2 elements is always returned. The first is the symbol object or None, the second is a boolean with the value of is_a_field_of_this (see comment in lookup_symbol_in_language). */ + PyObject * gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw) { @@ -294,6 +295,39 @@ gdbpy_lookup_symbol (PyObject *self, PyO return ret_tuple; } +/* Implementation of + gdb.lookup_global_symbol (name [, domain]) -> symbol or None. */ + +PyObject * +gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw) +{ + int domain = VAR_DOMAIN; + const char *name; + static char *keywords[] = { "name", "domain", NULL }; + struct symbol *symbol; + PyObject *sym_obj; + + if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name, + &domain)) + return NULL; + + symbol = lookup_symbol_global (name, NULL, domain); + + if (symbol) + { + sym_obj = symbol_to_symbol_object (symbol); + if (!sym_obj) + return NULL; + } + else + { + sym_obj = Py_None; + Py_INCREF (Py_None); + } + + return sym_obj; +} + /* This function is called when an objfile is about to be freed. Invalidate the symbol as further actions on the symbol would result in bad data. All access to obj->symbol should be gated by Index: python/python-internal.h =================================================================== RCS file: /cvs/src/src/gdb/python/python-internal.h,v retrieving revision 1.42 diff -u -p -r1.42 python-internal.h --- python/python-internal.h 4 Feb 2011 21:54:16 -0000 1.42 +++ python/python-internal.h 18 Feb 2011 23:48:45 -0000 @@ -136,6 +136,8 @@ PyObject *gdbpy_history (PyObject *self, PyObject *gdbpy_breakpoints (PyObject *, PyObject *); PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *); PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); +PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, + PyObject *kw); PyObject *gdbpy_newest_frame (PyObject *self, PyObject *args); PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args); PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args); Index: python/python.c =================================================================== RCS file: /cvs/src/src/gdb/python/python.c,v retrieving revision 1.59 diff -u -p -r1.59 python.c --- python/python.c 4 Feb 2011 21:54:16 -0000 1.59 +++ python/python.c 18 Feb 2011 23:48:45 -0000 @@ -1145,6 +1145,10 @@ Return a Type corresponding to the given Return a tuple with the symbol corresponding to the given name (or None) and\n\ a boolean indicating if name is a field of the current implied argument\n\ `this' (when the current language is object-oriented)." }, + { "lookup_global_symbol", (PyCFunction) gdbpy_lookup_global_symbol, + METH_VARARGS | METH_KEYWORDS, + "lookup_global_symbol (name [, domain]) -> symbol\n\ +Return the symbol corresponding to the given name (or None)." }, { "block_for_pc", gdbpy_block_for_pc, METH_VARARGS, "Return the block containing the given pc value, or None." }, { "solib_name", gdbpy_solib_name, METH_VARARGS, Index: testsuite/gdb.python/py-symbol.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.python/py-symbol.exp,v retrieving revision 1.4 diff -u -p -r1.4 py-symbol.exp --- testsuite/gdb.python/py-symbol.exp 1 Jan 2011 15:33:49 -0000 1.4 +++ testsuite/gdb.python/py-symbol.exp 18 Feb 2011 23:48:45 -0000 @@ -39,6 +39,13 @@ gdb_load ${binfile} # Skip all tests if Python scripting is not enabled. if { [skip_python_tests] } { continue } +# Test looking up a global symbol before we runto_main as this is the +# point where we don't have a current frame, and we don't want to +# require one. +gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1 +gdb_test "python print main_func.is_function" "True" "Test main_func.is_function" +gdb_test "python print gdb.lookup_global_symbol(\"junk\")" "None" "Test lookup_global_symbol(\"junk\")" + if ![runto_main] then { fail "Can't run to main" return 0