1 /* Scheme interface to symbols.
3 Copyright (C) 2008-2015 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
20 /* See README file in this directory for implementation notes, coding
21 conventions, et.al. */
29 #include "guile-internal.h"
31 /* The <gdb:symbol> smob. */
35 /* This always appears first. */
38 /* The GDB symbol structure this smob is wrapping. */
39 struct symbol
*symbol
;
42 static const char symbol_smob_name
[] = "gdb:symbol";
44 /* The tag Guile knows the symbol smob by. */
45 static scm_t_bits symbol_smob_tag
;
47 /* Keywords used in argument passing. */
48 static SCM block_keyword
;
49 static SCM domain_keyword
;
50 static SCM frame_keyword
;
52 static const struct objfile_data
*syscm_objfile_data_key
;
53 static struct gdbarch_data
*syscm_gdbarch_data_key
;
55 struct syscm_gdbarch_data
57 /* Hash table to implement eqable gdbarch symbols. */
61 /* Administrivia for symbol smobs. */
63 /* Helper function to hash a symbol_smob. */
66 syscm_hash_symbol_smob (const void *p
)
68 const symbol_smob
*s_smob
= p
;
70 return htab_hash_pointer (s_smob
->symbol
);
73 /* Helper function to compute equality of symbol_smobs. */
76 syscm_eq_symbol_smob (const void *ap
, const void *bp
)
78 const symbol_smob
*a
= ap
;
79 const symbol_smob
*b
= bp
;
81 return (a
->symbol
== b
->symbol
82 && a
->symbol
!= NULL
);
86 syscm_init_arch_symbols (struct gdbarch
*gdbarch
)
88 struct syscm_gdbarch_data
*data
89 = GDBARCH_OBSTACK_ZALLOC (gdbarch
, struct syscm_gdbarch_data
);
91 data
->htab
= gdbscm_create_eqable_gsmob_ptr_map (syscm_hash_symbol_smob
,
92 syscm_eq_symbol_smob
);
96 /* Return the struct symbol pointer -> SCM mapping table.
97 It is created if necessary. */
100 syscm_get_symbol_map (struct symbol
*symbol
)
104 if (SYMBOL_OBJFILE_OWNED (symbol
))
106 struct objfile
*objfile
= symbol_objfile (symbol
);
108 htab
= objfile_data (objfile
, syscm_objfile_data_key
);
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
);
118 struct gdbarch
*gdbarch
= symbol_arch (symbol
);
119 struct syscm_gdbarch_data
*data
= gdbarch_data (gdbarch
,
120 syscm_gdbarch_data_key
);
128 /* The smob "free" function for <gdb:symbol>. */
131 syscm_free_symbol_smob (SCM self
)
133 symbol_smob
*s_smob
= (symbol_smob
*) SCM_SMOB_DATA (self
);
135 if (s_smob
->symbol
!= NULL
)
137 htab_t htab
= syscm_get_symbol_map (s_smob
->symbol
);
139 gdbscm_clear_eqable_gsmob_ptr_slot (htab
, &s_smob
->base
);
142 /* Not necessary, done to catch bugs. */
143 s_smob
->symbol
= NULL
;
148 /* The smob "print" function for <gdb:symbol>. */
151 syscm_print_symbol_smob (SCM self
, SCM port
, scm_print_state
*pstate
)
153 symbol_smob
*s_smob
= (symbol_smob
*) SCM_SMOB_DATA (self
);
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
)
161 if (pstate
->writingp
)
162 scm_puts (">", port
);
164 scm_remember_upto_here_1 (self
);
166 /* Non-zero means success. */
170 /* Low level routine to create a <gdb:symbol> object. */
173 syscm_make_symbol_smob (void)
175 symbol_smob
*s_smob
= (symbol_smob
*)
176 scm_gc_malloc (sizeof (symbol_smob
), symbol_smob_name
);
179 s_smob
->symbol
= NULL
;
180 s_scm
= scm_new_smob (symbol_smob_tag
, (scm_t_bits
) s_smob
);
181 gdbscm_init_eqable_gsmob (&s_smob
->base
, s_scm
);
186 /* Return non-zero if SCM is a symbol smob. */
189 syscm_is_symbol (SCM scm
)
191 return SCM_SMOB_PREDICATE (symbol_smob_tag
, scm
);
194 /* (symbol? object) -> boolean */
197 gdbscm_symbol_p (SCM scm
)
199 return scm_from_bool (syscm_is_symbol (scm
));
202 /* Return the existing object that encapsulates SYMBOL, or create a new
203 <gdb:symbol> object. */
206 syscm_scm_from_symbol (struct symbol
*symbol
)
209 eqable_gdb_smob
**slot
;
210 symbol_smob
*s_smob
, s_smob_for_lookup
;
213 /* If we've already created a gsmob for this symbol, return it.
214 This makes symbols eq?-able. */
215 htab
= syscm_get_symbol_map (symbol
);
216 s_smob_for_lookup
.symbol
= symbol
;
217 slot
= gdbscm_find_eqable_gsmob_ptr_slot (htab
, &s_smob_for_lookup
.base
);
219 return (*slot
)->containing_scm
;
221 s_scm
= syscm_make_symbol_smob ();
222 s_smob
= (symbol_smob
*) SCM_SMOB_DATA (s_scm
);
223 s_smob
->symbol
= symbol
;
224 gdbscm_fill_eqable_gsmob_ptr_slot (slot
, &s_smob
->base
);
229 /* Returns the <gdb:symbol> object in SELF.
230 Throws an exception if SELF is not a <gdb:symbol> object. */
233 syscm_get_symbol_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
235 SCM_ASSERT_TYPE (syscm_is_symbol (self
), self
, arg_pos
, func_name
,
241 /* Returns a pointer to the symbol smob of SELF.
242 Throws an exception if SELF is not a <gdb:symbol> object. */
245 syscm_get_symbol_smob_arg_unsafe (SCM self
, int arg_pos
, const char *func_name
)
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
);
253 /* Return non-zero if symbol S_SMOB is valid. */
256 syscm_is_valid (symbol_smob
*s_smob
)
258 return s_smob
->symbol
!= NULL
;
261 /* Throw a Scheme error if SELF is not a valid symbol smob.
262 Otherwise return a pointer to the symbol smob. */
265 syscm_get_valid_symbol_smob_arg_unsafe (SCM self
, int arg_pos
,
266 const char *func_name
)
269 = syscm_get_symbol_smob_arg_unsafe (self
, arg_pos
, func_name
);
271 if (!syscm_is_valid (s_smob
))
273 gdbscm_invalid_object_error (func_name
, arg_pos
, self
,
280 /* Throw a Scheme error if SELF is not a valid symbol smob.
281 Otherwise return a pointer to the symbol struct. */
284 syscm_get_valid_symbol_arg_unsafe (SCM self
, int arg_pos
,
285 const char *func_name
)
287 symbol_smob
*s_smob
= syscm_get_valid_symbol_smob_arg_unsafe (self
, arg_pos
,
290 return s_smob
->symbol
;
293 /* Helper function for syscm_del_objfile_symbols to mark the symbol
297 syscm_mark_symbol_invalid (void **slot
, void *info
)
299 symbol_smob
*s_smob
= (symbol_smob
*) *slot
;
301 s_smob
->symbol
= NULL
;
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
312 syscm_del_objfile_symbols (struct objfile
*objfile
, void *datum
)
318 htab_traverse_noresize (htab
, syscm_mark_symbol_invalid
, NULL
);
323 /* Symbol methods. */
325 /* (symbol-valid? <gdb:symbol>) -> boolean
326 Returns #t if SELF still exists in GDB. */
329 gdbscm_symbol_valid_p (SCM self
)
332 = syscm_get_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
334 return scm_from_bool (syscm_is_valid (s_smob
));
337 /* (symbol-type <gdb:symbol>) -> <gdb:type>
338 Return the type of SELF, or #f if SELF has no type. */
341 gdbscm_symbol_type (SCM self
)
344 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
345 const struct symbol
*symbol
= s_smob
->symbol
;
347 if (SYMBOL_TYPE (symbol
) == NULL
)
350 return tyscm_scm_from_type (SYMBOL_TYPE (symbol
));
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. */
358 gdbscm_symbol_symtab (SCM self
)
361 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
362 const struct symbol
*symbol
= s_smob
->symbol
;
364 if (!SYMBOL_OBJFILE_OWNED (symbol
))
366 return stscm_scm_from_symtab (symbol_symtab (symbol
));
369 /* (symbol-name <gdb:symbol>) -> string */
372 gdbscm_symbol_name (SCM self
)
375 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
376 const struct symbol
*symbol
= s_smob
->symbol
;
378 return gdbscm_scm_from_c_string (SYMBOL_NATURAL_NAME (symbol
));
381 /* (symbol-linkage-name <gdb:symbol>) -> string */
384 gdbscm_symbol_linkage_name (SCM self
)
387 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
388 const struct symbol
*symbol
= s_smob
->symbol
;
390 return gdbscm_scm_from_c_string (SYMBOL_LINKAGE_NAME (symbol
));
393 /* (symbol-print-name <gdb:symbol>) -> string */
396 gdbscm_symbol_print_name (SCM self
)
399 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
400 const struct symbol
*symbol
= s_smob
->symbol
;
402 return gdbscm_scm_from_c_string (SYMBOL_PRINT_NAME (symbol
));
405 /* (symbol-addr-class <gdb:symbol>) -> integer */
408 gdbscm_symbol_addr_class (SCM self
)
411 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
412 const struct symbol
*symbol
= s_smob
->symbol
;
414 return scm_from_int (SYMBOL_CLASS (symbol
));
417 /* (symbol-argument? <gdb:symbol>) -> boolean */
420 gdbscm_symbol_argument_p (SCM self
)
423 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
424 const struct symbol
*symbol
= s_smob
->symbol
;
426 return scm_from_bool (SYMBOL_IS_ARGUMENT (symbol
));
429 /* (symbol-constant? <gdb:symbol>) -> boolean */
432 gdbscm_symbol_constant_p (SCM self
)
435 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
436 const struct symbol
*symbol
= s_smob
->symbol
;
437 enum address_class theclass
;
439 theclass
= SYMBOL_CLASS (symbol
);
441 return scm_from_bool (theclass
== LOC_CONST
|| theclass
== LOC_CONST_BYTES
);
444 /* (symbol-function? <gdb:symbol>) -> boolean */
447 gdbscm_symbol_function_p (SCM self
)
450 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
451 const struct symbol
*symbol
= s_smob
->symbol
;
452 enum address_class theclass
;
454 theclass
= SYMBOL_CLASS (symbol
);
456 return scm_from_bool (theclass
== LOC_BLOCK
);
459 /* (symbol-variable? <gdb:symbol>) -> boolean */
462 gdbscm_symbol_variable_p (SCM self
)
465 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
466 const struct symbol
*symbol
= s_smob
->symbol
;
467 enum address_class theclass
;
469 theclass
= SYMBOL_CLASS (symbol
);
471 return scm_from_bool (!SYMBOL_IS_ARGUMENT (symbol
)
472 && (theclass
== LOC_LOCAL
|| theclass
== LOC_REGISTER
473 || theclass
== LOC_STATIC
|| theclass
== LOC_COMPUTED
474 || theclass
== LOC_OPTIMIZED_OUT
));
477 /* (symbol-needs-frame? <gdb:symbol>) -> boolean
478 Return #t if the symbol needs a frame for evaluation. */
481 gdbscm_symbol_needs_frame_p (SCM self
)
484 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
485 struct symbol
*symbol
= s_smob
->symbol
;
490 result
= symbol_read_needs_frame (symbol
);
492 CATCH (except
, RETURN_MASK_ALL
)
494 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
498 return scm_from_bool (result
);
501 /* (symbol-line <gdb:symbol>) -> integer
502 Return the line number at which the symbol was defined. */
505 gdbscm_symbol_line (SCM self
)
508 = syscm_get_valid_symbol_smob_arg_unsafe (self
, SCM_ARG1
, FUNC_NAME
);
509 const struct symbol
*symbol
= s_smob
->symbol
;
511 return scm_from_int (SYMBOL_LINE (symbol
));
514 /* (symbol-value <gdb:symbol> [#:frame <gdb:frame>]) -> <gdb:value>
515 Return the value of the symbol, or an error in various circumstances. */
518 gdbscm_symbol_value (SCM self
, SCM rest
)
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
};
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
;
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
);
535 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
537 gdbscm_out_of_range_error (FUNC_NAME
, SCM_ARG1
, self
,
538 _("cannot get the value of a typedef"));
545 frame_info
= frscm_frame_smob_to_frame (f_smob
);
546 if (frame_info
== NULL
)
547 error (_("Invalid frame"));
550 if (symbol_read_needs_frame (symbol
) && frame_info
== NULL
)
551 error (_("Symbol requires a frame to compute its value"));
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
);
559 CATCH (except
, RETURN_MASK_ALL
)
561 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
565 return vlscm_scm_from_value (value
);
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?. */
574 gdbscm_lookup_symbol (SCM name_scm
, SCM rest
)
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
;
584 struct cleanup
*cleanups
;
585 struct gdb_exception except
= exception_none
;
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
);
592 cleanups
= make_cleanup (xfree
, name
);
594 if (block_arg_pos
>= 0)
598 block
= bkscm_scm_to_block (block_scm
, block_arg_pos
, FUNC_NAME
,
602 do_cleanups (cleanups
);
603 gdbscm_throw (except_scm
);
608 struct frame_info
*selected_frame
;
612 selected_frame
= get_selected_frame (_("no frame selected"));
613 block
= get_frame_block (selected_frame
, NULL
);
615 CATCH (except
, RETURN_MASK_ALL
)
617 GDBSCM_HANDLE_GDB_EXCEPTION_WITH_CLEANUPS (except
, cleanups
);
624 symbol
= lookup_symbol (name
, block
, domain
, &is_a_field_of_this
).symbol
;
626 CATCH (ex
, RETURN_MASK_ALL
)
632 do_cleanups (cleanups
);
633 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
638 return scm_list_2 (syscm_scm_from_symbol (symbol
),
639 scm_from_bool (is_a_field_of_this
.type
!= NULL
));
642 /* (lookup-global-symbol name [#:domain domain]) -> <gdb:symbol>
643 The result is #f if the symbol is not found. */
646 gdbscm_lookup_global_symbol (SCM name_scm
, SCM rest
)
649 SCM keywords
[] = { domain_keyword
, SCM_BOOL_F
};
650 int domain_arg_pos
= -1;
651 int domain
= VAR_DOMAIN
;
652 struct symbol
*symbol
= NULL
;
653 struct cleanup
*cleanups
;
654 struct gdb_exception except
= exception_none
;
656 gdbscm_parse_function_args (FUNC_NAME
, SCM_ARG1
, keywords
, "s#i",
657 name_scm
, &name
, rest
,
658 &domain_arg_pos
, &domain
);
660 cleanups
= make_cleanup (xfree
, name
);
664 symbol
= lookup_global_symbol (name
, NULL
, domain
).symbol
;
666 CATCH (ex
, RETURN_MASK_ALL
)
672 do_cleanups (cleanups
);
673 GDBSCM_HANDLE_GDB_EXCEPTION (except
);
678 return syscm_scm_from_symbol (symbol
);
681 /* Initialize the Scheme symbol support. */
683 /* Note: The SYMBOL_ prefix on the integer constants here is present for
684 compatibility with the Python support. */
686 static const scheme_integer_constant symbol_integer_constants
[] =
688 #define X(SYM) { "SYMBOL_" #SYM, SYM }
701 X (LOC_OPTIMIZED_OUT
),
703 X (LOC_REGPARM_ADDR
),
709 X (VARIABLES_DOMAIN
),
710 X (FUNCTIONS_DOMAIN
),
714 END_INTEGER_CONSTANTS
717 static const scheme_function symbol_functions
[] =
719 { "symbol?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_p
),
721 Return #t if the object is a <gdb:symbol> object." },
723 { "symbol-valid?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_valid_p
),
725 Return #t if object is a valid <gdb:symbol> object.\n\
726 A valid symbol is a symbol that has not been freed.\n\
727 Symbols are freed when the objfile they come from is freed." },
729 { "symbol-type", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_type
),
731 Return the type of symbol." },
733 { "symbol-symtab", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_symtab
),
735 Return the symbol table (<gdb:symtab>) containing symbol." },
737 { "symbol-line", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_line
),
739 Return the line number at which the symbol was defined." },
741 { "symbol-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_name
),
743 Return the name of the symbol as a string." },
745 { "symbol-linkage-name", 1, 0, 0,
746 as_a_scm_t_subr (gdbscm_symbol_linkage_name
),
748 Return the linkage name of the symbol as a string." },
750 { "symbol-print-name", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_print_name
),
752 Return the print name of the symbol as a string.\n\
753 This is either name or linkage-name, depending on whether the user\n\
754 asked GDB to display demangled or mangled names." },
756 { "symbol-addr-class", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_addr_class
),
758 Return the address class of the symbol." },
760 { "symbol-needs-frame?", 1, 0, 0,
761 as_a_scm_t_subr (gdbscm_symbol_needs_frame_p
),
763 Return #t if the symbol needs a frame to compute its value." },
765 { "symbol-argument?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_argument_p
),
767 Return #t if the symbol is a function argument." },
769 { "symbol-constant?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_constant_p
),
771 Return #t if the symbol is a constant." },
773 { "symbol-function?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_function_p
),
775 Return #t if the symbol is a function." },
777 { "symbol-variable?", 1, 0, 0, as_a_scm_t_subr (gdbscm_symbol_variable_p
),
779 Return #t if the symbol is a variable." },
781 { "symbol-value", 1, 0, 1, as_a_scm_t_subr (gdbscm_symbol_value
),
783 Return the value of the symbol.\n\
785 Arguments: <gdb:symbol> [#:frame frame]" },
787 { "lookup-symbol", 1, 0, 1, as_a_scm_t_subr (gdbscm_lookup_symbol
),
789 Return (<gdb:symbol> field-of-this?) if found, otherwise #f.\n\
791 Arguments: name [#:block block] [#:domain domain]\n\
792 name: a string containing the name of the symbol to lookup\n\
793 block: a <gdb:block> object\n\
794 domain: a SYMBOL_*_DOMAIN value" },
796 { "lookup-global-symbol", 1, 0, 1,
797 as_a_scm_t_subr (gdbscm_lookup_global_symbol
),
799 Return <gdb:symbol> if found, otherwise #f.\n\
801 Arguments: name [#:domain domain]\n\
802 name: a string containing the name of the symbol to lookup\n\
803 domain: a SYMBOL_*_DOMAIN value" },
809 gdbscm_initialize_symbols (void)
812 = gdbscm_make_smob_type (symbol_smob_name
, sizeof (symbol_smob
));
813 scm_set_smob_free (symbol_smob_tag
, syscm_free_symbol_smob
);
814 scm_set_smob_print (symbol_smob_tag
, syscm_print_symbol_smob
);
816 gdbscm_define_integer_constants (symbol_integer_constants
, 1);
817 gdbscm_define_functions (symbol_functions
, 1);
819 block_keyword
= scm_from_latin1_keyword ("block");
820 domain_keyword
= scm_from_latin1_keyword ("domain");
821 frame_keyword
= scm_from_latin1_keyword ("frame");
823 /* Register an objfile "free" callback so we can properly
824 invalidate symbols when an object file is about to be deleted. */
825 syscm_objfile_data_key
826 = register_objfile_data_with_cleanup (NULL
, syscm_del_objfile_symbols
);
828 /* Arch-specific symbol data. */
829 syscm_gdbarch_data_key
830 = gdbarch_data_register_post_init (syscm_init_arch_symbols
);