diff options
author | Guinevere Larsen <blarsen@redhat.com> | 2024-02-20 18:27:32 +0100 |
---|---|---|
committer | Guinevere Larsen <blarsen@redhat.com> | 2024-02-21 15:38:24 +0100 |
commit | d2b4f49047b9a3680e49fab70e460b62f4597524 (patch) | |
tree | 532bdc5df01fc9936e380c6c65bf50d27a92a481 | |
parent | c5497c10ba7fa170d350373fa103c0f7b899c988 (diff) | |
download | gdb-users/gwen/try-frame-unwind-c++-ification-fixed.zip gdb-users/gwen/try-frame-unwind-c++-ification-fixed.tar.gz gdb-users/gwen/try-frame-unwind-c++-ification-fixed.tar.bz2 |
gdb: Migrate frame unwinders to use C++ classesusers/gwen/try-frame-unwind-c++-ification-fixed
Frame unwinders have historically been a structure populated with
callback pointers, so that architectures (or other specific unwinders)
could install their own way to handle the inferior. However, since
moving to c++, we could use polymorphism to get the same functionality
in a more readable way. Polymorphism also makes it simpler to add new
functionality to all frame unwinders, since all that's required is
adding it to the base class.
As part of the changes to add support to disabling frame unwinders,
this commit makes the first baby step in using polymorphism for the
frame unwinders, by making frame_unwind a virtual class, and adds 3 new
classes. The main class added is frame_unwind_legacy, which works the
same as the previous structs, using function pointers as callbacks. This
class was added to allow the transition to happen piecemeal. New
unwinders should instead follow the lead of the other 2 classes
implemented.
The other 2, frame_unwind_python and frame_unwind_trampoline, were added
because it seemed simpler at the moment to do that instead of reworking
the dynamic allocation to work with the legacy class, and can be used as
an example to future implementations.
86 files changed, 537 insertions, 357 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index abbf8dc..387fedb 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -1204,8 +1204,7 @@ aarch64_prologue_prev_register (frame_info_ptr this_frame, } /* AArch64 prologue unwinder. */ -static frame_unwind aarch64_prologue_unwind = -{ +static frame_unwind_legacy aarch64_prologue_unwind ( "aarch64 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1214,7 +1213,7 @@ static frame_unwind aarch64_prologue_unwind = aarch64_prologue_prev_register, NULL, default_frame_sniffer -}; +); /* Allocate and fill in *THIS_CACHE with information about the prologue of *THIS_FRAME. Do not do this is if *THIS_CACHE was already allocated. @@ -1300,8 +1299,7 @@ aarch64_stub_unwind_sniffer (const struct frame_unwind *self, } /* AArch64 stub unwinder. */ -static frame_unwind aarch64_stub_unwind = -{ +static frame_unwind_legacy aarch64_stub_unwind ( "aarch64 stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1310,7 +1308,7 @@ static frame_unwind aarch64_stub_unwind = aarch64_prologue_prev_register, NULL, aarch64_stub_unwind_sniffer -}; +); /* Return the frame base address of *THIS_FRAME. */ diff --git a/gdb/alpha-mdebug-tdep.c b/gdb/alpha-mdebug-tdep.c index f7323a4..164cc84 100644 --- a/gdb/alpha-mdebug-tdep.c +++ b/gdb/alpha-mdebug-tdep.c @@ -331,8 +331,7 @@ alpha_mdebug_frame_sniffer (const struct frame_unwind *self, return 1; } -static const struct frame_unwind alpha_mdebug_frame_unwind = -{ +static const struct frame_unwind_legacy alpha_mdebug_frame_unwind ( "alpha mdebug", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -341,7 +340,7 @@ static const struct frame_unwind alpha_mdebug_frame_unwind = alpha_mdebug_frame_prev_register, NULL, alpha_mdebug_frame_sniffer -}; +); static CORE_ADDR alpha_mdebug_frame_base_address (frame_info_ptr this_frame, diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c index 1d07fe2..832d21c 100644 --- a/gdb/alpha-tdep.c +++ b/gdb/alpha-tdep.c @@ -1007,8 +1007,7 @@ alpha_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind alpha_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy alpha_sigtramp_frame_unwind ( "alpha sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -1017,7 +1016,7 @@ static const struct frame_unwind alpha_sigtramp_frame_unwind = alpha_sigtramp_frame_prev_register, NULL, alpha_sigtramp_frame_sniffer -}; +); @@ -1427,8 +1426,7 @@ alpha_heuristic_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind alpha_heuristic_frame_unwind = -{ +static const struct frame_unwind_legacy alpha_heuristic_frame_unwind ( "alpha prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1437,7 +1435,7 @@ static const struct frame_unwind alpha_heuristic_frame_unwind = alpha_heuristic_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR alpha_heuristic_frame_base_address (frame_info_ptr this_frame, diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c index a359802..d8814f3 100644 --- a/gdb/amd64-obsd-tdep.c +++ b/gdb/amd64-obsd-tdep.c @@ -402,8 +402,7 @@ amd64obsd_trapframe_sniffer (const struct frame_unwind *self, || (startswith (name, "Xintr")))); } -static const struct frame_unwind amd64obsd_trapframe_unwind = -{ +static const struct frame_unwind_legacy amd64obsd_trapframe_unwind ( /* FIXME: kettenis/20051219: This really is more like an interrupt frame, but SIGTRAMP_FRAME would print <signal handler called>, which really is not what we want here. */ @@ -415,7 +414,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind = amd64obsd_trapframe_prev_register, NULL, amd64obsd_trapframe_sniffer -}; +); static void diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 6b868c2..4dfb3a2 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2658,8 +2658,7 @@ amd64_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind amd64_frame_unwind = -{ +static const struct frame_unwind_legacy amd64_frame_unwind ( "amd64 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2668,7 +2667,7 @@ static const struct frame_unwind amd64_frame_unwind = amd64_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Generate a bytecode expression to get the value of the saved PC. */ @@ -2805,8 +2804,7 @@ amd64_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind amd64_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy amd64_sigtramp_frame_unwind ( "amd64 sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -2815,7 +2813,7 @@ static const struct frame_unwind amd64_sigtramp_frame_unwind = amd64_sigtramp_frame_prev_register, NULL, amd64_sigtramp_frame_sniffer -}; +); static CORE_ADDR @@ -2998,8 +2996,7 @@ amd64_epilogue_frame_this_id (frame_info_ptr this_frame, (*this_id) = frame_id_build (cache->base + 16, cache->pc); } -static const struct frame_unwind amd64_epilogue_override_frame_unwind = -{ +static const struct frame_unwind_legacy amd64_epilogue_override_frame_unwind ( "amd64 epilogue override", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3008,10 +3005,9 @@ static const struct frame_unwind amd64_epilogue_override_frame_unwind = amd64_frame_prev_register, NULL, amd64_epilogue_override_frame_sniffer -}; +); -static const struct frame_unwind amd64_epilogue_frame_unwind = -{ +static const struct frame_unwind_legacy amd64_epilogue_frame_unwind ( "amd64 epilogue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3020,7 +3016,7 @@ static const struct frame_unwind amd64_epilogue_frame_unwind = amd64_frame_prev_register, NULL, amd64_epilogue_frame_sniffer -}; +); static struct frame_id amd64_dummy_id (struct gdbarch *gdbarch, frame_info_ptr this_frame) diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c index d423f2b..15b15c3 100644 --- a/gdb/amd64-windows-tdep.c +++ b/gdb/amd64-windows-tdep.c @@ -1181,8 +1181,7 @@ amd64_windows_frame_this_id (frame_info_ptr this_frame, void **this_cache, /* Windows x64 SEH unwinder. */ -static const struct frame_unwind amd64_windows_frame_unwind = -{ +static const struct frame_unwind_legacy amd64_windows_frame_unwind ( "amd64 windows", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1191,7 +1190,7 @@ static const struct frame_unwind amd64_windows_frame_unwind = &amd64_windows_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Implement the "skip_prologue" gdbarch method. */ diff --git a/gdb/amdgpu-tdep.c b/gdb/amdgpu-tdep.c index ac0ed0c..135aa5c 100644 --- a/gdb/amdgpu-tdep.c +++ b/gdb/amdgpu-tdep.c @@ -892,7 +892,7 @@ amdgpu_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const frame_unwind amdgpu_frame_unwind = { +static const frame_unwind_legacy amdgpu_frame_unwind ( "amdgpu", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -903,7 +903,7 @@ static const frame_unwind amdgpu_frame_unwind = { default_frame_sniffer, nullptr, nullptr, -}; +); static int print_insn_amdgpu (bfd_vma memaddr, struct disassemble_info *info) diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c index fa52ad0..e7faed9 100644 --- a/gdb/arc-tdep.c +++ b/gdb/arc-tdep.c @@ -1900,7 +1900,7 @@ arc_sigtramp_frame_sniffer (const struct frame_unwind *self, the fallback unwinder, we use the default frame sniffer, which always accepts the frame. */ -static const struct frame_unwind arc_frame_unwind = { +static const struct frame_unwind_legacy arc_frame_unwind ( "arc prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1911,13 +1911,13 @@ static const struct frame_unwind arc_frame_unwind = { default_frame_sniffer, NULL, NULL -}; +); /* Structure defining the ARC signal frame unwind functions. Custom sniffer is used, because this frame must be accepted only in the right context. */ -static const struct frame_unwind arc_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy arc_sigtramp_frame_unwind ( "arc sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -1928,7 +1928,7 @@ static const struct frame_unwind arc_sigtramp_frame_unwind = { arc_sigtramp_frame_sniffer, NULL, NULL -}; +); static const struct frame_base arc_normal_base = { diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 086fa56..539788a 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -2469,7 +2469,7 @@ arm_prologue_prev_register (frame_info_ptr this_frame, prev_regnum); } -static frame_unwind arm_prologue_unwind = { +static frame_unwind_legacy arm_prologue_unwind = { "arm prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3189,7 +3189,7 @@ arm_exidx_unwind_sniffer (const struct frame_unwind *self, return 1; } -struct frame_unwind arm_exidx_unwind = { +struct frame_unwind_legacy arm_exidx_unwind = { "arm exidx", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3299,8 +3299,7 @@ arm_epilogue_frame_sniffer (const struct frame_unwind *self, /* Frame unwinder from epilogue. */ -static const struct frame_unwind arm_epilogue_frame_unwind = -{ +static const struct frame_unwind_legacy arm_epilogue_frame_unwind ( "arm epilogue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3308,8 +3307,8 @@ static const struct frame_unwind arm_epilogue_frame_unwind = arm_epilogue_frame_this_id, arm_epilogue_frame_prev_register, NULL, - arm_epilogue_frame_sniffer, -}; + arm_epilogue_frame_sniffer +); /* Recognize GCC's trampoline for thumb call-indirect. If we are in a trampoline, return the target PC. Otherwise return 0. @@ -3430,7 +3429,7 @@ arm_stub_unwind_sniffer (const struct frame_unwind *self, return 0; } -struct frame_unwind arm_stub_unwind = { +struct frame_unwind_legacy arm_stub_unwind ( "arm stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3439,7 +3438,7 @@ struct frame_unwind arm_stub_unwind = { arm_prologue_prev_register, NULL, arm_stub_unwind_sniffer -}; +); /* Put here the code to store, into CACHE->saved_regs, the addresses of the saved registers of frame described by THIS_FRAME. CACHE is @@ -3956,8 +3955,7 @@ arm_m_exception_unwind_sniffer (const struct frame_unwind *self, /* Frame unwinder for M-profile exceptions (EXC_RETURN on stack), lockup and secure/nonsecure interstate function calls (FNC_RETURN). */ -struct frame_unwind arm_m_exception_unwind = -{ +struct frame_unwind_legacy arm_m_exception_unwind ( "arm m exception lockup sec_fnc", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -3966,7 +3964,7 @@ struct frame_unwind arm_m_exception_unwind = arm_m_exception_prev_register, NULL, arm_m_exception_unwind_sniffer -}; +); static CORE_ADDR arm_normal_frame_base (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index 701cec8..8f4ca5b 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -1155,7 +1155,7 @@ avr_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind avr_frame_unwind = { +static const struct frame_unwind_legacy avr_frame_unwind ( "avr prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1164,7 +1164,7 @@ static const struct frame_unwind avr_frame_unwind = { avr_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR avr_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/bfin-tdep.c b/gdb/bfin-tdep.c index 3194296..f9294a5 100644 --- a/gdb/bfin-tdep.c +++ b/gdb/bfin-tdep.c @@ -372,8 +372,7 @@ bfin_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind bfin_frame_unwind = -{ +static const struct frame_unwind_legacy bfin_frame_unwind ( "bfin prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -382,7 +381,7 @@ static const struct frame_unwind bfin_frame_unwind = bfin_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Check for "[--SP] = <reg>;" insns. These are appear in function prologues to save misc registers onto the stack. */ diff --git a/gdb/bpf-tdep.c b/gdb/bpf-tdep.c index 603d0cc..a9a4c3c 100644 --- a/gdb/bpf-tdep.c +++ b/gdb/bpf-tdep.c @@ -182,8 +182,7 @@ bpf_frame_prev_register (frame_info_ptr this_frame, /* Frame unwinder machinery for BPF. */ -static const struct frame_unwind bpf_frame_unwind = -{ +static const struct frame_unwind_legacy bpf_frame_unwind ( "bpf prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -192,7 +191,7 @@ static const struct frame_unwind bpf_frame_unwind = bpf_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Breakpoints. */ diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c index aa70a17..73701cc 100644 --- a/gdb/cris-tdep.c +++ b/gdb/cris-tdep.c @@ -435,8 +435,7 @@ cris_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind cris_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy cris_sigtramp_frame_unwind ( "cris sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -445,7 +444,7 @@ static const struct frame_unwind cris_sigtramp_frame_unwind = cris_sigtramp_frame_prev_register, NULL, cris_sigtramp_frame_sniffer -}; +); static int crisv32_single_step_through_delay (struct gdbarch *gdbarch, @@ -901,8 +900,7 @@ cris_push_dummy_call (struct gdbarch *gdbarch, struct value *function, return sp; } -static const struct frame_unwind cris_frame_unwind = -{ +static const struct frame_unwind_legacy cris_frame_unwind ( "cris prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -911,7 +909,7 @@ static const struct frame_unwind cris_frame_unwind = cris_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR cris_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c index 4fcc707..d228b9a 100644 --- a/gdb/csky-tdep.c +++ b/gdb/csky-tdep.c @@ -2159,7 +2159,7 @@ csky_frame_prev_register (frame_info_ptr this_frame, /* Data structures for the normal prologue-analysis-based unwinder. */ -static const struct frame_unwind csky_unwind_cache = { +static const struct frame_unwind_legacy csky_unwind_cache ( "cski prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2170,7 +2170,7 @@ static const struct frame_unwind csky_unwind_cache = { default_frame_sniffer, NULL, NULL -}; +); static CORE_ADDR csky_check_long_branch (frame_info_ptr frame, CORE_ADDR pc) @@ -2294,7 +2294,7 @@ csky_stub_prev_register (frame_info_ptr this_frame, prev_regnum); } -static frame_unwind csky_stub_unwind = { +static frame_unwind_legacy csky_stub_unwind ( "csky stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2303,7 +2303,7 @@ static frame_unwind csky_stub_unwind = { csky_stub_prev_register, NULL, csky_stub_unwind_sniffer -}; + ); /* Implement the this_base, this_locals, and this_args hooks for the normal unwinder. */ diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c index dd0a466..a243ce3 100644 --- a/gdb/dummy-frame.c +++ b/gdb/dummy-frame.c @@ -376,8 +376,7 @@ dummy_frame_this_id (frame_info_ptr this_frame, (*this_id) = cache->this_id; } -const struct frame_unwind dummy_frame_unwind = -{ +const struct frame_unwind_legacy dummy_frame_unwind ( "dummy", DUMMY_FRAME, FRAME_UNWIND_GDB, @@ -385,8 +384,8 @@ const struct frame_unwind dummy_frame_unwind = dummy_frame_this_id, dummy_frame_prev_register, NULL, - dummy_frame_sniffer, -}; + dummy_frame_sniffer +); /* See dummy-frame.h. */ diff --git a/gdb/dummy-frame.h b/gdb/dummy-frame.h index 753be1a..8b18481 100644 --- a/gdb/dummy-frame.h +++ b/gdb/dummy-frame.h @@ -54,7 +54,7 @@ extern void dummy_frame_discard (frame_id dummy_id, thread_info *thread); /* If the PC falls in a dummy frame, return a dummy frame unwinder. */ -extern const struct frame_unwind dummy_frame_unwind; +extern const struct frame_unwind_legacy dummy_frame_unwind; /* Destructor for dummy_frame. DATA is supplied by registrant. REGISTERS_VALID is 1 for dummy_frame_pop, 0 for dummy_frame_discard. */ diff --git a/gdb/dwarf2/frame-tailcall.c b/gdb/dwarf2/frame-tailcall.c index 18abd2a..95b5cf6 100644 --- a/gdb/dwarf2/frame-tailcall.c +++ b/gdb/dwarf2/frame-tailcall.c @@ -469,8 +469,7 @@ tailcall_frame_prev_arch (frame_info_ptr this_frame, /* Virtual tail call frame unwinder if dwarf2_tailcall_sniffer_first finds a chain to create. */ -const struct frame_unwind dwarf2_tailcall_frame_unwind = -{ +const struct frame_unwind_legacy dwarf2_tailcall_frame_unwind ( "dwarf2 tailcall", TAILCALL_FRAME, FRAME_UNWIND_DEBUGINFO, @@ -481,7 +480,7 @@ const struct frame_unwind dwarf2_tailcall_frame_unwind = tailcall_frame_sniffer, tailcall_frame_dealloc_cache, tailcall_frame_prev_arch -}; +); void _initialize_tailcall_frame (); void diff --git a/gdb/dwarf2/frame-tailcall.h b/gdb/dwarf2/frame-tailcall.h index b0809c8..bcb511d 100644 --- a/gdb/dwarf2/frame-tailcall.h +++ b/gdb/dwarf2/frame-tailcall.h @@ -34,6 +34,6 @@ extern struct value * dwarf2_tailcall_prev_register_first (frame_info_ptr this_frame, void **tailcall_cachep, int regnum); -extern const struct frame_unwind dwarf2_tailcall_frame_unwind; +extern const struct frame_unwind_legacy dwarf2_tailcall_frame_unwind; #endif /* !DWARF2_FRAME_TAILCALL_H */ diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c index f747b9b..2316370 100644 --- a/gdb/dwarf2/frame.c +++ b/gdb/dwarf2/frame.c @@ -1332,16 +1332,15 @@ dwarf2_frame_sniffer (const struct frame_unwind *self, if (fde->cie->signal_frame || dwarf2_frame_signal_frame_p (get_frame_arch (this_frame), this_frame)) - return self->type == SIGTRAMP_FRAME; + return self->type () == SIGTRAMP_FRAME; - if (self->type != NORMAL_FRAME) + if (self->type () != NORMAL_FRAME) return 0; return 1; } -static const struct frame_unwind dwarf2_frame_unwind = -{ +static const struct frame_unwind_legacy dwarf2_frame_unwind ( "dwarf2", NORMAL_FRAME, FRAME_UNWIND_DEBUGINFO, @@ -1351,10 +1350,9 @@ static const struct frame_unwind dwarf2_frame_unwind = NULL, dwarf2_frame_sniffer, dwarf2_frame_dealloc_cache -}; +); -static const struct frame_unwind dwarf2_signal_frame_unwind = -{ +static const struct frame_unwind_legacy dwarf2_signal_frame_unwind ( "dwarf2 signal", SIGTRAMP_FRAME, FRAME_UNWIND_DEBUGINFO, @@ -1366,7 +1364,7 @@ static const struct frame_unwind dwarf2_signal_frame_unwind = /* TAILCALL_CACHE can never be in such frame to need dealloc_cache. */ NULL -}; +); /* Append the DWARF-2 frame unwinders to GDBARCH's list. */ diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c index 9400e1f..4346bba 100644 --- a/gdb/frame-unwind.c +++ b/gdb/frame-unwind.c @@ -131,7 +131,7 @@ frame_unwind_try_unwinder (frame_info_ptr this_frame, void **this_cache, try { - frame_debug_printf ("trying unwinder \"%s\"", unwinder->name); + frame_debug_printf ("trying unwinder \"%s\"", unwinder->name ()); res = unwinder->sniffer (unwinder, this_frame, this_cache); } catch (const gdb_exception &ex) @@ -337,6 +337,78 @@ frame_unwind_got_address (frame_info_ptr frame, int regnum, return reg_val; } +/* See frame-unwind.h. */ + +enum unwind_stop_reason +frame_unwind::stop_reason (frame_info_ptr this_frame, + void **this_prologue_cache) const +{ + return default_frame_unwind_stop_reason (this_frame, this_prologue_cache); +} + +/* See frame-unwind.h. */ + +int +frame_unwind::sniffer (const struct frame_unwind *self, + frame_info_ptr this_frame, + void **this_prologue_cache) const +{ + return 1; +} + +/* This method just passes the parameters to the callback pointer. */ +enum unwind_stop_reason +frame_unwind_legacy::stop_reason (frame_info_ptr this_frame, + void **this_prologue_cache) const +{ + return stop_reason_p (this_frame, this_prologue_cache); +} + +/* This method just passes the parameters to the callback pointer. */ +void +frame_unwind_legacy::this_id (frame_info_ptr this_frame, + void **this_prologue_cache, + struct frame_id *id) const +{ + return this_id_p (this_frame, this_prologue_cache, id); +} + +/* This method just passes the parameters to the callback pointer. */ +struct value * +frame_unwind_legacy::prev_register (frame_info_ptr this_frame, + void **this_prologue_cache, + int regnum) const +{ + return prev_register_p (this_frame, this_prologue_cache, regnum); +} + +/* This method just passes the parameters to the callback pointer. */ +int +frame_unwind_legacy::sniffer (const struct frame_unwind *self, + frame_info_ptr this_frame, + void **this_prologue_cache) const +{ + return sniffer_p (self, this_frame, this_prologue_cache); +} + +/* This method just passes the parameters to the callback pointer. */ +void +frame_unwind_legacy::dealloc_cache (frame_info *self, void *this_cache) const +{ + if (dealloc_cache_p != nullptr) + dealloc_cache_p (self, this_cache); +} + +/* This method just passes the parameters to the callback pointer. */ +struct gdbarch * +frame_unwind_legacy::prev_arch (frame_info_ptr this_frame, + void **this_prologue_cache) const +{ + if (prev_arch_p == nullptr) + error (_("No prev_arch callback installed")); + return prev_arch_p (this_frame, this_prologue_cache); +} + /* Implement "maintenance info frame-unwinders" command. */ static void @@ -354,9 +426,9 @@ maintenance_info_frame_unwinders (const char *args, int from_tty) for (const struct frame_unwind* unwinder: table) { - const char *name = unwinder->name; - const char *type = frame_type_str (unwinder->type); - const char *uclass = frame_unwinder_class_str (unwinder->unwinder_class); + const char *name = unwinder->name (); + const char *type = frame_type_str (unwinder->type ()); + const char *uclass = frame_unwinder_class_str (unwinder->unwinder_class ()); ui_out_emit_list tuple_emitter (uiout, nullptr); uiout->field_string ("name", name); diff --git a/gdb/frame-unwind.h b/gdb/frame-unwind.h index 86bb092..1c26833 100644 --- a/gdb/frame-unwind.h +++ b/gdb/frame-unwind.h @@ -163,25 +163,143 @@ enum frame_unwind_class { FRAME_UNWIND_ARCH, }; -struct frame_unwind +class frame_unwind { - const char *name; +private: + const char *m_name; /* The frame's type. Should this instead be a collection of predicates that test the frame for various attributes? */ - enum frame_type type; + enum frame_type m_type; /* What kind of unwinder is this. It generally follows from where the unwinder was added or where it looks for information to do the unwinding. */ - enum frame_unwind_class unwinder_class; + enum frame_unwind_class m_unwinder_class; + const struct frame_data *m_unwind_data; +public: + frame_unwind (const char *n, frame_type t, frame_unwind_class c, + const struct frame_data *d) + : m_name (n), m_type (t), m_unwinder_class (c), m_unwind_data (d) { } + + const char *name () const + { + return m_name; + } + + enum frame_type type () const + { + return m_type; + } + + enum frame_unwind_class unwinder_class () const + { + return m_unwinder_class; + } + + const struct frame_data *unwind_data () const + { + return m_unwind_data; + } + + /* Default stop_reason function. It reports NO_REASON, unless the + frame is the outermost. */ + virtual enum unwind_stop_reason stop_reason (frame_info_ptr this_frame, + void **this_prologue_cache) const; + + /* Default frame sniffer. Will always return that the unwinder + is able to unwind the frame. */ + virtual int sniffer (const frame_unwind *self, + frame_info_ptr this_frame, + void **this_prologue_cache) const; + + /* The following methods are here mostly for interface functionality. They + all throw an error when called, as a safe way to check if an unwinder has + implemented the desired functionality. */ + + /* Calculate the ID of the given frame using this unwinder. */ + virtual void this_id (frame_info_ptr this_frame, void **this_prologue_cache, + struct frame_id *id) const + { + error (_("No method this_id implemented for unwinder %s"), m_name); + } + + /* Get the value of a register in a previous frame. */ + virtual struct value *prev_register (frame_info_ptr this_frame, + void **this_prologue_cache, + int regnum) const + { + error (_("No method prev_register implemented for unwinder %s"), m_name); + } + + /* Properly deallocate the cache. */ + virtual void dealloc_cache (frame_info *self, void *this_cache) const + { + error (_("No method dealloc_cache implemented for unwinder %s"), m_name); + } + + /* Get the previous architecture. */ + virtual struct gdbarch *prev_arch (frame_info_ptr this_frame, + void **this_prologue_cache) const + { + error (_("No method prev_arch implemented for unwinder %s"), m_name); + } +}; + +/* This is a legacy version of the frame unwinder. The original struct + used function pointers for callbacks, this updated version has a + method that just passes the parameters along to the callback + pointer. */ +class frame_unwind_legacy : public frame_unwind +{ +public: /* Should an attribute indicating the frame's address-in-block go here? */ - frame_unwind_stop_reason_ftype *stop_reason; - frame_this_id_ftype *this_id; - frame_prev_register_ftype *prev_register; - const struct frame_data *unwind_data; - frame_sniffer_ftype *sniffer; - frame_dealloc_cache_ftype *dealloc_cache; - frame_prev_arch_ftype *prev_arch; + frame_unwind_stop_reason_ftype *stop_reason_p; + frame_this_id_ftype *this_id_p; + frame_prev_register_ftype *prev_register_p; + frame_sniffer_ftype *sniffer_p; + frame_dealloc_cache_ftype *dealloc_cache_p; + frame_prev_arch_ftype *prev_arch_p; +//public: + frame_unwind_legacy (const char *n, frame_type t, frame_unwind_class c, + frame_unwind_stop_reason_ftype *sr, + frame_this_id_ftype *ti, + frame_prev_register_ftype *pr, + const struct frame_data *ud, + frame_sniffer_ftype *s, + frame_dealloc_cache_ftype *dc = nullptr, + frame_prev_arch_ftype *pa = nullptr) + : frame_unwind (n, t, c, ud), stop_reason_p (sr), + this_id_p (ti), prev_register_p (pr), sniffer_p (s), + dealloc_cache_p (dc), prev_arch_p (pa) { } + + /* This method just passes the parameters to the callback pointer. */ + enum unwind_stop_reason stop_reason (frame_info_ptr this_frame, + void **this_prologue_cache) const override; + + /* This method just passes the parameters to the callback pointer. */ + void this_id (frame_info_ptr this_frame, void **this_prologue_cache, + struct frame_id *id) const override; + + /* This method just passes the parameters to the callback pointer. */ + struct value *prev_register (frame_info_ptr this_frame, + void **this_prologue_cache, + int regnum) const override; + + /* This method just passes the parameters to the callback pointer. */ + int sniffer (const frame_unwind *self, + frame_info_ptr this_frame, + void **this_prologue_cache) const override; + + /* This method just passes the parameters to the callback pointer. + It is safe to call this method if no callback is installed, it + just turns into a noop. */ + void dealloc_cache (frame_info *self, void *this_cache) const override; + + /* This method just passes the parameters to the callback pointer. + If this function is called with no installed callback, this method + will error out. Wrap calls in try-catch blocks. */ + struct gdbarch *prev_arch (frame_info_ptr this_frame, + void **this_prologue_cache) const override; }; /* Register a frame unwinder, _prepending_ it to the front of the diff --git a/gdb/frame.c b/gdb/frame.c index 72a34fc..a8b1e79 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -268,12 +268,10 @@ frame_addr_hash_eq (const void *a, const void *b) static void frame_info_del (frame_info *frame) { - if (frame->prologue_cache != nullptr - && frame->unwind->dealloc_cache != nullptr) + if (frame->prologue_cache != nullptr) frame->unwind->dealloc_cache (frame, frame->prologue_cache); - if (frame->base_cache != nullptr - && frame->base->unwind->dealloc_cache != nullptr) + if (frame->base_cache != nullptr) frame->base->unwind->dealloc_cache (frame, frame->base_cache); } @@ -486,12 +484,12 @@ frame_info::to_string () const res += string_printf ("{level=%d,", fi->level); if (fi->unwind != NULL) - res += string_printf ("type=%s,", frame_type_str (fi->unwind->type)); + res += string_printf ("type=%s,", frame_type_str (fi->unwind->type ())); else res += "type=<unknown>,"; if (fi->unwind != NULL) - res += string_printf ("unwinder=\"%s\",", fi->unwind->name); + res += string_printf ("unwinder=\"%s\",", fi->unwind->name ()); else res += "unwinder=<unknown>,"; @@ -2356,7 +2354,7 @@ get_prev_frame_always_1 (frame_info_ptr this_frame) This check is valid only if this frame and the next frame are NORMAL. See the comment at frame_id_inner for details. */ if (get_frame_type (this_frame) == NORMAL_FRAME - && this_frame->next->unwind->type == NORMAL_FRAME + && this_frame->next->unwind->type () == NORMAL_FRAME && frame_id_inner (get_frame_arch (frame_info_ptr (this_frame->next)), get_frame_id (this_frame), get_frame_id (frame_info_ptr (this_frame->next)))) @@ -2952,7 +2950,7 @@ get_frame_type (frame_info_ptr frame) /* Initialize the frame's unwinder because that's what provides the frame's type. */ frame_unwind_find_by_frame (frame, &frame->prologue_cache); - return frame->unwind->type; + return frame->unwind->type (); } struct program_space * @@ -3033,11 +3031,15 @@ frame_unwind_arch (frame_info_ptr next_frame) if (next_frame->unwind == NULL) frame_unwind_find_by_frame (next_frame, &next_frame->prologue_cache); - if (next_frame->unwind->prev_arch != NULL) - arch = next_frame->unwind->prev_arch (next_frame, - &next_frame->prologue_cache); - else - arch = get_frame_arch (next_frame); + try + { + arch = next_frame->unwind->prev_arch (next_frame, + &next_frame->prologue_cache); + } + catch (gdb_exception &e) + { + arch = get_frame_arch (next_frame); + } next_frame->prev_arch.arch = arch; next_frame->prev_arch.p = true; diff --git a/gdb/frv-linux-tdep.c b/gdb/frv-linux-tdep.c index 657377c..23eee56 100644 --- a/gdb/frv-linux-tdep.c +++ b/gdb/frv-linux-tdep.c @@ -332,8 +332,7 @@ frv_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind frv_linux_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy frv_linux_sigtramp_frame_unwind ( "frv linux sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -342,7 +341,7 @@ static const struct frame_unwind frv_linux_sigtramp_frame_unwind = frv_linux_sigtramp_frame_prev_register, NULL, frv_linux_sigtramp_frame_sniffer -}; +); /* The FRV kernel defines ELF_NGREG as 46. We add 2 in order to include the loadmap addresses in the register set. (See below for more info.) */ diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c index b1dc0a2..ad945c6 100644 --- a/gdb/frv-tdep.c +++ b/gdb/frv-tdep.c @@ -1405,7 +1405,7 @@ frv_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind frv_frame_unwind = { +static const struct frame_unwind_legacy frv_frame_unwind ( "frv prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1414,7 +1414,7 @@ static const struct frame_unwind frv_frame_unwind = { frv_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR frv_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c index 22a0fbf..8dc62ea 100644 --- a/gdb/ft32-tdep.c +++ b/gdb/ft32-tdep.c @@ -524,8 +524,7 @@ ft32_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind ft32_frame_unwind = -{ +static const struct frame_unwind_legacy ft32_frame_unwind ( "ft32 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -534,7 +533,7 @@ static const struct frame_unwind ft32_frame_unwind = ft32_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Return the base address of this_frame. */ diff --git a/gdb/h8300-tdep.c b/gdb/h8300-tdep.c index ef73e78..7c284b8 100644 --- a/gdb/h8300-tdep.c +++ b/gdb/h8300-tdep.c @@ -500,7 +500,7 @@ h8300_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind h8300_frame_unwind = { +static const struct frame_unwind_legacy h8300_frame_unwind ( "h8300 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -509,7 +509,7 @@ static const struct frame_unwind h8300_frame_unwind = { h8300_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR h8300_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/hppa-linux-tdep.c b/gdb/hppa-linux-tdep.c index c187ff1..9670f48 100644 --- a/gdb/hppa-linux-tdep.c +++ b/gdb/hppa-linux-tdep.c @@ -308,7 +308,7 @@ hppa_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy hppa_linux_sigtramp_frame_unwind ( "hppa linux sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -317,7 +317,7 @@ static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = { hppa_linux_sigtramp_frame_prev_register, NULL, hppa_linux_sigtramp_frame_sniffer -}; +); /* Attempt to find (and return) the global pointer for the given function. diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index d5c41db..5b601ad 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -2283,8 +2283,7 @@ hppa_frame_unwind_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind hppa_frame_unwind = -{ +static const struct frame_unwind_legacy hppa_frame_unwind ( "hppa unwind table", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2293,7 +2292,7 @@ static const struct frame_unwind hppa_frame_unwind = hppa_frame_prev_register, NULL, hppa_frame_unwind_sniffer -}; +); /* This is a generic fallback frame unwinder that kicks in if we fail all the other ones. Normally we would expect the stub and regular unwinder @@ -2397,8 +2396,7 @@ hppa_fallback_frame_prev_register (frame_info_ptr this_frame, info->saved_regs, regnum); } -static const struct frame_unwind hppa_fallback_frame_unwind = -{ +static const struct frame_unwind_legacy hppa_fallback_frame_unwind ( "hppa prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2407,7 +2405,7 @@ static const struct frame_unwind hppa_fallback_frame_unwind = hppa_fallback_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Stub frames, used for all kinds of call stubs. */ struct hppa_stub_unwind_cache @@ -2480,7 +2478,7 @@ hppa_stub_unwind_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind hppa_stub_frame_unwind = { +static const struct frame_unwind_legacy hppa_stub_frame_unwind ( "hppa stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2489,7 +2487,7 @@ static const struct frame_unwind hppa_stub_frame_unwind = { hppa_stub_frame_prev_register, NULL, hppa_stub_unwind_sniffer -}; +); CORE_ADDR hppa_unwind_pc (struct gdbarch *gdbarch, frame_info_ptr next_frame) diff --git a/gdb/i386-obsd-tdep.c b/gdb/i386-obsd-tdep.c index 4b790ee..09b8d2a 100644 --- a/gdb/i386-obsd-tdep.c +++ b/gdb/i386-obsd-tdep.c @@ -390,7 +390,7 @@ i386obsd_trapframe_sniffer (const struct frame_unwind *self, || startswith (name, "Xsoft"))); } -static const struct frame_unwind i386obsd_trapframe_unwind = { +static const struct frame_unwind_legacy i386obsd_trapframe_unwind ( "i386 openbsd trap", /* FIXME: kettenis/20051219: This really is more like an interrupt frame, but SIGTRAMP_FRAME would print <signal handler called>, @@ -402,7 +402,7 @@ static const struct frame_unwind i386obsd_trapframe_unwind = { i386obsd_trapframe_prev_register, NULL, i386obsd_trapframe_sniffer -}; +); static void diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index d98b332..b44df37 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -2196,8 +2196,7 @@ i386_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind i386_frame_unwind = -{ +static const struct frame_unwind_legacy i386_frame_unwind ( "i386 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2206,7 +2205,7 @@ static const struct frame_unwind i386_frame_unwind = i386_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Normal frames, but in a function epilogue. */ @@ -2352,8 +2351,7 @@ i386_epilogue_frame_prev_register (frame_info_ptr this_frame, return i386_frame_prev_register (this_frame, this_cache, regnum); } -static const struct frame_unwind i386_epilogue_override_frame_unwind = -{ +static const struct frame_unwind_legacy i386_epilogue_override_frame_unwind ( "i386 epilogue override", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2362,10 +2360,9 @@ static const struct frame_unwind i386_epilogue_override_frame_unwind = i386_epilogue_frame_prev_register, NULL, i386_epilogue_override_frame_sniffer -}; +); -static const struct frame_unwind i386_epilogue_frame_unwind = -{ +static const struct frame_unwind_legacy i386_epilogue_frame_unwind ( "i386 epilogue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2374,7 +2371,7 @@ static const struct frame_unwind i386_epilogue_frame_unwind = i386_epilogue_frame_prev_register, NULL, i386_epilogue_frame_sniffer -}; +); /* Stack-based trampolines. */ @@ -2447,8 +2444,7 @@ i386_stack_tramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind i386_stack_tramp_frame_unwind = -{ +static const struct frame_unwind_legacy i386_stack_tramp_frame_unwind ( "i386 stack tramp", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2457,7 +2453,7 @@ static const struct frame_unwind i386_stack_tramp_frame_unwind = i386_epilogue_frame_prev_register, NULL, i386_stack_tramp_frame_sniffer -}; +); /* Generate a bytecode expression to get the value of the saved PC. */ @@ -2597,8 +2593,7 @@ i386_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind i386_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy i386_sigtramp_frame_unwind ( "i386 sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -2607,7 +2602,7 @@ static const struct frame_unwind i386_sigtramp_frame_unwind = i386_sigtramp_frame_prev_register, NULL, i386_sigtramp_frame_sniffer -}; +); static CORE_ADDR diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c index 53bac38..aac610a 100644 --- a/gdb/ia64-tdep.c +++ b/gdb/ia64-tdep.c @@ -2162,8 +2162,7 @@ ia64_frame_prev_register (frame_info_ptr this_frame, void **this_cache, } } -static const struct frame_unwind ia64_frame_unwind = -{ +static const struct frame_unwind_legacy ia64_frame_unwind ( "ia64 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2172,7 +2171,7 @@ static const struct frame_unwind ia64_frame_unwind = &ia64_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Signal trampolines. */ @@ -2352,8 +2351,7 @@ ia64_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind ia64_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy ia64_sigtramp_frame_unwind ( "ia64 sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -2362,7 +2360,7 @@ static const struct frame_unwind ia64_sigtramp_frame_unwind = ia64_sigtramp_frame_prev_register, NULL, ia64_sigtramp_frame_sniffer -}; +); @@ -3013,8 +3011,7 @@ ia64_libunwind_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind ia64_libunwind_frame_unwind = -{ +static const struct frame_unwind_legacy ia64_libunwind_frame_unwind ( "ia64 libunwind", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3024,7 +3021,7 @@ static const struct frame_unwind ia64_libunwind_frame_unwind = NULL, ia64_libunwind_frame_sniffer, libunwind_frame_dealloc_cache -}; +); static void ia64_libunwind_sigtramp_frame_this_id (frame_info_ptr this_frame, @@ -3103,8 +3100,7 @@ ia64_libunwind_sigtramp_frame_sniffer (const struct frame_unwind *self, return ia64_sigtramp_frame_sniffer (self, this_frame, this_cache); } -static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy ia64_libunwind_sigtramp_frame_unwind ( "ia64 libunwind sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -3113,7 +3109,7 @@ static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind = ia64_libunwind_sigtramp_frame_prev_register, NULL, ia64_libunwind_sigtramp_frame_sniffer -}; +); /* Set of libunwind callback acccessor functions. */ unw_accessors_t ia64_unw_accessors = diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c index 575fab6..774e71c 100644 --- a/gdb/inline-frame.c +++ b/gdb/inline-frame.c @@ -265,7 +265,7 @@ inline_frame_sniffer (const struct frame_unwind *self, return 1; } -const struct frame_unwind inline_frame_unwind = { +const struct frame_unwind_legacy inline_frame_unwind ( "inline", INLINE_FRAME, FRAME_UNWIND_GDB, @@ -274,7 +274,7 @@ const struct frame_unwind inline_frame_unwind = { inline_frame_prev_register, NULL, inline_frame_sniffer -}; +); /* Return non-zero if BLOCK, an inlined function block containing PC, has a group of contiguous instructions starting at PC (but not diff --git a/gdb/inline-frame.h b/gdb/inline-frame.h index e19b60e..1514ea6 100644 --- a/gdb/inline-frame.h +++ b/gdb/inline-frame.h @@ -27,7 +27,7 @@ struct process_stratum_target; /* The inline frame unwinder. */ -extern const struct frame_unwind inline_frame_unwind; +extern const struct frame_unwind_legacy inline_frame_unwind; /* Skip all inlined functions whose call sites are at the current PC. diff --git a/gdb/iq2000-tdep.c b/gdb/iq2000-tdep.c index 0cf0737..3adf00e 100644 --- a/gdb/iq2000-tdep.c +++ b/gdb/iq2000-tdep.c @@ -424,7 +424,7 @@ iq2000_frame_this_id (frame_info_ptr this_frame, void **this_cache, *this_id = frame_id_build (cache->saved_sp, cache->pc); } -static const struct frame_unwind iq2000_frame_unwind = { +static const struct frame_unwind_legacy iq2000_frame_unwind ( "iq2000 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -433,7 +433,7 @@ static const struct frame_unwind iq2000_frame_unwind = { iq2000_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR iq2000_frame_base_address (frame_info_ptr this_frame, void **this_cache) @@ -1104,8 +1104,7 @@ jit_frame_prev_register (frame_info_ptr this_frame, void **cache, int reg) /* Relay everything back to the unwinder registered by the JIT debug info reader.*/ -static const struct frame_unwind jit_frame_unwind = -{ +static const struct frame_unwind_legacy jit_frame_unwind ( "jit", NORMAL_FRAME, FRAME_UNWIND_EXTENSION, @@ -1115,7 +1114,7 @@ static const struct frame_unwind jit_frame_unwind = NULL, jit_frame_sniffer, jit_dealloc_cache -}; +); /* This is the information that is stored at jit_gdbarch_data for each diff --git a/gdb/lm32-tdep.c b/gdb/lm32-tdep.c index a132dec..104c409 100644 --- a/gdb/lm32-tdep.c +++ b/gdb/lm32-tdep.c @@ -447,7 +447,7 @@ lm32_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind lm32_frame_unwind = { +static const struct frame_unwind_legacy lm32_frame_unwind ( "lm32 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -456,7 +456,7 @@ static const struct frame_unwind lm32_frame_unwind = { lm32_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR lm32_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/loongarch-tdep.c b/gdb/loongarch-tdep.c index 3e017c4..d42b30a 100644 --- a/gdb/loongarch-tdep.c +++ b/gdb/loongarch-tdep.c @@ -450,7 +450,7 @@ loongarch_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_register (info, this_frame, regnum); } -static const struct frame_unwind loongarch_frame_unwind = { +static const struct frame_unwind_legacy loongarch_frame_unwind ( "loongarch prologue", /*.type =*/NORMAL_FRAME, /*.unwinder_class=*/FRAME_UNWIND_ARCH, @@ -460,8 +460,8 @@ static const struct frame_unwind loongarch_frame_unwind = { /*.unwind_data =*/nullptr, /*.sniffer =*/default_frame_sniffer, /*.dealloc_cache =*/nullptr, - /*.prev_arch =*/nullptr, -}; + /*.prev_arch =*/nullptr +); /* Write the contents of buffer VAL into the general-purpose argument register defined by GAR in REGCACHE. GAR indicates the available diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c index 5a91160..8d2722f 100644 --- a/gdb/m32c-tdep.c +++ b/gdb/m32c-tdep.c @@ -1955,7 +1955,7 @@ m32c_prev_register (frame_info_ptr this_frame, } -static const struct frame_unwind m32c_unwind = { +static const struct frame_unwind_legacy m32c_unwind ( "m32c prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1964,7 +1964,7 @@ static const struct frame_unwind m32c_unwind = { m32c_prev_register, NULL, default_frame_sniffer -}; +); /* Inferior calls. */ diff --git a/gdb/m32r-linux-tdep.c b/gdb/m32r-linux-tdep.c index 4287c81..d0f1a1b 100644 --- a/gdb/m32r-linux-tdep.c +++ b/gdb/m32r-linux-tdep.c @@ -301,7 +301,7 @@ m32r_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy m32r_linux_sigtramp_frame_unwind ( "m32r linux sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -310,7 +310,7 @@ static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = { m32r_linux_sigtramp_frame_prev_register, NULL, m32r_linux_sigtramp_frame_sniffer -}; +); /* Mapping between the registers in `struct pt_regs' format and GDB's register array layout. */ diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c index 8210662..ab812ec 100644 --- a/gdb/m32r-tdep.c +++ b/gdb/m32r-tdep.c @@ -831,7 +831,7 @@ m32r_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind m32r_frame_unwind = { +static const struct frame_unwind_legacy m32r_frame_unwind ( "m32r prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -840,7 +840,7 @@ static const struct frame_unwind m32r_frame_unwind = { m32r_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR m32r_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c index bbb2976..a905584 100644 --- a/gdb/m68hc11-tdep.c +++ b/gdb/m68hc11-tdep.c @@ -936,7 +936,7 @@ m68hc11_frame_prev_register (frame_info_ptr this_frame, return value; } -static const struct frame_unwind m68hc11_frame_unwind = { +static const struct frame_unwind_legacy m68hc11_frame_unwind ( "m68hc11 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -945,7 +945,7 @@ static const struct frame_unwind m68hc11_frame_unwind = { m68hc11_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR m68hc11_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/m68k-linux-tdep.c b/gdb/m68k-linux-tdep.c index f2b6905..a76a351 100644 --- a/gdb/m68k-linux-tdep.c +++ b/gdb/m68k-linux-tdep.c @@ -314,8 +314,7 @@ m68k_linux_sigtramp_frame_sniffer (const struct frame_unwind *self, return m68k_linux_pc_in_sigtramp (this_frame); } -static const struct frame_unwind m68k_linux_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy m68k_linux_sigtramp_frame_unwind ( "m68k linux sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -324,7 +323,7 @@ static const struct frame_unwind m68k_linux_sigtramp_frame_unwind = m68k_linux_sigtramp_frame_prev_register, NULL, m68k_linux_sigtramp_frame_sniffer -}; +); /* Register maps for supply/collect regset functions. */ diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index 3f7e89a..52999fd 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -1007,8 +1007,7 @@ m68k_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind m68k_frame_unwind = -{ +static const struct frame_unwind_legacy m68k_frame_unwind ( "m68k prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1017,7 +1016,7 @@ static const struct frame_unwind m68k_frame_unwind = m68k_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR m68k_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/mep-tdep.c b/gdb/mep-tdep.c index a0c648a..fdc8e90 100644 --- a/gdb/mep-tdep.c +++ b/gdb/mep-tdep.c @@ -2061,7 +2061,7 @@ mep_frame_prev_register (frame_info_ptr this_frame, } -static const struct frame_unwind mep_frame_unwind = { +static const struct frame_unwind_legacy mep_frame_unwind ( "mep prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2070,7 +2070,7 @@ static const struct frame_unwind mep_frame_unwind = { mep_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Return values. */ diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c index ced8b75..26d7130 100644 --- a/gdb/microblaze-tdep.c +++ b/gdb/microblaze-tdep.c @@ -478,8 +478,7 @@ microblaze_frame_prev_register (frame_info_ptr this_frame, } -static const struct frame_unwind microblaze_frame_unwind = -{ +static const struct frame_unwind_legacy microblaze_frame_unwind ( "microblaze prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -488,7 +487,7 @@ static const struct frame_unwind microblaze_frame_unwind = microblaze_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR microblaze_frame_base_address (frame_info_ptr next_frame, diff --git a/gdb/mips-sde-tdep.c b/gdb/mips-sde-tdep.c index 07a43d0..ef09fb1 100644 --- a/gdb/mips-sde-tdep.c +++ b/gdb/mips-sde-tdep.c @@ -161,8 +161,7 @@ mips_sde_frame_sniffer (const struct frame_unwind *self, /* Data structure for the SDE frame unwinder. */ -static const struct frame_unwind mips_sde_frame_unwind = -{ +static const struct frame_unwind_legacy mips_sde_frame_unwind ( "mips sde sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -171,7 +170,7 @@ static const struct frame_unwind mips_sde_frame_unwind = mips_sde_frame_prev_register, NULL, mips_sde_frame_sniffer -}; +); /* Implement the this_base, this_locals, and this_args hooks for the normal unwinder. */ diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 457b875..d63a3bb 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -2929,8 +2929,7 @@ mips_insn16_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind mips_insn16_frame_unwind = -{ +static const struct frame_unwind_legacy mips_insn16_frame_unwind ( "mips insn16 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2939,7 +2938,7 @@ static const struct frame_unwind mips_insn16_frame_unwind = mips_insn16_frame_prev_register, NULL, mips_insn16_frame_sniffer -}; +); static CORE_ADDR mips_insn16_frame_base_address (frame_info_ptr this_frame, @@ -3366,8 +3365,7 @@ mips_micro_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind mips_micro_frame_unwind = -{ +static const struct frame_unwind_legacy mips_micro_frame_unwind ( "mips micro prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3376,7 +3374,7 @@ static const struct frame_unwind mips_micro_frame_unwind = mips_micro_frame_prev_register, NULL, mips_micro_frame_sniffer -}; +); static CORE_ADDR mips_micro_frame_base_address (frame_info_ptr this_frame, @@ -3746,8 +3744,7 @@ mips_insn32_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind mips_insn32_frame_unwind = -{ +static const struct frame_unwind_legacy mips_insn32_frame_unwind ( "mips insn32 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3756,7 +3753,7 @@ static const struct frame_unwind mips_insn32_frame_unwind = mips_insn32_frame_prev_register, NULL, mips_insn32_frame_sniffer -}; +); static CORE_ADDR mips_insn32_frame_base_address (frame_info_ptr this_frame, @@ -3864,8 +3861,7 @@ mips_stub_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind mips_stub_frame_unwind = -{ +static const struct frame_unwind_legacy mips_stub_frame_unwind ( "mips stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3874,7 +3870,7 @@ static const struct frame_unwind mips_stub_frame_unwind = mips_stub_frame_prev_register, NULL, mips_stub_frame_sniffer -}; +); static CORE_ADDR mips_stub_frame_base_address (frame_info_ptr this_frame, diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c index 307f199..adacd84 100644 --- a/gdb/mn10300-tdep.c +++ b/gdb/mn10300-tdep.c @@ -1127,7 +1127,7 @@ mn10300_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind mn10300_frame_unwind = { +static const struct frame_unwind_legacy mn10300_frame_unwind ( "mn10300 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1136,7 +1136,7 @@ static const struct frame_unwind mn10300_frame_unwind = { mn10300_frame_prev_register, NULL, default_frame_sniffer -}; +); static void mn10300_frame_unwind_init (struct gdbarch *gdbarch) diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c index 1eeec7d..6def915 100644 --- a/gdb/moxie-tdep.c +++ b/gdb/moxie-tdep.c @@ -585,7 +585,7 @@ moxie_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind moxie_frame_unwind = { +static const struct frame_unwind_legacy moxie_frame_unwind ( "moxie prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -594,7 +594,7 @@ static const struct frame_unwind moxie_frame_unwind = { moxie_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Return the base address of this_frame. */ diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c index 6bbcc1e..7366013 100644 --- a/gdb/msp430-tdep.c +++ b/gdb/msp430-tdep.c @@ -542,7 +542,7 @@ msp430_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind msp430_unwind = { +static const struct frame_unwind_legacy msp430_unwind ( "msp430 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -551,7 +551,7 @@ static const struct frame_unwind msp430_unwind = { msp430_prev_register, NULL, default_frame_sniffer -}; +); /* Implement the "dwarf2_reg_to_regnum" gdbarch method. */ diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c index d816b9a..98956ee 100644 --- a/gdb/nds32-tdep.c +++ b/gdb/nds32-tdep.c @@ -988,8 +988,7 @@ nds32_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind nds32_frame_unwind = -{ +static const struct frame_unwind_legacy nds32_frame_unwind ( "nds32 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -997,8 +996,8 @@ static const struct frame_unwind nds32_frame_unwind = nds32_frame_this_id, nds32_frame_prev_register, NULL, - default_frame_sniffer, -}; + default_frame_sniffer +); /* Return the frame base address of *THIS_FRAME. */ @@ -1373,8 +1372,7 @@ nds32_epilogue_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind nds32_epilogue_frame_unwind = -{ +static const struct frame_unwind_legacy nds32_epilogue_frame_unwind ( "nds32 epilogue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1383,7 +1381,7 @@ static const struct frame_unwind nds32_epilogue_frame_unwind = nds32_epilogue_frame_prev_register, NULL, nds32_epilogue_frame_sniffer -}; +); /* Floating type and struct type that has only one floating type member diff --git a/gdb/nios2-tdep.c b/gdb/nios2-tdep.c index 5f4aa44..0fc9d72 100644 --- a/gdb/nios2-tdep.c +++ b/gdb/nios2-tdep.c @@ -1977,8 +1977,7 @@ nios2_frame_base_address (frame_info_ptr this_frame, void **this_cache) /* Data structures for the normal prologue-analysis-based unwinder. */ -static const struct frame_unwind nios2_frame_unwind = -{ +static const struct frame_unwind_legacy nios2_frame_unwind ( "nios2 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1987,7 +1986,7 @@ static const struct frame_unwind nios2_frame_unwind = nios2_frame_prev_register, NULL, default_frame_sniffer -}; +); static const struct frame_base nios2_frame_base = { @@ -2079,8 +2078,7 @@ nios2_stub_frame_sniffer (const struct frame_unwind *self, /* Define the data structures for the stub unwinder. */ -static const struct frame_unwind nios2_stub_frame_unwind = -{ +static const struct frame_unwind_legacy nios2_stub_frame_unwind ( "nios2 stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2089,7 +2087,7 @@ static const struct frame_unwind nios2_stub_frame_unwind = nios2_stub_frame_prev_register, NULL, nios2_stub_frame_sniffer -}; +); diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c index a1dfbf6..a3b4e9f 100644 --- a/gdb/or1k-tdep.c +++ b/gdb/or1k-tdep.c @@ -1125,7 +1125,7 @@ or1k_frame_prev_register (frame_info_ptr this_frame, /* Data structures for the normal prologue-analysis-based unwinder. */ -static const struct frame_unwind or1k_frame_unwind = { +static const struct frame_unwind_legacy or1k_frame_unwind ( "or1k prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1134,8 +1134,8 @@ static const struct frame_unwind or1k_frame_unwind = { or1k_frame_prev_register, NULL, default_frame_sniffer, - NULL, -}; + NULL +); /* Architecture initialization for OpenRISC 1000. */ diff --git a/gdb/ppc-fbsd-tdep.c b/gdb/ppc-fbsd-tdep.c index 03c3e28..ff7b7cc 100644 --- a/gdb/ppc-fbsd-tdep.c +++ b/gdb/ppc-fbsd-tdep.c @@ -262,7 +262,7 @@ ppcfbsd_sigtramp_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_register (cache, this_frame, regnum); } -static const struct frame_unwind ppcfbsd_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy ppcfbsd_sigtramp_frame_unwind ( "ppc freebsd sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -271,7 +271,7 @@ static const struct frame_unwind ppcfbsd_sigtramp_frame_unwind = { ppcfbsd_sigtramp_frame_prev_register, NULL, ppcfbsd_sigtramp_frame_sniffer -}; +); static enum return_value_convention ppcfbsd_return_value (struct gdbarch *gdbarch, struct value *function, diff --git a/gdb/ppc-obsd-tdep.c b/gdb/ppc-obsd-tdep.c index 4985bf8..93b87c2 100644 --- a/gdb/ppc-obsd-tdep.c +++ b/gdb/ppc-obsd-tdep.c @@ -231,7 +231,7 @@ ppcobsd_sigtramp_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_register (cache, this_frame, regnum); } -static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy ppcobsd_sigtramp_frame_unwind ( "ppc openbsd sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -240,7 +240,7 @@ static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = { ppcobsd_sigtramp_frame_prev_register, NULL, ppcobsd_sigtramp_frame_sniffer -}; +); static void diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c index e669295..5f6aeb5 100644 --- a/gdb/python/py-unwind.c +++ b/gdb/python/py-unwind.c @@ -807,7 +807,7 @@ pyuw_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame, { PYUW_SCOPED_DEBUG_ENTER_EXIT; - struct gdbarch *gdbarch = (struct gdbarch *) (self->unwind_data); + struct gdbarch *gdbarch = (struct gdbarch *) (self->unwind_data ()); cached_frame_info *cached_frame; gdbpy_enter enter_py (gdbarch); @@ -948,6 +948,41 @@ struct pyuw_gdbarch_data_type static const registry<gdbarch>::key<pyuw_gdbarch_data_type> pyuw_gdbarch_data; +/* Class for frame unwinders registered by the Python architecture callback. */ +class frame_unwind_python : public frame_unwind +{ +public: + frame_unwind_python (const struct frame_data *newarch) + : frame_unwind ("python", NORMAL_FRAME, FRAME_UNWIND_EXTENSION, newarch) + { } + + /* No need to override stop_reason, we want the default. */ + + int sniffer (const frame_unwind *self, frame_info_ptr this_frame, + void **this_prologue_cache) const override + { + return pyuw_sniffer (self, this_frame, this_prologue_cache); + } + + void this_id (frame_info_ptr this_frame, void **this_prologue_cache, + struct frame_id *id) const override + { + pyuw_this_id (this_frame, this_prologue_cache, id); + } + + struct value *prev_register (frame_info_ptr this_frame, + void **this_prologue_cache, + int regnum) const override + { + return pyuw_prev_register (this_frame, this_prologue_cache, regnum); + } + + void dealloc_cache (frame_info *self, void *this_cache) const override + { + pyuw_dealloc_cache (self, this_cache); + } +}; + /* New inferior architecture callback: register the Python unwinders intermediary. */ @@ -961,17 +996,9 @@ pyuw_on_new_gdbarch (gdbarch *newarch) if (!data->unwinder_registered) { struct frame_unwind *unwinder - = GDBARCH_OBSTACK_ZALLOC (newarch, struct frame_unwind); - - unwinder->name = "python"; - unwinder->type = NORMAL_FRAME; - unwinder->unwinder_class = FRAME_UNWIND_EXTENSION; - unwinder->stop_reason = default_frame_unwind_stop_reason; - unwinder->this_id = pyuw_this_id; - unwinder->prev_register = pyuw_prev_register; - unwinder->unwind_data = (const struct frame_data *) newarch; - unwinder->sniffer = pyuw_sniffer; - unwinder->dealloc_cache = pyuw_dealloc_cache; + = obstack_new<frame_unwind_python> + (gdbarch_obstack(newarch), (const struct frame_data *) newarch); + frame_unwind_prepend_unwinder (newarch, unwinder); data->unwinder_registered = 1; } diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 6b1415d..7232509 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1894,8 +1894,7 @@ record_btrace_frame_dealloc_cache (frame_info *self, void *this_cache) Therefore this unwinder reports any possibly unwound registers as <unavailable>. */ -const struct frame_unwind record_btrace_frame_unwind = -{ +const struct frame_unwind_legacy record_btrace_frame_unwind ( "record-btrace", NORMAL_FRAME, FRAME_UNWIND_GDB, @@ -1905,10 +1904,9 @@ const struct frame_unwind record_btrace_frame_unwind = NULL, record_btrace_frame_sniffer, record_btrace_frame_dealloc_cache -}; +); -const struct frame_unwind record_btrace_tailcall_frame_unwind = -{ +const struct frame_unwind_legacy record_btrace_tailcall_frame_unwind ( "record-btrace tailcall", TAILCALL_FRAME, FRAME_UNWIND_GDB, @@ -1918,7 +1916,7 @@ const struct frame_unwind record_btrace_tailcall_frame_unwind = NULL, record_btrace_tailcall_frame_sniffer, record_btrace_frame_dealloc_cache -}; +); /* Implement the get_unwinder method. */ diff --git a/gdb/record.h b/gdb/record.h index f44b395..44918ef 100644 --- a/gdb/record.h +++ b/gdb/record.h @@ -36,8 +36,8 @@ extern struct cmd_list_element *show_record_cmdlist; extern struct cmd_list_element *info_record_cmdlist; /* Unwinders for some record targets. */ -extern const struct frame_unwind record_btrace_frame_unwind; -extern const struct frame_unwind record_btrace_tailcall_frame_unwind; +extern const struct frame_unwind_legacy record_btrace_frame_unwind; +extern const struct frame_unwind_legacy record_btrace_tailcall_frame_unwind; /* A list of different recording methods. */ enum record_method diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index 4ecc761..2025b34 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -3901,8 +3901,7 @@ riscv_frame_prev_register (frame_info_ptr this_frame, are the fallback unwinder (DWARF unwinder is used first), we use the default frame sniffer, which always accepts the frame. */ -static const struct frame_unwind riscv_frame_unwind = -{ +static const struct frame_unwind_legacy riscv_frame_unwind ( /*.name =*/ "riscv prologue", /*.type =*/ NORMAL_FRAME, /*.unwinder_class=*/FRAME_UNWIND_ARCH, @@ -3912,8 +3911,8 @@ static const struct frame_unwind riscv_frame_unwind = /*.unwind_data =*/ NULL, /*.sniffer =*/ default_frame_sniffer, /*.dealloc_cache =*/ NULL, - /*.prev_arch =*/ NULL, -}; + /*.prev_arch =*/ NULL +); /* Extract a set of required target features out of ABFD. If ABFD is nullptr then a RISCV_GDBARCH_FEATURES is returned in its default state. */ diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c index 88a96cb..365040e 100644 --- a/gdb/rl78-tdep.c +++ b/gdb/rl78-tdep.c @@ -1183,8 +1183,7 @@ rl78_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind rl78_unwind = -{ +static const struct frame_unwind_legacy rl78_unwind ( "rl78 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1193,7 +1192,7 @@ static const struct frame_unwind rl78_unwind = rl78_prev_register, NULL, default_frame_sniffer -}; +); /* Implement the "dwarf_reg_to_regnum" gdbarch method. */ diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 39ef09f..a9c1c52 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -328,7 +328,7 @@ aix_sighandle_frame_sniffer (const struct frame_unwind *self, /* AIX signal handler frame unwinder */ -static const struct frame_unwind aix_sighandle_frame_unwind = { +static const struct frame_unwind_legacy aix_sighandle_frame_unwind ( "rs6000 aix sighandle", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -337,7 +337,7 @@ static const struct frame_unwind aix_sighandle_frame_unwind = { aix_sighandle_frame_prev_register, NULL, aix_sighandle_frame_sniffer -}; +); /* Core file support. */ diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 92e2746..842e80c 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -3838,8 +3838,7 @@ rs6000_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum); } -static const struct frame_unwind rs6000_frame_unwind = -{ +static const struct frame_unwind_legacy rs6000_frame_unwind ( "rs6000 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3848,7 +3847,7 @@ static const struct frame_unwind rs6000_frame_unwind = rs6000_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Allocate and initialize a frame cache for an epilogue frame. SP is restored and prev-PC is stored in LR. */ @@ -3980,8 +3979,7 @@ rs6000_epilogue_frame_sniffer (const struct frame_unwind *self, /* Frame unwinder for epilogue frame. This is required for reverse step-over a function without debug information. */ -static const struct frame_unwind rs6000_epilogue_frame_unwind = -{ +static const struct frame_unwind_legacy rs6000_epilogue_frame_unwind ( "rs6000 epilogue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -3989,7 +3987,7 @@ static const struct frame_unwind rs6000_epilogue_frame_unwind = rs6000_epilogue_frame_this_id, rs6000_epilogue_frame_prev_register, NULL, rs6000_epilogue_frame_sniffer -}; +); static CORE_ADDR diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c index 18b0030..5805fe2 100644 --- a/gdb/rx-tdep.c +++ b/gdb/rx-tdep.c @@ -631,7 +631,7 @@ rx_exception_sniffer (const struct frame_unwind *self, /* Data structure for normal code using instruction-based prologue analyzer. */ -static const struct frame_unwind rx_frame_unwind = { +static const struct frame_unwind_legacy rx_frame_unwind ( "rx prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -640,12 +640,12 @@ static const struct frame_unwind rx_frame_unwind = { rx_frame_prev_register, NULL, rx_frame_sniffer -}; +); /* Data structure for exception code using instruction-based prologue analyzer. */ -static const struct frame_unwind rx_exception_unwind = { +static const struct frame_unwind_legacy rx_exception_unwind ( "rx exception", /* SIGTRAMP_FRAME could be used here, but backtraces are less informative. */ NORMAL_FRAME, @@ -655,7 +655,7 @@ static const struct frame_unwind rx_exception_unwind = { rx_frame_prev_register, NULL, rx_exception_sniffer -}; +); /* Implement the "push_dummy_call" gdbarch method. */ static CORE_ADDR diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c index 887d473..d7cd1b8 100644 --- a/gdb/s12z-tdep.c +++ b/gdb/s12z-tdep.c @@ -442,7 +442,7 @@ s12z_frame_prev_register (frame_info_ptr this_frame, } /* Data structures for the normal prologue-analysis-based unwinder. */ -static const struct frame_unwind s12z_frame_unwind = { +static const struct frame_unwind_legacy s12z_frame_unwind ( "s12z prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -451,8 +451,8 @@ static const struct frame_unwind s12z_frame_unwind = { s12z_frame_prev_register, NULL, default_frame_sniffer, - NULL, -}; + NULL +); constexpr gdb_byte s12z_break_insn[] = {0x00}; diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c index 9c49bb8..94f3d38 100644 --- a/gdb/s390-linux-tdep.c +++ b/gdb/s390-linux-tdep.c @@ -542,7 +542,7 @@ s390_sigtramp_frame_sniffer (const struct frame_unwind *self, /* S390 sigtramp frame unwinder. */ -static const struct frame_unwind s390_sigtramp_frame_unwind = { +static const struct frame_unwind_legacy s390_sigtramp_frame_unwind ( "s390 linux sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -551,7 +551,7 @@ static const struct frame_unwind s390_sigtramp_frame_unwind = { s390_sigtramp_frame_prev_register, NULL, s390_sigtramp_frame_sniffer -}; +); /* Syscall handling. */ diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index c3eacf6..efc979c 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -2646,7 +2646,7 @@ s390_frame_prev_register (frame_info_ptr this_frame, /* Default S390 frame unwinder. */ -static const struct frame_unwind s390_frame_unwind = { +static const struct frame_unwind_legacy s390_frame_unwind ( "s390 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2655,7 +2655,7 @@ static const struct frame_unwind s390_frame_unwind = { s390_frame_prev_register, NULL, default_frame_sniffer -}; +); /* Code stubs and their stack frames. For things like PLTs and NULL function calls (where there is no true frame and the return address @@ -2741,7 +2741,7 @@ s390_stub_frame_sniffer (const struct frame_unwind *self, /* S390 stub frame unwinder. */ -static const struct frame_unwind s390_stub_frame_unwind = { +static const struct frame_unwind_legacy s390_stub_frame_unwind ( "s390 stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2750,7 +2750,7 @@ static const struct frame_unwind s390_stub_frame_unwind = { s390_stub_frame_prev_register, NULL, s390_stub_frame_sniffer -}; +); /* Frame base handling. */ diff --git a/gdb/sentinel-frame.c b/gdb/sentinel-frame.c index 3f2f1f1..075454f 100644 --- a/gdb/sentinel-frame.c +++ b/gdb/sentinel-frame.c @@ -79,8 +79,7 @@ sentinel_frame_prev_arch (frame_info_ptr this_frame, return cache->regcache->arch (); } -const struct frame_unwind sentinel_frame_unwind = -{ +const struct frame_unwind_legacy sentinel_frame_unwind ( "sentinel", SENTINEL_FRAME, FRAME_UNWIND_GDB, @@ -90,5 +89,5 @@ const struct frame_unwind sentinel_frame_unwind = NULL, NULL, NULL, - sentinel_frame_prev_arch, -}; + sentinel_frame_prev_arch +); diff --git a/gdb/sentinel-frame.h b/gdb/sentinel-frame.h index 1a37ff1..4b498f1 100644 --- a/gdb/sentinel-frame.h +++ b/gdb/sentinel-frame.h @@ -34,6 +34,6 @@ extern void *sentinel_frame_cache (struct regcache *regcache); /* At present there is only one type of sentinel frame. */ -extern const struct frame_unwind sentinel_frame_unwind; +extern const struct frame_unwind_legacy sentinel_frame_unwind; #endif /* !defined (SENTINEL_FRAME_H) */ diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c index b0ff92d..3196348 100644 --- a/gdb/sh-tdep.c +++ b/gdb/sh-tdep.c @@ -1929,7 +1929,7 @@ sh_frame_this_id (frame_info_ptr this_frame, void **this_cache, *this_id = frame_id_build (cache->saved_sp, cache->pc); } -static const struct frame_unwind sh_frame_unwind = { +static const struct frame_unwind_legacy sh_frame_unwind ( "sh prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1938,7 +1938,7 @@ static const struct frame_unwind sh_frame_unwind = { sh_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR sh_frame_base_address (frame_info_ptr this_frame, void **this_cache) @@ -1996,8 +1996,7 @@ sh_stub_unwind_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sh_stub_unwind = -{ +static const struct frame_unwind_legacy sh_stub_unwind ( "sh stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -2006,7 +2005,7 @@ static const struct frame_unwind sh_stub_unwind = sh_frame_prev_register, NULL, sh_stub_unwind_sniffer -}; +); /* Implement the stack_frame_destroyed_p gdbarch method. diff --git a/gdb/sparc-netbsd-tdep.c b/gdb/sparc-netbsd-tdep.c index 3c1add9..7f1e079 100644 --- a/gdb/sparc-netbsd-tdep.c +++ b/gdb/sparc-netbsd-tdep.c @@ -249,8 +249,7 @@ sparc32nbsd_sigcontext_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind = -{ +static const struct frame_unwind_legacy sparc32nbsd_sigcontext_frame_unwind ( "sparc32 netbsd sigcontext", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -259,7 +258,7 @@ static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind = sparc32nbsd_sigcontext_frame_prev_register, NULL, sparc32nbsd_sigcontext_frame_sniffer -}; +); /* Return the address of a system call's alternative return address. */ diff --git a/gdb/sparc-obsd-tdep.c b/gdb/sparc-obsd-tdep.c index e56ddf2..79f3a15 100644 --- a/gdb/sparc-obsd-tdep.c +++ b/gdb/sparc-obsd-tdep.c @@ -134,8 +134,7 @@ sparc32obsd_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc32obsd_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy sparc32obsd_sigtramp_frame_unwind ( "sparc32 openbsd sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -144,7 +143,7 @@ static const struct frame_unwind sparc32obsd_sigtramp_frame_unwind = sparc32obsd_sigtramp_frame_prev_register, NULL, sparc32obsd_sigtramp_frame_sniffer -}; +); diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c index 3fe8263..8d80ded 100644 --- a/gdb/sparc-sol2-tdep.c +++ b/gdb/sparc-sol2-tdep.c @@ -180,8 +180,7 @@ sparc32_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self, return sol2_sigtramp_p (this_frame); } -static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy sparc32_sol2_sigtramp_frame_unwind ( "sparc32 solaris sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -190,7 +189,7 @@ static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind = sparc32_sol2_sigtramp_frame_prev_register, NULL, sparc32_sol2_sigtramp_frame_sniffer -}; +); diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c index 36dd7bd..36056c5 100644 --- a/gdb/sparc-tdep.c +++ b/gdb/sparc-tdep.c @@ -1346,8 +1346,7 @@ sparc32_frame_prev_register (frame_info_ptr this_frame, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind sparc32_frame_unwind = -{ +static const struct frame_unwind_legacy sparc32_frame_unwind ( "sparc32 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1356,7 +1355,7 @@ static const struct frame_unwind sparc32_frame_unwind = sparc32_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR diff --git a/gdb/sparc64-fbsd-tdep.c b/gdb/sparc64-fbsd-tdep.c index b30c1edb..8be8935 100644 --- a/gdb/sparc64-fbsd-tdep.c +++ b/gdb/sparc64-fbsd-tdep.c @@ -197,8 +197,7 @@ sparc64fbsd_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy sparc64fbsd_sigtramp_frame_unwind ( "sparc64 freebsd sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -207,7 +206,7 @@ static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind = sparc64fbsd_sigtramp_frame_prev_register, NULL, sparc64fbsd_sigtramp_frame_sniffer -}; +); static const struct regset sparc64fbsd_gregset = diff --git a/gdb/sparc64-netbsd-tdep.c b/gdb/sparc64-netbsd-tdep.c index 3f61410..f318da3 100644 --- a/gdb/sparc64-netbsd-tdep.c +++ b/gdb/sparc64-netbsd-tdep.c @@ -223,8 +223,7 @@ sparc64nbsd_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind = -{ +static const struct frame_unwind_legacy sparc64nbsd_sigcontext_frame_unwind ( "sparc64 netbsd sigcontext", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -233,7 +232,7 @@ static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind = sparc64nbsd_sigcontext_frame_prev_register, NULL, sparc64nbsd_sigtramp_frame_sniffer -}; +); static const struct regset sparc64nbsd_gregset = diff --git a/gdb/sparc64-obsd-tdep.c b/gdb/sparc64-obsd-tdep.c index f7c6871..b8f18ea 100644 --- a/gdb/sparc64-obsd-tdep.c +++ b/gdb/sparc64-obsd-tdep.c @@ -220,8 +220,7 @@ sparc64obsd_sigtramp_frame_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc64obsd_frame_unwind = -{ +static const struct frame_unwind_legacy sparc64obsd_frame_unwind ( "sparc64 openbsd sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -230,7 +229,7 @@ static const struct frame_unwind sparc64obsd_frame_unwind = sparc64obsd_frame_prev_register, NULL, sparc64obsd_sigtramp_frame_sniffer -}; +); /* Kernel debugging support. */ @@ -305,8 +304,7 @@ sparc64obsd_trapframe_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind sparc64obsd_trapframe_unwind = -{ +static const struct frame_unwind_legacy sparc64obsd_trapframe_unwind ( "sparc64 openbsd trap", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -315,7 +313,7 @@ static const struct frame_unwind sparc64obsd_trapframe_unwind = sparc64obsd_trapframe_prev_register, NULL, sparc64obsd_trapframe_sniffer -}; +); /* Threads support. */ diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c index 3cdc7a7..f51679c 100644 --- a/gdb/sparc64-sol2-tdep.c +++ b/gdb/sparc64-sol2-tdep.c @@ -183,8 +183,7 @@ sparc64_sol2_sigtramp_frame_sniffer (const struct frame_unwind *self, return sol2_sigtramp_p (this_frame); } -static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind = -{ +static const struct frame_unwind_legacy sparc64_sol2_sigtramp_frame_unwind ( "sparc64 solaris sigtramp", SIGTRAMP_FRAME, FRAME_UNWIND_ARCH, @@ -193,7 +192,7 @@ static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind = sparc64_sol2_sigtramp_frame_prev_register, NULL, sparc64_sol2_sigtramp_frame_sniffer -}; +); diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c index cf37d0a..8f53c1a 100644 --- a/gdb/sparc64-tdep.c +++ b/gdb/sparc64-tdep.c @@ -1134,8 +1134,7 @@ sparc64_frame_prev_register (frame_info_ptr this_frame, void **this_cache, return frame_unwind_got_register (this_frame, regnum, regnum); } -static const struct frame_unwind sparc64_frame_unwind = -{ +static const struct frame_unwind_legacy sparc64_frame_unwind ( "sparc64 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1144,7 +1143,7 @@ static const struct frame_unwind sparc64_frame_unwind = sparc64_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c index 1022573..17496ac 100644 --- a/gdb/tic6x-tdep.c +++ b/gdb/tic6x-tdep.c @@ -452,8 +452,7 @@ tic6x_frame_base_address (frame_info_ptr this_frame, void **this_cache) return info->base; } -static const struct frame_unwind tic6x_frame_unwind = -{ +static const struct frame_unwind_legacy tic6x_frame_unwind ( "tic6x prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -462,7 +461,7 @@ static const struct frame_unwind tic6x_frame_unwind = tic6x_frame_prev_register, NULL, default_frame_sniffer -}; +); static const struct frame_base tic6x_frame_base = { @@ -516,8 +515,7 @@ tic6x_stub_unwind_sniffer (const struct frame_unwind *self, return 0; } -static const struct frame_unwind tic6x_stub_unwind = -{ +static const struct frame_unwind_legacy tic6x_stub_unwind ( "tic6x stub", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -526,7 +524,7 @@ static const struct frame_unwind tic6x_stub_unwind = tic6x_frame_prev_register, NULL, tic6x_stub_unwind_sniffer -}; +); /* Return the instruction on address PC. */ diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c index 690159f..8c127c5 100644 --- a/gdb/tilegx-tdep.c +++ b/gdb/tilegx-tdep.c @@ -900,7 +900,7 @@ tilegx_frame_base_address (frame_info_ptr this_frame, void **this_cache) return cache->base; } -static const struct frame_unwind tilegx_frame_unwind = { +static const struct frame_unwind_legacy tilegx_frame_unwind ( "tilegx prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -910,7 +910,7 @@ static const struct frame_unwind tilegx_frame_unwind = { NULL, /* const struct frame_data *unwind_data */ default_frame_sniffer, /* frame_sniffer_ftype *sniffer */ NULL /* frame_prev_pc_ftype *prev_pc */ -}; +); static const struct frame_base tilegx_frame_base = { &tilegx_frame_unwind, diff --git a/gdb/tramp-frame.c b/gdb/tramp-frame.c index d2513fc..722d24e 100644 --- a/gdb/tramp-frame.c +++ b/gdb/tramp-frame.c @@ -58,6 +58,7 @@ tramp_frame_cache (frame_info_ptr this_frame, } static void +__attribute__ ((__used__)) tramp_frame_this_id (frame_info_ptr this_frame, void **this_cache, struct frame_id *this_id) @@ -69,6 +70,7 @@ tramp_frame_this_id (frame_info_ptr this_frame, } static struct value * +__attribute__ ((__used__)) tramp_frame_prev_register (frame_info_ptr this_frame, void **this_cache, int prev_regnum) @@ -80,6 +82,7 @@ tramp_frame_prev_register (frame_info_ptr this_frame, } static CORE_ADDR +__attribute__ ((__used__)) tramp_frame_start (const struct tramp_frame *tramp, frame_info_ptr this_frame, CORE_ADDR pc) { @@ -120,11 +123,12 @@ tramp_frame_start (const struct tramp_frame *tramp, } static int +__attribute__ ((__used__)) tramp_frame_sniffer (const struct frame_unwind *self, frame_info_ptr this_frame, void **this_cache) { - const struct tramp_frame *tramp = self->unwind_data->tramp_frame; + const struct tramp_frame *tramp = self->unwind_data ()->tramp_frame; CORE_ADDR pc = get_frame_pc (this_frame); CORE_ADDR func; struct tramp_frame_cache *tramp_cache; @@ -143,6 +147,39 @@ tramp_frame_sniffer (const struct frame_unwind *self, return 1; } +class frame_unwind_trampoline : public frame_unwind { +private: + frame_prev_arch_ftype *prev_arch_p; +public: + frame_unwind_trampoline (enum frame_type t, const struct frame_data *d, + frame_prev_arch_ftype *pa) + : frame_unwind ("trampoline", t, FRAME_UNWIND_GDB, d), prev_arch_p (pa) + { } + + int sniffer(const frame_unwind *self, frame_info_ptr this_frame, + void **this_prologue_cache) const override + { + return tramp_frame_sniffer (self, this_frame, this_prologue_cache); + } + void this_id (frame_info_ptr this_frame, void **this_prologue_cache, + struct frame_id *id) const override + { + tramp_frame_this_id (this_frame, this_prologue_cache, id); + } + struct value *prev_register (frame_info_ptr this_frame, + void **this_prologue_cache, + int regnum) const override + { + return tramp_frame_prev_register (this_frame, this_prologue_cache, regnum); + } + + struct gdbarch *prev_arch (frame_info_ptr this_frame, + void **this_prologue_cache) const override + { + return prev_arch_p (this_frame, this_prologue_cache); + } +}; + void tramp_frame_prepend_unwinder (struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame) @@ -161,16 +198,11 @@ tramp_frame_prepend_unwinder (struct gdbarch *gdbarch, gdb_assert (tramp_frame->insn_size <= sizeof (tramp_frame->insn[0].bytes)); data = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_data); - unwinder = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct frame_unwind); - data->tramp_frame = tramp_frame; - unwinder->type = tramp_frame->frame_type; - unwinder->unwind_data = data; - unwinder->unwinder_class = FRAME_UNWIND_GDB; - unwinder->sniffer = tramp_frame_sniffer; - unwinder->stop_reason = default_frame_unwind_stop_reason; - unwinder->this_id = tramp_frame_this_id; - unwinder->prev_register = tramp_frame_prev_register; - unwinder->prev_arch = tramp_frame->prev_arch; + + unwinder = obstack_new <frame_unwind_trampoline> (gdbarch_obstack (gdbarch), + tramp_frame->frame_type, + data, + tramp_frame->prev_arch); frame_unwind_prepend_unwinder (gdbarch, unwinder); } diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c index 43475ca..a66f462 100644 --- a/gdb/v850-tdep.c +++ b/gdb/v850-tdep.c @@ -1320,7 +1320,7 @@ v850_frame_this_id (frame_info_ptr this_frame, void **this_cache, *this_id = frame_id_build (cache->saved_regs[E_SP_REGNUM].addr (), cache->pc); } -static const struct frame_unwind v850_frame_unwind = { +static const struct frame_unwind_legacy v850_frame_unwind ( "v850 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1329,7 +1329,7 @@ static const struct frame_unwind v850_frame_unwind = { v850_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR v850_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/vax-tdep.c b/gdb/vax-tdep.c index 8283120..fbd5a4b 100644 --- a/gdb/vax-tdep.c +++ b/gdb/vax-tdep.c @@ -386,8 +386,7 @@ vax_frame_prev_register (frame_info_ptr this_frame, return trad_frame_get_prev_register (this_frame, cache->saved_regs, regnum); } -static const struct frame_unwind vax_frame_unwind = -{ +static const struct frame_unwind_legacy vax_frame_unwind ( "vax prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -396,7 +395,7 @@ static const struct frame_unwind vax_frame_unwind = vax_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR diff --git a/gdb/xstormy16-tdep.c b/gdb/xstormy16-tdep.c index 1495829..c602386 100644 --- a/gdb/xstormy16-tdep.c +++ b/gdb/xstormy16-tdep.c @@ -728,7 +728,7 @@ xstormy16_frame_base_address (frame_info_ptr this_frame, void **this_cache) return cache->base; } -static const struct frame_unwind xstormy16_frame_unwind = { +static const struct frame_unwind_legacy xstormy16_frame_unwind ( "xstormy16 prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -737,7 +737,7 @@ static const struct frame_unwind xstormy16_frame_unwind = { xstormy16_frame_prev_register, NULL, default_frame_sniffer -}; +); static const struct frame_base xstormy16_frame_base = { &xstormy16_frame_unwind, diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c index 82149da..e364ee7 100644 --- a/gdb/xtensa-tdep.c +++ b/gdb/xtensa-tdep.c @@ -1496,9 +1496,8 @@ xtensa_frame_prev_register (frame_info_ptr this_frame, } -static const struct frame_unwind -xtensa_unwind = -{ +static const struct frame_unwind_legacy +xtensa_unwind ( "xtensa prologue", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1507,7 +1506,7 @@ xtensa_unwind = xtensa_frame_prev_register, NULL, default_frame_sniffer -}; +); static CORE_ADDR xtensa_frame_base_address (frame_info_ptr this_frame, void **this_cache) diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c index 6c9d51c..36b3b5d 100644 --- a/gdb/z80-tdep.c +++ b/gdb/z80-tdep.c @@ -1063,9 +1063,7 @@ z80_insn_is_jump (struct gdbarch *gdbarch, CORE_ADDR addr) return 0; } -static const struct frame_unwind -z80_frame_unwind = -{ +static const struct frame_unwind_legacy z80_frame_unwind ( "z80", NORMAL_FRAME, FRAME_UNWIND_ARCH, @@ -1076,7 +1074,7 @@ z80_frame_unwind = default_frame_sniffer /*dealloc_cache*/ /*prev_arch*/ -}; +); /* Initialize the gdbarch struct for the Z80 arch */ static struct gdbarch * |