scm-symtab.c revision 1.1.1.2 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.2 christos 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.2 christos CORE_ADDR pc = (CORE_ADDR) pc_ull;
605 1.1.1.2 christos
606 1.1.1.2 christos sal = find_pc_line (pc, 0);
607 1.1.1.2 christos }
608 1.1.1.2 christos 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