scm-symbol.c revision 1.1.1.1 1 /* Scheme interface to symbols.
2
3 Copyright (C) 2008-2015 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 = 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 = ap;
80 const symbol_smob *b = 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 = 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 = gdbarch_data (gdbarch,
121 syscm_gdbarch_data_key);
122
123 htab = data->htab;
124 }
125
126 return htab;
127 }
128
129 /* The smob "free" function for <gdb:symbol>. */
130
131 static size_t
132 syscm_free_symbol_smob (SCM self)
133 {
134 symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
135
136 if (s_smob->symbol != NULL)
137 {
138 htab_t htab = syscm_get_symbol_map (s_smob->symbol);
139
140 gdbscm_clear_eqable_gsmob_ptr_slot (htab, &s_smob->base);
141 }
142
143 /* Not necessary, done to catch bugs. */
144 s_smob->symbol = NULL;
145
146 return 0;
147 }
148
149 /* The smob "print" function for <gdb:symbol>. */
150
151 static int
152 syscm_print_symbol_smob (SCM self, SCM port, scm_print_state *pstate)
153 {
154 symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (self);
155
156 if (pstate->writingp)
157 gdbscm_printf (port, "#<%s ", symbol_smob_name);
158 gdbscm_printf (port, "%s",
159 s_smob->symbol != NULL
160 ? SYMBOL_PRINT_NAME (s_smob->symbol)
161 : "<invalid>");
162 if (pstate->writingp)
163 scm_puts (">", port);
164
165 scm_remember_upto_here_1 (self);
166
167 /* Non-zero means success. */
168 return 1;
169 }
170
171 /* Low level routine to create a <gdb:symbol> object. */
172
173 static SCM
174 syscm_make_symbol_smob (void)
175 {
176 symbol_smob *s_smob = (symbol_smob *)
177 scm_gc_malloc (sizeof (symbol_smob), symbol_smob_name);
178 SCM s_scm;
179
180 s_smob->symbol = NULL;
181 s_scm = scm_new_smob (symbol_smob_tag, (scm_t_bits) s_smob);
182 gdbscm_init_eqable_gsmob (&s_smob->base, s_scm);
183
184 return s_scm;
185 }
186
187 /* Return non-zero if SCM is a symbol smob. */
188
189 int
190 syscm_is_symbol (SCM scm)
191 {
192 return SCM_SMOB_PREDICATE (symbol_smob_tag, scm);
193 }
194
195 /* (symbol? object) -> boolean */
196
197 static SCM
198 gdbscm_symbol_p (SCM scm)
199 {
200 return scm_from_bool (syscm_is_symbol (scm));
201 }
202
203 /* Return the existing object that encapsulates SYMBOL, or create a new
204 <gdb:symbol> object. */
205
206 SCM
207 syscm_scm_from_symbol (struct symbol *symbol)
208 {
209 htab_t htab;
210 eqable_gdb_smob **slot;
211 symbol_smob *s_smob, s_smob_for_lookup;
212 SCM s_scm;
213
214 /* If we've already created a gsmob for this symbol, return it.
215 This makes symbols eq?-able. */
216 htab = syscm_get_symbol_map (symbol);
217 s_smob_for_lookup.symbol = symbol;
218 slot = gdbscm_find_eqable_gsmob_ptr_slot (htab, &s_smob_for_lookup.base);
219 if (*slot != NULL)
220 return (*slot)->containing_scm;
221
222 s_scm = syscm_make_symbol_smob ();
223 s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm);
224 s_smob->symbol = symbol;
225 gdbscm_fill_eqable_gsmob_ptr_slot (slot, &s_smob->base);
226
227 return s_scm;
228 }
229
230 /* Returns the <gdb:symbol> object in SELF.
231 Throws an exception if SELF is not a <gdb:symbol> object. */
232
233 static SCM
234 syscm_get_symbol_arg_unsafe (SCM self, int arg_pos, const char *func_name)
235 {
236 SCM_ASSERT_TYPE (syscm_is_symbol (self), self, arg_pos, func_name,
237 symbol_smob_name);
238
239 return self;
240 }
241
242 /* Returns a pointer to the symbol smob of SELF.
243 Throws an exception if SELF is not a <gdb:symbol> object. */
244
245 static symbol_smob *
246 syscm_get_symbol_smob_arg_unsafe (SCM self, int arg_pos, const char *func_name)
247 {
248 SCM s_scm = syscm_get_symbol_arg_unsafe (self, arg_pos, func_name);
249 symbol_smob *s_smob = (symbol_smob *) SCM_SMOB_DATA (s_scm);
250
251 return s_smob;
252 }
253
254 /* Return non-zero if symbol S_SMOB is valid. */
255
256 static int
257 syscm_is_valid (symbol_smob *s_smob)
258 {
259 return s_smob->symbol != NULL;
260 }
261
262 /* Throw a Scheme error if SELF is not a valid symbol smob.
263 Otherwise return a pointer to the symbol smob. */
264
265 static symbol_smob *
266 syscm_get_valid_symbol_smob_arg_unsafe (SCM self, int arg_pos,
267 const char *func_name)
268 {
269 symbol_smob *s_smob
270 = syscm_get_symbol_smob_arg_unsafe (self, arg_pos, func_name);
271
272 if (!syscm_is_valid (s_smob))
273 {
274 gdbscm_invalid_object_error (func_name, arg_pos, self,
275 _("<gdb:symbol>"));
276 }
277
278 return s_smob;
279 }
280
281 /* Throw a Scheme error if SELF is not a valid symbol smob.
282 Otherwise return a pointer to the symbol struct. */
283
284 struct symbol *
285 syscm_get_valid_symbol_arg_unsafe (SCM self, int arg_pos,
286 const char *func_name)
287 {
288 symbol_smob *s_smob = syscm_get_valid_symbol_smob_arg_unsafe (self, arg_pos,
289 func_name);
290
291 return s_smob->symbol;
292 }
293
294 /* Helper function for syscm_del_objfile_symbols to mark the symbol
295 as invalid. */
296
297 static int
298 syscm_mark_symbol_invalid (void **slot, void *info)
299 {
300 symbol_smob *s_smob = (symbol_smob *) *slot;
301
302 s_smob->symbol = NULL;
303 return 1;
304 }
305
306 /* This function is called when an objfile is about to be freed.
307 Invalidate the symbol as further actions on the symbol would result
308 in bad data. All access to s_smob->symbol should be gated by
309 syscm_get_valid_symbol_smob_arg_unsafe which will raise an exception on
310 invalid symbols. */
311
312 static void
313 syscm_del_objfile_symbols (struct objfile *objfile, void *datum)
314 {
315 htab_t htab = datum;
316
317 if (htab != NULL)
318 {
319 htab_traverse_noresize (htab, syscm_mark_symbol_invalid, NULL);
320 htab_delete (htab);
321 }
322 }
323
324 /* Symbol methods. */
326
327 /* (symbol-valid? <gdb:symbol>) -> boolean
328 Returns #t if SELF still exists in GDB. */
329
330 static SCM
331 gdbscm_symbol_valid_p (SCM self)
332 {
333 symbol_smob *s_smob
334 = syscm_get_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
335
336 return scm_from_bool (syscm_is_valid (s_smob));
337 }
338
339 /* (symbol-type <gdb:symbol>) -> <gdb:type>
340 Return the type of SELF, or #f if SELF has no type. */
341
342 static SCM
343 gdbscm_symbol_type (SCM self)
344 {
345 symbol_smob *s_smob
346 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
347 const struct symbol *symbol = s_smob->symbol;
348
349 if (SYMBOL_TYPE (symbol) == NULL)
350 return SCM_BOOL_F;
351
352 return tyscm_scm_from_type (SYMBOL_TYPE (symbol));
353 }
354
355 /* (symbol-symtab <gdb:symbol>) -> <gdb:symtab> | #f
356 Return the symbol table of SELF.
357 If SELF does not have a symtab (it is arch-owned) return #f. */
358
359 static SCM
360 gdbscm_symbol_symtab (SCM self)
361 {
362 symbol_smob *s_smob
363 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
364 const struct symbol *symbol = s_smob->symbol;
365
366 if (!SYMBOL_OBJFILE_OWNED (symbol))
367 return SCM_BOOL_F;
368 return stscm_scm_from_symtab (symbol_symtab (symbol));
369 }
370
371 /* (symbol-name <gdb:symbol>) -> string */
372
373 static SCM
374 gdbscm_symbol_name (SCM self)
375 {
376 symbol_smob *s_smob
377 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
378 const struct symbol *symbol = s_smob->symbol;
379
380 return gdbscm_scm_from_c_string (SYMBOL_NATURAL_NAME (symbol));
381 }
382
383 /* (symbol-linkage-name <gdb:symbol>) -> string */
384
385 static SCM
386 gdbscm_symbol_linkage_name (SCM self)
387 {
388 symbol_smob *s_smob
389 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
390 const struct symbol *symbol = s_smob->symbol;
391
392 return gdbscm_scm_from_c_string (SYMBOL_LINKAGE_NAME (symbol));
393 }
394
395 /* (symbol-print-name <gdb:symbol>) -> string */
396
397 static SCM
398 gdbscm_symbol_print_name (SCM self)
399 {
400 symbol_smob *s_smob
401 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
402 const struct symbol *symbol = s_smob->symbol;
403
404 return gdbscm_scm_from_c_string (SYMBOL_PRINT_NAME (symbol));
405 }
406
407 /* (symbol-addr-class <gdb:symbol>) -> integer */
408
409 static SCM
410 gdbscm_symbol_addr_class (SCM self)
411 {
412 symbol_smob *s_smob
413 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
414 const struct symbol *symbol = s_smob->symbol;
415
416 return scm_from_int (SYMBOL_CLASS (symbol));
417 }
418
419 /* (symbol-argument? <gdb:symbol>) -> boolean */
420
421 static SCM
422 gdbscm_symbol_argument_p (SCM self)
423 {
424 symbol_smob *s_smob
425 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
426 const struct symbol *symbol = s_smob->symbol;
427
428 return scm_from_bool (SYMBOL_IS_ARGUMENT (symbol));
429 }
430
431 /* (symbol-constant? <gdb:symbol>) -> boolean */
432
433 static SCM
434 gdbscm_symbol_constant_p (SCM self)
435 {
436 symbol_smob *s_smob
437 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
438 const struct symbol *symbol = s_smob->symbol;
439 enum address_class class;
440
441 class = SYMBOL_CLASS (symbol);
442
443 return scm_from_bool (class == LOC_CONST || class == LOC_CONST_BYTES);
444 }
445
446 /* (symbol-function? <gdb:symbol>) -> boolean */
447
448 static SCM
449 gdbscm_symbol_function_p (SCM self)
450 {
451 symbol_smob *s_smob
452 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
453 const struct symbol *symbol = s_smob->symbol;
454 enum address_class class;
455
456 class = SYMBOL_CLASS (symbol);
457
458 return scm_from_bool (class == LOC_BLOCK);
459 }
460
461 /* (symbol-variable? <gdb:symbol>) -> boolean */
462
463 static SCM
464 gdbscm_symbol_variable_p (SCM self)
465 {
466 symbol_smob *s_smob
467 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
468 const struct symbol *symbol = s_smob->symbol;
469 enum address_class class;
470
471 class = SYMBOL_CLASS (symbol);
472
473 return scm_from_bool (!SYMBOL_IS_ARGUMENT (symbol)
474 && (class == LOC_LOCAL || class == LOC_REGISTER
475 || class == LOC_STATIC || class == LOC_COMPUTED
476 || class == LOC_OPTIMIZED_OUT));
477 }
478
479 /* (symbol-needs-frame? <gdb:symbol>) -> boolean
480 Return #t if the symbol needs a frame for evaluation. */
481
482 static SCM
483 gdbscm_symbol_needs_frame_p (SCM self)
484 {
485 symbol_smob *s_smob
486 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
487 struct symbol *symbol = s_smob->symbol;
488 volatile struct gdb_exception except;
489 int result = 0;
490
491 TRY_CATCH (except, RETURN_MASK_ALL)
492 {
493 result = symbol_read_needs_frame (symbol);
494 }
495 GDBSCM_HANDLE_GDB_EXCEPTION (except);
496
497 return scm_from_bool (result);
498 }
499
500 /* (symbol-line <gdb:symbol>) -> integer
501 Return the line number at which the symbol was defined. */
502
503 static SCM
504 gdbscm_symbol_line (SCM self)
505 {
506 symbol_smob *s_smob
507 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
508 const struct symbol *symbol = s_smob->symbol;
509
510 return scm_from_int (SYMBOL_LINE (symbol));
511 }
512
513 /* (symbol-value <gdb:symbol> [#:frame <gdb:frame>]) -> <gdb:value>
514 Return the value of the symbol, or an error in various circumstances. */
515
516 static SCM
517 gdbscm_symbol_value (SCM self, SCM rest)
518 {
519 symbol_smob *s_smob
520 = syscm_get_valid_symbol_smob_arg_unsafe (self, SCM_ARG1, FUNC_NAME);
521 struct symbol *symbol = s_smob->symbol;
522 SCM keywords[] = { frame_keyword, SCM_BOOL_F };
523 int frame_pos = -1;
524 SCM frame_scm = SCM_BOOL_F;
525 frame_smob *f_smob = NULL;
526 struct frame_info *frame_info = NULL;
527 struct value *value = NULL;
528 volatile struct gdb_exception except;
529
530 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG2, keywords, "#O",
531 rest, &frame_pos, &frame_scm);
532 if (!gdbscm_is_false (frame_scm))
533 f_smob = frscm_get_frame_smob_arg_unsafe (frame_scm, frame_pos, FUNC_NAME);
534
535 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
536 {
537 gdbscm_out_of_range_error (FUNC_NAME, SCM_ARG1, self,
538 _("cannot get the value of a typedef"));
539 }
540
541 TRY_CATCH (except, RETURN_MASK_ALL)
542 {
543 if (f_smob != NULL)
544 {
545 frame_info = frscm_frame_smob_to_frame (f_smob);
546 if (frame_info == NULL)
547 error (_("Invalid frame"));
548 }
549
550 if (symbol_read_needs_frame (symbol) && frame_info == NULL)
551 error (_("Symbol requires a frame to compute its value"));
552
553 value = read_var_value (symbol, frame_info);
554 }
555 GDBSCM_HANDLE_GDB_EXCEPTION (except);
556
557 return vlscm_scm_from_value (value);
558 }
559
560 /* (lookup-symbol name [#:block <gdb:block>] [#:domain domain])
562 -> (<gdb:symbol> field-of-this?)
563 The result is #f if the symbol is not found.
564 See comment in lookup_symbol_in_language for field-of-this?. */
565
566 static SCM
567 gdbscm_lookup_symbol (SCM name_scm, SCM rest)
568 {
569 char *name;
570 SCM keywords[] = { block_keyword, domain_keyword, SCM_BOOL_F };
571 const struct block *block = NULL;
572 SCM block_scm = SCM_BOOL_F;
573 int domain = VAR_DOMAIN;
574 int block_arg_pos = -1, domain_arg_pos = -1;
575 struct field_of_this_result is_a_field_of_this;
576 struct symbol *symbol = NULL;
577 volatile struct gdb_exception except;
578 struct cleanup *cleanups;
579
580 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#Oi",
581 name_scm, &name, rest,
582 &block_arg_pos, &block_scm,
583 &domain_arg_pos, &domain);
584
585 cleanups = make_cleanup (xfree, name);
586
587 if (block_arg_pos >= 0)
588 {
589 SCM except_scm;
590
591 block = bkscm_scm_to_block (block_scm, block_arg_pos, FUNC_NAME,
592 &except_scm);
593 if (block == NULL)
594 {
595 do_cleanups (cleanups);
596 gdbscm_throw (except_scm);
597 }
598 }
599 else
600 {
601 struct frame_info *selected_frame;
602
603 TRY_CATCH (except, RETURN_MASK_ALL)
604 {
605 selected_frame = get_selected_frame (_("no frame selected"));
606 block = get_frame_block (selected_frame, NULL);
607 }
608 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except, cleanups);
609 }
610
611 TRY_CATCH (except, RETURN_MASK_ALL)
612 {
613 symbol = lookup_symbol (name, block, domain, &is_a_field_of_this);
614 }
615 do_cleanups (cleanups);
616 GDBSCM_HANDLE_GDB_EXCEPTION (except);
617
618 if (symbol == NULL)
619 return SCM_BOOL_F;
620
621 return scm_list_2 (syscm_scm_from_symbol (symbol),
622 scm_from_bool (is_a_field_of_this.type != NULL));
623 }
624
625 /* (lookup-global-symbol name [#:domain domain]) -> <gdb:symbol>
626 The result is #f if the symbol is not found. */
627
628 static SCM
629 gdbscm_lookup_global_symbol (SCM name_scm, SCM rest)
630 {
631 char *name;
632 SCM keywords[] = { domain_keyword, SCM_BOOL_F };
633 int domain_arg_pos = -1;
634 int domain = VAR_DOMAIN;
635 struct symbol *symbol = NULL;
636 volatile struct gdb_exception except;
637 struct cleanup *cleanups;
638
639 gdbscm_parse_function_args (FUNC_NAME, SCM_ARG1, keywords, "s#i",
640 name_scm, &name, rest,
641 &domain_arg_pos, &domain);
642
643 cleanups = make_cleanup (xfree, name);
644
645 TRY_CATCH (except, RETURN_MASK_ALL)
646 {
647 symbol = lookup_global_symbol (name, NULL, domain);
648 }
649 do_cleanups (cleanups);
650 GDBSCM_HANDLE_GDB_EXCEPTION (except);
651
652 if (symbol == NULL)
653 return SCM_BOOL_F;
654
655 return syscm_scm_from_symbol (symbol);
656 }
657
658 /* Initialize the Scheme symbol support. */
660
661 /* Note: The SYMBOL_ prefix on the integer constants here is present for
662 compatibility with the Python support. */
663
664 static const scheme_integer_constant symbol_integer_constants[] =
665 {
666 #define X(SYM) { "SYMBOL_" #SYM, SYM }
667 X (LOC_UNDEF),
668 X (LOC_CONST),
669 X (LOC_STATIC),
670 X (LOC_REGISTER),
671 X (LOC_ARG),
672 X (LOC_REF_ARG),
673 X (LOC_LOCAL),
674 X (LOC_TYPEDEF),
675 X (LOC_LABEL),
676 X (LOC_BLOCK),
677 X (LOC_CONST_BYTES),
678 X (LOC_UNRESOLVED),
679 X (LOC_OPTIMIZED_OUT),
680 X (LOC_COMPUTED),
681 X (LOC_REGPARM_ADDR),
682
683 X (UNDEF_DOMAIN),
684 X (VAR_DOMAIN),
685 X (STRUCT_DOMAIN),
686 X (LABEL_DOMAIN),
687 X (VARIABLES_DOMAIN),
688 X (FUNCTIONS_DOMAIN),
689 X (TYPES_DOMAIN),
690 #undef X
691
692 END_INTEGER_CONSTANTS
693 };
694
695 static const scheme_function symbol_functions[] =
696 {
697 { "symbol?", 1, 0, 0, gdbscm_symbol_p,
698 "\
699 Return #t if the object is a <gdb:symbol> object." },
700
701 { "symbol-valid?", 1, 0, 0, gdbscm_symbol_valid_p,
702 "\
703 Return #t if object is a valid <gdb:symbol> object.\n\
704 A valid symbol is a symbol that has not been freed.\n\
705 Symbols are freed when the objfile they come from is freed." },
706
707 { "symbol-type", 1, 0, 0, gdbscm_symbol_type,
708 "\
709 Return the type of symbol." },
710
711 { "symbol-symtab", 1, 0, 0, gdbscm_symbol_symtab,
712 "\
713 Return the symbol table (<gdb:symtab>) containing symbol." },
714
715 { "symbol-line", 1, 0, 0, gdbscm_symbol_line,
716 "\
717 Return the line number at which the symbol was defined." },
718
719 { "symbol-name", 1, 0, 0, gdbscm_symbol_name,
720 "\
721 Return the name of the symbol as a string." },
722
723 { "symbol-linkage-name", 1, 0, 0, gdbscm_symbol_linkage_name,
724 "\
725 Return the linkage name of the symbol as a string." },
726
727 { "symbol-print-name", 1, 0, 0, gdbscm_symbol_print_name,
728 "\
729 Return the print name of the symbol as a string.\n\
730 This is either name or linkage-name, depending on whether the user\n\
731 asked GDB to display demangled or mangled names." },
732
733 { "symbol-addr-class", 1, 0, 0, gdbscm_symbol_addr_class,
734 "\
735 Return the address class of the symbol." },
736
737 { "symbol-needs-frame?", 1, 0, 0, gdbscm_symbol_needs_frame_p,
738 "\
739 Return #t if the symbol needs a frame to compute its value." },
740
741 { "symbol-argument?", 1, 0, 0, gdbscm_symbol_argument_p,
742 "\
743 Return #t if the symbol is a function argument." },
744
745 { "symbol-constant?", 1, 0, 0, gdbscm_symbol_constant_p,
746 "\
747 Return #t if the symbol is a constant." },
748
749 { "symbol-function?", 1, 0, 0, gdbscm_symbol_function_p,
750 "\
751 Return #t if the symbol is a function." },
752
753 { "symbol-variable?", 1, 0, 0, gdbscm_symbol_variable_p,
754 "\
755 Return #t if the symbol is a variable." },
756
757 { "symbol-value", 1, 0, 1, gdbscm_symbol_value,
758 "\
759 Return the value of the symbol.\n\
760 \n\
761 Arguments: <gdb:symbol> [#:frame frame]" },
762
763 { "lookup-symbol", 1, 0, 1, gdbscm_lookup_symbol,
764 "\
765 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
766 \n\
767 Arguments: name [#:block block] [#:domain domain]\n\
768 name: a string containing the name of the symbol to lookup\n\
769 block: a <gdb:block> object\n\
770 domain: a SYMBOL_*_DOMAIN value" },
771
772 { "lookup-global-symbol", 1, 0, 1, gdbscm_lookup_global_symbol,
773 "\
774 Return <gdb:symbol> if found, otherwise #f.\n\
775 \n\
776 Arguments: name [#:domain domain]\n\
777 name: a string containing the name of the symbol to lookup\n\
778 domain: a SYMBOL_*_DOMAIN value" },
779
780 END_FUNCTIONS
781 };
782
783 void
784 gdbscm_initialize_symbols (void)
785 {
786 symbol_smob_tag
787 = gdbscm_make_smob_type (symbol_smob_name, sizeof (symbol_smob));
788 scm_set_smob_free (symbol_smob_tag, syscm_free_symbol_smob);
789 scm_set_smob_print (symbol_smob_tag, syscm_print_symbol_smob);
790
791 gdbscm_define_integer_constants (symbol_integer_constants, 1);
792 gdbscm_define_functions (symbol_functions, 1);
793
794 block_keyword = scm_from_latin1_keyword ("block");
795 domain_keyword = scm_from_latin1_keyword ("domain");
796 frame_keyword = scm_from_latin1_keyword ("frame");
797
798 /* Register an objfile "free" callback so we can properly
799 invalidate symbols when an object file is about to be deleted. */
800 syscm_objfile_data_key
801 = register_objfile_data_with_cleanup (NULL, syscm_del_objfile_symbols);
802
803 /* Arch-specific symbol data. */
804 syscm_gdbarch_data_key
805 = gdbarch_data_register_post_init (syscm_init_arch_symbols);
806 }
807