Home | History | Annotate | Line # | Download | only in guile
scm-symbol.c revision 1.1.1.4
      1 /* Scheme interface to symbols.
      2 
      3    Copyright (C) 2008-2017 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   struct cleanup *cleanups;
    589   struct gdb_exception except = exception_none;
    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   cleanups = make_cleanup (xfree, name);
    597 
    598   if (block_arg_pos >= 0)
    599     {
    600       SCM except_scm;
    601 
    602       block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
    603 				  &except_scm);
    604       if (block == NULL)
    605 	{
    606 	  do_cleanups (cleanups);
    607 	  gdbscm_throw (except_scm);
    608 	}
    609     }
    610   else
    611     {
    612       struct frame_info *selected_frame;
    613 
    614       TRY
    615 	{
    616 	  selected_frame = get_selected_frame (_("no frame selected"));
    617 	  block = get_frame_block (selected_frame, NULL);
    618 	}
    619       CATCH (except, RETURN_MASK_ALL)
    620 	{
    621 	  GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
    622 	}
    623       END_CATCH
    624     }
    625 
    626   TRY
    627     {
    628       symbol = lookup_symbol (name, block, (domain_enum) domain,
    629 			      &is_a_field_of_this).symbol;
    630     }
    631   CATCH (ex, RETURN_MASK_ALL)
    632     {
    633       except = ex;
    634     }
    635   END_CATCH
    636 
    637   do_cleanups (cleanups);
    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   struct cleanup *cleanups;
    659   struct gdb_exception except = exception_none;
    660 
    661   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i",
    662 			      name_scm, &name, rest,
    663 			      &domain_arg_pos, &domain);
    664 
    665   cleanups = make_cleanup (xfree, name);
    666 
    667   TRY
    668     {
    669       symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
    670     }
    671   CATCH (ex, RETURN_MASK_ALL)
    672     {
    673       except = ex;
    674     }
    675   END_CATCH
    676 
    677   do_cleanups (cleanups);
    678   GDBSCM_HANDLE_GDB_EXCEPTION (except);
    679 
    680   if (symbol == NULL)
    681     return SCM_BOOL_F;
    682 
    683   return syscm_scm_from_symbol (symbol);
    684 }
    685 
    686 /* Initialize the Scheme symbol support.  */
    688 
    689 /* Note: The SYMBOL_ prefix on the integer constants here is present for
    690    compatibility with the Python support.  */
    691 
    692 static const scheme_integer_constant symbol_integer_constants[] =
    693 {
    694 #define X(SYM) { "SYMBOL_" #SYM, SYM }
    695   X (LOC_UNDEF),
    696   X (LOC_CONST),
    697   X (LOC_STATIC),
    698   X (LOC_REGISTER),
    699   X (LOC_ARG),
    700   X (LOC_REF_ARG),
    701   X (LOC_LOCAL),
    702   X (LOC_TYPEDEF),
    703   X (LOC_LABEL),
    704   X (LOC_BLOCK),
    705   X (LOC_CONST_BYTES),
    706   X (LOC_UNRESOLVED),
    707   X (LOC_OPTIMIZED_OUT),
    708   X (LOC_COMPUTED),
    709   X (LOC_REGPARM_ADDR),
    710 
    711   X (UNDEF_DOMAIN),
    712   X (VAR_DOMAIN),
    713   X (STRUCT_DOMAIN),
    714   X (LABEL_DOMAIN),
    715   X (VARIABLES_DOMAIN),
    716   X (FUNCTIONS_DOMAIN),
    717   X (TYPES_DOMAIN),
    718 #undef X
    719 
    720   END_INTEGER_CONSTANTS
    721 };
    722 
    723 static const scheme_function symbol_functions[] =
    724 {
    725   { "symbol?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_p),
    726     "\
    727 Return #t if the object is a <gdb:symbol> object." },
    728 
    729   { "symbol-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_valid_p),
    730     "\
    731 Return #t if object is a valid <gdb:symbol> object.\n\
    732 A valid symbol is a symbol that has not been freed.\n\
    733 Symbols are freed when the objfile they come from is freed." },
    734 
    735   { "symbol-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_type),
    736     "\
    737 Return the type of symbol." },
    738 
    739   { "symbol-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_symtab),
    740     "\
    741 Return the symbol table (<gdb:symtab>) containing symbol." },
    742 
    743   { "symbol-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_line),
    744     "\
    745 Return the line number at which the symbol was defined." },
    746 
    747   { "symbol-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_name),
    748     "\
    749 Return the name of the symbol as a string." },
    750 
    751   { "symbol-linkage-name", 1, 0, 0,
    752     as_a_scm_t_subr (gdbscm_symbol_linkage_name),
    753     "\
    754 Return the linkage name of the symbol as a string." },
    755 
    756   { "symbol-print-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_print_name),
    757     "\
    758 Return the print name of the symbol as a string.\n\
    759 This is either name or linkage-name, depending on whether the user\n\
    760 asked GDB to display demangled or mangled names." },
    761 
    762   { "symbol-addr-class", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_addr_class),
    763     "\
    764 Return the address class of the symbol." },
    765 
    766   { "symbol-needs-frame?", 1, 0, 0,
    767     as_a_scm_t_subr (gdbscm_symbol_needs_frame_p),
    768     "\
    769 Return #t if the symbol needs a frame to compute its value." },
    770 
    771   { "symbol-argument?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_argument_p),
    772     "\
    773 Return #t if the symbol is a function argument." },
    774 
    775   { "symbol-constant?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_constant_p),
    776     "\
    777 Return #t if the symbol is a constant." },
    778 
    779   { "symbol-function?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_function_p),
    780     "\
    781 Return #t if the symbol is a function." },
    782 
    783   { "symbol-variable?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_variable_p),
    784     "\
    785 Return #t if the symbol is a variable." },
    786 
    787   { "symbol-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_symbol_value),
    788     "\
    789 Return the value of the symbol.\n\
    790 \n\
    791   Arguments: <gdb:symbol> [#:frame frame]" },
    792 
    793   { "lookup-symbol", 1, 0, 1, as_a_scm_t_subr (gdbscm_lookup_symbol),
    794     "\
    795 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
    796 \n\
    797   Arguments: name [#:block block] [#:domain domain]\n\
    798     name:   a string containing the name of the symbol to lookup\n\
    799     block:  a <gdb:block> object\n\
    800     domain: a SYMBOL_*_DOMAIN value" },
    801 
    802   { "lookup-global-symbol", 1, 0, 1,
    803     as_a_scm_t_subr (gdbscm_lookup_global_symbol),
    804     "\
    805 Return <gdb:symbol> if found, otherwise #f.\n\
    806 \n\
    807   Arguments: name [#:domain domain]\n\
    808     name:   a string containing the name of the symbol to lookup\n\
    809     domain: a SYMBOL_*_DOMAIN value" },
    810 
    811   END_FUNCTIONS
    812 };
    813 
    814 void
    815 gdbscm_initialize_symbols (void)
    816 {
    817   symbol_smob_tag
    818     = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
    819   scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
    820   scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
    821 
    822   gdbscm_define_integer_constants (symbol_integer_constants, 1);
    823   gdbscm_define_functions (symbol_functions, 1);
    824 
    825   block_keyword = scm_from_latin1_keyword ("block");
    826   domain_keyword = scm_from_latin1_keyword ("domain");
    827   frame_keyword = scm_from_latin1_keyword ("frame");
    828 
    829   /* Register an objfile "free" callback so we can properly
    830      invalidate symbols when an object file is about to be deleted.  */
    831   syscm_objfile_data_key
    832     = register_objfile_data_with_cleanup (NULL, syscm_del_objfile_symbols);
    833 
    834   /* Arch-specific symbol data.  */
    835   syscm_gdbarch_data_key
    836     = gdbarch_data_register_post_init (syscm_init_arch_symbols);
    837 }
    838