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