Home | History | Annotate | Line # | Download | only in guile
scm-symtab.c revision 1.1.1.1.2.1
      1          1.1  christos /* Scheme interface to symbol tables.
      2          1.1  christos 
      3          1.1  christos    Copyright (C) 2008-2015 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  christos {
     90          1.1  christos   const symtab_smob *st_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  christos {
    100          1.1  christos   const symtab_smob *a = ap;
    101          1.1  christos   const symtab_smob *b = 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  christos   struct objfile *objfile = SYMTAB_OBJFILE (symtab);
    114          1.1  christos   htab_t htab = 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  christos {
    296          1.1  christos   htab_t htab = 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   symtab_smob *st_smob = (symtab_smob *) SCM_SMOB_DATA (s_smob->symtab_scm);
    402          1.1  christos 
    403          1.1  christos   gdbscm_printf (port, "#<%s ", symtab_smob_name);
    404          1.1  christos   scm_write (s_smob->symtab_scm, port);
    405          1.1  christos   if (s_smob->sal.line != 0)
    406          1.1  christos     gdbscm_printf (port, " line %d", s_smob->sal.line);
    407          1.1  christos   scm_puts (">", port);
    408          1.1  christos 
    409          1.1  christos   scm_remember_upto_here_1 (self);
    410          1.1  christos 
    411          1.1  christos   /* Non-zero means success.  */
    412          1.1  christos   return 1;
    413          1.1  christos }
    414          1.1  christos 
    415          1.1  christos /* Low level routine to create a <gdb:sal> object.  */
    416          1.1  christos 
    417          1.1  christos static SCM
    418          1.1  christos stscm_make_sal_smob (void)
    419          1.1  christos {
    420          1.1  christos   sal_smob *s_smob
    421          1.1  christos     = (sal_smob *) scm_gc_malloc (sizeof (sal_smob), sal_smob_name);
    422          1.1  christos   SCM s_scm;
    423          1.1  christos 
    424          1.1  christos   s_smob->symtab_scm = SCM_BOOL_F;
    425          1.1  christos   memset (&s_smob->sal, 0, sizeof (s_smob->sal));
    426          1.1  christos   s_scm = scm_new_smob (sal_smob_tag, (scm_t_bits) s_smob);
    427          1.1  christos   gdbscm_init_gsmob (&s_smob->base);
    428          1.1  christos 
    429          1.1  christos   return s_scm;
    430          1.1  christos }
    431          1.1  christos 
    432          1.1  christos /* Return non-zero if SCM is a <gdb:sal> object.  */
    433          1.1  christos 
    434          1.1  christos static int
    435          1.1  christos stscm_is_sal (SCM scm)
    436          1.1  christos {
    437          1.1  christos   return SCM_SMOB_PREDICATE (sal_smob_tag, scm);
    438          1.1  christos }
    439          1.1  christos 
    440          1.1  christos /* (sal? object) -> boolean */
    441          1.1  christos 
    442          1.1  christos static SCM
    443          1.1  christos gdbscm_sal_p (SCM scm)
    444          1.1  christos {
    445          1.1  christos   return scm_from_bool (stscm_is_sal (scm));
    446          1.1  christos }
    447          1.1  christos 
    448          1.1  christos /* Create a new <gdb:sal> object that encapsulates SAL.  */
    449          1.1  christos 
    450          1.1  christos SCM
    451          1.1  christos stscm_scm_from_sal (struct symtab_and_line sal)
    452          1.1  christos {
    453          1.1  christos   SCM st_scm, s_scm;
    454          1.1  christos   sal_smob *s_smob;
    455          1.1  christos 
    456          1.1  christos   st_scm = SCM_BOOL_F;
    457          1.1  christos   if (sal.symtab != NULL)
    458          1.1  christos     st_scm = stscm_scm_from_symtab (sal.symtab);
    459          1.1  christos 
    460          1.1  christos   s_scm = stscm_make_sal_smob ();
    461          1.1  christos   s_smob = (sal_smob *) SCM_SMOB_DATA (s_scm);
    462          1.1  christos   s_smob->symtab_scm = st_scm;
    463          1.1  christos   s_smob->sal = sal;
    464          1.1  christos 
    465          1.1  christos   return s_scm;
    466          1.1  christos }
    467          1.1  christos 
    468          1.1  christos /* Returns the <gdb:sal> object in SELF.
    469          1.1  christos    Throws an exception if SELF is not a <gdb:sal> object.  */
    470          1.1  christos 
    471          1.1  christos static SCM
    472          1.1  christos stscm_get_sal_arg (SCM self, int arg_pos, const char *func_name)
    473          1.1  christos {
    474          1.1  christos   SCM_ASSERT_TYPE (stscm_is_sal (self), self, arg_pos, func_name,
    475          1.1  christos 		   sal_smob_name);
    476          1.1  christos 
    477          1.1  christos   return self;
    478          1.1  christos }
    479          1.1  christos 
    480          1.1  christos /* Returns a pointer to the sal smob of SELF.
    481          1.1  christos    Throws an exception if SELF is not a <gdb:sal> object.  */
    482          1.1  christos 
    483          1.1  christos static sal_smob *
    484          1.1  christos stscm_get_sal_smob_arg (SCM self, int arg_pos, const char *func_name)
    485          1.1  christos {
    486          1.1  christos   SCM s_scm = stscm_get_sal_arg (self, arg_pos, func_name);
    487          1.1  christos   sal_smob *s_smob = (sal_smob *) SCM_SMOB_DATA (s_scm);
    488          1.1  christos 
    489          1.1  christos   return s_smob;
    490          1.1  christos }
    491          1.1  christos 
    492          1.1  christos /* Return non-zero if the symtab in S_SMOB is valid.  */
    493          1.1  christos 
    494          1.1  christos static int
    495          1.1  christos stscm_sal_is_valid (sal_smob *s_smob)
    496          1.1  christos {
    497          1.1  christos   symtab_smob *st_smob;
    498          1.1  christos 
    499          1.1  christos   /* If there's no symtab that's ok, the sal is still valid.  */
    500          1.1  christos   if (gdbscm_is_false (s_smob->symtab_scm))
    501          1.1  christos     return 1;
    502          1.1  christos 
    503          1.1  christos   st_smob = (symtab_smob *) SCM_SMOB_DATA (s_smob->symtab_scm);
    504          1.1  christos 
    505          1.1  christos   return st_smob->symtab != NULL;
    506          1.1  christos }
    507          1.1  christos 
    508          1.1  christos /* Throw a Scheme error if SELF is not a valid sal smob.
    509          1.1  christos    Otherwise return a pointer to the sal_smob object.  */
    510          1.1  christos 
    511          1.1  christos static sal_smob *
    512          1.1  christos stscm_get_valid_sal_smob_arg (SCM self, int arg_pos, const char *func_name)
    513          1.1  christos {
    514          1.1  christos   sal_smob *s_smob = stscm_get_sal_smob_arg (self, arg_pos, func_name);
    515          1.1  christos 
    516          1.1  christos   if (!stscm_sal_is_valid (s_smob))
    517          1.1  christos     {
    518          1.1  christos       gdbscm_invalid_object_error (func_name, arg_pos, self,
    519          1.1  christos 				   _("<gdb:sal>"));
    520          1.1  christos     }
    521          1.1  christos 
    522          1.1  christos   return s_smob;
    523          1.1  christos }
    524          1.1  christos 
    525          1.1  christos /* sal methods */
    527          1.1  christos 
    528          1.1  christos /* (sal-valid? <gdb:sal>) -> boolean
    529          1.1  christos    Returns #t if the symtab for SELF still exists in GDB.  */
    530          1.1  christos 
    531          1.1  christos static SCM
    532          1.1  christos gdbscm_sal_valid_p (SCM self)
    533          1.1  christos {
    534          1.1  christos   sal_smob *s_smob = stscm_get_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    535          1.1  christos 
    536          1.1  christos   return scm_from_bool (stscm_sal_is_valid (s_smob));
    537          1.1  christos }
    538          1.1  christos 
    539          1.1  christos /* (sal-pc <gdb:sal>) -> address */
    540          1.1  christos 
    541          1.1  christos static SCM
    542          1.1  christos gdbscm_sal_pc (SCM self)
    543          1.1  christos {
    544          1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    545          1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    546          1.1  christos 
    547          1.1  christos   return gdbscm_scm_from_ulongest (sal->pc);
    548          1.1  christos }
    549          1.1  christos 
    550          1.1  christos /* (sal-last <gdb:sal>) -> address
    551          1.1  christos    Returns #f if no ending address is recorded.  */
    552          1.1  christos 
    553          1.1  christos static SCM
    554          1.1  christos gdbscm_sal_last (SCM self)
    555          1.1  christos {
    556          1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    557          1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    558          1.1  christos 
    559          1.1  christos   if (sal->end > 0)
    560          1.1  christos     return gdbscm_scm_from_ulongest (sal->end - 1);
    561          1.1  christos   return SCM_BOOL_F;
    562          1.1  christos }
    563          1.1  christos 
    564          1.1  christos /* (sal-line <gdb:sal>) -> integer
    565          1.1  christos    Returns #f if no line number is recorded.  */
    566          1.1  christos 
    567          1.1  christos static SCM
    568          1.1  christos gdbscm_sal_line (SCM self)
    569          1.1  christos {
    570          1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    571          1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    572          1.1  christos 
    573          1.1  christos   if (sal->line > 0)
    574          1.1  christos     return scm_from_int (sal->line);
    575          1.1  christos   return SCM_BOOL_F;
    576          1.1  christos }
    577          1.1  christos 
    578          1.1  christos /* (sal-symtab <gdb:sal>) -> <gdb:symtab>
    579          1.1  christos    Returns #f if no symtab is recorded.  */
    580          1.1  christos 
    581          1.1  christos static SCM
    582          1.1  christos gdbscm_sal_symtab (SCM self)
    583          1.1  christos {
    584          1.1  christos   sal_smob *s_smob = stscm_get_valid_sal_smob_arg (self, SCM_ARG1, FUNC_NAME);
    585          1.1  christos   const struct symtab_and_line *sal = &s_smob->sal;
    586          1.1  christos 
    587          1.1  christos   return s_smob->symtab_scm;
    588          1.1  christos }
    589          1.1  christos 
    590          1.1  christos /* (find-pc-line address) -> <gdb:sal> */
    591          1.1  christos 
    592          1.1  christos static SCM
    593          1.1  christos gdbscm_find_pc_line (SCM pc_scm)
    594          1.1  christos {
    595          1.1  christos   ULONGEST pc_ull;
    596          1.1  christos   struct symtab_and_line sal;
    597          1.1  christos 
    598  1.1.1.1.2.1  pgoyette   init_sal (&sal); /* -Wall */
    599          1.1  christos 
    600          1.1  christos   gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, NULL, "U", pc_scm, &pc_ull);
    601          1.1  christos 
    602          1.1  christos   TRY
    603          1.1  christos     {
    604  1.1.1.1.2.1  pgoyette       CORE_ADDR pc = (CORE_ADDR) pc_ull;
    605  1.1.1.1.2.1  pgoyette 
    606  1.1.1.1.2.1  pgoyette       sal = find_pc_line (pc, 0);
    607  1.1.1.1.2.1  pgoyette     }
    608  1.1.1.1.2.1  pgoyette   CATCH (except, RETURN_MASK_ALL)
    609          1.1  christos     {
    610          1.1  christos       GDBSCM_HANDLE_GDB_EXCEPTION (except);
    611          1.1  christos     }
    612          1.1  christos   END_CATCH
    613          1.1  christos 
    614          1.1  christos   return stscm_scm_from_sal (sal);
    615          1.1  christos }
    616          1.1  christos 
    617          1.1  christos /* Initialize the Scheme symbol support.  */
    619          1.1  christos 
    620          1.1  christos static const scheme_function symtab_functions[] =
    621          1.1  christos {
    622          1.1  christos   { "symtab?", 1, 0, 0, gdbscm_symtab_p,
    623          1.1  christos     "\
    624          1.1  christos Return #t if the object is a <gdb:symtab> object." },
    625          1.1  christos 
    626          1.1  christos   { "symtab-valid?", 1, 0, 0, gdbscm_symtab_valid_p,
    627          1.1  christos     "\
    628          1.1  christos Return #t if the symtab still exists in GDB.\n\
    629          1.1  christos Symtabs are deleted when the corresponding objfile is freed." },
    630          1.1  christos 
    631          1.1  christos   { "symtab-filename", 1, 0, 0, gdbscm_symtab_filename,
    632          1.1  christos     "\
    633          1.1  christos Return the symtab's source file name." },
    634          1.1  christos 
    635          1.1  christos   { "symtab-fullname", 1, 0, 0, gdbscm_symtab_fullname,
    636          1.1  christos     "\
    637          1.1  christos Return the symtab's full source file name." },
    638          1.1  christos 
    639          1.1  christos   { "symtab-objfile", 1, 0, 0, gdbscm_symtab_objfile,
    640          1.1  christos     "\
    641          1.1  christos Return the symtab's objfile." },
    642          1.1  christos 
    643          1.1  christos   { "symtab-global-block", 1, 0, 0, gdbscm_symtab_global_block,
    644          1.1  christos     "\
    645          1.1  christos Return the symtab's global block." },
    646          1.1  christos 
    647          1.1  christos   { "symtab-static-block", 1, 0, 0, gdbscm_symtab_static_block,
    648          1.1  christos     "\
    649          1.1  christos Return the symtab's static block." },
    650          1.1  christos 
    651          1.1  christos   { "sal?", 1, 0, 0, gdbscm_sal_p,
    652          1.1  christos     "\
    653          1.1  christos Return #t if the object is a <gdb:sal> (symtab-and-line) object." },
    654          1.1  christos 
    655          1.1  christos   { "sal-valid?", 1, 0, 0, gdbscm_sal_valid_p,
    656          1.1  christos     "\
    657          1.1  christos Return #t if the symtab for the sal still exists in GDB.\n\
    658          1.1  christos Symtabs are deleted when the corresponding objfile is freed." },
    659          1.1  christos 
    660          1.1  christos   { "sal-symtab", 1, 0, 0, gdbscm_sal_symtab,
    661          1.1  christos     "\
    662          1.1  christos Return the sal's symtab." },
    663          1.1  christos 
    664          1.1  christos   { "sal-line", 1, 0, 0, gdbscm_sal_line,
    665          1.1  christos     "\
    666          1.1  christos Return the sal's line number, or #f if there is none." },
    667          1.1  christos 
    668          1.1  christos   { "sal-pc", 1, 0, 0, gdbscm_sal_pc,
    669          1.1  christos     "\
    670          1.1  christos Return the sal's address." },
    671          1.1  christos 
    672          1.1  christos   { "sal-last", 1, 0, 0, gdbscm_sal_last,
    673          1.1  christos     "\
    674          1.1  christos Return the last address specified by the sal, or #f if there is none." },
    675          1.1  christos 
    676          1.1  christos   { "find-pc-line", 1, 0, 0, gdbscm_find_pc_line,
    677          1.1  christos     "\
    678          1.1  christos Return the sal corresponding to the address, or #f if there isn't one.\n\
    679          1.1  christos \n\
    680          1.1  christos   Arguments: address" },
    681          1.1  christos 
    682          1.1  christos   END_FUNCTIONS
    683          1.1  christos };
    684          1.1  christos 
    685          1.1  christos void
    686          1.1  christos gdbscm_initialize_symtabs (void)
    687          1.1  christos {
    688          1.1  christos   symtab_smob_tag
    689          1.1  christos     = gdbscm_make_smob_type (symtab_smob_name, sizeof (symtab_smob));
    690          1.1  christos   scm_set_smob_free (symtab_smob_tag, stscm_free_symtab_smob);
    691          1.1  christos   scm_set_smob_print (symtab_smob_tag, stscm_print_symtab_smob);
    692          1.1  christos 
    693          1.1  christos   sal_smob_tag = gdbscm_make_smob_type (sal_smob_name, sizeof (sal_smob));
    694          1.1  christos   scm_set_smob_print (sal_smob_tag, stscm_print_sal_smob);
    695          1.1  christos 
    696          1.1  christos   gdbscm_define_functions (symtab_functions, 1);
    697          1.1  christos 
    698          1.1  christos   /* Register an objfile "free" callback so we can properly
    699                             invalidate symbol tables, and symbol table and line data
    700                             structures when an object file that is about to be deleted.  */
    701                          stscm_objfile_data_key
    702                            = register_objfile_data_with_cleanup (NULL, stscm_del_objfile_symtabs);
    703                        }
    704