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