Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / python / py-record-btrace.c
index 55f673eedaf2b3c40412d69a0706c713f7d7fa22..a3c3a546d7db71cd64866208cfd292dafa6b1b4c 100644 (file)
@@ -1,6 +1,6 @@
 /* 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.
 
@@ -24,7 +24,9 @@
 #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)
 
@@ -42,7 +44,7 @@ typedef struct {
   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;
@@ -81,7 +83,7 @@ btrace_insn_from_recpy_insn (const PyObject * const pyobject)
     }
 
   obj = (const recpy_element_object *) pyobject;
-  tinfo = find_thread_ptid (obj->ptid);
+  tinfo = obj->thread;
 
   if (tinfo == NULL || btrace_is_empty (tinfo))
     {
@@ -124,7 +126,7 @@ btrace_func_from_recpy_func (const PyObject * const pyobject)
     }
 
   obj = (const recpy_element_object *) pyobject;
-  tinfo = find_thread_ptid (obj->ptid);
+  tinfo = obj->thread;
 
   if (tinfo == NULL || btrace_is_empty (tinfo))
     {
@@ -152,7 +154,7 @@ btrace_func_from_recpy_func (const PyObject * const pyobject)
    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;
@@ -171,13 +173,13 @@ btpy_insn_or_gap_new (const thread_info *tinfo, Py_ssize_t number)
       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,
@@ -186,7 +188,7 @@ btpy_list_new (ptid_t ptid, Py_ssize_t first, Py_ssize_t last, Py_ssize_t step,
   if (obj == NULL)
     return NULL;
 
-  obj->ptid = ptid;
+  obj->thread = thread;
   obj->first = first;
   obj->last = last;
   obj->step = step;
@@ -207,15 +209,14 @@ recpy_bt_insn_sal (PyObject *self, void *closure)
   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;
 }
@@ -272,26 +273,24 @@ PyObject *
 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;
@@ -316,16 +315,15 @@ recpy_bt_insn_decoded (PyObject *self, void *closure)
   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 ());
@@ -343,7 +341,7 @@ recpy_bt_func_level (PyObject *self, void *closure)
   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);
 }
 
@@ -382,7 +380,7 @@ recpy_bt_func_instructions (PyObject *self, void *closure)
   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);
 }
@@ -401,7 +399,7 @@ recpy_bt_func_up (PyObject *self, void *closure)
   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);
 }
 
@@ -419,7 +417,7 @@ recpy_bt_func_prev (PyObject *self, void *closure)
   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);
 }
 
@@ -437,7 +435,7 @@ recpy_bt_func_next (PyObject *self, void *closure)
   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);
 }
 
@@ -473,9 +471,9 @@ btpy_list_item (PyObject *self, Py_ssize_t index)
   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.  */
@@ -505,7 +503,7 @@ btpy_list_slice (PyObject *self, PyObject *value)
                                 &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);
 }
@@ -523,7 +521,7 @@ btpy_list_position (PyObject *self, PyObject *value)
   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)
@@ -589,7 +587,7 @@ btpy_list_richcompare (PyObject *self, PyObject *other, int op)
   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
@@ -599,7 +597,7 @@ btpy_list_richcompare (PyObject *self, PyObject *other, int op)
        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
@@ -632,7 +630,7 @@ PyObject *
 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)
@@ -653,7 +651,7 @@ PyObject *
 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;
@@ -672,13 +670,13 @@ PyObject *
 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;
@@ -694,13 +692,13 @@ PyObject *
 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;
@@ -716,7 +714,7 @@ PyObject *
 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;
@@ -724,7 +722,7 @@ recpy_bt_instruction_history (PyObject *self, void *closure)
    if (tinfo == NULL)
      Py_RETURN_NONE;
 
-   btrace_fetch (tinfo);
+   btrace_fetch (tinfo, record_btrace_get_cpu ());
 
    if (btrace_is_empty (tinfo))
      Py_RETURN_NONE;
@@ -735,7 +733,7 @@ recpy_bt_instruction_history (PyObject *self, void *closure)
    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
@@ -745,7 +743,7 @@ PyObject *
 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;
@@ -753,7 +751,7 @@ recpy_bt_function_call_history (PyObject *self, void *closure)
   if (tinfo == NULL)
     Py_RETURN_NONE;
 
-  btrace_fetch (tinfo);
+  btrace_fetch (tinfo, record_btrace_get_cpu ());
 
   if (btrace_is_empty (tinfo))
     Py_RETURN_NONE;
@@ -764,7 +762,7 @@ recpy_bt_function_call_history (PyObject *self, void *closure)
   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.  */
@@ -773,19 +771,21 @@ PyObject *
 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;
 
@@ -796,11 +796,10 @@ recpy_bt_goto (PyObject *self, PyObject *args)
       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;
 }
This page took 0.028964 seconds and 4 git commands to generate.