scm-symbol.c 21 KB

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