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