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