scm-symbol.c revision 1.5 1 /* Scheme interface to symbols.
2
3 Copyright (C) 2008-2017 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 struct cleanup *cleanups;
589 struct gdb_exception except = exception_none;
590
591 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi",
592 name_scm, &name, rest,
593 &block_arg_pos, &block_scm,
594 &domain_arg_pos, &domain);
595
596 cleanups = make_cleanup (xfree, name);
597
598 if (block_arg_pos >= 0)
599 {
600 SCM except_scm;
601
602 block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
603 &except_scm);
604 if (block == NULL)
605 {
606 do_cleanups (cleanups);
607 gdbscm_throw (except_scm);
608 }
609 }
610 else
611 {
612 struct frame_info *selected_frame;
613
614 TRY
615 {
616 selected_frame = get_selected_frame (_("no frame selected"));
617 block = get_frame_block (selected_frame, NULL);
618 }
619 CATCH (except, RETURN_MASK_ALL)
620 {
621 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
622 }
623 END_CATCH
624 }
625
626 TRY
627 {
628 symbol = lookup_symbol (name, block, (domain_enum) domain,
629 &is_a_field_of_this).symbol;
630 }
631 CATCH (ex, RETURN_MASK_ALL)
632 {
633 except = ex;
634 }
635 END_CATCH
636
637 do_cleanups (cleanups);
638 GDBSCM_HANDLE_GDB_EXCEPTION (except);
639
640 if (symbol == NULL)
641 return SCM_BOOL_F;
642
643 return scm_list_2 (syscm_scm_from_symbol (symbol),
644 scm_from_bool (is_a_field_of_this.type != NULL));
645 }
646
647 /* (lookup-global-symbol name [#:domain domain]) -> <gdb:symbol>
648 The result is #f if the symbol is not found. */
649
650 static SCM
651 gdbscm_lookup_global_symbol (SCM name_scm, SCM rest)
652 {
653 char *name;
654 SCM keywords[] = { domain_keyword, SCM_BOOL_F };
655 int domain_arg_pos = -1;
656 int domain = VAR_DOMAIN;
657 struct symbol *symbol = NULL;
658 struct cleanup *cleanups;
659 struct gdb_exception except = exception_none;
660
661 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i",
662 name_scm, &name, rest,
663 &domain_arg_pos, &domain);
664
665 cleanups = make_cleanup (xfree, name);
666
667 TRY
668 {
669 symbol = lookup_global_symbol (name, NULL, (domain_enum) domain).symbol;
670 }
671 CATCH (ex, RETURN_MASK_ALL)
672 {
673 except = ex;
674 }
675 END_CATCH
676
677 do_cleanups (cleanups);
678 GDBSCM_HANDLE_GDB_EXCEPTION (except);
679
680 if (symbol == NULL)
681 return SCM_BOOL_F;
682
683 return syscm_scm_from_symbol (symbol);
684 }
685
686 /* Initialize the Scheme symbol support. */
688
689 /* Note: The SYMBOL_ prefix on the integer constants here is present for
690 compatibility with the Python support. */
691
692 static const scheme_integer_constant symbol_integer_constants[] =
693 {
694 #define X(SYM) { "SYMBOL_" #SYM, SYM }
695 X (LOC_UNDEF),
696 X (LOC_CONST),
697 X (LOC_STATIC),
698 X (LOC_REGISTER),
699 X (LOC_ARG),
700 X (LOC_REF_ARG),
701 X (LOC_LOCAL),
702 X (LOC_TYPEDEF),
703 X (LOC_LABEL),
704 X (LOC_BLOCK),
705 X (LOC_CONST_BYTES),
706 X (LOC_UNRESOLVED),
707 X (LOC_OPTIMIZED_OUT),
708 X (LOC_COMPUTED),
709 X (LOC_REGPARM_ADDR),
710
711 X (UNDEF_DOMAIN),
712 X (VAR_DOMAIN),
713 X (STRUCT_DOMAIN),
714 X (LABEL_DOMAIN),
715 X (VARIABLES_DOMAIN),
716 X (FUNCTIONS_DOMAIN),
717 X (TYPES_DOMAIN),
718 #undef X
719
720 END_INTEGER_CONSTANTS
721 };
722
723 static const scheme_function symbol_functions[] =
724 {
725 { "symbol?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_p),
726 "\
727 Return #t if the object is a <gdb:symbol> object." },
728
729 { "symbol-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_valid_p),
730 "\
731 Return #t if object is a valid <gdb:symbol> object.\n\
732 A valid symbol is a symbol that has not been freed.\n\
733 Symbols are freed when the objfile they come from is freed." },
734
735 { "symbol-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_type),
736 "\
737 Return the type of symbol." },
738
739 { "symbol-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_symtab),
740 "\
741 Return the symbol table (<gdb:symtab>) containing symbol." },
742
743 { "symbol-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_line),
744 "\
745 Return the line number at which the symbol was defined." },
746
747 { "symbol-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_name),
748 "\
749 Return the name of the symbol as a string." },
750
751 { "symbol-linkage-name", 1, 0, 0,
752 as_a_scm_t_subr (gdbscm_symbol_linkage_name),
753 "\
754 Return the linkage name of the symbol as a string." },
755
756 { "symbol-print-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_print_name),
757 "\
758 Return the print name of the symbol as a string.\n\
759 This is either name or linkage-name, depending on whether the user\n\
760 asked GDB to display demangled or mangled names." },
761
762 { "symbol-addr-class", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_addr_class),
763 "\
764 Return the address class of the symbol." },
765
766 { "symbol-needs-frame?", 1, 0, 0,
767 as_a_scm_t_subr (gdbscm_symbol_needs_frame_p),
768 "\
769 Return #t if the symbol needs a frame to compute its value." },
770
771 { "symbol-argument?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_argument_p),
772 "\
773 Return #t if the symbol is a function argument." },
774
775 { "symbol-constant?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_constant_p),
776 "\
777 Return #t if the symbol is a constant." },
778
779 { "symbol-function?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_function_p),
780 "\
781 Return #t if the symbol is a function." },
782
783 { "symbol-variable?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_variable_p),
784 "\
785 Return #t if the symbol is a variable." },
786
787 { "symbol-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_symbol_value),
788 "\
789 Return the value of the symbol.\n\
790 \n\
791 Arguments: <gdb:symbol> [#:frame frame]" },
792
793 { "lookup-symbol", 1, 0, 1, as_a_scm_t_subr (gdbscm_lookup_symbol),
794 "\
795 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
796 \n\
797 Arguments: name [#:block block] [#:domain domain]\n\
798 name: a string containing the name of the symbol to lookup\n\
799 block: a <gdb:block> object\n\
800 domain: a SYMBOL_*_DOMAIN value" },
801
802 { "lookup-global-symbol", 1, 0, 1,
803 as_a_scm_t_subr (gdbscm_lookup_global_symbol),
804 "\
805 Return <gdb:symbol> if found, otherwise #f.\n\
806 \n\
807 Arguments: name [#:domain domain]\n\
808 name: a string containing the name of the symbol to lookup\n\
809 domain: a SYMBOL_*_DOMAIN value" },
810
811 END_FUNCTIONS
812 };
813
814 void
815 gdbscm_initialize_symbols (void)
816 {
817 symbol_smob_tag
818 = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
819 scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
820 scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
821
822 gdbscm_define_integer_constants (symbol_integer_constants, 1);
823 gdbscm_define_functions (symbol_functions, 1);
824
825 block_keyword = scm_from_latin1_keyword ("block");
826 domain_keyword = scm_from_latin1_keyword ("domain");
827 frame_keyword = scm_from_latin1_keyword ("frame");
828
829 /* Register an objfile "free" callback so we can properly
830 invalidate symbols when an object file is about to be deleted. */
831 syscm_objfile_data_key
832 = register_objfile_data_with_cleanup (NULL, syscm_del_objfile_symbols);
833
834 /* Arch-specific symbol data. */
835 syscm_gdbarch_data_key
836 = gdbarch_data_register_post_init (syscm_init_arch_symbols);
837 }
838