From 68811f8ff84895ef1cad37ac6947f1a340dd2ae2 Mon Sep 17 00:00:00 2001 From: Alan Hayward Date: Wed, 10 Apr 2019 15:58:27 +0100 Subject: [PATCH] AArch64: Ensure regcache is reset between tests A recent change made the AArch64 self tests resuse the saved regs cache, rather than creating a new one. Ensure it is reset to default values between tests. Do this by splitting the reset functionality from trad_frame_alloc_saved_regs into a new function. Fixes selftest on AArch64. gdb/ChangeLog: * aarch64-tdep.c (aarch64_analyze_prologue_test): Reset saved regs. * trad-frame.c (trad_frame_reset_saved_regs): New function. (trad_frame_alloc_saved_regs): Call trad_frame_reset_saved_regs. * trad-frame.h (trad_frame_reset_saved_regs): New declaration. --- gdb/ChangeLog | 7 +++++++ gdb/aarch64-tdep.c | 2 ++ gdb/trad-frame.c | 21 +++++++++++++++------ gdb/trad-frame.h | 3 +++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cc6762dc786..a5cbc899729 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-04-11 Alan Hayward + + * aarch64-tdep.c (aarch64_analyze_prologue_test): Reset saved regs. + * trad-frame.c (trad_frame_reset_saved_regs): New function. + (trad_frame_alloc_saved_regs): Call trad_frame_reset_saved_regs. + * trad-frame.h (trad_frame_reset_saved_regs): New declaration. + 2019-04-10 Kevin Buettner * amd64-linux-nat.c (amd64_linux_collect_native_gregset): New diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 7eecb52eb11..1b3977bfaf2 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -665,6 +665,7 @@ aarch64_analyze_prologue_test (void) }; instruction_reader_test reader (insns); + trad_frame_reset_saved_regs (gdbarch, cache.saved_regs); CORE_ADDR end = aarch64_analyze_prologue (gdbarch, 0, 128, &cache, reader); SELF_CHECK (end == 4 * 5); @@ -707,6 +708,7 @@ aarch64_analyze_prologue_test (void) }; instruction_reader_test reader (insns); + trad_frame_reset_saved_regs (gdbarch, cache.saved_regs); CORE_ADDR end = aarch64_analyze_prologue (gdbarch, 0, 128, &cache, reader); diff --git a/gdb/trad-frame.c b/gdb/trad-frame.c index 3cb295309c5..d9114753c5e 100644 --- a/gdb/trad-frame.c +++ b/gdb/trad-frame.c @@ -44,19 +44,28 @@ trad_frame_cache_zalloc (struct frame_info *this_frame) return this_trad_cache; } +/* See trad-frame.h. */ + +void +trad_frame_reset_saved_regs (struct gdbarch *gdbarch, + struct trad_frame_saved_reg *regs) +{ + int numregs = gdbarch_num_cooked_regs (gdbarch); + for (int regnum = 0; regnum < numregs; regnum++) + { + regs[regnum].realreg = regnum; + regs[regnum].addr = -1; + } +} + struct trad_frame_saved_reg * trad_frame_alloc_saved_regs (struct gdbarch *gdbarch) { - int regnum; int numregs = gdbarch_num_cooked_regs (gdbarch); struct trad_frame_saved_reg *this_saved_regs = FRAME_OBSTACK_CALLOC (numregs, struct trad_frame_saved_reg); - for (regnum = 0; regnum < numregs; regnum++) - { - this_saved_regs[regnum].realreg = regnum; - this_saved_regs[regnum].addr = -1; - } + trad_frame_reset_saved_regs (gdbarch, this_saved_regs); return this_saved_regs; } diff --git a/gdb/trad-frame.h b/gdb/trad-frame.h index dd80d1b83c4..f947e586a13 100644 --- a/gdb/trad-frame.h +++ b/gdb/trad-frame.h @@ -113,6 +113,9 @@ int trad_frame_addr_p (struct trad_frame_saved_reg this_saved_regs[], int trad_frame_realreg_p (struct trad_frame_saved_reg this_saved_regs[], int regnum); +/* Reset the save regs cache, setting register values to -1. */ +void trad_frame_reset_saved_regs (struct gdbarch *gdbarch, + struct trad_frame_saved_reg *regs); /* Return a freshly allocated (and initialized) trad_frame array. */ struct trad_frame_saved_reg *trad_frame_alloc_saved_regs (struct frame_info *); -- 2.30.2