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