py-symbol.c revision 1.1.1.9 1 1.1 christos /* Python interface to symbols.
2 1.1 christos
3 1.1.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.1.9 christos #include "top.h"
21 1.1 christos #include "block.h"
22 1.1 christos #include "frame.h"
23 1.1 christos #include "symtab.h"
24 1.1 christos #include "python-internal.h"
25 1.1 christos #include "objfiles.h"
26 1.1.1.7 christos #include "symfile.h"
27 1.1 christos
28 1.1.1.8 christos struct symbol_object {
29 1.1 christos PyObject_HEAD
30 1.1 christos /* The GDB symbol structure this object is wrapping. */
31 1.1 christos struct symbol *symbol;
32 1.1 christos /* A symbol object is associated with an objfile, so keep track with
33 1.1 christos doubly-linked list, rooted in the objfile. This lets us
34 1.1 christos invalidate the underlying struct symbol when the objfile is
35 1.1 christos deleted. */
36 1.1.1.8 christos symbol_object *prev;
37 1.1.1.8 christos symbol_object *next;
38 1.1.1.8 christos };
39 1.1 christos
40 1.1 christos /* Require a valid symbol. All access to symbol_object->symbol should be
41 1.1 christos gated by this call. */
42 1.1 christos #define SYMPY_REQUIRE_VALID(symbol_obj, symbol) \
43 1.1 christos do { \
44 1.1 christos symbol = symbol_object_to_symbol (symbol_obj); \
45 1.1 christos if (symbol == NULL) \
46 1.1 christos { \
47 1.1 christos PyErr_SetString (PyExc_RuntimeError, \
48 1.1 christos _("Symbol is invalid.")); \
49 1.1 christos return NULL; \
50 1.1 christos } \
51 1.1 christos } while (0)
52 1.1 christos
53 1.1.1.8 christos /* A deleter that is used when an objfile is about to be freed. */
54 1.1.1.8 christos struct symbol_object_deleter
55 1.1.1.8 christos {
56 1.1.1.8 christos void operator() (symbol_object *obj)
57 1.1.1.8 christos {
58 1.1.1.8 christos while (obj)
59 1.1.1.8 christos {
60 1.1.1.8 christos symbol_object *next = obj->next;
61 1.1.1.8 christos
62 1.1.1.8 christos obj->symbol = NULL;
63 1.1.1.8 christos obj->next = NULL;
64 1.1.1.8 christos obj->prev = NULL;
65 1.1.1.8 christos
66 1.1.1.8 christos obj = next;
67 1.1.1.8 christos }
68 1.1.1.8 christos }
69 1.1.1.8 christos };
70 1.1.1.8 christos
71 1.1.1.8 christos static const registry<objfile>::key<symbol_object, symbol_object_deleter>
72 1.1.1.8 christos sympy_objfile_data_key;
73 1.1 christos
74 1.1 christos static PyObject *
75 1.1 christos sympy_str (PyObject *self)
76 1.1 christos {
77 1.1 christos PyObject *result;
78 1.1 christos struct symbol *symbol = NULL;
79 1.1 christos
80 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
81 1.1 christos
82 1.1.1.8 christos result = PyUnicode_FromString (symbol->print_name ());
83 1.1 christos
84 1.1 christos return result;
85 1.1 christos }
86 1.1 christos
87 1.1 christos static PyObject *
88 1.1 christos sympy_get_type (PyObject *self, void *closure)
89 1.1 christos {
90 1.1 christos struct symbol *symbol = NULL;
91 1.1 christos
92 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
93 1.1 christos
94 1.1.1.8 christos if (symbol->type () == NULL)
95 1.1 christos {
96 1.1 christos Py_INCREF (Py_None);
97 1.1 christos return Py_None;
98 1.1 christos }
99 1.1 christos
100 1.1.1.8 christos return type_to_type_object (symbol->type ());
101 1.1 christos }
102 1.1 christos
103 1.1 christos static PyObject *
104 1.1 christos sympy_get_symtab (PyObject *self, void *closure)
105 1.1 christos {
106 1.1 christos struct symbol *symbol = NULL;
107 1.1 christos
108 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
109 1.1 christos
110 1.1.1.8 christos if (!symbol->is_objfile_owned ())
111 1.1.1.2 christos Py_RETURN_NONE;
112 1.1.1.2 christos
113 1.1.1.8 christos return symtab_to_symtab_object (symbol->symtab ());
114 1.1 christos }
115 1.1 christos
116 1.1 christos static PyObject *
117 1.1 christos sympy_get_name (PyObject *self, void *closure)
118 1.1 christos {
119 1.1 christos struct symbol *symbol = NULL;
120 1.1 christos
121 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
122 1.1 christos
123 1.1.1.8 christos return PyUnicode_FromString (symbol->natural_name ());
124 1.1 christos }
125 1.1 christos
126 1.1 christos static PyObject *
127 1.1 christos sympy_get_linkage_name (PyObject *self, void *closure)
128 1.1 christos {
129 1.1 christos struct symbol *symbol = NULL;
130 1.1 christos
131 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
132 1.1 christos
133 1.1.1.8 christos return PyUnicode_FromString (symbol->linkage_name ());
134 1.1 christos }
135 1.1 christos
136 1.1 christos static PyObject *
137 1.1 christos sympy_get_print_name (PyObject *self, void *closure)
138 1.1 christos {
139 1.1 christos struct symbol *symbol = NULL;
140 1.1 christos
141 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
142 1.1 christos
143 1.1 christos return sympy_str (self);
144 1.1 christos }
145 1.1 christos
146 1.1 christos static PyObject *
147 1.1 christos sympy_get_addr_class (PyObject *self, void *closure)
148 1.1 christos {
149 1.1 christos struct symbol *symbol = NULL;
150 1.1 christos
151 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
152 1.1 christos
153 1.1.1.8 christos return gdb_py_object_from_longest (symbol->aclass ()).release ();
154 1.1 christos }
155 1.1 christos
156 1.1 christos static PyObject *
157 1.1 christos sympy_is_argument (PyObject *self, void *closure)
158 1.1 christos {
159 1.1 christos struct symbol *symbol = NULL;
160 1.1 christos
161 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
162 1.1 christos
163 1.1.1.8 christos return PyBool_FromLong (symbol->is_argument ());
164 1.1 christos }
165 1.1 christos
166 1.1 christos static PyObject *
167 1.1 christos sympy_is_constant (PyObject *self, void *closure)
168 1.1 christos {
169 1.1 christos struct symbol *symbol = NULL;
170 1.1.1.3 christos enum address_class theclass;
171 1.1 christos
172 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
173 1.1 christos
174 1.1.1.8 christos theclass = symbol->aclass ();
175 1.1 christos
176 1.1.1.3 christos return PyBool_FromLong (theclass == LOC_CONST || theclass == LOC_CONST_BYTES);
177 1.1 christos }
178 1.1 christos
179 1.1 christos static PyObject *
180 1.1 christos sympy_is_function (PyObject *self, void *closure)
181 1.1 christos {
182 1.1 christos struct symbol *symbol = NULL;
183 1.1.1.3 christos enum address_class theclass;
184 1.1 christos
185 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
186 1.1 christos
187 1.1.1.8 christos theclass = symbol->aclass ();
188 1.1 christos
189 1.1.1.3 christos return PyBool_FromLong (theclass == LOC_BLOCK);
190 1.1 christos }
191 1.1 christos
192 1.1 christos static PyObject *
193 1.1 christos sympy_is_variable (PyObject *self, void *closure)
194 1.1 christos {
195 1.1 christos struct symbol *symbol = NULL;
196 1.1.1.3 christos enum address_class theclass;
197 1.1 christos
198 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
199 1.1 christos
200 1.1.1.8 christos theclass = symbol->aclass ();
201 1.1 christos
202 1.1.1.8 christos return PyBool_FromLong (!symbol->is_argument ()
203 1.1.1.3 christos && (theclass == LOC_LOCAL || theclass == LOC_REGISTER
204 1.1.1.3 christos || theclass == LOC_STATIC || theclass == LOC_COMPUTED
205 1.1.1.3 christos || theclass == LOC_OPTIMIZED_OUT));
206 1.1 christos }
207 1.1 christos
208 1.1 christos /* Implementation of gdb.Symbol.needs_frame -> Boolean.
209 1.1 christos Returns true iff the symbol needs a frame for evaluation. */
210 1.1 christos
211 1.1 christos static PyObject *
212 1.1 christos sympy_needs_frame (PyObject *self, void *closure)
213 1.1 christos {
214 1.1 christos struct symbol *symbol = NULL;
215 1.1 christos int result = 0;
216 1.1 christos
217 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
218 1.1 christos
219 1.1.1.7 christos try
220 1.1 christos {
221 1.1 christos result = symbol_read_needs_frame (symbol);
222 1.1 christos }
223 1.1.1.7 christos catch (const gdb_exception &except)
224 1.1.1.3 christos {
225 1.1.1.3 christos GDB_PY_HANDLE_EXCEPTION (except);
226 1.1.1.3 christos }
227 1.1 christos
228 1.1 christos if (result)
229 1.1 christos Py_RETURN_TRUE;
230 1.1 christos Py_RETURN_FALSE;
231 1.1 christos }
232 1.1 christos
233 1.1 christos /* Implementation of gdb.Symbol.line -> int.
234 1.1 christos Returns the line number at which the symbol was defined. */
235 1.1 christos
236 1.1 christos static PyObject *
237 1.1 christos sympy_line (PyObject *self, void *closure)
238 1.1 christos {
239 1.1 christos struct symbol *symbol = NULL;
240 1.1 christos
241 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
242 1.1 christos
243 1.1.1.8 christos return gdb_py_object_from_longest (symbol->line ()).release ();
244 1.1 christos }
245 1.1 christos
246 1.1 christos /* Implementation of gdb.Symbol.is_valid (self) -> Boolean.
247 1.1 christos Returns True if this Symbol still exists in GDB. */
248 1.1 christos
249 1.1 christos static PyObject *
250 1.1 christos sympy_is_valid (PyObject *self, PyObject *args)
251 1.1 christos {
252 1.1 christos struct symbol *symbol = NULL;
253 1.1 christos
254 1.1 christos symbol = symbol_object_to_symbol (self);
255 1.1 christos if (symbol == NULL)
256 1.1 christos Py_RETURN_FALSE;
257 1.1 christos
258 1.1 christos Py_RETURN_TRUE;
259 1.1 christos }
260 1.1 christos
261 1.1 christos /* Implementation of gdb.Symbol.value (self[, frame]) -> gdb.Value. Returns
262 1.1 christos the value of the symbol, or an error in various circumstances. */
263 1.1 christos
264 1.1 christos static PyObject *
265 1.1 christos sympy_value (PyObject *self, PyObject *args)
266 1.1 christos {
267 1.1 christos struct symbol *symbol = NULL;
268 1.1.1.8 christos frame_info_ptr frame_info = NULL;
269 1.1 christos PyObject *frame_obj = NULL;
270 1.1 christos
271 1.1 christos if (!PyArg_ParseTuple (args, "|O", &frame_obj))
272 1.1 christos return NULL;
273 1.1 christos
274 1.1 christos if (frame_obj != NULL && !PyObject_TypeCheck (frame_obj, &frame_object_type))
275 1.1 christos {
276 1.1 christos PyErr_SetString (PyExc_TypeError, "argument is not a frame");
277 1.1 christos return NULL;
278 1.1 christos }
279 1.1 christos
280 1.1 christos SYMPY_REQUIRE_VALID (self, symbol);
281 1.1.1.8 christos if (symbol->aclass () == LOC_TYPEDEF)
282 1.1 christos {
283 1.1 christos PyErr_SetString (PyExc_TypeError, "cannot get the value of a typedef");
284 1.1 christos return NULL;
285 1.1 christos }
286 1.1 christos
287 1.1.1.9 christos PyObject *result = nullptr;
288 1.1.1.7 christos try
289 1.1 christos {
290 1.1 christos if (frame_obj != NULL)
291 1.1 christos {
292 1.1 christos frame_info = frame_object_to_frame_info (frame_obj);
293 1.1 christos if (frame_info == NULL)
294 1.1 christos error (_("invalid frame"));
295 1.1 christos }
296 1.1 christos
297 1.1 christos if (symbol_read_needs_frame (symbol) && frame_info == NULL)
298 1.1 christos error (_("symbol requires a frame to compute its value"));
299 1.1 christos
300 1.1.1.4 christos /* TODO: currently, we have no way to recover the block in which SYMBOL
301 1.1.1.4 christos was found, so we have no block to pass to read_var_value. This will
302 1.1.1.4 christos yield an incorrect value when symbol is not local to FRAME_INFO (this
303 1.1.1.4 christos can happen with nested functions). */
304 1.1.1.9 christos scoped_value_mark free_values;
305 1.1.1.9 christos struct value *value = read_var_value (symbol, NULL, frame_info);
306 1.1.1.9 christos result = value_to_value_object (value);
307 1.1 christos }
308 1.1.1.7 christos catch (const gdb_exception &except)
309 1.1.1.3 christos {
310 1.1.1.3 christos GDB_PY_HANDLE_EXCEPTION (except);
311 1.1.1.3 christos }
312 1.1 christos
313 1.1.1.9 christos return result;
314 1.1 christos }
315 1.1 christos
316 1.1 christos /* Given a symbol, and a symbol_object that has previously been
317 1.1 christos allocated and initialized, populate the symbol_object with the
318 1.1 christos struct symbol data. Also, register the symbol_object life-cycle
319 1.1 christos with the life-cycle of the object file associated with this
320 1.1 christos symbol, if needed. */
321 1.1 christos static void
322 1.1 christos set_symbol (symbol_object *obj, struct symbol *symbol)
323 1.1 christos {
324 1.1 christos obj->symbol = symbol;
325 1.1 christos obj->prev = NULL;
326 1.1.1.8 christos if (symbol->is_objfile_owned ()
327 1.1.1.8 christos && symbol->symtab () != NULL)
328 1.1 christos {
329 1.1.1.8 christos struct objfile *objfile = symbol->objfile ();
330 1.1 christos
331 1.1.1.8 christos obj->next = sympy_objfile_data_key.get (objfile);
332 1.1 christos if (obj->next)
333 1.1 christos obj->next->prev = obj;
334 1.1.1.8 christos sympy_objfile_data_key.set (objfile, obj);
335 1.1 christos }
336 1.1 christos else
337 1.1 christos obj->next = NULL;
338 1.1 christos }
339 1.1 christos
340 1.1 christos /* Create a new symbol object (gdb.Symbol) that encapsulates the struct
341 1.1 christos symbol object from GDB. */
342 1.1 christos PyObject *
343 1.1 christos symbol_to_symbol_object (struct symbol *sym)
344 1.1 christos {
345 1.1 christos symbol_object *sym_obj;
346 1.1 christos
347 1.1 christos sym_obj = PyObject_New (symbol_object, &symbol_object_type);
348 1.1 christos if (sym_obj)
349 1.1 christos set_symbol (sym_obj, sym);
350 1.1 christos
351 1.1 christos return (PyObject *) sym_obj;
352 1.1 christos }
353 1.1 christos
354 1.1 christos /* Return the symbol that is wrapped by this symbol object. */
355 1.1 christos struct symbol *
356 1.1 christos symbol_object_to_symbol (PyObject *obj)
357 1.1 christos {
358 1.1 christos if (! PyObject_TypeCheck (obj, &symbol_object_type))
359 1.1 christos return NULL;
360 1.1 christos return ((symbol_object *) obj)->symbol;
361 1.1 christos }
362 1.1 christos
363 1.1 christos static void
364 1.1 christos sympy_dealloc (PyObject *obj)
365 1.1 christos {
366 1.1 christos symbol_object *sym_obj = (symbol_object *) obj;
367 1.1 christos
368 1.1 christos if (sym_obj->prev)
369 1.1 christos sym_obj->prev->next = sym_obj->next;
370 1.1.1.2 christos else if (sym_obj->symbol != NULL
371 1.1.1.8 christos && sym_obj->symbol->is_objfile_owned ()
372 1.1.1.8 christos && sym_obj->symbol->symtab () != NULL)
373 1.1.1.8 christos sympy_objfile_data_key.set (sym_obj->symbol->objfile (), sym_obj->next);
374 1.1 christos if (sym_obj->next)
375 1.1 christos sym_obj->next->prev = sym_obj->prev;
376 1.1 christos sym_obj->symbol = NULL;
377 1.1.1.7 christos Py_TYPE (obj)->tp_free (obj);
378 1.1 christos }
379 1.1 christos
380 1.1.1.9 christos /* __repr__ implementation for gdb.Symbol. */
381 1.1.1.9 christos
382 1.1.1.9 christos static PyObject *
383 1.1.1.9 christos sympy_repr (PyObject *self)
384 1.1.1.9 christos {
385 1.1.1.9 christos const auto symbol = symbol_object_to_symbol (self);
386 1.1.1.9 christos if (symbol == nullptr)
387 1.1.1.9 christos return gdb_py_invalid_object_repr (self);
388 1.1.1.9 christos
389 1.1.1.9 christos return PyUnicode_FromFormat ("<%s print_name=%s>", Py_TYPE (self)->tp_name,
390 1.1.1.9 christos symbol->print_name ());
391 1.1.1.9 christos }
392 1.1.1.9 christos
393 1.1 christos /* Implementation of
394 1.1 christos gdb.lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)
395 1.1 christos A tuple with 2 elements is always returned. The first is the symbol
396 1.1 christos object or None, the second is a boolean with the value of
397 1.1 christos is_a_field_of_this (see comment in lookup_symbol_in_language). */
398 1.1 christos
399 1.1 christos PyObject *
400 1.1 christos gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw)
401 1.1 christos {
402 1.1 christos int domain = VAR_DOMAIN;
403 1.1 christos struct field_of_this_result is_a_field_of_this;
404 1.1 christos const char *name;
405 1.1.1.5 christos static const char *keywords[] = { "name", "block", "domain", NULL };
406 1.1 christos struct symbol *symbol = NULL;
407 1.1.1.5 christos PyObject *block_obj = NULL, *sym_obj, *bool_obj;
408 1.1 christos const struct block *block = NULL;
409 1.1 christos
410 1.1.1.5 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!i", keywords, &name,
411 1.1.1.5 christos &block_object_type, &block_obj,
412 1.1.1.5 christos &domain))
413 1.1 christos return NULL;
414 1.1 christos
415 1.1 christos if (block_obj)
416 1.1 christos block = block_object_to_block (block_obj);
417 1.1 christos else
418 1.1 christos {
419 1.1.1.8 christos frame_info_ptr selected_frame;
420 1.1 christos
421 1.1.1.7 christos try
422 1.1 christos {
423 1.1 christos selected_frame = get_selected_frame (_("No frame selected."));
424 1.1 christos block = get_frame_block (selected_frame, NULL);
425 1.1 christos }
426 1.1.1.7 christos catch (const gdb_exception &except)
427 1.1.1.3 christos {
428 1.1.1.3 christos GDB_PY_HANDLE_EXCEPTION (except);
429 1.1.1.3 christos }
430 1.1 christos }
431 1.1 christos
432 1.1.1.7 christos try
433 1.1 christos {
434 1.1.1.9 christos domain_search_flags flags = from_scripting_domain (domain);
435 1.1.1.9 christos symbol = lookup_symbol (name, block, flags, &is_a_field_of_this).symbol;
436 1.1 christos }
437 1.1.1.7 christos catch (const gdb_exception &except)
438 1.1.1.3 christos {
439 1.1.1.3 christos GDB_PY_HANDLE_EXCEPTION (except);
440 1.1.1.3 christos }
441 1.1 christos
442 1.1.1.5 christos gdbpy_ref<> ret_tuple (PyTuple_New (2));
443 1.1.1.5 christos if (ret_tuple == NULL)
444 1.1 christos return NULL;
445 1.1 christos
446 1.1 christos if (symbol)
447 1.1 christos {
448 1.1 christos sym_obj = symbol_to_symbol_object (symbol);
449 1.1 christos if (!sym_obj)
450 1.1.1.5 christos return NULL;
451 1.1 christos }
452 1.1 christos else
453 1.1 christos {
454 1.1 christos sym_obj = Py_None;
455 1.1 christos Py_INCREF (Py_None);
456 1.1 christos }
457 1.1.1.5 christos PyTuple_SET_ITEM (ret_tuple.get (), 0, sym_obj);
458 1.1 christos
459 1.1.1.8 christos bool_obj = PyBool_FromLong (is_a_field_of_this.type != NULL);
460 1.1.1.5 christos PyTuple_SET_ITEM (ret_tuple.get (), 1, bool_obj);
461 1.1 christos
462 1.1.1.5 christos return ret_tuple.release ();
463 1.1 christos }
464 1.1 christos
465 1.1 christos /* Implementation of
466 1.1 christos gdb.lookup_global_symbol (name [, domain]) -> symbol or None. */
467 1.1 christos
468 1.1 christos PyObject *
469 1.1 christos gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
470 1.1 christos {
471 1.1 christos int domain = VAR_DOMAIN;
472 1.1 christos const char *name;
473 1.1.1.5 christos static const char *keywords[] = { "name", "domain", NULL };
474 1.1 christos struct symbol *symbol = NULL;
475 1.1 christos PyObject *sym_obj;
476 1.1 christos
477 1.1.1.5 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
478 1.1.1.5 christos &domain))
479 1.1 christos return NULL;
480 1.1 christos
481 1.1.1.7 christos try
482 1.1 christos {
483 1.1.1.9 christos domain_search_flags flags = from_scripting_domain (domain);
484 1.1.1.9 christos symbol = lookup_global_symbol (name, NULL, flags).symbol;
485 1.1 christos }
486 1.1.1.7 christos catch (const gdb_exception &except)
487 1.1.1.3 christos {
488 1.1.1.3 christos GDB_PY_HANDLE_EXCEPTION (except);
489 1.1.1.3 christos }
490 1.1 christos
491 1.1 christos if (symbol)
492 1.1 christos {
493 1.1 christos sym_obj = symbol_to_symbol_object (symbol);
494 1.1 christos if (!sym_obj)
495 1.1 christos return NULL;
496 1.1 christos }
497 1.1 christos else
498 1.1 christos {
499 1.1 christos sym_obj = Py_None;
500 1.1 christos Py_INCREF (Py_None);
501 1.1 christos }
502 1.1 christos
503 1.1 christos return sym_obj;
504 1.1 christos }
505 1.1 christos
506 1.1.1.7 christos /* Implementation of
507 1.1.1.7 christos gdb.lookup_static_symbol (name [, domain]) -> symbol or None. */
508 1.1.1.7 christos
509 1.1.1.7 christos PyObject *
510 1.1.1.7 christos gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
511 1.1.1.7 christos {
512 1.1.1.7 christos const char *name;
513 1.1.1.7 christos int domain = VAR_DOMAIN;
514 1.1.1.7 christos static const char *keywords[] = { "name", "domain", NULL };
515 1.1.1.7 christos struct symbol *symbol = NULL;
516 1.1.1.7 christos PyObject *sym_obj;
517 1.1.1.7 christos
518 1.1.1.7 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
519 1.1.1.7 christos &domain))
520 1.1.1.7 christos return NULL;
521 1.1.1.7 christos
522 1.1.1.7 christos /* In order to find static symbols associated with the "current" object
523 1.1.1.7 christos file ahead of those from other object files, we first need to see if
524 1.1.1.7 christos we can acquire a current block. If this fails however, then we still
525 1.1.1.7 christos want to search all static symbols, so don't throw an exception just
526 1.1.1.7 christos yet. */
527 1.1.1.7 christos const struct block *block = NULL;
528 1.1.1.7 christos try
529 1.1.1.7 christos {
530 1.1.1.8 christos frame_info_ptr selected_frame
531 1.1.1.7 christos = get_selected_frame (_("No frame selected."));
532 1.1.1.7 christos block = get_frame_block (selected_frame, NULL);
533 1.1.1.7 christos }
534 1.1.1.9 christos catch (const gdb_exception_forced_quit &e)
535 1.1.1.9 christos {
536 1.1.1.9 christos quit_force (NULL, 0);
537 1.1.1.9 christos }
538 1.1.1.7 christos catch (const gdb_exception &except)
539 1.1.1.7 christos {
540 1.1.1.7 christos /* Nothing. */
541 1.1.1.7 christos }
542 1.1.1.7 christos
543 1.1.1.7 christos try
544 1.1.1.7 christos {
545 1.1.1.9 christos domain_search_flags flags = from_scripting_domain (domain);
546 1.1.1.9 christos
547 1.1.1.7 christos if (block != nullptr)
548 1.1.1.7 christos symbol
549 1.1.1.9 christos = lookup_symbol_in_static_block (name, block, flags).symbol;
550 1.1.1.7 christos
551 1.1.1.7 christos if (symbol == nullptr)
552 1.1.1.9 christos symbol = lookup_static_symbol (name, flags).symbol;
553 1.1.1.7 christos }
554 1.1.1.7 christos catch (const gdb_exception &except)
555 1.1.1.7 christos {
556 1.1.1.7 christos GDB_PY_HANDLE_EXCEPTION (except);
557 1.1.1.7 christos }
558 1.1.1.7 christos
559 1.1.1.7 christos if (symbol)
560 1.1.1.7 christos {
561 1.1.1.7 christos sym_obj = symbol_to_symbol_object (symbol);
562 1.1.1.7 christos if (!sym_obj)
563 1.1.1.7 christos return NULL;
564 1.1.1.7 christos }
565 1.1.1.7 christos else
566 1.1.1.7 christos {
567 1.1.1.7 christos sym_obj = Py_None;
568 1.1.1.7 christos Py_INCREF (Py_None);
569 1.1.1.7 christos }
570 1.1.1.7 christos
571 1.1.1.7 christos return sym_obj;
572 1.1.1.7 christos }
573 1.1.1.7 christos
574 1.1.1.7 christos /* Implementation of
575 1.1.1.7 christos gdb.lookup_static_symbols (name [, domain]) -> symbol list.
576 1.1.1.7 christos
577 1.1.1.7 christos Returns a list of all static symbols matching NAME in DOMAIN. */
578 1.1.1.7 christos
579 1.1.1.7 christos PyObject *
580 1.1.1.7 christos gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, PyObject *kw)
581 1.1.1.7 christos {
582 1.1.1.7 christos const char *name;
583 1.1.1.7 christos int domain = VAR_DOMAIN;
584 1.1.1.7 christos static const char *keywords[] = { "name", "domain", NULL };
585 1.1.1.7 christos
586 1.1.1.7 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
587 1.1.1.7 christos &domain))
588 1.1.1.7 christos return NULL;
589 1.1.1.7 christos
590 1.1.1.7 christos gdbpy_ref<> return_list (PyList_New (0));
591 1.1.1.7 christos if (return_list == NULL)
592 1.1.1.7 christos return NULL;
593 1.1.1.7 christos
594 1.1.1.7 christos try
595 1.1.1.7 christos {
596 1.1.1.9 christos domain_search_flags flags = from_scripting_domain (domain);
597 1.1.1.9 christos
598 1.1.1.7 christos /* Expand any symtabs that contain potentially matching symbols. */
599 1.1.1.7 christos lookup_name_info lookup_name (name, symbol_name_match_type::FULL);
600 1.1.1.8 christos expand_symtabs_matching (NULL, lookup_name, NULL, NULL,
601 1.1.1.8 christos SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
602 1.1.1.9 christos SEARCH_ALL_DOMAINS);
603 1.1.1.7 christos
604 1.1.1.7 christos for (objfile *objfile : current_program_space->objfiles ())
605 1.1.1.7 christos {
606 1.1.1.7 christos for (compunit_symtab *cust : objfile->compunits ())
607 1.1.1.7 christos {
608 1.1.1.9 christos /* Skip included compunits to prevent including compunits from
609 1.1.1.9 christos being searched twice. */
610 1.1.1.9 christos if (cust->user != nullptr)
611 1.1.1.9 christos continue;
612 1.1.1.7 christos
613 1.1.1.9 christos const struct blockvector *bv = cust->blockvector ();
614 1.1.1.8 christos const struct block *block = bv->static_block ();
615 1.1.1.7 christos
616 1.1.1.7 christos if (block != nullptr)
617 1.1.1.7 christos {
618 1.1.1.7 christos symbol *symbol = lookup_symbol_in_static_block
619 1.1.1.9 christos (name, block, flags).symbol;
620 1.1.1.7 christos
621 1.1.1.7 christos if (symbol != nullptr)
622 1.1.1.7 christos {
623 1.1.1.7 christos PyObject *sym_obj
624 1.1.1.7 christos = symbol_to_symbol_object (symbol);
625 1.1.1.7 christos if (PyList_Append (return_list.get (), sym_obj) == -1)
626 1.1.1.7 christos return NULL;
627 1.1.1.7 christos }
628 1.1.1.7 christos }
629 1.1.1.7 christos }
630 1.1.1.7 christos }
631 1.1.1.7 christos }
632 1.1.1.7 christos catch (const gdb_exception &except)
633 1.1.1.7 christos {
634 1.1.1.7 christos GDB_PY_HANDLE_EXCEPTION (except);
635 1.1.1.7 christos }
636 1.1.1.7 christos
637 1.1.1.7 christos return return_list.release ();
638 1.1.1.7 christos }
639 1.1.1.7 christos
640 1.1.1.9 christos static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
641 1.1 christos gdbpy_initialize_symbols (void)
642 1.1 christos {
643 1.1 christos if (PyType_Ready (&symbol_object_type) < 0)
644 1.1 christos return -1;
645 1.1 christos
646 1.1 christos if (PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNDEF", LOC_UNDEF) < 0
647 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST",
648 1.1 christos LOC_CONST) < 0
649 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_STATIC",
650 1.1 christos LOC_STATIC) < 0
651 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGISTER",
652 1.1 christos LOC_REGISTER) < 0
653 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_ARG",
654 1.1 christos LOC_ARG) < 0
655 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REF_ARG",
656 1.1 christos LOC_REF_ARG) < 0
657 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LOCAL",
658 1.1 christos LOC_LOCAL) < 0
659 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_TYPEDEF",
660 1.1 christos LOC_TYPEDEF) < 0
661 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_LABEL",
662 1.1 christos LOC_LABEL) < 0
663 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_BLOCK",
664 1.1 christos LOC_BLOCK) < 0
665 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_CONST_BYTES",
666 1.1 christos LOC_CONST_BYTES) < 0
667 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_UNRESOLVED",
668 1.1 christos LOC_UNRESOLVED) < 0
669 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_OPTIMIZED_OUT",
670 1.1 christos LOC_OPTIMIZED_OUT) < 0
671 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMPUTED",
672 1.1 christos LOC_COMPUTED) < 0
673 1.1.1.6 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_COMMON_BLOCK",
674 1.1.1.6 christos LOC_COMMON_BLOCK) < 0
675 1.1 christos || PyModule_AddIntConstant (gdb_module, "SYMBOL_LOC_REGPARM_ADDR",
676 1.1.1.9 christos LOC_REGPARM_ADDR) < 0)
677 1.1.1.6 christos return -1;
678 1.1.1.6 christos
679 1.1.1.9 christos #define SYM_DOMAIN(X) \
680 1.1.1.9 christos if (PyModule_AddIntConstant (gdb_module, "SYMBOL_" #X "_DOMAIN", \
681 1.1.1.9 christos to_scripting_domain (X ## _DOMAIN)) < 0 \
682 1.1.1.9 christos || PyModule_AddIntConstant (gdb_module, "SEARCH_" #X "_DOMAIN", \
683 1.1.1.9 christos to_scripting_domain (SEARCH_ ## X ## _DOMAIN)) < 0) \
684 1.1 christos return -1;
685 1.1.1.9 christos #include "sym-domains.def"
686 1.1.1.9 christos #undef SYM_DOMAIN
687 1.1 christos
688 1.1 christos return gdb_pymodule_addobject (gdb_module, "Symbol",
689 1.1 christos (PyObject *) &symbol_object_type);
690 1.1 christos }
691 1.1 christos
692 1.1.1.9 christos GDBPY_INITIALIZE_FILE (gdbpy_initialize_symbols);
693 1.1.1.9 christos
694 1.1 christos
695 1.1 christos
697 1.1 christos static gdb_PyGetSetDef symbol_object_getset[] = {
698 1.1 christos { "type", sympy_get_type, NULL,
699 1.1 christos "Type of the symbol.", NULL },
700 1.1 christos { "symtab", sympy_get_symtab, NULL,
701 1.1 christos "Symbol table in which the symbol appears.", NULL },
702 1.1 christos { "name", sympy_get_name, NULL,
703 1.1 christos "Name of the symbol, as it appears in the source code.", NULL },
704 1.1 christos { "linkage_name", sympy_get_linkage_name, NULL,
705 1.1 christos "Name of the symbol, as used by the linker (i.e., may be mangled).",
706 1.1 christos NULL },
707 1.1 christos { "print_name", sympy_get_print_name, NULL,
708 1.1 christos "Name of the symbol in a form suitable for output.\n\
709 1.1 christos This is either name or linkage_name, depending on whether the user asked GDB\n\
710 1.1 christos to display demangled or mangled names.", NULL },
711 1.1 christos { "addr_class", sympy_get_addr_class, NULL, "Address class of the symbol." },
712 1.1 christos { "is_argument", sympy_is_argument, NULL,
713 1.1 christos "True if the symbol is an argument of a function." },
714 1.1 christos { "is_constant", sympy_is_constant, NULL,
715 1.1 christos "True if the symbol is a constant." },
716 1.1 christos { "is_function", sympy_is_function, NULL,
717 1.1 christos "True if the symbol is a function or method." },
718 1.1 christos { "is_variable", sympy_is_variable, NULL,
719 1.1 christos "True if the symbol is a variable." },
720 1.1 christos { "needs_frame", sympy_needs_frame, NULL,
721 1.1 christos "True if the symbol requires a frame for evaluation." },
722 1.1 christos { "line", sympy_line, NULL,
723 1.1 christos "The source line number at which the symbol was defined." },
724 1.1 christos { NULL } /* Sentinel */
725 1.1 christos };
726 1.1 christos
727 1.1 christos static PyMethodDef symbol_object_methods[] = {
728 1.1 christos { "is_valid", sympy_is_valid, METH_NOARGS,
729 1.1 christos "is_valid () -> Boolean.\n\
730 1.1 christos Return true if this symbol is valid, false if not." },
731 1.1 christos { "value", sympy_value, METH_VARARGS,
732 1.1 christos "value ([frame]) -> gdb.Value\n\
733 1.1 christos Return the value of the symbol." },
734 1.1 christos {NULL} /* Sentinel */
735 1.1 christos };
736 1.1 christos
737 1.1 christos PyTypeObject symbol_object_type = {
738 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
739 1.1 christos "gdb.Symbol", /*tp_name*/
740 1.1 christos sizeof (symbol_object), /*tp_basicsize*/
741 1.1 christos 0, /*tp_itemsize*/
742 1.1 christos sympy_dealloc, /*tp_dealloc*/
743 1.1 christos 0, /*tp_print*/
744 1.1 christos 0, /*tp_getattr*/
745 1.1 christos 0, /*tp_setattr*/
746 1.1.1.9 christos 0, /*tp_compare*/
747 1.1 christos sympy_repr, /*tp_repr*/
748 1.1 christos 0, /*tp_as_number*/
749 1.1 christos 0, /*tp_as_sequence*/
750 1.1 christos 0, /*tp_as_mapping*/
751 1.1 christos 0, /*tp_hash */
752 1.1 christos 0, /*tp_call*/
753 1.1 christos sympy_str, /*tp_str*/
754 1.1 christos 0, /*tp_getattro*/
755 1.1 christos 0, /*tp_setattro*/
756 1.1 christos 0, /*tp_as_buffer*/
757 1.1 christos Py_TPFLAGS_DEFAULT, /*tp_flags*/
758 1.1 christos "GDB symbol object", /*tp_doc */
759 1.1 christos 0, /*tp_traverse */
760 1.1 christos 0, /*tp_clear */
761 1.1 christos 0, /*tp_richcompare */
762 1.1 christos 0, /*tp_weaklistoffset */
763 1.1 christos 0, /*tp_iter */
764 1.1 christos 0, /*tp_iternext */
765 1.1 christos symbol_object_methods, /*tp_methods */
766 1.1 christos 0, /*tp_members */
767 1.1 christos symbol_object_getset /*tp_getset */
768 };
769