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