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