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