Home | History | Annotate | Line # | Download | only in guile
scm-symbol.c revision 1.6
      1 /* Scheme interface to symbols.
      2 
      3    Copyright (C) 2008-2019 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 		 ? SYMBOL_PRINT_NAME (s_smob->symbol)
    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 (symbol));
    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 (symbol));
    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 (symbol));
    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   TRY
    492     {
    493       result = symbol_read_needs_frame (symbol);
    494     }
    495   CATCH (except, RETURN_MASK_ALL)
    496     {
    497       GDBSCM_HANDLE_GDB_EXCEPTION (except);
    498     }
    499   END_CATCH
    500 
    501   return scm_from_bool (result);
    502 }
    503 
    504 /* (symbol-line <gdb:symbol>) -> integer
    505    Return the line number at which the symbol was defined.  */
    506 
    507 static SCM
    508 gdbscm_symbol_line (SCM self)
    509 {
    510   symbol_smob *s_smob
    511     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    512   const struct symbol *symbol = s_smob->symbol;
    513 
    514   return scm_from_int (SYMBOL_LINE (symbol));
    515 }
    516 
    517 /* (symbol-value <gdb:symbol> [#:frame <gdb:frame>]) -> <gdb:value>
    518    Return the value of the symbol, or an error in various circumstances.  */
    519 
    520 static SCM
    521 gdbscm_symbol_value (SCM self, SCM rest)
    522 {
    523   symbol_smob *s_smob
    524     = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    525   struct symbol *symbol = s_smob->symbol;
    526   SCM keywords[] = { frame_keyword, SCM_BOOL_F };
    527   int frame_pos = -1;
    528   SCM frame_scm = SCM_BOOL_F;
    529   frame_smob *f_smob = NULL;
    530   struct frame_info *frame_info = NULL;
    531   struct value *value = NULL;
    532 
    533   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O",
    534 			      rest, &frame_pos, &frame_scm);
    535   if (!gdbscm_is_false (frame_scm))
    536     f_smob = frscm_get_frame_smob_arg_unsafe (frame_scm, frame_pos, FUNC_NAME);
    537 
    538   if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
    539     {
    540       gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
    541 				 _("cannot get the value of a typedef"));
    542     }
    543 
    544   TRY
    545     {
    546       if (f_smob != NULL)
    547 	{
    548 	  frame_info = frscm_frame_smob_to_frame (f_smob);
    549 	  if (frame_info == NULL)
    550 	    error (_("Invalid frame"));
    551 	}
    552 
    553       if (symbol_read_needs_frame (symbol) && frame_info == NULL)
    554 	error (_("Symbol requires a frame to compute its value"));
    555 
    556       /* TODO: currently, we have no way to recover the block in which SYMBOL
    557 	 was found, so we have no block to pass to read_var_value.  This will
    558 	 yield an incorrect value when symbol is not local to FRAME_INFO (this
    559 	 can happen with nested functions).  */
    560       value = read_var_value (symbol, NULL, frame_info);
    561     }
    562   CATCH (except, RETURN_MASK_ALL)
    563     {
    564       GDBSCM_HANDLE_GDB_EXCEPTION (except);
    565     }
    566   END_CATCH
    567 
    568   return vlscm_scm_from_value (value);
    569 }
    570 
    571 /* (lookup-symbol name [#:block <gdb:block>] [#:domain domain])
    573      -> (<gdb:symbol> field-of-this?)
    574    The result is #f if the symbol is not found.
    575    See comment in lookup_symbol_in_language for field-of-this?.  */
    576 
    577 static SCM
    578 gdbscm_lookup_symbol (SCM name_scm, SCM rest)
    579 {
    580   char *name;
    581   SCM keywords[] = { block_keyword, domain_keyword, SCM_BOOL_F };
    582   const struct block *block = NULL;
    583   SCM block_scm = SCM_BOOL_F;
    584   int domain = VAR_DOMAIN;
    585   int block_arg_pos = -1, domain_arg_pos = -1;
    586   struct field_of_this_result is_a_field_of_this;
    587   struct symbol *symbol = NULL;
    588 
    589   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi",
    590 			      name_scm, &name, rest,
    591 			      &block_arg_pos, &block_scm,
    592 			      &domain_arg_pos, &domain);
    593 
    594   if (block_arg_pos >= 0)
    595     {
    596       SCM except_scm;
    597 
    598       block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
    599 				  &except_scm);
    600       if (block == NULL)
    601 	{
    602 	  xfree (name);
    603 	  gdbscm_throw (except_scm);
    604 	}
    605     }
    606   else
    607     {
    608       struct frame_info *selected_frame;
    609 
    610       TRY
    611 	{
    612 	  selected_frame = get_selected_frame (_("no frame selected"));
    613 	  block = get_frame_block (selected_frame, NULL);
    614 	}
    615       CATCH (ex, RETURN_MASK_ALL)
    616 	{
    617 	  xfree (name);
    618 	  GDBSCM_HANDLE_GDB_EXCEPTION (ex);
    619 	}
    620       END_CATCH
    621     }
    622 
    623   struct gdb_exception except = exception_none;
    624   TRY
    625     {
    626       symbol = lookup_symbol (name, block, (domain_enum) domain,
    627 			      &is_a_field_of_this).symbol;
    628     }
    629   CATCH (ex, RETURN_MASK_ALL)
    630     {
    631       except = ex;
    632     }
    633   END_CATCH
    634 
    635   xfree (name);
    636   GDBSCM_HANDLE_GDB_EXCEPTION (except);
    637 
    638   if (symbol == NULL)
    639     return SCM_BOOL_F;
    640 
    641   return scm_list_2 (syscm_scm_from_symbol (symbol),
    642 		     scm_from_bool (is_a_field_of_this.type != NULL));
    643 }
    644 
    645 /* (lookup-global-symbol name [#:domain domain]) -> <gdb:symbol>
    646    The result is #f if the symbol is not found.  */
    647 
    648 static SCM
    649 gdbscm_lookup_global_symbol (SCM name_scm, SCM rest)
    650 {
    651   char *name;
    652   SCM keywords[] = { domain_keyword, SCM_BOOL_F };
    653   int domain_arg_pos = -1;
    654   int domain = VAR_DOMAIN;
    655   struct symbol *symbol = NULL;
    656   struct gdb_exception except = exception_none;
    657 
    658   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i",
    659 			      name_scm, &name, rest,
    660 			      &domain_arg_pos, &domain);
    661 
    662   TRY
    663     {
    664       symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
    665     }
    666   CATCH (ex, RETURN_MASK_ALL)
    667     {
    668       except = ex;
    669     }
    670   END_CATCH
    671 
    672   xfree (name);
    673   GDBSCM_HANDLE_GDB_EXCEPTION (except);
    674 
    675   if (symbol == NULL)
    676     return SCM_BOOL_F;
    677 
    678   return syscm_scm_from_symbol (symbol);
    679 }
    680 
    681 /* Initialize the Scheme symbol support.  */
    683 
    684 /* Note: The SYMBOL_ prefix on the integer constants here is present for
    685    compatibility with the Python support.  */
    686 
    687 static const scheme_integer_constant symbol_integer_constants[] =
    688 {
    689 #define X(SYM) { "SYMBOL_" #SYM, SYM }
    690   X (LOC_UNDEF),
    691   X (LOC_CONST),
    692   X (LOC_STATIC),
    693   X (LOC_REGISTER),
    694   X (LOC_ARG),
    695   X (LOC_REF_ARG),
    696   X (LOC_LOCAL),
    697   X (LOC_TYPEDEF),
    698   X (LOC_LABEL),
    699   X (LOC_BLOCK),
    700   X (LOC_CONST_BYTES),
    701   X (LOC_UNRESOLVED),
    702   X (LOC_OPTIMIZED_OUT),
    703   X (LOC_COMPUTED),
    704   X (LOC_REGPARM_ADDR),
    705 
    706   X (UNDEF_DOMAIN),
    707   X (VAR_DOMAIN),
    708   X (STRUCT_DOMAIN),
    709   X (LABEL_DOMAIN),
    710   X (VARIABLES_DOMAIN),
    711   X (FUNCTIONS_DOMAIN),
    712   X (TYPES_DOMAIN),
    713 #undef X
    714 
    715   END_INTEGER_CONSTANTS
    716 };
    717 
    718 static const scheme_function symbol_functions[] =
    719 {
    720   { "symbol?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_p),
    721     "\
    722 Return #t if the object is a <gdb:symbol> object." },
    723 
    724   { "symbol-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_valid_p),
    725     "\
    726 Return #t if object is a valid <gdb:symbol> object.\n\
    727 A valid symbol is a symbol that has not been freed.\n\
    728 Symbols are freed when the objfile they come from is freed." },
    729 
    730   { "symbol-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_type),
    731     "\
    732 Return the type of symbol." },
    733 
    734   { "symbol-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_symtab),
    735     "\
    736 Return the symbol table (<gdb:symtab>) containing symbol." },
    737 
    738   { "symbol-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_line),
    739     "\
    740 Return the line number at which the symbol was defined." },
    741 
    742   { "symbol-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_name),
    743     "\
    744 Return the name of the symbol as a string." },
    745 
    746   { "symbol-linkage-name", 1, 0, 0,
    747     as_a_scm_t_subr (gdbscm_symbol_linkage_name),
    748     "\
    749 Return the linkage name of the symbol as a string." },
    750 
    751   { "symbol-print-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_print_name),
    752     "\
    753 Return the print name of the symbol as a string.\n\
    754 This is either name or linkage-name, depending on whether the user\n\
    755 asked GDB to display demangled or mangled names." },
    756 
    757   { "symbol-addr-class", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_addr_class),
    758     "\
    759 Return the address class of the symbol." },
    760 
    761   { "symbol-needs-frame?", 1, 0, 0,
    762     as_a_scm_t_subr (gdbscm_symbol_needs_frame_p),
    763     "\
    764 Return #t if the symbol needs a frame to compute its value." },
    765 
    766   { "symbol-argument?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_argument_p),
    767     "\
    768 Return #t if the symbol is a function argument." },
    769 
    770   { "symbol-constant?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_constant_p),
    771     "\
    772 Return #t if the symbol is a constant." },
    773 
    774   { "symbol-function?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_function_p),
    775     "\
    776 Return #t if the symbol is a function." },
    777 
    778   { "symbol-variable?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_variable_p),
    779     "\
    780 Return #t if the symbol is a variable." },
    781 
    782   { "symbol-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_symbol_value),
    783     "\
    784 Return the value of the symbol.\n\
    785 \n\
    786   Arguments: <gdb:symbol> [#:frame frame]" },
    787 
    788   { "lookup-symbol", 1, 0, 1, as_a_scm_t_subr (gdbscm_lookup_symbol),
    789     "\
    790 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
    791 \n\
    792   Arguments: name [#:block block] [#:domain domain]\n\
    793     name:   a string containing the name of the symbol to lookup\n\
    794     block:  a <gdb:block> object\n\
    795     domain: a SYMBOL_*_DOMAIN value" },
    796 
    797   { "lookup-global-symbol", 1, 0, 1,
    798     as_a_scm_t_subr (gdbscm_lookup_global_symbol),
    799     "\
    800 Return <gdb:symbol> if found, otherwise #f.\n\
    801 \n\
    802   Arguments: name [#:domain domain]\n\
    803     name:   a string containing the name of the symbol to lookup\n\
    804     domain: a SYMBOL_*_DOMAIN value" },
    805 
    806   END_FUNCTIONS
    807 };
    808 
    809 void
    810 gdbscm_initialize_symbols (void)
    811 {
    812   symbol_smob_tag
    813     = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
    814   scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
    815   scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
    816 
    817   gdbscm_define_integer_constants (symbol_integer_constants, 1);
    818   gdbscm_define_functions (symbol_functions, 1);
    819 
    820   block_keyword = scm_from_latin1_keyword ("block");
    821   domain_keyword = scm_from_latin1_keyword ("domain");
    822   frame_keyword = scm_from_latin1_keyword ("frame");
    823 
    824   /* Register an objfile "free" callback so we can properly
    825      invalidate symbols when an object file is about to be deleted.  */
    826   syscm_objfile_data_key
    827     = register_objfile_data_with_cleanup (NULL, syscm_del_objfile_symbols);
    828 
    829   /* Arch-specific symbol data.  */
    830   syscm_gdbarch_data_key
    831     = gdbarch_data_register_post_init (syscm_init_arch_symbols);
    832 }
    833