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