diff options
Diffstat (limited to 'gdb/s390-linux-tdep.c')
-rw-r--r-- | gdb/s390-linux-tdep.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index d48364b..8847e8d 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -1861,6 +1861,8 @@ is_non_branch_ril (gdb_byte *insn) return 0; } +typedef buf_displaced_step_closure s390_displaced_step_closure; + /* Implementation of gdbarch_displaced_step_copy_insn. */ static struct displaced_step_closure * @@ -1869,8 +1871,9 @@ s390_displaced_step_copy_insn (struct gdbarch *gdbarch, struct regcache *regs) { size_t len = gdbarch_max_insn_length (gdbarch); - gdb_byte *buf = (gdb_byte *) xmalloc (len); - struct cleanup *old_chain = make_cleanup (xfree, buf); + std::unique_ptr<s390_displaced_step_closure> closure + (new s390_displaced_step_closure (len)); + gdb_byte *buf = closure->buf.data (); read_memory (from, buf, len); @@ -1898,7 +1901,7 @@ s390_displaced_step_copy_insn (struct gdbarch *gdbarch, "RIL instruction: offset %s out of range\n", plongest (offset)); } - do_cleanups (old_chain); + return NULL; } @@ -1914,20 +1917,21 @@ s390_displaced_step_copy_insn (struct gdbarch *gdbarch, displaced_step_dump_bytes (gdb_stdlog, buf, len); } - discard_cleanups (old_chain); - return (struct displaced_step_closure *) buf; + return closure.release (); } /* Fix up the state of registers and memory after having single-stepped a displaced instruction. */ static void s390_displaced_step_fixup (struct gdbarch *gdbarch, - struct displaced_step_closure *closure, + struct displaced_step_closure *closure_, CORE_ADDR from, CORE_ADDR to, struct regcache *regs) { /* Our closure is a copy of the instruction. */ - gdb_byte *insn = (gdb_byte *) closure; + s390_displaced_step_closure *closure + = (s390_displaced_step_closure *) closure_; + gdb_byte *insn = closure->buf.data (); static int s390_instrlen[] = { 2, 4, 4, 6 }; int insnlen = s390_instrlen[insn[0] >> 6]; |