diff options
author | Yao Qi <yao@codesourcery.com> | 2014-04-18 19:32:01 +0800 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2014-04-22 09:21:55 +0800 |
commit | 48b6e87ef297136a6409c2c993c4626f28bbb4d1 (patch) | |
tree | a54fda3ab474325c513a7981d0a8f8ec4063990a /gdb/ctf.c | |
parent | f159927f4d15d820a6eb615e33d68780db035c8d (diff) | |
download | gdb-48b6e87ef297136a6409c2c993c4626f28bbb4d1.zip gdb-48b6e87ef297136a6409c2c993c4626f28bbb4d1.tar.gz gdb-48b6e87ef297136a6409c2c993c4626f28bbb4d1.tar.bz2 |
Unify ctf_fetch_registers and tfile_fetch_registers
Functions ctf_fetch_registers and tfile_fetch_registers have some
duplicated code about guessing the PC in regcache. Sometimes, we
may change one function and forget to update the other one, like this
https://www.sourceware.org/ml/gdb-patches/2014-01/msg00292.html
This patch is to move the duplicated code into a new function
tracefile_fetch_registers, and let both ctf_fetch_registers and
tfile_fetch_registers call it.
gdb:
2014-04-22 Yao Qi <yao@codesourcery.com>
* tracefile-tfile.c (tfile_fetch_registers): Move the bottom to ...
* tracefile.c (tracefile_fetch_registers): ... it. New function.
* tracefile.h (tracefile_fetch_registers): Declare.
* ctf.c (ctf_fetch_registers): Remove the bottom. Call
tracefile_fetch_registers.
Diffstat (limited to 'gdb/ctf.c')
-rw-r--r-- | gdb/ctf.c | 48 |
1 files changed, 4 insertions, 44 deletions
@@ -1229,8 +1229,6 @@ ctf_fetch_registers (struct target_ops *ops, struct regcache *regcache, int regno) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - int offset, regn, regsize, pc_regno; - gdb_byte *regs = NULL; struct bt_ctf_event *event = NULL; struct bt_iter_pos *pos; @@ -1270,13 +1268,14 @@ ctf_fetch_registers (struct target_ops *ops, if (event != NULL) { + int offset, regsize, regn; const struct bt_definition *scope = bt_ctf_get_top_level_scope (event, BT_EVENT_FIELDS); const struct bt_definition *array = bt_ctf_get_field (event, scope, "contents"); + gdb_byte *regs = (gdb_byte *) bt_ctf_get_char_array (array); - regs = (gdb_byte *) bt_ctf_get_char_array (array); /* Assume the block is laid out in GDB register number order, each register with the size that it has in GDB. */ offset = 0; @@ -1300,48 +1299,9 @@ ctf_fetch_registers (struct target_ops *ops, } offset += regsize; } - return; - } - - regs = alloca (trace_regblock_size); - - /* We get here if no register data has been found. Mark registers - as unavailable. */ - for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++) - regcache_raw_supply (regcache, regn, NULL); - - /* We can often usefully guess that the PC is going to be the same - as the address of the tracepoint. */ - pc_regno = gdbarch_pc_regnum (gdbarch); - if (pc_regno >= 0 && (regno == -1 || regno == pc_regno)) - { - struct tracepoint *tp = get_tracepoint (get_tracepoint_number ()); - - if (tp != NULL && tp->base.loc) - { - /* But don't try to guess if tracepoint is multi-location... */ - if (tp->base.loc->next != NULL) - { - warning (_("Tracepoint %d has multiple " - "locations, cannot infer $pc"), - tp->base.number); - return; - } - /* ... or does while-stepping. */ - if (tp->step_count > 0) - { - warning (_("Tracepoint %d does while-stepping, " - "cannot infer $pc"), - tp->base.number); - return; - } - - store_unsigned_integer (regs, register_size (gdbarch, pc_regno), - gdbarch_byte_order (gdbarch), - tp->base.loc->address); - regcache_raw_supply (regcache, pc_regno, regs); - } } + else + tracefile_fetch_registers (regcache, regno); } /* This is the implementation of target_ops method to_xfer_partial. |