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