py-objfile.c revision 1.10 1 1.1 christos /* Python interface to objfiles.
2 1.1 christos
3 1.10 christos Copyright (C) 2008-2023 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "python-internal.h"
22 1.1 christos #include "charset.h"
23 1.1 christos #include "objfiles.h"
24 1.1 christos #include "language.h"
25 1.3 christos #include "build-id.h"
26 1.3 christos #include "symtab.h"
27 1.10 christos #include "python.h"
28 1.1 christos
29 1.10 christos struct objfile_object
30 1.1 christos {
31 1.1 christos PyObject_HEAD
32 1.1 christos
33 1.1 christos /* The corresponding objfile. */
34 1.1 christos struct objfile *objfile;
35 1.1 christos
36 1.3 christos /* Dictionary holding user-added attributes.
37 1.3 christos This is the __dict__ attribute of the object. */
38 1.3 christos PyObject *dict;
39 1.3 christos
40 1.1 christos /* The pretty-printer list of functions. */
41 1.1 christos PyObject *printers;
42 1.1 christos
43 1.1 christos /* The frame filter list of functions. */
44 1.1 christos PyObject *frame_filters;
45 1.5 christos
46 1.5 christos /* The list of frame unwinders. */
47 1.5 christos PyObject *frame_unwinders;
48 1.5 christos
49 1.1 christos /* The type-printer list. */
50 1.1 christos PyObject *type_printers;
51 1.3 christos
52 1.3 christos /* The debug method matcher list. */
53 1.3 christos PyObject *xmethods;
54 1.10 christos };
55 1.1 christos
56 1.5 christos extern PyTypeObject objfile_object_type
57 1.1 christos CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("objfile_object");
58 1.1 christos
59 1.10 christos /* Clear the OBJFILE pointer in an Objfile object and remove the
60 1.10 christos reference. */
61 1.10 christos struct objfpy_deleter
62 1.10 christos {
63 1.10 christos void operator() (objfile_object *obj)
64 1.10 christos {
65 1.10 christos gdbpy_enter enter_py;
66 1.10 christos gdbpy_ref<objfile_object> object (obj);
67 1.10 christos object->objfile = nullptr;
68 1.10 christos }
69 1.10 christos };
70 1.10 christos
71 1.10 christos static const registry<objfile>::key<objfile_object, objfpy_deleter>
72 1.10 christos objfpy_objfile_data_key;
73 1.1 christos
74 1.3 christos /* Require that OBJF be a valid objfile. */
75 1.3 christos #define OBJFPY_REQUIRE_VALID(obj) \
76 1.3 christos do { \
77 1.3 christos if (!(obj)->objfile) \
78 1.3 christos { \
79 1.3 christos PyErr_SetString (PyExc_RuntimeError, \
80 1.3 christos _("Objfile no longer exists.")); \
81 1.3 christos return NULL; \
82 1.3 christos } \
83 1.3 christos } while (0)
84 1.3 christos
85 1.1 christos
86 1.1 christos
88 1.3 christos /* An Objfile method which returns the objfile's file name, or None. */
89 1.1 christos
90 1.1 christos static PyObject *
91 1.1 christos objfpy_get_filename (PyObject *self, void *closure)
92 1.1 christos {
93 1.1 christos objfile_object *obj = (objfile_object *) self;
94 1.1 christos
95 1.8 christos if (obj->objfile)
96 1.8 christos return (host_string_to_python_string (objfile_name (obj->objfile))
97 1.1 christos .release ());
98 1.1 christos Py_RETURN_NONE;
99 1.1 christos }
100 1.5 christos
101 1.5 christos /* An Objfile method which returns the objfile's file name, as specified
102 1.5 christos by the user, or None. */
103 1.5 christos
104 1.5 christos static PyObject *
105 1.5 christos objfpy_get_username (PyObject *self, void *closure)
106 1.5 christos {
107 1.5 christos objfile_object *obj = (objfile_object *) self;
108 1.5 christos
109 1.5 christos if (obj->objfile)
110 1.5 christos {
111 1.5 christos const char *username = obj->objfile->original_name;
112 1.8 christos
113 1.5 christos return host_string_to_python_string (username).release ();
114 1.5 christos }
115 1.5 christos
116 1.5 christos Py_RETURN_NONE;
117 1.5 christos }
118 1.10 christos
119 1.10 christos /* Get the 'is_file' attribute. */
120 1.10 christos
121 1.10 christos static PyObject *
122 1.10 christos objfpy_get_is_file (PyObject *o, void *ignore)
123 1.10 christos {
124 1.10 christos objfile_object *self = (objfile_object *) o;
125 1.10 christos
126 1.10 christos if (self->objfile != nullptr)
127 1.10 christos return PyBool_FromLong ((self->objfile->flags & OBJF_NOT_FILENAME) == 0);
128 1.10 christos Py_RETURN_NONE;
129 1.10 christos }
130 1.3 christos
131 1.3 christos /* If SELF is a separate debug-info file, return the "backlink" field.
132 1.3 christos Otherwise return None. */
133 1.3 christos
134 1.3 christos static PyObject *
135 1.3 christos objfpy_get_owner (PyObject *self, void *closure)
136 1.3 christos {
137 1.3 christos objfile_object *obj = (objfile_object *) self;
138 1.3 christos struct objfile *objfile = obj->objfile;
139 1.3 christos struct objfile *owner;
140 1.3 christos
141 1.3 christos OBJFPY_REQUIRE_VALID (obj);
142 1.3 christos
143 1.3 christos owner = objfile->separate_debug_objfile_backlink;
144 1.8 christos if (owner != NULL)
145 1.3 christos return objfile_to_objfile_object (owner).release ();
146 1.3 christos Py_RETURN_NONE;
147 1.3 christos }
148 1.3 christos
149 1.3 christos /* An Objfile method which returns the objfile's build id, or None. */
150 1.3 christos
151 1.3 christos static PyObject *
152 1.3 christos objfpy_get_build_id (PyObject *self, void *closure)
153 1.3 christos {
154 1.3 christos objfile_object *obj = (objfile_object *) self;
155 1.5 christos struct objfile *objfile = obj->objfile;
156 1.3 christos const struct bfd_build_id *build_id = NULL;
157 1.3 christos
158 1.3 christos OBJFPY_REQUIRE_VALID (obj);
159 1.9 christos
160 1.3 christos try
161 1.10 christos {
162 1.3 christos build_id = build_id_bfd_get (objfile->obfd.get ());
163 1.9 christos }
164 1.5 christos catch (const gdb_exception &except)
165 1.5 christos {
166 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
167 1.3 christos }
168 1.3 christos
169 1.3 christos if (build_id != NULL)
170 1.9 christos {
171 1.3 christos std::string hex_form = bin2hex (build_id->data, build_id->size);
172 1.9 christos
173 1.3 christos return host_string_to_python_string (hex_form.c_str ()).release ();
174 1.3 christos }
175 1.3 christos
176 1.3 christos Py_RETURN_NONE;
177 1.3 christos }
178 1.3 christos
179 1.3 christos /* An Objfile method which returns the objfile's progspace, or None. */
180 1.3 christos
181 1.3 christos static PyObject *
182 1.3 christos objfpy_get_progspace (PyObject *self, void *closure)
183 1.3 christos {
184 1.3 christos objfile_object *obj = (objfile_object *) self;
185 1.3 christos
186 1.8 christos if (obj->objfile)
187 1.3 christos return pspace_to_pspace_object (obj->objfile->pspace).release ();
188 1.3 christos
189 1.3 christos Py_RETURN_NONE;
190 1.3 christos }
191 1.1 christos
192 1.1 christos static void
193 1.1 christos objfpy_dealloc (PyObject *o)
194 1.1 christos {
195 1.1 christos objfile_object *self = (objfile_object *) o;
196 1.3 christos
197 1.1 christos Py_XDECREF (self->dict);
198 1.1 christos Py_XDECREF (self->printers);
199 1.5 christos Py_XDECREF (self->frame_filters);
200 1.1 christos Py_XDECREF (self->frame_unwinders);
201 1.3 christos Py_XDECREF (self->type_printers);
202 1.1 christos Py_XDECREF (self->xmethods);
203 1.1 christos Py_TYPE (self)->tp_free (self);
204 1.1 christos }
205 1.3 christos
206 1.3 christos /* Initialize an objfile_object.
207 1.3 christos The result is a boolean indicating success. */
208 1.3 christos
209 1.3 christos static int
210 1.3 christos objfpy_initialize (objfile_object *self)
211 1.3 christos {
212 1.6 christos self->objfile = NULL;
213 1.6 christos
214 1.6 christos self->dict = PyDict_New ();
215 1.6 christos if (self->dict == NULL)
216 1.3 christos return 0;
217 1.3 christos
218 1.3 christos self->printers = PyList_New (0);
219 1.3 christos if (self->printers == NULL)
220 1.3 christos return 0;
221 1.3 christos
222 1.3 christos self->frame_filters = PyDict_New ();
223 1.3 christos if (self->frame_filters == NULL)
224 1.3 christos return 0;
225 1.5 christos
226 1.5 christos self->frame_unwinders = PyList_New (0);
227 1.5 christos if (self->frame_unwinders == NULL)
228 1.5 christos return 0;
229 1.3 christos
230 1.3 christos self->type_printers = PyList_New (0);
231 1.3 christos if (self->type_printers == NULL)
232 1.3 christos return 0;
233 1.3 christos
234 1.3 christos self->xmethods = PyList_New (0);
235 1.3 christos if (self->xmethods == NULL)
236 1.3 christos return 0;
237 1.3 christos
238 1.3 christos return 1;
239 1.3 christos }
240 1.1 christos
241 1.1 christos static PyObject *
242 1.1 christos objfpy_new (PyTypeObject *type, PyObject *args, PyObject *keywords)
243 1.7 christos {
244 1.1 christos gdbpy_ref<objfile_object> self ((objfile_object *) type->tp_alloc (type, 0));
245 1.7 christos
246 1.1 christos if (self != NULL)
247 1.7 christos {
248 1.7 christos if (!objfpy_initialize (self.get ()))
249 1.3 christos return NULL;
250 1.1 christos }
251 1.7 christos
252 1.1 christos return (PyObject *) self.release ();
253 1.1 christos }
254 1.1 christos
255 1.1 christos PyObject *
256 1.1 christos objfpy_get_printers (PyObject *o, void *ignore)
257 1.1 christos {
258 1.1 christos objfile_object *self = (objfile_object *) o;
259 1.1 christos
260 1.1 christos Py_INCREF (self->printers);
261 1.1 christos return self->printers;
262 1.1 christos }
263 1.1 christos
264 1.1 christos static int
265 1.1 christos objfpy_set_printers (PyObject *o, PyObject *value, void *ignore)
266 1.1 christos {
267 1.1 christos objfile_object *self = (objfile_object *) o;
268 1.1 christos
269 1.1 christos if (! value)
270 1.1 christos {
271 1.1 christos PyErr_SetString (PyExc_TypeError,
272 1.1 christos _("Cannot delete the pretty_printers attribute."));
273 1.1 christos return -1;
274 1.1 christos }
275 1.1 christos
276 1.1 christos if (! PyList_Check (value))
277 1.1 christos {
278 1.1 christos PyErr_SetString (PyExc_TypeError,
279 1.1 christos _("The pretty_printers attribute must be a list."));
280 1.1 christos return -1;
281 1.1 christos }
282 1.1 christos
283 1.8 christos /* Take care in case the LHS and RHS are related somehow. */
284 1.1 christos gdbpy_ref<> tmp (self->printers);
285 1.1 christos Py_INCREF (value);
286 1.1 christos self->printers = value;
287 1.1 christos
288 1.1 christos return 0;
289 1.1 christos }
290 1.1 christos
291 1.1 christos /* Return the Python dictionary attribute containing frame filters for
292 1.1 christos this object file. */
293 1.1 christos PyObject *
294 1.1 christos objfpy_get_frame_filters (PyObject *o, void *ignore)
295 1.1 christos {
296 1.1 christos objfile_object *self = (objfile_object *) o;
297 1.1 christos
298 1.1 christos Py_INCREF (self->frame_filters);
299 1.1 christos return self->frame_filters;
300 1.1 christos }
301 1.1 christos
302 1.1 christos /* Set this object file's frame filters dictionary to FILTERS. */
303 1.1 christos static int
304 1.1 christos objfpy_set_frame_filters (PyObject *o, PyObject *filters, void *ignore)
305 1.1 christos {
306 1.1 christos objfile_object *self = (objfile_object *) o;
307 1.1 christos
308 1.1 christos if (! filters)
309 1.1 christos {
310 1.1 christos PyErr_SetString (PyExc_TypeError,
311 1.1 christos _("Cannot delete the frame filters attribute."));
312 1.1 christos return -1;
313 1.1 christos }
314 1.1 christos
315 1.1 christos if (! PyDict_Check (filters))
316 1.1 christos {
317 1.1 christos PyErr_SetString (PyExc_TypeError,
318 1.1 christos _("The frame_filters attribute must be a dictionary."));
319 1.1 christos return -1;
320 1.1 christos }
321 1.1 christos
322 1.8 christos /* Take care in case the LHS and RHS are related somehow. */
323 1.1 christos gdbpy_ref<> tmp (self->frame_filters);
324 1.1 christos Py_INCREF (filters);
325 1.1 christos self->frame_filters = filters;
326 1.1 christos
327 1.1 christos return 0;
328 1.1 christos }
329 1.5 christos
330 1.5 christos /* Return the frame unwinders attribute for this object file. */
331 1.5 christos
332 1.5 christos PyObject *
333 1.5 christos objfpy_get_frame_unwinders (PyObject *o, void *ignore)
334 1.5 christos {
335 1.5 christos objfile_object *self = (objfile_object *) o;
336 1.5 christos
337 1.5 christos Py_INCREF (self->frame_unwinders);
338 1.5 christos return self->frame_unwinders;
339 1.5 christos }
340 1.5 christos
341 1.5 christos /* Set this object file's frame unwinders list to UNWINDERS. */
342 1.5 christos
343 1.5 christos static int
344 1.5 christos objfpy_set_frame_unwinders (PyObject *o, PyObject *unwinders, void *ignore)
345 1.5 christos {
346 1.5 christos objfile_object *self = (objfile_object *) o;
347 1.5 christos
348 1.5 christos if (!unwinders)
349 1.5 christos {
350 1.5 christos PyErr_SetString (PyExc_TypeError,
351 1.5 christos _("Cannot delete the frame unwinders attribute."));
352 1.5 christos return -1;
353 1.5 christos }
354 1.5 christos
355 1.5 christos if (!PyList_Check (unwinders))
356 1.5 christos {
357 1.5 christos PyErr_SetString (PyExc_TypeError,
358 1.5 christos _("The frame_unwinders attribute must be a list."));
359 1.5 christos return -1;
360 1.5 christos }
361 1.5 christos
362 1.8 christos /* Take care in case the LHS and RHS are related somehow. */
363 1.5 christos gdbpy_ref<> tmp (self->frame_unwinders);
364 1.5 christos Py_INCREF (unwinders);
365 1.5 christos self->frame_unwinders = unwinders;
366 1.5 christos
367 1.5 christos return 0;
368 1.5 christos }
369 1.1 christos
370 1.1 christos /* Get the 'type_printers' attribute. */
371 1.1 christos
372 1.1 christos static PyObject *
373 1.1 christos objfpy_get_type_printers (PyObject *o, void *ignore)
374 1.1 christos {
375 1.1 christos objfile_object *self = (objfile_object *) o;
376 1.1 christos
377 1.1 christos Py_INCREF (self->type_printers);
378 1.1 christos return self->type_printers;
379 1.1 christos }
380 1.3 christos
381 1.3 christos /* Get the 'xmethods' attribute. */
382 1.3 christos
383 1.3 christos PyObject *
384 1.3 christos objfpy_get_xmethods (PyObject *o, void *ignore)
385 1.3 christos {
386 1.3 christos objfile_object *self = (objfile_object *) o;
387 1.3 christos
388 1.3 christos Py_INCREF (self->xmethods);
389 1.3 christos return self->xmethods;
390 1.3 christos }
391 1.1 christos
392 1.1 christos /* Set the 'type_printers' attribute. */
393 1.1 christos
394 1.1 christos static int
395 1.1 christos objfpy_set_type_printers (PyObject *o, PyObject *value, void *ignore)
396 1.1 christos {
397 1.1 christos objfile_object *self = (objfile_object *) o;
398 1.1 christos
399 1.1 christos if (! value)
400 1.1 christos {
401 1.1 christos PyErr_SetString (PyExc_TypeError,
402 1.1 christos _("Cannot delete the type_printers attribute."));
403 1.1 christos return -1;
404 1.1 christos }
405 1.1 christos
406 1.1 christos if (! PyList_Check (value))
407 1.1 christos {
408 1.1 christos PyErr_SetString (PyExc_TypeError,
409 1.1 christos _("The type_printers attribute must be a list."));
410 1.1 christos return -1;
411 1.1 christos }
412 1.1 christos
413 1.8 christos /* Take care in case the LHS and RHS are related somehow. */
414 1.1 christos gdbpy_ref<> tmp (self->type_printers);
415 1.1 christos Py_INCREF (value);
416 1.1 christos self->type_printers = value;
417 1.1 christos
418 1.1 christos return 0;
419 1.1 christos }
420 1.1 christos
421 1.1 christos /* Implementation of gdb.Objfile.is_valid (self) -> Boolean.
422 1.1 christos Returns True if this object file still exists in GDB. */
423 1.1 christos
424 1.1 christos static PyObject *
425 1.1 christos objfpy_is_valid (PyObject *self, PyObject *args)
426 1.1 christos {
427 1.1 christos objfile_object *obj = (objfile_object *) self;
428 1.1 christos
429 1.1 christos if (! obj->objfile)
430 1.1 christos Py_RETURN_FALSE;
431 1.1 christos
432 1.1 christos Py_RETURN_TRUE;
433 1.1 christos }
434 1.9 christos
435 1.3 christos /* Implementation of gdb.Objfile.add_separate_debug_file (self, string). */
436 1.3 christos
437 1.3 christos static PyObject *
438 1.3 christos objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
439 1.7 christos {
440 1.3 christos static const char *keywords[] = { "file_name", NULL };
441 1.3 christos objfile_object *obj = (objfile_object *) self;
442 1.3 christos const char *file_name;
443 1.3 christos
444 1.3 christos OBJFPY_REQUIRE_VALID (obj);
445 1.7 christos
446 1.3 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &file_name))
447 1.3 christos return NULL;
448 1.9 christos
449 1.3 christos try
450 1.7 christos {
451 1.3 christos gdb_bfd_ref_ptr abfd (symfile_bfd_open (file_name));
452 1.10 christos
453 1.3 christos symbol_file_add_separate (abfd, file_name, 0, obj->objfile);
454 1.9 christos }
455 1.9 christos catch (const gdb_exception &except)
456 1.9 christos {
457 1.9 christos GDB_PY_HANDLE_EXCEPTION (except);
458 1.9 christos }
459 1.9 christos
460 1.9 christos Py_RETURN_NONE;
461 1.9 christos }
462 1.9 christos
463 1.9 christos /* Implementation of
464 1.9 christos gdb.Objfile.lookup_global_symbol (self, string [, domain]) -> gdb.Symbol. */
465 1.9 christos
466 1.9 christos static PyObject *
467 1.9 christos objfpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
468 1.9 christos {
469 1.9 christos static const char *keywords[] = { "name", "domain", NULL };
470 1.9 christos objfile_object *obj = (objfile_object *) self;
471 1.9 christos const char *symbol_name;
472 1.9 christos int domain = VAR_DOMAIN;
473 1.9 christos
474 1.9 christos OBJFPY_REQUIRE_VALID (obj);
475 1.9 christos
476 1.9 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
477 1.9 christos &domain))
478 1.9 christos return nullptr;
479 1.9 christos
480 1.9 christos try
481 1.9 christos {
482 1.10 christos struct symbol *sym = lookup_global_symbol_from_objfile
483 1.9 christos (obj->objfile, GLOBAL_BLOCK, symbol_name, (domain_enum) domain).symbol;
484 1.9 christos if (sym == nullptr)
485 1.9 christos Py_RETURN_NONE;
486 1.9 christos
487 1.9 christos return symbol_to_symbol_object (sym);
488 1.9 christos }
489 1.9 christos catch (const gdb_exception &except)
490 1.9 christos {
491 1.9 christos GDB_PY_HANDLE_EXCEPTION (except);
492 1.9 christos }
493 1.9 christos
494 1.9 christos Py_RETURN_NONE;
495 1.9 christos }
496 1.9 christos
497 1.9 christos /* Implementation of
498 1.9 christos gdb.Objfile.lookup_static_symbol (self, string [, domain]) -> gdb.Symbol. */
499 1.9 christos
500 1.9 christos static PyObject *
501 1.9 christos objfpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
502 1.9 christos {
503 1.9 christos static const char *keywords[] = { "name", "domain", NULL };
504 1.9 christos objfile_object *obj = (objfile_object *) self;
505 1.9 christos const char *symbol_name;
506 1.9 christos int domain = VAR_DOMAIN;
507 1.9 christos
508 1.9 christos OBJFPY_REQUIRE_VALID (obj);
509 1.9 christos
510 1.9 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &symbol_name,
511 1.9 christos &domain))
512 1.9 christos return nullptr;
513 1.9 christos
514 1.9 christos try
515 1.9 christos {
516 1.10 christos struct symbol *sym = lookup_global_symbol_from_objfile
517 1.9 christos (obj->objfile, STATIC_BLOCK, symbol_name, (domain_enum) domain).symbol;
518 1.9 christos if (sym == nullptr)
519 1.9 christos Py_RETURN_NONE;
520 1.9 christos
521 1.9 christos return symbol_to_symbol_object (sym);
522 1.9 christos }
523 1.5 christos catch (const gdb_exception &except)
524 1.5 christos {
525 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
526 1.3 christos }
527 1.3 christos
528 1.3 christos Py_RETURN_NONE;
529 1.3 christos }
530 1.8 christos
531 1.8 christos /* Implement repr() for gdb.Objfile. */
532 1.8 christos
533 1.8 christos static PyObject *
534 1.8 christos objfpy_repr (PyObject *self_)
535 1.8 christos {
536 1.8 christos objfile_object *self = (objfile_object *) self_;
537 1.8 christos objfile *obj = self->objfile;
538 1.8 christos
539 1.10 christos if (obj == nullptr)
540 1.8 christos return PyUnicode_FromString ("<gdb.Objfile (invalid)>");
541 1.10 christos
542 1.10 christos return PyUnicode_FromFormat ("<gdb.Objfile filename=%s>",
543 1.8 christos objfile_name (obj));
544 1.8 christos }
545 1.3 christos
546 1.3 christos /* Subroutine of gdbpy_lookup_objfile_by_build_id to simplify it.
547 1.3 christos Return non-zero if STRING is a potentially valid build id. */
548 1.3 christos
549 1.3 christos static int
550 1.3 christos objfpy_build_id_ok (const char *string)
551 1.3 christos {
552 1.3 christos size_t i, n = strlen (string);
553 1.3 christos
554 1.3 christos if (n % 2 != 0)
555 1.3 christos return 0;
556 1.3 christos for (i = 0; i < n; ++i)
557 1.3 christos {
558 1.3 christos if (!isxdigit (string[i]))
559 1.3 christos return 0;
560 1.3 christos }
561 1.3 christos return 1;
562 1.3 christos }
563 1.3 christos
564 1.3 christos /* Subroutine of gdbpy_lookup_objfile_by_build_id to simplify it.
565 1.3 christos Returns non-zero if BUILD_ID matches STRING.
566 1.3 christos It is assumed that objfpy_build_id_ok (string) returns TRUE. */
567 1.3 christos
568 1.5 christos static int
569 1.3 christos objfpy_build_id_matches (const struct bfd_build_id *build_id,
570 1.3 christos const char *string)
571 1.3 christos {
572 1.3 christos size_t i;
573 1.3 christos
574 1.3 christos if (strlen (string) != 2 * build_id->size)
575 1.3 christos return 0;
576 1.3 christos
577 1.3 christos for (i = 0; i < build_id->size; ++i)
578 1.3 christos {
579 1.10 christos char c1 = string[i * 2], c2 = string[i * 2 + 1];
580 1.3 christos int byte = (fromhex (c1) << 4) | fromhex (c2);
581 1.3 christos
582 1.3 christos if (byte != build_id->data[i])
583 1.3 christos return 0;
584 1.3 christos }
585 1.3 christos
586 1.3 christos return 1;
587 1.3 christos }
588 1.3 christos
589 1.3 christos /* Implementation of gdb.lookup_objfile. */
590 1.3 christos
591 1.3 christos PyObject *
592 1.3 christos gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw)
593 1.7 christos {
594 1.3 christos static const char *keywords[] = { "name", "by_build_id", NULL };
595 1.3 christos const char *name;
596 1.3 christos PyObject *by_build_id_obj = NULL;
597 1.3 christos int by_build_id;
598 1.7 christos
599 1.7 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!", keywords,
600 1.3 christos &name, &PyBool_Type, &by_build_id_obj))
601 1.3 christos return NULL;
602 1.3 christos
603 1.3 christos by_build_id = 0;
604 1.3 christos if (by_build_id_obj != NULL)
605 1.3 christos {
606 1.3 christos int cmp = PyObject_IsTrue (by_build_id_obj);
607 1.3 christos
608 1.3 christos if (cmp < 0)
609 1.3 christos return NULL;
610 1.3 christos by_build_id = cmp;
611 1.3 christos }
612 1.10 christos
613 1.3 christos if (by_build_id && !objfpy_build_id_ok (name))
614 1.10 christos {
615 1.10 christos PyErr_SetString (PyExc_TypeError, _("Not a valid build id."));
616 1.3 christos return NULL;
617 1.10 christos }
618 1.10 christos
619 1.10 christos struct objfile *objfile = nullptr;
620 1.10 christos if (by_build_id)
621 1.10 christos gdbarch_iterate_over_objfiles_in_search_order
622 1.10 christos (target_gdbarch (),
623 1.10 christos [&objfile, name] (struct objfile *obj)
624 1.10 christos {
625 1.10 christos /* Don't return separate debug files. */
626 1.10 christos if (obj->separate_debug_objfile_backlink != nullptr)
627 1.10 christos return 0;
628 1.10 christos
629 1.10 christos bfd *obfd = obj->obfd.get ();
630 1.10 christos if (obfd == nullptr)
631 1.10 christos return 0;
632 1.10 christos
633 1.10 christos const bfd_build_id *obfd_build_id = build_id_bfd_get (obfd);
634 1.10 christos if (obfd_build_id == nullptr)
635 1.10 christos return 0;
636 1.10 christos
637 1.10 christos if (!objfpy_build_id_matches (obfd_build_id, name))
638 1.10 christos return 0;
639 1.10 christos
640 1.10 christos objfile = obj;
641 1.10 christos return 1;
642 1.3 christos }, gdbpy_current_objfile);
643 1.10 christos else
644 1.10 christos gdbarch_iterate_over_objfiles_in_search_order
645 1.10 christos (target_gdbarch (),
646 1.10 christos [&objfile, name] (struct objfile *obj)
647 1.10 christos {
648 1.10 christos /* Don't return separate debug files. */
649 1.10 christos if (obj->separate_debug_objfile_backlink != nullptr)
650 1.10 christos return 0;
651 1.10 christos
652 1.10 christos if ((obj->flags & OBJF_NOT_FILENAME) != 0)
653 1.10 christos return 0;
654 1.10 christos
655 1.10 christos const char *filename = objfile_filename (obj);
656 1.10 christos if (filename != NULL
657 1.10 christos && compare_filenames_for_search (filename, name))
658 1.10 christos {
659 1.10 christos objfile = obj;
660 1.10 christos return 1;
661 1.10 christos }
662 1.10 christos
663 1.10 christos if (compare_filenames_for_search (obj->original_name, name))
664 1.10 christos {
665 1.10 christos objfile = obj;
666 1.10 christos return 1;
667 1.10 christos }
668 1.10 christos
669 1.10 christos return 0;
670 1.3 christos }, gdbpy_current_objfile);
671 1.3 christos
672 1.8 christos if (objfile != NULL)
673 1.3 christos return objfile_to_objfile_object (objfile).release ();
674 1.3 christos
675 1.3 christos PyErr_SetString (PyExc_ValueError, _("Objfile not found."));
676 1.3 christos return NULL;
677 1.3 christos }
678 1.1 christos
679 1.1 christos
680 1.8 christos
682 1.1 christos /* Return a new reference to the Python object of type Objfile
683 1.1 christos representing OBJFILE. If the object has already been created,
684 1.3 christos return it. Otherwise, create it. Return NULL and set the Python
685 1.8 christos error on failure. */
686 1.1 christos
687 1.1 christos gdbpy_ref<>
688 1.8 christos objfile_to_objfile_object (struct objfile *objfile)
689 1.10 christos {
690 1.8 christos PyObject *result
691 1.8 christos = (PyObject *) objfpy_objfile_data_key.get (objfile);
692 1.8 christos if (result == NULL)
693 1.8 christos {
694 1.8 christos gdbpy_ref<objfile_object> object
695 1.8 christos ((objfile_object *) PyObject_New (objfile_object, &objfile_object_type));
696 1.8 christos if (object == NULL)
697 1.8 christos return NULL;
698 1.1 christos if (!objfpy_initialize (object.get ()))
699 1.8 christos return NULL;
700 1.10 christos
701 1.8 christos object->objfile = objfile;
702 1.1 christos objfpy_objfile_data_key.set (objfile, object.get ());
703 1.1 christos result = (PyObject *) object.release ();
704 1.8 christos }
705 1.1 christos
706 1.1 christos return gdbpy_ref<>::new_reference (result);
707 1.1 christos }
708 1.1 christos
709 1.1 christos int
710 1.1 christos gdbpy_initialize_objfile (void)
711 1.1 christos {
712 1.1 christos if (PyType_Ready (&objfile_object_type) < 0)
713 1.1 christos return -1;
714 1.1 christos
715 1.1 christos return gdb_pymodule_addobject (gdb_module, "Objfile",
716 1.1 christos (PyObject *) &objfile_object_type);
717 1.1 christos }
718 1.1 christos
719 1.1 christos
720 1.1 christos
722 1.1 christos static PyMethodDef objfile_object_methods[] =
723 1.1 christos {
724 1.1 christos { "is_valid", objfpy_is_valid, METH_NOARGS,
725 1.3 christos "is_valid () -> Boolean.\n\
726 1.3 christos Return true if this object file is valid, false if not." },
727 1.3 christos
728 1.3 christos { "add_separate_debug_file", (PyCFunction) objfpy_add_separate_debug_file,
729 1.3 christos METH_VARARGS | METH_KEYWORDS,
730 1.9 christos "add_separate_debug_file (file_name).\n\
731 1.9 christos Add FILE_NAME to the list of files containing debug info for the objfile." },
732 1.9 christos
733 1.9 christos { "lookup_global_symbol", (PyCFunction) objfpy_lookup_global_symbol,
734 1.9 christos METH_VARARGS | METH_KEYWORDS,
735 1.9 christos "lookup_global_symbol (name [, domain]).\n\
736 1.9 christos Look up a global symbol in this objfile and return it." },
737 1.9 christos
738 1.9 christos { "lookup_static_symbol", (PyCFunction) objfpy_lookup_static_symbol,
739 1.9 christos METH_VARARGS | METH_KEYWORDS,
740 1.1 christos "lookup_static_symbol (name [, domain]).\n\
741 1.1 christos Look up a static-linkage global symbol in this objfile and return it." },
742 1.1 christos
743 1.7 christos { NULL }
744 1.1 christos };
745 1.3 christos
746 1.3 christos static gdb_PyGetSetDef objfile_getset[] =
747 1.1 christos {
748 1.1 christos { "__dict__", gdb_py_generic_dict, NULL,
749 1.5 christos "The __dict__ for this objfile.", &objfile_object_type },
750 1.5 christos { "filename", objfpy_get_filename, NULL,
751 1.3 christos "The objfile's filename, or None.", NULL },
752 1.3 christos { "username", objfpy_get_username, NULL,
753 1.3 christos "The name of the objfile as provided by the user, or None.", NULL },
754 1.3 christos { "owner", objfpy_get_owner, NULL,
755 1.3 christos "The objfile owner of separate debug info objfiles, or None.",
756 1.3 christos NULL },
757 1.3 christos { "build_id", objfpy_get_build_id, NULL,
758 1.1 christos "The objfile's build id, or None.", NULL },
759 1.1 christos { "progspace", objfpy_get_progspace, NULL,
760 1.1 christos "The objfile's progspace, or None.", NULL },
761 1.1 christos { "pretty_printers", objfpy_get_printers, objfpy_set_printers,
762 1.5 christos "Pretty printers.", NULL },
763 1.5 christos { "frame_filters", objfpy_get_frame_filters,
764 1.1 christos objfpy_set_frame_filters, "Frame Filters.", NULL },
765 1.1 christos { "frame_unwinders", objfpy_get_frame_unwinders,
766 1.3 christos objfpy_set_frame_unwinders, "Frame Unwinders", NULL },
767 1.3 christos { "type_printers", objfpy_get_type_printers, objfpy_set_type_printers,
768 1.10 christos "Type printers.", NULL },
769 1.10 christos { "xmethods", objfpy_get_xmethods, NULL,
770 1.1 christos "Debug methods.", NULL },
771 1.1 christos { "is_file", objfpy_get_is_file, nullptr,
772 1.1 christos "Whether this objfile came from a file.", nullptr },
773 1.5 christos { NULL }
774 1.1 christos };
775 1.1 christos
776 1.1 christos PyTypeObject objfile_object_type =
777 1.1 christos {
778 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
779 1.1 christos "gdb.Objfile", /*tp_name*/
780 1.1 christos sizeof (objfile_object), /*tp_basicsize*/
781 1.1 christos 0, /*tp_itemsize*/
782 1.1 christos objfpy_dealloc, /*tp_dealloc*/
783 1.1 christos 0, /*tp_print*/
784 1.8 christos 0, /*tp_getattr*/
785 1.1 christos 0, /*tp_setattr*/
786 1.1 christos 0, /*tp_compare*/
787 1.1 christos objfpy_repr, /*tp_repr*/
788 1.1 christos 0, /*tp_as_number*/
789 1.1 christos 0, /*tp_as_sequence*/
790 1.1 christos 0, /*tp_as_mapping*/
791 1.1 christos 0, /*tp_hash */
792 1.1 christos 0, /*tp_call*/
793 1.1 christos 0, /*tp_str*/
794 1.1 christos 0, /*tp_getattro*/
795 1.1 christos 0, /*tp_setattro*/
796 1.1 christos 0, /*tp_as_buffer*/
797 1.1 christos Py_TPFLAGS_DEFAULT, /*tp_flags*/
798 1.1 christos "GDB objfile object", /* tp_doc */
799 1.1 christos 0, /* tp_traverse */
800 1.1 christos 0, /* tp_clear */
801 1.1 christos 0, /* tp_richcompare */
802 1.1 christos 0, /* tp_weaklistoffset */
803 1.1 christos 0, /* tp_iter */
804 1.1 christos 0, /* tp_iternext */
805 1.1 christos objfile_object_methods, /* tp_methods */
806 1.1 christos 0, /* tp_members */
807 1.1 christos objfile_getset, /* tp_getset */
808 1.1 christos 0, /* tp_base */
809 1.3 christos 0, /* tp_dict */
810 1.1 christos 0, /* tp_descr_get */
811 1.1 christos 0, /* tp_descr_set */
812 1.1 christos offsetof (objfile_object, dict), /* tp_dictoffset */
813 1.1 christos 0, /* tp_init */
814 0, /* tp_alloc */
815 objfpy_new, /* tp_new */
816 };
817