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