Home | History | Annotate | Line # | Download | only in guile
scm-symtab.c revision 1.1.1.5
      1      1.1  christos /* Scheme interface to symbol tables.
      2      1.1  christos 
      3  1.1.1.5  christos    Copyright (C) 2008-2019 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 "symtab.h"
     25      1.1  christos #include "source.h"
     26      1.1  christos #include "objfiles.h"
     27      1.1  christos #include "block.h"
     28      1.1  christos #include "guile-internal.h"
     29      1.1  christos 
     30      1.1  christos /* A <gdb:symtab> smob.  */
     31      1.1  christos 
     32      1.1  christos typedef struct
     33      1.1  christos {
     34      1.1  christos   /* This always appears first.
     35      1.1  christos      eqable_gdb_smob is used so that symtabs are eq?-able.
     36      1.1  christos      Also, a symtab object is associated with an objfile.  eqable_gdb_smob
     37      1.1  christos      lets us track the lifetime of all symtabs associated with an objfile.
     38      1.1  christos      When an objfile is deleted we need to invalidate the symtab object.  */
     39      1.1  christos   eqable_gdb_smob base;
     40      1.1  christos 
     41      1.1  christos   /* The GDB symbol table structure.
     42      1.1  christos      If this is NULL the symtab is invalid.  This can happen when the
     43      1.1  christos      underlying objfile is freed.  */
     44      1.1  christos   struct symtab *symtab;
     45      1.1  christos } symtab_smob;
     46      1.1  christos 
     47      1.1  christos /* A <gdb:sal> smob.
     48      1.1  christos    A smob describing a gdb symtab-and-line object.
     49      1.1  christos    A sal is associated with an objfile.  All access must be gated by checking
     50      1.1  christos    the validity of symtab_scm.
     51      1.1  christos    TODO: Sals are not eq?-able at the moment, or even comparable.  */
     52      1.1  christos 
     53      1.1  christos typedef struct
     54      1.1  christos {
     55      1.1  christos   /* This always appears first.  */
     56      1.1  christos   gdb_smob base;
     57      1.1  christos 
     58      1.1  christos   /* The <gdb:symtab> object of the symtab.
     59      1.1  christos      We store this instead of a pointer to the symtab_smob because it's not
     60      1.1  christos      clear GC will know the symtab_smob is referenced by us otherwise, and we
     61      1.1  christos      need quick access to symtab_smob->symtab to know if this sal is valid.  */
     62      1.1  christos   SCM symtab_scm;
     63      1.1  christos 
     64      1.1  christos   /* The GDB symbol table and line structure.
     65      1.1  christos      This object is ephemeral in GDB, so keep our own copy.
     66      1.1  christos      The symtab pointer in this struct is not usable: If the symtab is deleted
     67      1.1  christos      this pointer will not be updated.  Use symtab_scm instead to determine
     68      1.1  christos      if this sal is valid.  */
     69      1.1  christos   struct symtab_and_line sal;
     70      1.1  christos } sal_smob;
     71      1.1  christos 
     72      1.1  christos static const char symtab_smob_name[] = "gdb:symtab";
     73      1.1  christos /* "symtab-and-line" is pretty long, and "sal" is short and unique.  */
     74      1.1  christos static const char sal_smob_name[] = "gdb:sal";
     75      1.1  christos 
     76      1.1  christos /* The tags Guile knows the symbol table smobs by.  */
     77      1.1  christos static scm_t_bits symtab_smob_tag;
     78      1.1  christos static scm_t_bits sal_smob_tag;
     79      1.1  christos 
     80      1.1  christos static const struct objfile_data *stscm_objfile_data_key;
     81      1.1  christos 
     82      1.1  christos /* Administrivia for symtab smobs.  */
     84      1.1  christos 
     85      1.1  christos /* Helper function to hash a symbol_smob.  */
     86      1.1  christos 
     87      1.1  christos static hashval_t
     88      1.1  christos stscm_hash_symtab_smob (const void *p)
     89  1.1.1.3  christos {
     90      1.1  christos   const symtab_smob *st_smob = (const symtab_smob *) p;
     91      1.1  christos 
     92      1.1  christos   return htab_hash_pointer (st_smob->symtab);
     93      1.1  christos }
     94      1.1  christos 
     95      1.1  christos /* Helper function to compute equality of symtab_smobs.  */
     96      1.1  christos 
     97      1.1  christos static int
     98      1.1  christos stscm_eq_symtab_smob (const void *ap, const void *bp)
     99  1.1.1.3  christos {
    100  1.1.1.3  christos   const symtab_smob *a = (const symtab_smob *) ap;
    101      1.1  christos   const symtab_smob *b = (const symtab_smob *) bp;
    102      1.1  christos 
    103      1.1  christos   return (a->symtab == b->symtab
    104      1.1  christos 	  && a->symtab != NULL);
    105      1.1  christos }
    106      1.1  christos 
    107      1.1  christos /* Return the struct symtab pointer -> SCM mapping table.
    108      1.1  christos    It is created if necessary.  */
    109      1.1  christos 
    110      1.1  christos static htab_t
    111      1.1  christos stscm_objfile_symtab_map (struct symtab *symtab)
    112      1.1  christos {
    113  1.1.1.3  christos   struct objfile *objfile = SYMTAB_OBJFILE (symtab);
    114      1.1  christos   htab_t htab = (htab_t) objfile_data (objfile, stscm_objfile_data_key);
    115      1.1  christos 
    116      1.1  christos   if (htab == NULL)
    117      1.1  christos     {
    118      1.1  christos       htab = gdbscm_create_eqable_gsmob_ptr_map (stscm_hash_symtab_smob,
    119      1.1  christos 						 stscm_eq_symtab_smob);
    120      1.1  christos       set_objfile_data (objfile, stscm_objfile_data_key, htab);
    121      1.1  christos     }
    122      1.1  christos 
    123      1.1  christos   return htab;
    124      1.1  christos }
    125      1.1  christos 
    126      1.1  christos /* The smob "free" function for <gdb:symtab>.  */
    127      1.1  christos 
    128      1.1  christos static size_t
    129      1.1  christos stscm_free_symtab_smob (SCM self)
    130      1.1  christos {
    131      1.1  christos   symtab_smob *st_smob = (symtab_smob *) SCM_SMOB_DATA (self);
    132      1.1  christos 
    133      1.1  christos   if (st_smob->symtab != NULL)
    134      1.1  christos     {
    135      1.1  christos       htab_t htab = stscm_objfile_symtab_map (st_smob->symtab);
    136      1.1  christos 
    137      1.1  christos       gdbscm_clear_eqable_gsmob_ptr_slot (htab, &st_smob->base);
    138      1.1  christos     }
    139      1.1  christos 
    140      1.1  christos   /* Not necessary, done to catch bugs.  */
    141      1.1  christos   st_smob->symtab = NULL;
    142      1.1  christos 
    143      1.1  christos   return 0;
    144      1.1  christos }
    145      1.1  christos 
    146      1.1  christos /* The smob "print" function for <gdb:symtab>.  */
    147      1.1  christos 
    148      1.1  christos static int
    149      1.1  christos stscm_print_symtab_smob (SCM self, SCM port, scm_print_state *pstate)
    150      1.1  christos {
    151      1.1  christos   symtab_smob *st_smob = (symtab_smob *) SCM_SMOB_DATA (self);
    152      1.1  christos 
    153      1.1  christos   gdbscm_printf (port, "#<%s ", symtab_smob_name);
    154      1.1  christos   gdbscm_printf (port, "%s",
    155      1.1  christos 		 st_smob->symtab != NULL
    156      1.1  christos 		 ? symtab_to_filename_for_display (st_smob->symtab)
    157      1.1  christos 		 : "<invalid>");
    158      1.1  christos   scm_puts (">", port);
    159      1.1  christos 
    160      1.1  christos   scm_remember_upto_here_1 (self);
    161      1.1  christos 
    162      1.1  christos   /* Non-zero means success.  */
    163      1.1  christos   return 1;
    164      1.1  christos }
    165      1.1  christos 
    166      1.1  christos /* Low level routine to create a <gdb:symtab> object.  */
    167      1.1  christos 
    168      1.1  christos static SCM
    169      1.1  christos stscm_make_symtab_smob (void)
    170      1.1  christos {
    171      1.1  christos   symtab_smob *st_smob = (symtab_smob *)
    172      1.1  christos     scm_gc_malloc (sizeof (symtab_smob), symtab_smob_name);
    173      1.1  christos   SCM st_scm;
    174      1.1  christos 
    175      1.1  christos   st_smob->symtab = NULL;
    176      1.1  christos   st_scm = scm_new_smob (symtab_smob_tag, (scm_t_bits) st_smob);
    177      1.1  christos   gdbscm_init_eqable_gsmob (&st_smob->base, st_scm);
    178      1.1  christos 
    179      1.1  christos   return st_scm;
    180      1.1  christos }
    181      1.1  christos 
    182      1.1  christos /* Return non-zero if SCM is a symbol table smob.  */
    183      1.1  christos 
    184      1.1  christos static int
    185      1.1  christos stscm_is_symtab (SCM scm)
    186      1.1  christos {
    187      1.1  christos   return SCM_SMOB_PREDICATE (symtab_smob_tag, scm);
    188      1.1  christos }
    189      1.1  christos 
    190      1.1  christos /* (symtab? object) -> boolean */
    191      1.1  christos 
    192      1.1  christos static SCM
    193      1.1  christos gdbscm_symtab_p (SCM scm)
    194      1.1  christos {
    195      1.1  christos   return scm_from_bool (stscm_is_symtab (scm));
    196      1.1  christos }
    197      1.1  christos 
    198      1.1  christos /* Create a new <gdb:symtab> object that encapsulates SYMTAB.  */
    199      1.1  christos 
    200      1.1  christos SCM
    201      1.1  christos stscm_scm_from_symtab (struct symtab *symtab)
    202      1.1  christos {
    203      1.1  christos   htab_t htab;
    204      1.1  christos   eqable_gdb_smob **slot;
    205      1.1  christos   symtab_smob *st_smob, st_smob_for_lookup;
    206      1.1  christos   SCM st_scm;
    207      1.1  christos 
    208      1.1  christos   /* If we've already created a gsmob for this symtab, return it.
    209      1.1  christos      This makes symtabs eq?-able.  */
    210      1.1  christos   htab = stscm_objfile_symtab_map (symtab);
    211      1.1  christos   st_smob_for_lookup.symtab = symtab;
    212      1.1  christos   slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &st_smob_for_lookup.base);
    213      1.1  christos   if (*slot != NULL)
    214      1.1  christos     return (*slot)->containing_scm;
    215      1.1  christos 
    216      1.1  christos   st_scm = stscm_make_symtab_smob ();
    217      1.1  christos   st_smob = (symtab_smob *) SCM_SMOB_DATA (st_scm);
    218      1.1  christos   st_smob->symtab = symtab;
    219      1.1  christos   gdbscm_fill_eqable_gsmob_ptr_slot (slot, &st_smob->base);
    220      1.1  christos 
    221      1.1  christos   return st_scm;
    222      1.1  christos }
    223      1.1  christos 
    224      1.1  christos /* Returns the <gdb:symtab> object in SELF.
    225      1.1  christos    Throws an exception if SELF is not a <gdb:symtab> object.  */
    226      1.1  christos 
    227      1.1  christos static SCM
    228      1.1  christos stscm_get_symtab_arg_unsafe (SCM self, int arg_pos, const char *func_name)
    229      1.1  christos {
    230      1.1  christos   SCM_ASSERT_TYPE (stscm_is_symtab (self), self, arg_pos, func_name,
    231      1.1  christos 		   symtab_smob_name);
    232      1.1  christos 
    233      1.1  christos   return self;
    234      1.1  christos }
    235      1.1  christos 
    236      1.1  christos /* Returns a pointer to the symtab smob of SELF.
    237      1.1  christos    Throws an exception if SELF is not a <gdb:symtab> object.  */
    238      1.1  christos 
    239      1.1  christos static symtab_smob *
    240      1.1  christos stscm_get_symtab_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
    241      1.1  christos {
    242      1.1  christos   SCM st_scm = stscm_get_symtab_arg_unsafe (self, arg_pos, func_name);
    243      1.1  christos   symtab_smob *st_smob = (symtab_smob *) SCM_SMOB_DATA (st_scm);
    244      1.1  christos 
    245      1.1  christos   return st_smob;
    246      1.1  christos }
    247      1.1  christos 
    248      1.1  christos /* Return non-zero if symtab ST_SMOB is valid.  */
    249      1.1  christos 
    250      1.1  christos static int
    251      1.1  christos stscm_is_valid (symtab_smob *st_smob)
    252      1.1  christos {
    253      1.1  christos   return st_smob->symtab != NULL;
    254      1.1  christos }
    255      1.1  christos 
    256      1.1  christos /* Throw a Scheme error if SELF is not a valid symtab smob.
    257      1.1  christos    Otherwise return a pointer to the symtab_smob object.  */
    258      1.1  christos 
    259      1.1  christos static symtab_smob *
    260      1.1  christos stscm_get_valid_symtab_smob_arg_unsafe (SCM self, int arg_pos,
    261      1.1  christos 					const char *func_name)
    262      1.1  christos {
    263      1.1  christos   symtab_smob *st_smob
    264      1.1  christos     = stscm_get_symtab_smob_arg_unsafe (self, arg_pos, func_name);
    265      1.1  christos 
    266      1.1  christos   if (!stscm_is_valid (st_smob))
    267      1.1  christos     {
    268      1.1  christos       gdbscm_invalid_object_error (func_name, arg_pos, self,
    269      1.1  christos 				   _("<gdb:symtab>"));
    270      1.1  christos     }
    271      1.1  christos 
    272      1.1  christos   return st_smob;
    273      1.1  christos }
    274      1.1  christos 
    275      1.1  christos /* Helper function for stscm_del_objfile_symtabs to mark the symtab
    276      1.1  christos    as invalid.  */
    277      1.1  christos 
    278      1.1  christos static int
    279      1.1  christos stscm_mark_symtab_invalid (void **slot, void *info)
    280      1.1  christos {
    281      1.1  christos   symtab_smob *st_smob = (symtab_smob *) *slot;
    282      1.1  christos 
    283      1.1  christos   st_smob->symtab = NULL;
    284      1.1  christos   return 1;
    285      1.1  christos }
    286      1.1  christos 
    287      1.1  christos /* This function is called when an objfile is about to be freed.
    288      1.1  christos    Invalidate the symbol table as further actions on the symbol table
    289      1.1  christos    would result in bad data.  All access to st_smob->symtab should be
    290      1.1  christos    gated by stscm_get_valid_symtab_smob_arg_unsafe which will raise an
    291      1.1  christos    exception on invalid symbol tables.  */
    292      1.1  christos 
    293      1.1  christos static void
    294      1.1  christos stscm_del_objfile_symtabs (struct objfile *objfile, void *datum)
    295  1.1.1.3  christos {
    296      1.1  christos   htab_t htab = (htab_t) datum;
    297      1.1  christos 
    298      1.1  christos   if (htab != NULL)
    299      1.1  christos     {
    300      1.1  christos       htab_traverse_noresize (htab, stscm_mark_symtab_invalid, NULL);
    301      1.1  christos       htab_delete (htab);
    302      1.1  christos     }
    303      1.1  christos }
    304      1.1  christos 
    305      1.1  christos /* Symbol table methods.  */
    307      1.1  christos 
    308      1.1  christos /* (symtab-valid? <gdb:symtab>) -> boolean
    309      1.1  christos    Returns #t if SELF still exists in GDB.  */
    310      1.1  christos 
    311      1.1  christos static SCM
    312      1.1  christos gdbscm_symtab_valid_p (SCM self)
    313      1.1  christos {
    314      1.1  christos   symtab_smob *st_smob
    315      1.1  christos     = stscm_get_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    316      1.1  christos 
    317      1.1  christos   return scm_from_bool (stscm_is_valid (st_smob));
    318      1.1  christos }
    319      1.1  christos 
    320      1.1  christos /* (symtab-filename <gdb:symtab>) -> string */
    321      1.1  christos 
    322      1.1  christos static SCM
    323      1.1  christos gdbscm_symtab_filename (SCM self)
    324      1.1  christos {
    325      1.1  christos   symtab_smob *st_smob
    326      1.1  christos     = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    327      1.1  christos   struct symtab *symtab = st_smob->symtab;
    328      1.1  christos 
    329      1.1  christos   return gdbscm_scm_from_c_string (symtab_to_filename_for_display (symtab));
    330      1.1  christos }
    331      1.1  christos 
    332      1.1  christos /* (symtab-fullname <gdb:symtab>) -> string */
    333      1.1  christos 
    334      1.1  christos static SCM
    335      1.1  christos gdbscm_symtab_fullname (SCM self)
    336      1.1  christos {
    337      1.1  christos   symtab_smob *st_smob
    338      1.1  christos     = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    339      1.1  christos   struct symtab *symtab = st_smob->symtab;
    340      1.1  christos 
    341      1.1  christos   return gdbscm_scm_from_c_string (symtab_to_fullname (symtab));
    342      1.1  christos }
    343      1.1  christos 
    344      1.1  christos /* (symtab-objfile <gdb:symtab>) -> <gdb:objfile> */
    345      1.1  christos 
    346      1.1  christos static SCM
    347      1.1  christos gdbscm_symtab_objfile (SCM self)
    348      1.1  christos {
    349      1.1  christos   symtab_smob *st_smob
    350      1.1  christos     = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    351      1.1  christos   const struct symtab *symtab = st_smob->symtab;
    352      1.1  christos 
    353      1.1  christos   return ofscm_scm_from_objfile (SYMTAB_OBJFILE (symtab));
    354      1.1  christos }
    355      1.1  christos 
    356      1.1  christos /* (symtab-global-block <gdb:symtab>) -> <gdb:block>
    357      1.1  christos    Return the GLOBAL_BLOCK of the underlying symtab.  */
    358      1.1  christos 
    359      1.1  christos static SCM
    360      1.1  christos gdbscm_symtab_global_block (SCM self)
    361      1.1  christos {
    362      1.1  christos   symtab_smob *st_smob
    363      1.1  christos     = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    364      1.1  christos   const struct symtab *symtab = st_smob->symtab;
    365      1.1  christos   const struct blockvector *blockvector;
    366      1.1  christos   const struct block *block;
    367      1.1  christos 
    368      1.1  christos   blockvector = SYMTAB_BLOCKVECTOR (symtab);
    369      1.1  christos   block = BLOCKVECTOR_BLOCK (blockvector, GLOBAL_BLOCK);
    370      1.1  christos 
    371      1.1  christos   return bkscm_scm_from_block (block, SYMTAB_OBJFILE (symtab));
    372      1.1  christos }
    373      1.1  christos 
    374      1.1  christos /* (symtab-static-block <gdb:symtab>) -> <gdb:block>
    375      1.1  christos    Return the STATIC_BLOCK of the underlying symtab.  */
    376      1.1  christos 
    377      1.1  christos static SCM
    378      1.1  christos gdbscm_symtab_static_block (SCM self)
    379      1.1  christos {
    380      1.1  christos   symtab_smob *st_smob
    381      1.1  christos     = stscm_get_valid_symtab_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
    382      1.1  christos   const struct symtab *symtab = st_smob->symtab;
    383      1.1  christos   const struct blockvector *blockvector;
    384      1.1  christos   const struct block *block;
    385      1.1  christos 
    386      1.1  christos   blockvector = SYMTAB_BLOCKVECTOR (symtab);
    387      1.1  christos   block = BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK);
    388      1.1  christos 
    389      1.1  christos   return bkscm_scm_from_block (block, SYMTAB_OBJFILE (symtab));
    390      1.1  christos }
    391      1.1  christos 
    392      1.1  christos /* Administrivia for sal (symtab-and-line) smobs.  */
    394      1.1  christos 
    395      1.1  christos /* The smob "print" function for <gdb:sal>.  */
    396      1.1  christos 
    397      1.1  christos static int
    398      1.1  christos stscm_print_sal_smob (SCM self, SCM port, scm_print_state *pstate)
    399      1.1  christos {
    400      1.1  christos   sal_smob *s_smob = (sal_smob *) SCM_SMOB_DATA (self);
    401      1.1  christos 
    402      1.1  christos   gdbscm_printf (port, "#<%s ", symtab_smob_name);
    403      1.1  christos   scm_write (s_smob->symtab_scm, port);
    404      1.1  christos   if (s_smob->sal.line != 0)
    405      1.1  christos     gdbscm_printf (port, " line %d", s_smob->sal.line);
    406      1.1  christos   scm_puts (">", port);
    407      1.1  christos 
    408      1.1  christos   scm_remember_upto_here_1 (self);
    409      1.1  christos 
    410      1.1  christos   /* Non-zero means success.  */
    411      1.1  christos   return 1;
    412      1.1  christos }
    413      1.1  christos 
    414      1.1  christos /* Low level routine to create a <gdb:sal> object.  */
    415      1.1  christos 
    416      1.1  christos static SCM
    417      1.1  christos stscm_make_sal_smob (void)
    418      1.1  christos {
    419      1.1  christos   sal_smob *s_smob
    420      1.1  christos     = (sal_smob *) scm_gc_malloc (sizeof (sal_smob), sal_smob_name);
    421  1.1.1.5  christos   SCM s_scm;
    422      1.1  christos 
    423      1.1  christos   s_smob->symtab_scm = SCM_BOOL_F;
    424      1.1  christos   new (&s_smob->sal) symtab_and_line ();
    425      1.1  christos   s_scm = scm_new_smob (sal_smob_tag, (scm_t_bits) s_smob);
    426      1.1  christos   gdbscm_init_gsmob (&s_smob->base);
    427      1.1  christos 
    428      1.1  christos   return s_scm;
    429      1.1  christos }
    430      1.1  christos 
    431      1.1  christos /* Return non-zero if SCM is a <gdb:sal> object.  */
    432      1.1  christos 
    433      1.1  christos static int
    434      1.1  christos stscm_is_sal (SCM scm)
    435      1.1  christos {
    436      1.1  christos   return SCM_SMOB_PREDICATE (sal_smob_tag, scm);
    437      1.1  christos }
    438      1.1  christos 
    439      1.1  christos /* (sal? object) -> boolean */
    440      1.1  christos 
    441      1.1  christos static SCM
    442      1.1  christos gdbscm_sal_p (SCM scm)
    443      1.1  christos {
    444      1.1  christos   return scm_from_bool (stscm_is_sal (scm));
    445      1.1  christos }
    446      1.1  christos 
    447      1.1  christos /* Create a new <gdb:sal> object that encapsulates SAL.  */
    448      1.1  christos 
    449      1.1  christos SCM
    450      1.1  christos stscm_scm_from_sal (struct symtab_and_line sal)
    451      1.1  christos {
    452      1.1  christos   SCM st_scm, s_scm;
    453      1.1  christos   sal_smob *s_smob;
    454      1.1  christos 
    455      1.1  christos   st_scm = SCM_BOOL_F;
    456      1.1  christos   if (sal.symtab != NULL)
    457      1.1  christos     st_scm = stscm_scm_from_symtab (sal.symtab);
    458      1.1  christos 
    459      1.1  christos   s_scm = stscm_make_sal_smob ();
    460      1.1  christos   s_smob = (sal_smob *) SCM_SMOB_DATA (s_scm);
    461      1.1  christos   s_smob->symtab_scm = st_scm;
    462      1.1  christos   s_smob->sal = sal;
    463      1.1  christos 
    464      1.1  christos   return s_scm;
    465      1.1  christos }
    466      1.1  christos 
    467      1.1  christos /* Returns the <gdb:sal> object in SELF.
    468      1.1  christos    Throws an exception if SELF is not a <gdb:sal> object.  */
    469      1.1  christos 
    470      1.1  christos static SCM
    471      1.1  christos stscm_get_sal_arg (SCM self, int arg_pos, const char *func_name)
    472      1.1  christos {
    473      1.1  christos   SCM_ASSERT_TYPE (stscm_is_sal (self), self, arg_pos, func_name,
    474      1.1  christos 		   sal_smob_name);
    475      1.1  christos 
    476      1.1  christos   return self;
    477      1.1  christos }
    478      1.1  christos 
    479      1.1  christos /* Returns a pointer to the sal smob of SELF.
    480      1.1  christos    Throws an exception if SELF is not a <gdb:sal> object.  */
    481      1.1  christos 
    482      1.1  christos static sal_smob *
    483      1.1  christos stscm_get_sal_smob_arg (SCM self, int arg_pos, const char *func_name)
    484      1.1  christos {
    485      1.1  christos   SCM s_scm = stscm_get_sal_arg (self, arg_pos, func_name);
    486      1.1  christos   sal_smob *s_smob = (sal_smob *) SCM_SMOB_DATA (s_scm);
    487      1.1  christos 
    488      1.1  christos   return s_smob;
    489      1.1  christos }
    490      1.1  christos 
    491      1.1  christos /* Return non-zero if the symtab in S_SMOB is valid.  */
    492      1.1  christos 
    493      1.1  christos static int
    494      1.1  christos stscm_sal_is_valid (sal_smob *s_smob)
    495      1.1  christos {
    496      1.1  christos   symtab_smob *st_smob;
    497      1.1  christos 
    498      1.1  christos   /* If there's no symtab that's ok, the sal is still valid.  */
    499      1.1  christos   if (gdbscm_is_false (s_smob->symtab_scm))
    500      1.1  christos     return 1;
    501      1.1  christos 
    502      1.1  christos   st_smob = (symtab_smob *) SCM_SMOB_DATA (s_smob->symtab_scm);
    503      1.1  christos 
    504      1.1  christos   return st_smob->symtab != NULL;
    505      1.1  christos }
    506      1.1  christos 
    507      1.1  christos /* Throw a Scheme error if SELF is not a valid sal smob.
    508      1.1  christos    Otherwise return a pointer to the sal_smob object.  */
    509      1.1  christos 
    510      1.1  christos static sal_smob *
    511      1.1  christos stscm_get_valid_sal_smob_arg (SCM self, int arg_pos, const char *func_name)
    512      1.1  christos {
    513      1.1  christos   sal_smob *s_smob = stscm_get_sal_smob_arg (self, arg_pos, func_name);
    514      1.1  christos 
    515      1.1  christos   if (!stscm_sal_is_valid (s_smob))
    516      1.1  christos     {
    517      1.1  christos       gdbscm_invalid_object_error (func_name, arg_pos, self,
    518      1.1  christos 				   _("<gdb:sal>"));
    519      1.1  christos     }
    520      1.1  christos 
    521      1.1  christos   return s_smob;
    522      1.1  christos }
    523      1.1  christos 
    524      1.1  christos /* sal methods */
    526      1.1  christos 
    527      1.1  christos /* (sal-valid? <gdb:sal>) -> boolean
    528      1.1  christos    Returns #t if the symtab for SELF still exists in GDB.  */
    529      1.1  christos 
    530      1.1  christos static SCM
    531      1.1  christos gdbscm_sal_valid_p (SCM self)
    532      1.1  christos {
    533      1.1  christos   sal_smob *s_smob = stscm_get_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    534      1.1  christos 
    535      1.1  christos   return scm_from_bool (stscm_sal_is_valid (s_smob));
    536      1.1  christos }
    537      1.1  christos 
    538      1.1  christos /* (sal-pc <gdb:sal>) -> address */
    539      1.1  christos 
    540      1.1  christos static SCM
    541      1.1  christos gdbscm_sal_pc (SCM self)
    542      1.1  christos {
    543      1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    544      1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    545      1.1  christos 
    546      1.1  christos   return gdbscm_scm_from_ulongest (sal->pc);
    547      1.1  christos }
    548      1.1  christos 
    549      1.1  christos /* (sal-last <gdb:sal>) -> address
    550      1.1  christos    Returns #f if no ending address is recorded.  */
    551      1.1  christos 
    552      1.1  christos static SCM
    553      1.1  christos gdbscm_sal_last (SCM self)
    554      1.1  christos {
    555      1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    556      1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    557      1.1  christos 
    558      1.1  christos   if (sal->end > 0)
    559      1.1  christos     return gdbscm_scm_from_ulongest (sal->end - 1);
    560      1.1  christos   return SCM_BOOL_F;
    561      1.1  christos }
    562      1.1  christos 
    563      1.1  christos /* (sal-line <gdb:sal>) -> integer
    564      1.1  christos    Returns #f if no line number is recorded.  */
    565      1.1  christos 
    566      1.1  christos static SCM
    567      1.1  christos gdbscm_sal_line (SCM self)
    568      1.1  christos {
    569      1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    570      1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    571      1.1  christos 
    572      1.1  christos   if (sal->line > 0)
    573      1.1  christos     return scm_from_int (sal->line);
    574      1.1  christos   return SCM_BOOL_F;
    575      1.1  christos }
    576      1.1  christos 
    577      1.1  christos /* (sal-symtab <gdb:sal>) -> <gdb:symtab>
    578      1.1  christos    Returns #f if no symtab is recorded.  */
    579      1.1  christos 
    580      1.1  christos static SCM
    581      1.1  christos gdbscm_sal_symtab (SCM self)
    582      1.1  christos {
    583      1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    584      1.1  christos 
    585      1.1  christos   return s_smob->symtab_scm;
    586      1.1  christos }
    587      1.1  christos 
    588      1.1  christos /* (find-pc-line address) -> <gdb:sal> */
    589      1.1  christos 
    590  1.1.1.5  christos static SCM
    591      1.1  christos gdbscm_find_pc_line (SCM pc_scm)
    592      1.1  christos {
    593      1.1  christos   ULONGEST pc_ull;
    594  1.1.1.2  christos   symtab_and_line sal;
    595      1.1  christos 
    596      1.1  christos   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "U", pc_scm, &pc_ull);
    597      1.1  christos 
    598      1.1  christos   TRY
    599      1.1  christos     {
    600  1.1.1.2  christos       CORE_ADDR pc = (CORE_ADDR) pc_ull;
    601  1.1.1.2  christos 
    602  1.1.1.2  christos       sal = find_pc_line (pc, 0);
    603  1.1.1.2  christos     }
    604  1.1.1.2  christos   CATCH (except, RETURN_MASK_ALL)
    605      1.1  christos     {
    606      1.1  christos       GDBSCM_HANDLE_GDB_EXCEPTION (except);
    607      1.1  christos     }
    608      1.1  christos   END_CATCH
    609      1.1  christos 
    610      1.1  christos   return stscm_scm_from_sal (sal);
    611      1.1  christos }
    612      1.1  christos 
    613  1.1.1.3  christos /* Initialize the Scheme symbol support.  */
    615      1.1  christos 
    616      1.1  christos static const scheme_function symtab_functions[] =
    617  1.1.1.3  christos {
    618      1.1  christos   { "symtab?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symtab_p),
    619      1.1  christos     "\
    620      1.1  christos Return #t if the object is a <gdb:symtab> object." },
    621      1.1  christos 
    622  1.1.1.3  christos   { "symtab-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symtab_valid_p),
    623      1.1  christos     "\
    624      1.1  christos Return #t if the symtab still exists in GDB.\n\
    625      1.1  christos Symtabs are deleted when the corresponding objfile is freed." },
    626  1.1.1.3  christos 
    627      1.1  christos   { "symtab-filename", 1, 0, 0, as_a_scm_t_subr (gdbscm_symtab_filename),
    628      1.1  christos     "\
    629      1.1  christos Return the symtab's source file name." },
    630  1.1.1.3  christos 
    631      1.1  christos   { "symtab-fullname", 1, 0, 0, as_a_scm_t_subr (gdbscm_symtab_fullname),
    632      1.1  christos     "\
    633      1.1  christos Return the symtab's full source file name." },
    634  1.1.1.3  christos 
    635  1.1.1.3  christos   { "symtab-objfile", 1, 0, 0, as_a_scm_t_subr (gdbscm_symtab_objfile),
    636      1.1  christos     "\
    637      1.1  christos Return the symtab's objfile." },
    638      1.1  christos 
    639  1.1.1.3  christos   { "symtab-global-block", 1, 0, 0,
    640  1.1.1.3  christos     as_a_scm_t_subr (gdbscm_symtab_global_block),
    641      1.1  christos     "\
    642      1.1  christos Return the symtab's global block." },
    643      1.1  christos 
    644  1.1.1.3  christos   { "symtab-static-block", 1, 0, 0,
    645      1.1  christos     as_a_scm_t_subr (gdbscm_symtab_static_block),
    646      1.1  christos     "\
    647      1.1  christos Return the symtab's static block." },
    648  1.1.1.3  christos 
    649      1.1  christos   { "sal?", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_p),
    650      1.1  christos     "\
    651      1.1  christos Return #t if the object is a <gdb:sal> (symtab-and-line) object." },
    652      1.1  christos 
    653  1.1.1.3  christos   { "sal-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_valid_p),
    654      1.1  christos     "\
    655      1.1  christos Return #t if the symtab for the sal still exists in GDB.\n\
    656      1.1  christos Symtabs are deleted when the corresponding objfile is freed." },
    657  1.1.1.3  christos 
    658      1.1  christos   { "sal-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_symtab),
    659      1.1  christos     "\
    660      1.1  christos Return the sal's symtab." },
    661  1.1.1.3  christos 
    662      1.1  christos   { "sal-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_line),
    663      1.1  christos     "\
    664      1.1  christos Return the sal's line number, or #f if there is none." },
    665  1.1.1.3  christos 
    666      1.1  christos   { "sal-pc", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_pc),
    667      1.1  christos     "\
    668      1.1  christos Return the sal's address." },
    669  1.1.1.3  christos 
    670      1.1  christos   { "sal-last", 1, 0, 0, as_a_scm_t_subr (gdbscm_sal_last),
    671      1.1  christos     "\
    672      1.1  christos Return the last address specified by the sal, or #f if there is none." },
    673      1.1  christos 
    674      1.1  christos   { "find-pc-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_find_pc_line),
    675      1.1  christos     "\
    676      1.1  christos Return the sal corresponding to the address, or #f if there isn't one.\n\
    677      1.1  christos \n\
    678      1.1  christos   Arguments: address" },
    679      1.1  christos 
    680      1.1  christos   END_FUNCTIONS
    681      1.1  christos };
    682      1.1  christos 
    683      1.1  christos void
    684      1.1  christos gdbscm_initialize_symtabs (void)
    685      1.1  christos {
    686      1.1  christos   symtab_smob_tag
    687      1.1  christos     = gdbscm_make_smob_type (symtab_smob_name, sizeof (symtab_smob));
    688      1.1  christos   scm_set_smob_free (symtab_smob_tag, stscm_free_symtab_smob);
    689      1.1  christos   scm_set_smob_print (symtab_smob_tag, stscm_print_symtab_smob);
    690      1.1  christos 
    691      1.1  christos   sal_smob_tag = gdbscm_make_smob_type (sal_smob_name, sizeof (sal_smob));
    692      1.1  christos   scm_set_smob_print (sal_smob_tag, stscm_print_sal_smob);
    693      1.1  christos 
    694      1.1  christos   gdbscm_define_functions (symtab_functions, 1);
    695      1.1  christos 
    696      1.1  christos   /* Register an objfile "free" callback so we can properly
    697                         invalidate symbol tables, and symbol table and line data
    698                         structures when an object file that is about to be deleted.  */
    699                      stscm_objfile_data_key
    700                        = register_objfile_data_with_cleanup (NULL, stscm_del_objfile_symtabs);
    701                    }
    702