Home | History | Annotate | Line # | Download | only in guile
scm-symbol.c revision 1.8
      1 /* Scheme 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 /* See README file in this directory for implementation notes, coding
     21    conventions, et.al.  */
     22 
     23 #include "defs.h"
     24 #include "block.h"
     25 #include "frame.h"
     26 #include "symtab.h"
     27 #include "objfiles.h"
     28 #include "value.h"
     29 #include "guile-internal.h"
     30 
     31 /* The <gdb:symbol> smob.  */
     32 
     33 struct symbol_smob
     34 {
     35   /* This always appears first.  */
     36   eqable_gdb_smob base;
     37 
     38   /* The GDB symbol structure this smob is wrapping.  */
     39   struct symbol *symbol;
     40 };
     41 
     42 static const char symbol_smob_name[] = "gdb:symbol";
     43 
     44 /* The tag Guile knows the symbol smob by.  */
     45 static scm_t_bits symbol_smob_tag;
     46 
     47 /* Keywords used in argument passing.  */
     48 static SCM block_keyword;
     49 static SCM domain_keyword;
     50 static SCM frame_keyword;
     51 
     52 /* This is called when an objfile is about to be freed.
     53    Invalidate the symbol as further actions on the symbol would result
     54    in bad data.  All access to s_smob->symbol should be gated by
     55    syscm_get_valid_symbol_smob_arg_unsafe which will raise an exception on
     56    invalid symbols.  */
     57 struct syscm_deleter
     58 {
     59   /* Helper function for syscm_del_objfile_symbols to mark the symbol
     60      as invalid.  */
     61 
     62   static int
     63   syscm_mark_symbol_invalid (void **slot, void *info)
     64   {
     65     symbol_smob *s_smob = (symbol_smob *) *slot;
     66 
     67     s_smob->symbol = NULL;
     68     return 1;
     69   }
     70 
     71   void operator() (htab_t htab)
     72   {
     73     gdb_assert (htab != nullptr);
     74     htab_traverse_noresize (htab, syscm_mark_symbol_invalid, NULL);
     75     htab_delete (htab);
     76   }
     77 };
     78 
     79 static const registry<objfile>::key<htab, syscm_deleter>
     80      syscm_objfile_data_key;
     81 
     82 struct syscm_gdbarch_data
     83 {
     84   /* Hash table to implement eqable gdbarch symbols.  */
     85   htab_t htab;
     86 };
     87 
     88 static const registry<gdbarch>::key<syscm_gdbarch_data> syscm_gdbarch_data_key;
     89 
     90 /* Administrivia for symbol smobs.  */
     92 
     93 /* Helper function to hash a symbol_smob.  */
     94 
     95 static hashval_t
     96 syscm_hash_symbol_smob (const void *p)
     97 {
     98   const symbol_smob *s_smob = (const symbol_smob *) p;
     99 
    100   return htab_hash_pointer (s_smob->symbol);
    101 }
    102 
    103 /* Helper function to compute equality of symbol_smobs.  */
    104 
    105 static int
    106 syscm_eq_symbol_smob (const void *ap, const void *bp)
    107 {
    108   const symbol_smob *a = (const symbol_smob *) ap;
    109   const symbol_smob *b = (const symbol_smob *) bp;
    110 
    111   return (a->symbol == b->symbol
    112 	  && a->symbol != NULL);
    113 }
    114 
    115 /* Return the struct symbol pointer -> SCM mapping table.
    116    It is created if necessary.  */
    117 
    118 static htab_t
    119 syscm_get_symbol_map (struct symbol *symbol)
    120 {
    121   htab_t htab;
    122 
    123   if (symbol->is_objfile_owned ())
    124     {
    125       struct objfile *objfile = symbol->objfile ();
    126 
    127       htab = syscm_objfile_data_key.get (objfile);
    128       if (htab == NULL)
    129 	{
    130 	  htab = gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob,
    131 						     syscm_eq_symbol_smob);
    132 	  syscm_objfile_data_key.set (objfile, htab);
    133 	}
    134     }
    135   else
    136     {
    137       struct gdbarch *gdbarch = symbol->arch ();
    138       struct syscm_gdbarch_data *data = syscm_gdbarch_data_key.get (gdbarch);
    139       if (data == nullptr)
    140 	{
    141 	  data = syscm_gdbarch_data_key.emplace (gdbarch);
    142 	  data->htab
    143 	    = gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob,
    144 						  syscm_eq_symbol_smob);
    145 	}
    146 
    147       htab = data->htab;
    148     }
    149 
    150   return htab;
    151 }
    152 
    153 /* The smob "free" function for <gdb:symbol>.  */
    154 
    155 static size_t
    156 syscm_free_symbol_smob (SCM self)
    157 {
    158   symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
    159 
    160   if (s_smob->symbol != NULL)
    161     {
    162       htab_t htab = syscm_get_symbol_map (s_smob->symbol);
    163 
    164       gdbscm_clear_eqable_gsmob_ptr_slot (htab, &s_smob->base);
    165     }
    166 
    167   /* Not necessary, done to catch bugs.  */
    168   s_smob->symbol = NULL;
    169 
    170   return 0;
    171 }
    172 
    173 /* The smob "print" function for <gdb:symbol>.  */
    174 
    175 static int
    176 syscm_print_symbol_smob (SCM self, SCM port, scm_print_state *pstate)
    177 {
    178   symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
    179 
    180   if (pstate->writingp)
    181     gdbscm_printf (port, "#<%s ", symbol_smob_name);
    182   gdbscm_printf (port, "%s",
    183 		 s_smob->symbol != NULL
    184 		 ? s_smob->symbol->print_name ()
    185 		 : "<invalid>");
    186   if (pstate->writingp)
    187     scm_puts (">", port);
    188 
    189   scm_remember_upto_here_1 (self);
    190 
    191   /* Non-zero means success.  */
    192   return 1;
    193 }
    194 
    195 /* Low level routine to create a <gdb:symbol> object.  */
    196 
    197 static SCM
    198 syscm_make_symbol_smob (void)
    199 {
    200   symbol_smob *s_smob = (symbol_smob *)
    201     scm_gc_malloc (sizeof (symbol_smob), symbol_smob_name);
    202   SCM s_scm;
    203 
    204   s_smob->symbol = NULL;
    205   s_scm = scm_new_smob (symbol_smob_tag, (scm_t_bits) s_smob);
    206   gdbscm_init_eqable_gsmob (&s_smob->base, s_scm);
    207 
    208   return s_scm;
    209 }
    210 
    211 /* Return non-zero if SCM is a symbol smob.  */
    212 
    213 int
    214 syscm_is_symbol (SCM scm)
    215 {
    216   return SCM_SMOB_PREDICATE (symbol_smob_tag, scm);
    217 }
    218 
    219 /* (symbol? object) -> boolean */
    220 
    221 static SCM
    222 gdbscm_symbol_p (SCM scm)
    223 {
    224   return scm_from_bool (syscm_is_symbol (scm));
    225 }
    226 
    227 /* Return the existing object that encapsulates SYMBOL, or create a new
    228    <gdb:symbol> object.  */
    229 
    230 SCM
    231 syscm_scm_from_symbol (struct symbol *symbol)
    232 {
    233   htab_t htab;
    234   eqable_gdb_smob **slot;
    235   symbol_smob *s_smob, s_smob_for_lookup;
    236   SCM s_scm;
    237 
    238   /* If we've already created a gsmob for this symbol, return it.
    239      This makes symbols eq?-able.  */
    240   htab = syscm_get_symbol_map (symbol);
    241   s_smob_for_lookup.symbol = symbol;
    242   slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &s_smob_for_lookup.base);
    243   if (*slot != NULL)
    244     return (*slot)->containing_scm;
    245 
    246   s_scm = syscm_make_symbol_smob ();
    247   s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm);
    248   s_smob->symbol = symbol;
    249   gdbscm_fill_eqable_gsmob_ptr_slot (slot, &s_smob->base);
    250 
    251   return s_scm;
    252 }
    253 
    254 /* Returns the <gdb:symbol> object in SELF.
    255    Throws an exception if SELF is not a <gdb:symbol> object.  */
    256 
    257 static SCM
    258 syscm_get_symbol_arg_unsafe (SCM self, int arg_pos, const char *func_name)
    259 {
    260   SCM_ASSERT_TYPE (syscm_is_symbol (self), self, arg_pos, func_name,
    261 		   symbol_smob_name);
    262 
    263   return self;
    264 }
    265 
    266 /* Returns a pointer to the symbol smob of SELF.
    267    Throws an exception if SELF is not a <gdb:symbol> object.  */
    268 
    269 static symbol_smob *
    270 syscm_get_symbol_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
    271 {
    272   SCM s_scm = syscm_get_symbol_arg_unsafe (self, arg_pos, func_name);
    273   symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm);
    274 
    275   return s_smob;
    276 }
    277 
    278 /* Return non-zero if symbol S_SMOB is valid.  */
    279 
    280 static int
    281 syscm_is_valid (symbol_smob *s_smob)
    282 {
    283   return s_smob->symbol != NULL;
    284 }
    285 
    286 /* Throw a Scheme error if SELF is not a valid symbol smob.
    287    Otherwise return a pointer to the symbol smob.  */
    288 
    289 static symbol_smob *
    290 syscm_get_valid_symbol_smob_arg_unsafe (SCM self, int arg_pos,
    291 					const char *func_name)
    292 {
    293   symbol_smob *s_smob
    294     = syscm_get_symbol_smob_arg_unsafe (self, arg_pos, func_name);
    295 
    296   if (!syscm_is_valid (s_smob))
    297     {
    298       gdbscm_invalid_object_error (func_name, arg_pos, self,
    299 				   _("<gdb:symbol>"));
    300     }
    301 
    302   return s_smob;
    303 }
    304 
    305 /* Throw a Scheme error if SELF is not a valid symbol smob.
    306    Otherwise return a pointer to the symbol struct.  */
    307 
    308 struct symbol *
    309 syscm_get_valid_symbol_arg_unsafe (SCM self, int arg_pos,
    310 				   const char *func_name)
    311 {
    312   symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, arg_pos,
    313 								func_name);
    314 
    315   return s_smob->symbol;
    316 }
    317 
    318 
    319 /* Symbol methods.  */
    321 
    322 /* (symbol-valid? <gdb:symbol>) -> boolean
    323    Returns #t if SELF still exists in GDB.  */
    324 
    325 static SCM
    326 gdbscm_symbol_valid_p (SCM self)
    327 {
    328   symbol_smob *s_smob
    329     = syscm_get_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    330 
    331   return scm_from_bool (syscm_is_valid (s_smob));
    332 }
    333 
    334 /* (symbol-type <gdb:symbol>) -> <gdb:type>
    335    Return the type of SELF, or #f if SELF has no type.  */
    336 
    337 static SCM
    338 gdbscm_symbol_type (SCM self)
    339 {
    340   symbol_smob *s_smob
    341     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    342   const struct symbol *symbol = s_smob->symbol;
    343 
    344   if (symbol->type () == NULL)
    345     return SCM_BOOL_F;
    346 
    347   return tyscm_scm_from_type (symbol->type ());
    348 }
    349 
    350 /* (symbol-symtab <gdb:symbol>) -> <gdb:symtab> | #f
    351    Return the symbol table of SELF.
    352    If SELF does not have a symtab (it is arch-owned) return #f.  */
    353 
    354 static SCM
    355 gdbscm_symbol_symtab (SCM self)
    356 {
    357   symbol_smob *s_smob
    358     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    359   const struct symbol *symbol = s_smob->symbol;
    360 
    361   if (!symbol->is_objfile_owned ())
    362     return SCM_BOOL_F;
    363   return stscm_scm_from_symtab (symbol->symtab ());
    364 }
    365 
    366 /* (symbol-name <gdb:symbol>) -> string */
    367 
    368 static SCM
    369 gdbscm_symbol_name (SCM self)
    370 {
    371   symbol_smob *s_smob
    372     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    373   const struct symbol *symbol = s_smob->symbol;
    374 
    375   return gdbscm_scm_from_c_string (symbol->natural_name ());
    376 }
    377 
    378 /* (symbol-linkage-name <gdb:symbol>) -> string */
    379 
    380 static SCM
    381 gdbscm_symbol_linkage_name (SCM self)
    382 {
    383   symbol_smob *s_smob
    384     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    385   const struct symbol *symbol = s_smob->symbol;
    386 
    387   return gdbscm_scm_from_c_string (symbol->linkage_name ());
    388 }
    389 
    390 /* (symbol-print-name <gdb:symbol>) -> string */
    391 
    392 static SCM
    393 gdbscm_symbol_print_name (SCM self)
    394 {
    395   symbol_smob *s_smob
    396     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    397   const struct symbol *symbol = s_smob->symbol;
    398 
    399   return gdbscm_scm_from_c_string (symbol->print_name ());
    400 }
    401 
    402 /* (symbol-addr-class <gdb:symbol>) -> integer */
    403 
    404 static SCM
    405 gdbscm_symbol_addr_class (SCM self)
    406 {
    407   symbol_smob *s_smob
    408     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    409   const struct symbol *symbol = s_smob->symbol;
    410 
    411   return scm_from_int (symbol->aclass ());
    412 }
    413 
    414 /* (symbol-argument? <gdb:symbol>) -> boolean */
    415 
    416 static SCM
    417 gdbscm_symbol_argument_p (SCM self)
    418 {
    419   symbol_smob *s_smob
    420     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    421   const struct symbol *symbol = s_smob->symbol;
    422 
    423   return scm_from_bool (symbol->is_argument ());
    424 }
    425 
    426 /* (symbol-constant? <gdb:symbol>) -> boolean */
    427 
    428 static SCM
    429 gdbscm_symbol_constant_p (SCM self)
    430 {
    431   symbol_smob *s_smob
    432     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    433   const struct symbol *symbol = s_smob->symbol;
    434   enum address_class theclass;
    435 
    436   theclass = symbol->aclass ();
    437 
    438   return scm_from_bool (theclass == LOC_CONST || theclass == LOC_CONST_BYTES);
    439 }
    440 
    441 /* (symbol-function? <gdb:symbol>) -> boolean */
    442 
    443 static SCM
    444 gdbscm_symbol_function_p (SCM self)
    445 {
    446   symbol_smob *s_smob
    447     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    448   const struct symbol *symbol = s_smob->symbol;
    449   enum address_class theclass;
    450 
    451   theclass = symbol->aclass ();
    452 
    453   return scm_from_bool (theclass == LOC_BLOCK);
    454 }
    455 
    456 /* (symbol-variable? <gdb:symbol>) -> boolean */
    457 
    458 static SCM
    459 gdbscm_symbol_variable_p (SCM self)
    460 {
    461   symbol_smob *s_smob
    462     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    463   const struct symbol *symbol = s_smob->symbol;
    464   enum address_class theclass;
    465 
    466   theclass = symbol->aclass ();
    467 
    468   return scm_from_bool (!symbol->is_argument ()
    469 			&& (theclass == LOC_LOCAL || theclass == LOC_REGISTER
    470 			    || theclass == LOC_STATIC || theclass == LOC_COMPUTED
    471 			    || theclass == LOC_OPTIMIZED_OUT));
    472 }
    473 
    474 /* (symbol-needs-frame? <gdb:symbol>) -> boolean
    475    Return #t if the symbol needs a frame for evaluation.  */
    476 
    477 static SCM
    478 gdbscm_symbol_needs_frame_p (SCM self)
    479 {
    480   symbol_smob *s_smob
    481     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    482   struct symbol *symbol = s_smob->symbol;
    483   int result = 0;
    484 
    485   gdbscm_gdb_exception exc {};
    486   try
    487     {
    488       result = symbol_read_needs_frame (symbol);
    489     }
    490   catch (const gdb_exception &except)
    491     {
    492       exc = unpack (except);
    493     }
    494 
    495   GDBSCM_HANDLE_GDB_EXCEPTION (exc);
    496   return scm_from_bool (result);
    497 }
    498 
    499 /* (symbol-line <gdb:symbol>) -> integer
    500    Return the line number at which the symbol was defined.  */
    501 
    502 static SCM
    503 gdbscm_symbol_line (SCM self)
    504 {
    505   symbol_smob *s_smob
    506     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    507   const struct symbol *symbol = s_smob->symbol;
    508 
    509   return scm_from_int (symbol->line ());
    510 }
    511 
    512 /* (symbol-value <gdb:symbol> [#:frame <gdb:frame>]) -> <gdb:value>
    513    Return the value of the symbol, or an error in various circumstances.  */
    514 
    515 static SCM
    516 gdbscm_symbol_value (SCM self, SCM rest)
    517 {
    518   symbol_smob *s_smob
    519     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    520   struct symbol *symbol = s_smob->symbol;
    521   SCM keywords[] = { frame_keyword, SCM_BOOL_F };
    522   int frame_pos = -1;
    523   SCM frame_scm = SCM_BOOL_F;
    524   frame_smob *f_smob = NULL;
    525   struct value *value = NULL;
    526 
    527   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O",
    528 			      rest, &frame_pos, &frame_scm);
    529   if (!gdbscm_is_false (frame_scm))
    530     f_smob = frscm_get_frame_smob_arg_unsafe (frame_scm, frame_pos, FUNC_NAME);
    531 
    532   if (symbol->aclass () == LOC_TYPEDEF)
    533     {
    534       gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
    535 				 _("cannot get the value of a typedef"));
    536     }
    537 
    538   gdbscm_gdb_exception exc {};
    539   try
    540     {
    541       frame_info_ptr frame_info;
    542 
    543       if (f_smob != NULL)
    544 	{
    545 	  frame_info = frame_info_ptr (frscm_frame_smob_to_frame (f_smob));
    546 	  if (frame_info == NULL)
    547 	    error (_("Invalid frame"));
    548 	}
    549 
    550       if (symbol_read_needs_frame (symbol) && frame_info == NULL)
    551 	error (_("Symbol requires a frame to compute its value"));
    552 
    553       /* TODO: currently, we have no way to recover the block in which SYMBOL
    554 	 was found, so we have no block to pass to read_var_value.  This will
    555 	 yield an incorrect value when symbol is not local to FRAME_INFO (this
    556 	 can happen with nested functions).  */
    557       value = read_var_value (symbol, NULL, frame_info);
    558     }
    559   catch (const gdb_exception &except)
    560     {
    561       exc = unpack (except);
    562     }
    563 
    564   GDBSCM_HANDLE_GDB_EXCEPTION (exc);
    565   return vlscm_scm_from_value (value);
    566 }
    567 
    568 /* (lookup-symbol name [#:block <gdb:block>] [#:domain domain])
    570      -> (<gdb:symbol> field-of-this?)
    571    The result is #f if the symbol is not found.
    572    See comment in lookup_symbol_in_language for field-of-this?.  */
    573 
    574 static SCM
    575 gdbscm_lookup_symbol (SCM name_scm, SCM rest)
    576 {
    577   char *name;
    578   SCM keywords[] = { block_keyword, domain_keyword, SCM_BOOL_F };
    579   const struct block *block = NULL;
    580   SCM block_scm = SCM_BOOL_F;
    581   int domain = VAR_DOMAIN;
    582   int block_arg_pos = -1, domain_arg_pos = -1;
    583   struct field_of_this_result is_a_field_of_this;
    584   struct symbol *symbol = NULL;
    585 
    586   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi",
    587 			      name_scm, &name, rest,
    588 			      &block_arg_pos, &block_scm,
    589 			      &domain_arg_pos, &domain);
    590 
    591   if (block_arg_pos >= 0)
    592     {
    593       SCM except_scm;
    594 
    595       block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
    596 				  &except_scm);
    597       if (block == NULL)
    598 	{
    599 	  xfree (name);
    600 	  gdbscm_throw (except_scm);
    601 	}
    602     }
    603   else
    604     {
    605       gdbscm_gdb_exception exc {};
    606       try
    607 	{
    608 	  frame_info_ptr selected_frame
    609 	    = get_selected_frame (_("no frame selected"));
    610 	  block = get_frame_block (selected_frame, NULL);
    611 	}
    612       catch (const gdb_exception &ex)
    613 	{
    614 	  xfree (name);
    615 	  exc = unpack (ex);
    616 	}
    617       GDBSCM_HANDLE_GDB_EXCEPTION (exc);
    618     }
    619 
    620   gdbscm_gdb_exception except {};
    621   try
    622     {
    623       symbol = lookup_symbol (name, block, (domain_enum) domain,
    624 			      &is_a_field_of_this).symbol;
    625     }
    626   catch (const gdb_exception &ex)
    627     {
    628       except = unpack (ex);
    629     }
    630 
    631   xfree (name);
    632   GDBSCM_HANDLE_GDB_EXCEPTION (except);
    633 
    634   if (symbol == NULL)
    635     return SCM_BOOL_F;
    636 
    637   return scm_list_2 (syscm_scm_from_symbol (symbol),
    638 		     scm_from_bool (is_a_field_of_this.type != NULL));
    639 }
    640 
    641 /* (lookup-global-symbol name [#:domain domain]) -> <gdb:symbol>
    642    The result is #f if the symbol is not found.  */
    643 
    644 static SCM
    645 gdbscm_lookup_global_symbol (SCM name_scm, SCM rest)
    646 {
    647   char *name;
    648   SCM keywords[] = { domain_keyword, SCM_BOOL_F };
    649   int domain_arg_pos = -1;
    650   int domain = VAR_DOMAIN;
    651   struct symbol *symbol = NULL;
    652   gdbscm_gdb_exception except {};
    653 
    654   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i",
    655 			      name_scm, &name, rest,
    656 			      &domain_arg_pos, &domain);
    657 
    658   try
    659     {
    660       symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
    661     }
    662   catch (const gdb_exception &ex)
    663     {
    664       except = unpack (ex);
    665     }
    666 
    667   xfree (name);
    668   GDBSCM_HANDLE_GDB_EXCEPTION (except);
    669 
    670   if (symbol == NULL)
    671     return SCM_BOOL_F;
    672 
    673   return syscm_scm_from_symbol (symbol);
    674 }
    675 
    676 /* Initialize the Scheme symbol support.  */
    678 
    679 /* Note: The SYMBOL_ prefix on the integer constants here is present for
    680    compatibility with the Python support.  */
    681 
    682 static const scheme_integer_constant symbol_integer_constants[] =
    683 {
    684 #define X(SYM) { "SYMBOL_" #SYM, SYM }
    685   X (LOC_UNDEF),
    686   X (LOC_CONST),
    687   X (LOC_STATIC),
    688   X (LOC_REGISTER),
    689   X (LOC_ARG),
    690   X (LOC_REF_ARG),
    691   X (LOC_LOCAL),
    692   X (LOC_TYPEDEF),
    693   X (LOC_LABEL),
    694   X (LOC_BLOCK),
    695   X (LOC_CONST_BYTES),
    696   X (LOC_UNRESOLVED),
    697   X (LOC_OPTIMIZED_OUT),
    698   X (LOC_COMPUTED),
    699   X (LOC_REGPARM_ADDR),
    700 
    701   X (UNDEF_DOMAIN),
    702   X (VAR_DOMAIN),
    703   X (STRUCT_DOMAIN),
    704   X (LABEL_DOMAIN),
    705   X (VARIABLES_DOMAIN),
    706   X (FUNCTIONS_DOMAIN),
    707   X (TYPES_DOMAIN),
    708 #undef X
    709 
    710   END_INTEGER_CONSTANTS
    711 };
    712 
    713 static const scheme_function symbol_functions[] =
    714 {
    715   { "symbol?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_p),
    716     "\
    717 Return #t if the object is a <gdb:symbol> object." },
    718 
    719   { "symbol-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_valid_p),
    720     "\
    721 Return #t if object is a valid <gdb:symbol> object.\n\
    722 A valid symbol is a symbol that has not been freed.\n\
    723 Symbols are freed when the objfile they come from is freed." },
    724 
    725   { "symbol-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_type),
    726     "\
    727 Return the type of symbol." },
    728 
    729   { "symbol-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_symtab),
    730     "\
    731 Return the symbol table (<gdb:symtab>) containing symbol." },
    732 
    733   { "symbol-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_line),
    734     "\
    735 Return the line number at which the symbol was defined." },
    736 
    737   { "symbol-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_name),
    738     "\
    739 Return the name of the symbol as a string." },
    740 
    741   { "symbol-linkage-name", 1, 0, 0,
    742     as_a_scm_t_subr (gdbscm_symbol_linkage_name),
    743     "\
    744 Return the linkage name of the symbol as a string." },
    745 
    746   { "symbol-print-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_print_name),
    747     "\
    748 Return the print name of the symbol as a string.\n\
    749 This is either name or linkage-name, depending on whether the user\n\
    750 asked GDB to display demangled or mangled names." },
    751 
    752   { "symbol-addr-class", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_addr_class),
    753     "\
    754 Return the address class of the symbol." },
    755 
    756   { "symbol-needs-frame?", 1, 0, 0,
    757     as_a_scm_t_subr (gdbscm_symbol_needs_frame_p),
    758     "\
    759 Return #t if the symbol needs a frame to compute its value." },
    760 
    761   { "symbol-argument?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_argument_p),
    762     "\
    763 Return #t if the symbol is a function argument." },
    764 
    765   { "symbol-constant?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_constant_p),
    766     "\
    767 Return #t if the symbol is a constant." },
    768 
    769   { "symbol-function?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_function_p),
    770     "\
    771 Return #t if the symbol is a function." },
    772 
    773   { "symbol-variable?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_variable_p),
    774     "\
    775 Return #t if the symbol is a variable." },
    776 
    777   { "symbol-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_symbol_value),
    778     "\
    779 Return the value of the symbol.\n\
    780 \n\
    781   Arguments: <gdb:symbol> [#:frame frame]" },
    782 
    783   { "lookup-symbol", 1, 0, 1, as_a_scm_t_subr (gdbscm_lookup_symbol),
    784     "\
    785 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
    786 \n\
    787   Arguments: name [#:block block] [#:domain domain]\n\
    788     name:   a string containing the name of the symbol to lookup\n\
    789     block:  a <gdb:block> object\n\
    790     domain: a SYMBOL_*_DOMAIN value" },
    791 
    792   { "lookup-global-symbol", 1, 0, 1,
    793     as_a_scm_t_subr (gdbscm_lookup_global_symbol),
    794     "\
    795 Return <gdb:symbol> if found, otherwise #f.\n\
    796 \n\
    797   Arguments: name [#:domain domain]\n\
    798     name:   a string containing the name of the symbol to lookup\n\
    799     domain: a SYMBOL_*_DOMAIN value" },
    800 
    801   END_FUNCTIONS
    802 };
    803 
    804 void
    805 gdbscm_initialize_symbols (void)
    806 {
    807   symbol_smob_tag
    808     = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
    809   scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
    810   scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
    811 
    812   gdbscm_define_integer_constants (symbol_integer_constants, 1);
    813   gdbscm_define_functions (symbol_functions, 1);
    814 
    815   block_keyword = scm_from_latin1_keyword ("block");
    816   domain_keyword = scm_from_latin1_keyword ("domain");
    817   frame_keyword = scm_from_latin1_keyword ("frame");
    818 }
    819