aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/aarch64-tdep.c10
-rw-r--r--gdb/alpha-mdebug-tdep.c5
-rw-r--r--gdb/alpha-tdep.c10
-rw-r--r--gdb/amd64-obsd-tdep.c5
-rw-r--r--gdb/amd64-tdep.c20
-rw-r--r--gdb/amd64-windows-tdep.c5
-rw-r--r--gdb/amdgpu-tdep.c4
-rw-r--r--gdb/arc-tdep.c8
-rw-r--r--gdb/arm-tdep.c20
-rw-r--r--gdb/avr-tdep.c4
-rw-r--r--gdb/bfin-tdep.c5
-rw-r--r--gdb/bpf-tdep.c5
-rw-r--r--gdb/cris-tdep.c10
-rw-r--r--gdb/csky-tdep.c8
-rw-r--r--gdb/dummy-frame.c7
-rw-r--r--gdb/dummy-frame.h2
-rw-r--r--gdb/dwarf2/frame-tailcall.c5
-rw-r--r--gdb/dwarf2/frame-tailcall.h2
-rw-r--r--gdb/dwarf2/frame.c14
-rw-r--r--gdb/frame-unwind.c80
-rw-r--r--gdb/frame-unwind.h140
-rw-r--r--gdb/frame.c28
-rw-r--r--gdb/frv-linux-tdep.c5
-rw-r--r--gdb/frv-tdep.c4
-rw-r--r--gdb/ft32-tdep.c5
-rw-r--r--gdb/h8300-tdep.c4
-rw-r--r--gdb/hppa-linux-tdep.c4
-rw-r--r--gdb/hppa-tdep.c14
-rw-r--r--gdb/i386-obsd-tdep.c4
-rw-r--r--gdb/i386-tdep.c25
-rw-r--r--gdb/ia64-tdep.c20
-rw-r--r--gdb/inline-frame.c4
-rw-r--r--gdb/inline-frame.h2
-rw-r--r--gdb/iq2000-tdep.c4
-rw-r--r--gdb/jit.c5
-rw-r--r--gdb/lm32-tdep.c4
-rw-r--r--gdb/loongarch-tdep.c6
-rw-r--r--gdb/m32c-tdep.c4
-rw-r--r--gdb/m32r-linux-tdep.c4
-rw-r--r--gdb/m32r-tdep.c4
-rw-r--r--gdb/m68hc11-tdep.c4
-rw-r--r--gdb/m68k-linux-tdep.c5
-rw-r--r--gdb/m68k-tdep.c5
-rw-r--r--gdb/mep-tdep.c4
-rw-r--r--gdb/microblaze-tdep.c5
-rw-r--r--gdb/mips-sde-tdep.c5
-rw-r--r--gdb/mips-tdep.c20
-rw-r--r--gdb/mn10300-tdep.c4
-rw-r--r--gdb/moxie-tdep.c4
-rw-r--r--gdb/msp430-tdep.c4
-rw-r--r--gdb/nds32-tdep.c12
-rw-r--r--gdb/nios2-tdep.c10
-rw-r--r--gdb/or1k-tdep.c6
-rw-r--r--gdb/ppc-fbsd-tdep.c4
-rw-r--r--gdb/ppc-obsd-tdep.c4
-rw-r--r--gdb/python/py-unwind.c51
-rw-r--r--gdb/record-btrace.c10
-rw-r--r--gdb/record.h4
-rw-r--r--gdb/riscv-tdep.c7
-rw-r--r--gdb/rl78-tdep.c5
-rw-r--r--gdb/rs6000-aix-tdep.c4
-rw-r--r--gdb/rs6000-tdep.c10
-rw-r--r--gdb/rx-tdep.c8
-rw-r--r--gdb/s12z-tdep.c6
-rw-r--r--gdb/s390-linux-tdep.c4
-rw-r--r--gdb/s390-tdep.c8
-rw-r--r--gdb/sentinel-frame.c7
-rw-r--r--gdb/sentinel-frame.h2
-rw-r--r--gdb/sh-tdep.c9
-rw-r--r--gdb/sparc-netbsd-tdep.c5
-rw-r--r--gdb/sparc-obsd-tdep.c5
-rw-r--r--gdb/sparc-sol2-tdep.c5
-rw-r--r--gdb/sparc-tdep.c5
-rw-r--r--gdb/sparc64-fbsd-tdep.c5
-rw-r--r--gdb/sparc64-netbsd-tdep.c5
-rw-r--r--gdb/sparc64-obsd-tdep.c10
-rw-r--r--gdb/sparc64-sol2-tdep.c5
-rw-r--r--gdb/sparc64-tdep.c5
-rw-r--r--gdb/tic6x-tdep.c10
-rw-r--r--gdb/tilegx-tdep.c4
-rw-r--r--gdb/tramp-frame.c54
-rw-r--r--gdb/v850-tdep.c4
-rw-r--r--gdb/vax-tdep.c5
-rw-r--r--gdb/xstormy16-tdep.c4
-rw-r--r--gdb/xtensa-tdep.c7
-rw-r--r--gdb/z80-tdep.c6
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)
diff --git a/gdb/jit.c b/gdb/jit.c
index c2d8a2b..86f909f 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -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 *