/* Python interface to btrace instruction history.
- Copyright 2016-2017 Free Software Foundation, Inc.
+ Copyright 2016-2020 Free Software Foundation, Inc.
This file is part of GDB.
#include "btrace.h"
#include "py-record.h"
#include "py-record-btrace.h"
+#include "record-btrace.h"
#include "disasm.h"
+#include "gdbarch.h"
#if defined (IS_PY3K)
PyObject_HEAD
/* The thread this list belongs to. */
- ptid_t ptid;
+ thread_info *thread;
/* The first index being part of this list. */
Py_ssize_t first;
}
obj = (const recpy_element_object *) pyobject;
- tinfo = find_thread_ptid (obj->ptid);
+ tinfo = obj->thread;
if (tinfo == NULL || btrace_is_empty (tinfo))
{
}
obj = (const recpy_element_object *) pyobject;
- tinfo = find_thread_ptid (obj->ptid);
+ tinfo = obj->thread;
if (tinfo == NULL || btrace_is_empty (tinfo))
{
gdb.RecordInstruction or gdb.RecordGap object for it accordingly. */
static PyObject *
-btpy_insn_or_gap_new (const thread_info *tinfo, Py_ssize_t number)
+btpy_insn_or_gap_new (thread_info *tinfo, Py_ssize_t number)
{
btrace_insn_iterator iter;
int err_code;
return recpy_gap_new (err_code, err_string, number);
}
- return recpy_insn_new (tinfo->ptid, RECORD_METHOD_BTRACE, number);
+ return recpy_insn_new (tinfo, RECORD_METHOD_BTRACE, number);
}
/* Create a new gdb.BtraceList object. */
static PyObject *
-btpy_list_new (ptid_t ptid, Py_ssize_t first, Py_ssize_t last, Py_ssize_t step,
+btpy_list_new (thread_info *thread, Py_ssize_t first, Py_ssize_t last, Py_ssize_t step,
PyTypeObject *element_type)
{
btpy_list_object * const obj = PyObject_New (btpy_list_object,
if (obj == NULL)
return NULL;
- obj->ptid = ptid;
+ obj->thread = thread;
obj->first = first;
obj->last = last;
obj->step = step;
if (insn == NULL)
return NULL;
- TRY
+ try
{
result = symtab_and_line_to_sal_object (find_pc_line (insn->pc, 0));
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
GDB_PY_HANDLE_EXCEPTION (except);
}
- END_CATCH
return result;
}
recpy_bt_insn_data (PyObject *self, void *closure)
{
const btrace_insn * const insn = btrace_insn_from_recpy_insn (self);
- gdb_byte *buffer = NULL;
+ gdb::byte_vector buffer;
PyObject *object;
if (insn == NULL)
return NULL;
- TRY
+ try
{
- buffer = (gdb_byte *) xmalloc (insn->size);
- read_memory (insn->pc, buffer, insn->size);
+ buffer.resize (insn->size);
+ read_memory (insn->pc, buffer.data (), insn->size);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
- xfree (buffer);
GDB_PY_HANDLE_EXCEPTION (except);
}
- END_CATCH
- object = PyBytes_FromStringAndSize ((const char*) buffer, insn->size);
- xfree (buffer);
+ object = PyBytes_FromStringAndSize ((const char *) buffer.data (),
+ insn->size);
if (object == NULL)
return NULL;
if (insn == NULL)
return NULL;
- TRY
+ try
{
gdb_print_insn (target_gdbarch (), insn->pc, &strfile, NULL);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
gdbpy_convert_exception (except);
return NULL;
}
- END_CATCH
return PyBytes_FromString (strfile.string ().c_str ());
if (func == NULL)
return NULL;
- tinfo = find_thread_ptid (((recpy_element_object *) self)->ptid);
+ tinfo = ((recpy_element_object *) self)->thread;
return PyInt_FromLong (tinfo->btrace.level + func->level);
}
if (len == 0)
len = 1;
- return btpy_list_new (((recpy_element_object *) self)->ptid,
+ return btpy_list_new (((recpy_element_object *) self)->thread,
func->insn_offset, func->insn_offset + len, 1,
&recpy_insn_type);
}
if (func->up == 0)
Py_RETURN_NONE;
- return recpy_func_new (((recpy_element_object *) self)->ptid,
+ return recpy_func_new (((recpy_element_object *) self)->thread,
RECORD_METHOD_BTRACE, func->up);
}
if (func->prev == 0)
Py_RETURN_NONE;
- return recpy_func_new (((recpy_element_object *) self)->ptid,
+ return recpy_func_new (((recpy_element_object *) self)->thread,
RECORD_METHOD_BTRACE, func->prev);
}
if (func->next == 0)
Py_RETURN_NONE;
- return recpy_func_new (((recpy_element_object *) self)->ptid,
+ return recpy_func_new (((recpy_element_object *) self)->thread,
RECORD_METHOD_BTRACE, func->next);
}
number = obj->first + (obj->step * index);
if (obj->element_type == &recpy_insn_type)
- return recpy_insn_new (obj->ptid, RECORD_METHOD_BTRACE, number);
+ return recpy_insn_new (obj->thread, RECORD_METHOD_BTRACE, number);
else
- return recpy_func_new (obj->ptid, RECORD_METHOD_BTRACE, number);
+ return recpy_func_new (obj->thread, RECORD_METHOD_BTRACE, number);
}
/* Implementation of BtraceList.__getitem__ (self, slice) -> BtraceList. */
&step, &slicelength))
return NULL;
- return btpy_list_new (obj->ptid, obj->first + obj->step * start,
+ return btpy_list_new (obj->thread, obj->first + obj->step * start,
obj->first + obj->step * stop, obj->step * step,
obj->element_type);
}
if (list_obj->element_type != Py_TYPE (value))
return -1;
- if (!ptid_equal (list_obj->ptid, obj->ptid))
+ if (list_obj->thread != obj->thread)
return -1;
if (index < list_obj->first || index > list_obj->last)
switch (op)
{
case Py_EQ:
- if (ptid_equal (obj1->ptid, obj2->ptid)
+ if (obj1->thread == obj2->thread
&& obj1->element_type == obj2->element_type
&& obj1->first == obj2->first
&& obj1->last == obj2->last
Py_RETURN_FALSE;
case Py_NE:
- if (!ptid_equal (obj1->ptid, obj2->ptid)
+ if (obj1->thread != obj2->thread
|| obj1->element_type != obj2->element_type
|| obj1->first != obj2->first
|| obj1->last != obj2->last
recpy_bt_format (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- const struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ const struct thread_info * const tinfo = record->thread;
const struct btrace_config * config;
if (tinfo == NULL)
recpy_bt_replay_position (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- const struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info * tinfo = record->thread;
if (tinfo == NULL)
Py_RETURN_NONE;
recpy_bt_begin (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info *const tinfo = record->thread;
struct btrace_insn_iterator iterator;
if (tinfo == NULL)
Py_RETURN_NONE;
- btrace_fetch (tinfo);
+ btrace_fetch (tinfo, record_btrace_get_cpu ());
if (btrace_is_empty (tinfo))
Py_RETURN_NONE;
recpy_bt_end (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info *const tinfo = record->thread;
struct btrace_insn_iterator iterator;
if (tinfo == NULL)
Py_RETURN_NONE;
- btrace_fetch (tinfo);
+ btrace_fetch (tinfo, record_btrace_get_cpu ());
if (btrace_is_empty (tinfo))
Py_RETURN_NONE;
recpy_bt_instruction_history (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info *const tinfo = record->thread;
struct btrace_insn_iterator iterator;
unsigned long first = 0;
unsigned long last = 0;
if (tinfo == NULL)
Py_RETURN_NONE;
- btrace_fetch (tinfo);
+ btrace_fetch (tinfo, record_btrace_get_cpu ());
if (btrace_is_empty (tinfo))
Py_RETURN_NONE;
btrace_insn_end (&iterator, &tinfo->btrace);
last = btrace_insn_number (&iterator);
- return btpy_list_new (record->ptid, first, last, 1, &recpy_insn_type);
+ return btpy_list_new (tinfo, first, last, 1, &recpy_insn_type);
}
/* Implementation of
recpy_bt_function_call_history (PyObject *self, void *closure)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info *const tinfo = record->thread;
struct btrace_call_iterator iterator;
unsigned long first = 0;
unsigned long last = 0;
if (tinfo == NULL)
Py_RETURN_NONE;
- btrace_fetch (tinfo);
+ btrace_fetch (tinfo, record_btrace_get_cpu ());
if (btrace_is_empty (tinfo))
Py_RETURN_NONE;
btrace_call_end (&iterator, &tinfo->btrace);
last = btrace_call_number (&iterator);
- return btpy_list_new (record->ptid, first, last, 1, &recpy_func_type);
+ return btpy_list_new (tinfo, first, last, 1, &recpy_func_type);
}
/* Implementation of BtraceRecord.goto (self, BtraceInstruction) -> None. */
recpy_bt_goto (PyObject *self, PyObject *args)
{
const recpy_record_object * const record = (recpy_record_object *) self;
- struct thread_info * const tinfo = find_thread_ptid (record->ptid);
+ thread_info *const tinfo = record->thread;
const recpy_element_object *obj;
+ PyObject *parse_obj;
if (tinfo == NULL || btrace_is_empty (tinfo))
return PyErr_Format (gdbpy_gdb_error, _("Empty branch trace."));
- if (!PyArg_ParseTuple (args, "O", &obj))
+ if (!PyArg_ParseTuple (args, "O", &parse_obj))
return NULL;
- if (Py_TYPE (obj) != &recpy_insn_type)
+ if (Py_TYPE (parse_obj) != &recpy_insn_type)
return PyErr_Format (PyExc_TypeError, _("Argument must be instruction."));
+ obj = (const recpy_element_object *) parse_obj;
- TRY
+ try
{
struct btrace_insn_iterator iter;
else
target_goto_record (obj->number);
}
- CATCH (except, RETURN_MASK_ALL)
+ catch (const gdb_exception &except)
{
GDB_PY_HANDLE_EXCEPTION (except);
}
- END_CATCH
Py_RETURN_NONE;
}