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