Home | History | Annotate | Line # | Download | only in python
py-symbol.c revision 1.10
      1 /* Python interface to symbols.
      2 
      3    Copyright (C) 2008-2023 Free Software Foundation, Inc.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 #include "defs.h"
     21 #include "block.h"
     22 #include "frame.h"
     23 #include "symtab.h"
     24 #include "python-internal.h"
     25 #include "objfiles.h"
     26 #include "symfile.h"
     27 
     28 struct symbol_object {
     29   PyObject_HEAD
     30   /* The GDB symbol structure this object is wrapping.  */
     31   struct symbol *symbol;
     32   /* A symbol object is associated with an objfile, so keep track with
     33      doubly-linked list, rooted in the objfile.  This lets us
     34      invalidate the underlying struct symbol when the objfile is
     35      deleted.  */
     36   symbol_object *prev;
     37   symbol_object *next;
     38 };
     39 
     40 /* Require a valid symbol.  All access to symbol_object->symbol should be
     41    gated by this call.  */
     42 #define SYMPY_REQUIRE_VALID(symbol_obj, symbol)		\
     43   do {							\
     44     symbol = symbol_object_to_symbol (symbol_obj);	\
     45     if (symbol == NULL)					\
     46       {							\
     47 	PyErr_SetString (PyExc_RuntimeError,		\
     48 			 _("Symbol is invalid."));	\
     49 	return NULL;					\
     50       }							\
     51   } while (0)
     52 
     53 /* A deleter that is used when an objfile is about to be freed.  */
     54 struct symbol_object_deleter
     55 {
     56   void operator() (symbol_object *obj)
     57   {
     58     while (obj)
     59       {
     60 	symbol_object *next = obj->next;
     61 
     62 	obj->symbol = NULL;
     63 	obj->next = NULL;
     64 	obj->prev = NULL;
     65 
     66 	obj = next;
     67       }
     68   }
     69 };
     70 
     71 static const registry<objfile>::key<symbol_object, symbol_object_deleter>
     72      sympy_objfile_data_key;
     73 
     74 static PyObject *
     75 sympy_str (PyObject *self)
     76 {
     77   PyObject *result;
     78   struct symbol *symbol = NULL;
     79 
     80   SYMPY_REQUIRE_VALID (self, symbol);
     81 
     82   result = PyUnicode_FromString (symbol->print_name ());
     83 
     84   return result;
     85 }
     86 
     87 static PyObject *
     88 sympy_get_type (PyObject *self, void *closure)
     89 {
     90   struct symbol *symbol = NULL;
     91 
     92   SYMPY_REQUIRE_VALID (self, symbol);
     93 
     94   if (symbol->type () == NULL)
     95     {
     96       Py_INCREF (Py_None);
     97       return Py_None;
     98     }
     99 
    100   return type_to_type_object (symbol->type ());
    101 }
    102 
    103 static PyObject *
    104 sympy_get_symtab (PyObject *self, void *closure)
    105 {
    106   struct symbol *symbol = NULL;
    107 
    108   SYMPY_REQUIRE_VALID (self, symbol);
    109 
    110   if (!symbol->is_objfile_owned ())
    111     Py_RETURN_NONE;
    112 
    113   return symtab_to_symtab_object (symbol->symtab ());
    114 }
    115 
    116 static PyObject *
    117 sympy_get_name (PyObject *self, void *closure)
    118 {
    119   struct symbol *symbol = NULL;
    120 
    121   SYMPY_REQUIRE_VALID (self, symbol);
    122 
    123   return PyUnicode_FromString (symbol->natural_name ());
    124 }
    125 
    126 static PyObject *
    127 sympy_get_linkage_name (PyObject *self, void *closure)
    128 {
    129   struct symbol *symbol = NULL;
    130 
    131   SYMPY_REQUIRE_VALID (self, symbol);
    132 
    133   return PyUnicode_FromString (symbol->linkage_name ());
    134 }
    135 
    136 static PyObject *
    137 sympy_get_print_name (PyObject *self, void *closure)
    138 {
    139   struct symbol *symbol = NULL;
    140 
    141   SYMPY_REQUIRE_VALID (self, symbol);
    142 
    143   return sympy_str (self);
    144 }
    145 
    146 static PyObject *
    147 sympy_get_addr_class (PyObject *self, void *closure)
    148 {
    149   struct symbol *symbol = NULL;
    150 
    151   SYMPY_REQUIRE_VALID (self, symbol);
    152 
    153   return gdb_py_object_from_longest (symbol->aclass ()).release ();
    154 }
    155 
    156 static PyObject *
    157 sympy_is_argument (PyObject *self, void *closure)
    158 {
    159   struct symbol *symbol = NULL;
    160 
    161   SYMPY_REQUIRE_VALID (self, symbol);
    162 
    163   return PyBool_FromLong (symbol->is_argument ());
    164 }
    165 
    166 static PyObject *
    167 sympy_is_constant (PyObject *self, void *closure)
    168 {
    169   struct symbol *symbol = NULL;
    170   enum address_class theclass;
    171 
    172   SYMPY_REQUIRE_VALID (self, symbol);
    173 
    174   theclass = symbol->aclass ();
    175 
    176   return PyBool_FromLong (theclass == LOC_CONST || theclass == LOC_CONST_BYTES);
    177 }
    178 
    179 static PyObject *
    180 sympy_is_function (PyObject *self, void *closure)
    181 {
    182   struct symbol *symbol = NULL;
    183   enum address_class theclass;
    184 
    185   SYMPY_REQUIRE_VALID (self, symbol);
    186 
    187   theclass = symbol->aclass ();
    188 
    189   return PyBool_FromLong (theclass == LOC_BLOCK);
    190 }
    191 
    192 static PyObject *
    193 sympy_is_variable (PyObject *self, void *closure)
    194 {
    195   struct symbol *symbol = NULL;
    196   enum address_class theclass;
    197 
    198   SYMPY_REQUIRE_VALID (self, symbol);
    199 
    200   theclass = symbol->aclass ();
    201 
    202   return PyBool_FromLong (!symbol->is_argument ()
    203 			  && (theclass == LOC_LOCAL || theclass == LOC_REGISTER
    204 			      || theclass == LOC_STATIC || theclass == LOC_COMPUTED
    205 			      || theclass == LOC_OPTIMIZED_OUT));
    206 }
    207 
    208 /* Implementation of gdb.Symbol.needs_frame -> Boolean.
    209    Returns true iff the symbol needs a frame for evaluation.  */
    210 
    211 static PyObject *
    212 sympy_needs_frame (PyObject *self, void *closure)
    213 {
    214   struct symbol *symbol = NULL;
    215   int result = 0;
    216 
    217   SYMPY_REQUIRE_VALID (self, symbol);
    218 
    219   try
    220     {
    221       result = symbol_read_needs_frame (symbol);
    222     }
    223   catch (const gdb_exception &except)
    224     {
    225       GDB_PY_HANDLE_EXCEPTION (except);
    226     }
    227 
    228   if (result)
    229     Py_RETURN_TRUE;
    230   Py_RETURN_FALSE;
    231 }
    232 
    233 /* Implementation of gdb.Symbol.line -> int.
    234    Returns the line number at which the symbol was defined.  */
    235 
    236 static PyObject *
    237 sympy_line (PyObject *self, void *closure)
    238 {
    239   struct symbol *symbol = NULL;
    240 
    241   SYMPY_REQUIRE_VALID (self, symbol);
    242 
    243   return gdb_py_object_from_longest (symbol->line ()).release ();
    244 }
    245 
    246 /* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
    247    Returns True if this Symbol still exists in GDB.  */
    248 
    249 static PyObject *
    250 sympy_is_valid (PyObject *self, PyObject *args)
    251 {
    252   struct symbol *symbol = NULL;
    253 
    254   symbol = symbol_object_to_symbol (self);
    255   if (symbol == NULL)
    256     Py_RETURN_FALSE;
    257 
    258   Py_RETURN_TRUE;
    259 }
    260 
    261 /* Implementation of gdb.Symbol.value (self[, frame]) -> gdb.Value.  Returns
    262    the value of the symbol, or an error in various circumstances.  */
    263 
    264 static PyObject *
    265 sympy_value (PyObject *self, PyObject *args)
    266 {
    267   struct symbol *symbol = NULL;
    268   frame_info_ptr frame_info = NULL;
    269   PyObject *frame_obj = NULL;
    270   struct value *value = NULL;
    271 
    272   if (!PyArg_ParseTuple (args, "|O", &frame_obj))
    273     return NULL;
    274 
    275   if (frame_obj != NULL && !PyObject_TypeCheck (frame_obj, &frame_object_type))
    276     {
    277       PyErr_SetString (PyExc_TypeError, "argument is not a frame");
    278       return NULL;
    279     }
    280 
    281   SYMPY_REQUIRE_VALID (self, symbol);
    282   if (symbol->aclass () == LOC_TYPEDEF)
    283     {
    284       PyErr_SetString (PyExc_TypeError, "cannot get the value of a typedef");
    285       return NULL;
    286     }
    287 
    288   try
    289     {
    290       if (frame_obj != NULL)
    291 	{
    292 	  frame_info = frame_object_to_frame_info (frame_obj);
    293 	  if (frame_info == NULL)
    294 	    error (_("invalid frame"));
    295 	}
    296 
    297       if (symbol_read_needs_frame (symbol) && frame_info == NULL)
    298 	error (_("symbol requires a frame to compute its value"));
    299 
    300       /* TODO: currently, we have no way to recover the block in which SYMBOL
    301 	 was found, so we have no block to pass to read_var_value.  This will
    302 	 yield an incorrect value when symbol is not local to FRAME_INFO (this
    303 	 can happen with nested functions).  */
    304       value = read_var_value (symbol, NULL, frame_info);
    305     }
    306   catch (const gdb_exception &except)
    307     {
    308       GDB_PY_HANDLE_EXCEPTION (except);
    309     }
    310 
    311   return value_to_value_object (value);
    312 }
    313 
    314 /* Given a symbol, and a symbol_object that has previously been
    315    allocated and initialized, populate the symbol_object with the
    316    struct symbol data.  Also, register the symbol_object life-cycle
    317    with the life-cycle of the object file associated with this
    318    symbol, if needed.  */
    319 static void
    320 set_symbol (symbol_object *obj, struct symbol *symbol)
    321 {
    322   obj->symbol = symbol;
    323   obj->prev = NULL;
    324   if (symbol->is_objfile_owned ()
    325       && symbol->symtab () != NULL)
    326     {
    327       struct objfile *objfile = symbol->objfile ();
    328 
    329       obj->next = sympy_objfile_data_key.get (objfile);
    330       if (obj->next)
    331 	obj->next->prev = obj;
    332       sympy_objfile_data_key.set (objfile, obj);
    333     }
    334   else
    335     obj->next = NULL;
    336 }
    337 
    338 /* Create a new symbol object (gdb.Symbol) that encapsulates the struct
    339    symbol object from GDB.  */
    340 PyObject *
    341 symbol_to_symbol_object (struct symbol *sym)
    342 {
    343   symbol_object *sym_obj;
    344 
    345   sym_obj = PyObject_New (symbol_object, &symbol_object_type);
    346   if (sym_obj)
    347     set_symbol (sym_obj, sym);
    348 
    349   return (PyObject *) sym_obj;
    350 }
    351 
    352 /* Return the symbol that is wrapped by this symbol object.  */
    353 struct symbol *
    354 symbol_object_to_symbol (PyObject *obj)
    355 {
    356   if (! PyObject_TypeCheck (obj, &symbol_object_type))
    357     return NULL;
    358   return ((symbol_object *) obj)->symbol;
    359 }
    360 
    361 static void
    362 sympy_dealloc (PyObject *obj)
    363 {
    364   symbol_object *sym_obj = (symbol_object *) obj;
    365 
    366   if (sym_obj->prev)
    367     sym_obj->prev->next = sym_obj->next;
    368   else if (sym_obj->symbol != NULL
    369 	   && sym_obj->symbol->is_objfile_owned ()
    370 	   && sym_obj->symbol->symtab () != NULL)
    371     sympy_objfile_data_key.set (sym_obj->symbol->objfile (), sym_obj->next);
    372   if (sym_obj->next)
    373     sym_obj->next->prev = sym_obj->prev;
    374   sym_obj->symbol = NULL;
    375   Py_TYPE (obj)->tp_free (obj);
    376 }
    377 
    378 /* Implementation of
    379    gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)
    380    A tuple with 2 elements is always returned.  The first is the symbol
    381    object or None, the second is a boolean with the value of
    382    is_a_field_of_this (see comment in lookup_symbol_in_language).  */
    383 
    384 PyObject *
    385 gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
    386 {
    387   int domain = VAR_DOMAIN;
    388   struct field_of_this_result is_a_field_of_this;
    389   const char *name;
    390   static const char *keywords[] = { "name", "block", "domain", NULL };
    391   struct symbol *symbol = NULL;
    392   PyObject *block_obj = NULL, *sym_obj, *bool_obj;
    393   const struct block *block = NULL;
    394 
    395   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
    396 					&block_object_type, &block_obj,
    397 					&domain))
    398     return NULL;
    399 
    400   if (block_obj)
    401     block = block_object_to_block (block_obj);
    402   else
    403     {
    404       frame_info_ptr selected_frame;
    405 
    406       try
    407 	{
    408 	  selected_frame = get_selected_frame (_("No frame selected."));
    409 	  block = get_frame_block (selected_frame, NULL);
    410 	}
    411       catch (const gdb_exception &except)
    412 	{
    413 	  GDB_PY_HANDLE_EXCEPTION (except);
    414 	}
    415     }
    416 
    417   try
    418     {
    419       symbol = lookup_symbol (name, block, (domain_enum) domain,
    420 			      &is_a_field_of_this).symbol;
    421     }
    422   catch (const gdb_exception &except)
    423     {
    424       GDB_PY_HANDLE_EXCEPTION (except);
    425     }
    426 
    427   gdbpy_ref<> ret_tuple (PyTuple_New (2));
    428   if (ret_tuple == NULL)
    429     return NULL;
    430 
    431   if (symbol)
    432     {
    433       sym_obj = symbol_to_symbol_object (symbol);
    434       if (!sym_obj)
    435 	return NULL;
    436     }
    437   else
    438     {
    439       sym_obj = Py_None;
    440       Py_INCREF (Py_None);
    441     }
    442   PyTuple_SET_ITEM (ret_tuple.get (), 0, sym_obj);
    443 
    444   bool_obj = PyBool_FromLong (is_a_field_of_this.type != NULL);
    445   PyTuple_SET_ITEM (ret_tuple.get (), 1, bool_obj);
    446 
    447   return ret_tuple.release ();
    448 }
    449 
    450 /* Implementation of
    451    gdb.lookup_global_symbol (name [, domain]) -> symbol or None.  */
    452 
    453 PyObject *
    454 gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
    455 {
    456   int domain = VAR_DOMAIN;
    457   const char *name;
    458   static const char *keywords[] = { "name", "domain", NULL };
    459   struct symbol *symbol = NULL;
    460   PyObject *sym_obj;
    461 
    462   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
    463 					&domain))
    464     return NULL;
    465 
    466   try
    467     {
    468       symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
    469     }
    470   catch (const gdb_exception &except)
    471     {
    472       GDB_PY_HANDLE_EXCEPTION (except);
    473     }
    474 
    475   if (symbol)
    476     {
    477       sym_obj = symbol_to_symbol_object (symbol);
    478       if (!sym_obj)
    479 	return NULL;
    480     }
    481   else
    482     {
    483       sym_obj = Py_None;
    484       Py_INCREF (Py_None);
    485     }
    486 
    487   return sym_obj;
    488 }
    489 
    490 /* Implementation of
    491    gdb.lookup_static_symbol (name [, domain]) -> symbol or None.  */
    492 
    493 PyObject *
    494 gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
    495 {
    496   const char *name;
    497   int domain = VAR_DOMAIN;
    498   static const char *keywords[] = { "name", "domain", NULL };
    499   struct symbol *symbol = NULL;
    500   PyObject *sym_obj;
    501 
    502   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
    503 					&domain))
    504     return NULL;
    505 
    506   /* In order to find static symbols associated with the "current" object
    507      file ahead of those from other object files, we first need to see if
    508      we can acquire a current block.  If this fails however, then we still
    509      want to search all static symbols, so don't throw an exception just
    510      yet.  */
    511   const struct block *block = NULL;
    512   try
    513     {
    514       frame_info_ptr selected_frame
    515 	= get_selected_frame (_("No frame selected."));
    516       block = get_frame_block (selected_frame, NULL);
    517     }
    518   catch (const gdb_exception &except)
    519     {
    520       /* Nothing.  */
    521     }
    522 
    523   try
    524     {
    525       if (block != nullptr)
    526 	symbol
    527 	  = lookup_symbol_in_static_block (name, block,
    528 					   (domain_enum) domain).symbol;
    529 
    530       if (symbol == nullptr)
    531 	symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
    532     }
    533   catch (const gdb_exception &except)
    534     {
    535       GDB_PY_HANDLE_EXCEPTION (except);
    536     }
    537 
    538   if (symbol)
    539     {
    540       sym_obj = symbol_to_symbol_object (symbol);
    541       if (!sym_obj)
    542 	return NULL;
    543     }
    544   else
    545     {
    546       sym_obj = Py_None;
    547       Py_INCREF (Py_None);
    548     }
    549 
    550   return sym_obj;
    551 }
    552 
    553 /* Implementation of
    554    gdb.lookup_static_symbols (name [, domain]) -> symbol list.
    555 
    556    Returns a list of all static symbols matching NAME in DOMAIN.  */
    557 
    558 PyObject *
    559 gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, PyObject *kw)
    560 {
    561   const char *name;
    562   int domain = VAR_DOMAIN;
    563   static const char *keywords[] = { "name", "domain", NULL };
    564 
    565   if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
    566 					&domain))
    567     return NULL;
    568 
    569   gdbpy_ref<> return_list (PyList_New (0));
    570   if (return_list == NULL)
    571     return NULL;
    572 
    573   try
    574     {
    575       /* Expand any symtabs that contain potentially matching symbols.  */
    576       lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
    577       expand_symtabs_matching (NULL, lookup_name, NULL, NULL,
    578 			       SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
    579 			       ALL_DOMAIN);
    580 
    581       for (objfile *objfile : current_program_space->objfiles ())
    582 	{
    583 	  for (compunit_symtab *cust : objfile->compunits ())
    584 	    {
    585 	      const struct blockvector *bv;
    586 
    587 	      bv = cust->blockvector ();
    588 	      const struct block *block = bv->static_block ();
    589 
    590 	      if (block != nullptr)
    591 		{
    592 		  symbol *symbol = lookup_symbol_in_static_block
    593 		    (name, block, (domain_enum) domain).symbol;
    594 
    595 		  if (symbol != nullptr)
    596 		    {
    597 		      PyObject *sym_obj
    598 			= symbol_to_symbol_object (symbol);
    599 		      if (PyList_Append (return_list.get (), sym_obj) == -1)
    600 			return NULL;
    601 		    }
    602 		}
    603 	    }
    604 	}
    605     }
    606   catch (const gdb_exception &except)
    607     {
    608       GDB_PY_HANDLE_EXCEPTION (except);
    609     }
    610 
    611   return return_list.release ();
    612 }
    613 
    614 int
    615 gdbpy_initialize_symbols (void)
    616 {
    617   if (PyType_Ready (&symbol_object_type) < 0)
    618     return -1;
    619 
    620   if (PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF) < 0
    621       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST",
    622 				  LOC_CONST) < 0
    623       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC",
    624 				  LOC_STATIC) < 0
    625       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER",
    626 				  LOC_REGISTER) < 0
    627       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG",
    628 				  LOC_ARG) < 0
    629       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG",
    630 				  LOC_REF_ARG) < 0
    631       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL",
    632 				  LOC_LOCAL) < 0
    633       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF",
    634 				  LOC_TYPEDEF) < 0
    635       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL",
    636 				  LOC_LABEL) < 0
    637       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK",
    638 				  LOC_BLOCK) < 0
    639       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES",
    640 				  LOC_CONST_BYTES) < 0
    641       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED",
    642 				  LOC_UNRESOLVED) < 0
    643       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT",
    644 				  LOC_OPTIMIZED_OUT) < 0
    645       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED",
    646 				  LOC_COMPUTED) < 0
    647       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMMON_BLOCK",
    648 				  LOC_COMMON_BLOCK) < 0
    649       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR",
    650 				  LOC_REGPARM_ADDR) < 0
    651       || PyModule_AddIntConstant (gdb_module, "SYMBOL_UNDEF_DOMAIN",
    652 				  UNDEF_DOMAIN) < 0
    653       || PyModule_AddIntConstant (gdb_module, "SYMBOL_VAR_DOMAIN",
    654 				  VAR_DOMAIN) < 0
    655       || PyModule_AddIntConstant (gdb_module, "SYMBOL_STRUCT_DOMAIN",
    656 				  STRUCT_DOMAIN) < 0
    657       || PyModule_AddIntConstant (gdb_module, "SYMBOL_LABEL_DOMAIN",
    658 				  LABEL_DOMAIN) < 0
    659       || PyModule_AddIntConstant (gdb_module, "SYMBOL_MODULE_DOMAIN",
    660 				  MODULE_DOMAIN) < 0
    661       || PyModule_AddIntConstant (gdb_module, "SYMBOL_COMMON_BLOCK_DOMAIN",
    662 				  COMMON_BLOCK_DOMAIN) < 0)
    663     return -1;
    664 
    665   /* These remain defined for compatibility, but as they were never
    666      correct, they are no longer documented.  Eventually we can remove
    667      them.  These exist because at one time, enum search_domain and
    668      enum domain_enum_tag were combined -- but different values were
    669      used differently.  Here we try to give them values that will make
    670      sense if they are passed to gdb.lookup_symbol.  */
    671   if (PyModule_AddIntConstant (gdb_module, "SYMBOL_VARIABLES_DOMAIN",
    672 			       VAR_DOMAIN) < 0
    673       || PyModule_AddIntConstant (gdb_module, "SYMBOL_FUNCTIONS_DOMAIN",
    674 				  VAR_DOMAIN) < 0
    675       || PyModule_AddIntConstant (gdb_module, "SYMBOL_TYPES_DOMAIN",
    676 				  VAR_DOMAIN) < 0)
    677     return -1;
    678 
    679   return gdb_pymodule_addobject (gdb_module, "Symbol",
    680 				 (PyObject *) &symbol_object_type);
    681 }
    682 
    683 
    684 
    686 static gdb_PyGetSetDef symbol_object_getset[] = {
    687   { "type", sympy_get_type, NULL,
    688     "Type of the symbol.", NULL },
    689   { "symtab", sympy_get_symtab, NULL,
    690     "Symbol table in which the symbol appears.", NULL },
    691   { "name", sympy_get_name, NULL,
    692     "Name of the symbol, as it appears in the source code.", NULL },
    693   { "linkage_name", sympy_get_linkage_name, NULL,
    694     "Name of the symbol, as used by the linker (i.e., may be mangled).",
    695     NULL },
    696   { "print_name", sympy_get_print_name, NULL,
    697     "Name of the symbol in a form suitable for output.\n\
    698 This is either name or linkage_name, depending on whether the user asked GDB\n\
    699 to display demangled or mangled names.", NULL },
    700   { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." },
    701   { "is_argument", sympy_is_argument, NULL,
    702     "True if the symbol is an argument of a function." },
    703   { "is_constant", sympy_is_constant, NULL,
    704     "True if the symbol is a constant." },
    705   { "is_function", sympy_is_function, NULL,
    706     "True if the symbol is a function or method." },
    707   { "is_variable", sympy_is_variable, NULL,
    708     "True if the symbol is a variable." },
    709   { "needs_frame", sympy_needs_frame, NULL,
    710     "True if the symbol requires a frame for evaluation." },
    711   { "line", sympy_line, NULL,
    712     "The source line number at which the symbol was defined." },
    713   { NULL }  /* Sentinel */
    714 };
    715 
    716 static PyMethodDef symbol_object_methods[] = {
    717   { "is_valid", sympy_is_valid, METH_NOARGS,
    718     "is_valid () -> Boolean.\n\
    719 Return true if this symbol is valid, false if not." },
    720   { "value", sympy_value, METH_VARARGS,
    721     "value ([frame]) -> gdb.Value\n\
    722 Return the value of the symbol." },
    723   {NULL}  /* Sentinel */
    724 };
    725 
    726 PyTypeObject symbol_object_type = {
    727   PyVarObject_HEAD_INIT (NULL, 0)
    728   "gdb.Symbol",			  /*tp_name*/
    729   sizeof (symbol_object),	  /*tp_basicsize*/
    730   0,				  /*tp_itemsize*/
    731   sympy_dealloc,		  /*tp_dealloc*/
    732   0,				  /*tp_print*/
    733   0,				  /*tp_getattr*/
    734   0,				  /*tp_setattr*/
    735   0,				  /*tp_compare*/
    736   0,				  /*tp_repr*/
    737   0,				  /*tp_as_number*/
    738   0,				  /*tp_as_sequence*/
    739   0,				  /*tp_as_mapping*/
    740   0,				  /*tp_hash */
    741   0,				  /*tp_call*/
    742   sympy_str,			  /*tp_str*/
    743   0,				  /*tp_getattro*/
    744   0,				  /*tp_setattro*/
    745   0,				  /*tp_as_buffer*/
    746   Py_TPFLAGS_DEFAULT,		  /*tp_flags*/
    747   "GDB symbol object",		  /*tp_doc */
    748   0,				  /*tp_traverse */
    749   0,				  /*tp_clear */
    750   0,				  /*tp_richcompare */
    751   0,				  /*tp_weaklistoffset */
    752   0,				  /*tp_iter */
    753   0,				  /*tp_iternext */
    754   symbol_object_methods,	  /*tp_methods */
    755   0,				  /*tp_members */
    756   symbol_object_getset		  /*tp_getset */
    757 };
    758