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