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