From: Andrew Burgess <aburgess@redhat.com>
To: Guinevere Larsen <guinevere@redhat.com>, gdb-patches@sourceware.org
Cc: Guinevere Larsen <guinevere@redhat.com>,
Eli Zaretskii <eliz@gnu.org>,
Thiago Jung Bauermann <thiago.bauermann@linaro.org>,
Simon Marchi <simon.marchi@efficios.com>
Subject: Re: [PATCH v8 2/5] gdb: add "unwinder class" to frame unwinders
Date: Tue, 14 Jan 2025 15:28:56 +0000 [thread overview]
Message-ID: <878qrdqurr.fsf@redhat.com> (raw)
In-Reply-To: <20241210195115.3046370-3-guinevere@redhat.com>
Guinevere Larsen <guinevere@redhat.com> writes:
> A future patch will add a way to disable certain unwinders based on
> different characteristics. This patch aims to make it more convenient
> to disable related unwinders in bulk, such as architecture specific
> ones, by identifying all unwinders by which part of the code adds it.
> The classes, and explanations, are as follows:
>
> * GDB: An internal unwinder, added by GDB core, such as the unwinder
> for dummy frames;
> * EXTENSION: Unwinders added by extension languages;
> * DEBUGINFO: Unwinders installed by the debug info reader;
> * ARCH: Unwinders installed by the architecture specific code.
>
> Reviewed-By: Eli Zaretskii <eliz@gnu.org>
> Reviewed-by: Thiago Jung Bauermann <thiago.bauermann@linaro.org>
> Approved-By: Simon Marchi <simon.marchi@efficios.com>
Approved-By: Andrew Burgess <aburgess@redhat.com>
Thanks,
Andrew
> ---
> gdb/NEWS | 4 ++++
> gdb/aarch64-tdep.c | 2 ++
> gdb/alpha-mdebug-tdep.c | 1 +
> gdb/alpha-tdep.c | 2 ++
> gdb/amd64-obsd-tdep.c | 1 +
> gdb/amd64-tdep.c | 4 ++++
> gdb/amd64-windows-tdep.c | 1 +
> gdb/amdgpu-tdep.c | 1 +
> gdb/arc-tdep.c | 2 ++
> gdb/arm-tdep.c | 5 +++++
> gdb/avr-tdep.c | 1 +
> gdb/bfin-tdep.c | 1 +
> gdb/bpf-tdep.c | 1 +
> gdb/cris-tdep.c | 2 ++
> gdb/csky-tdep.c | 2 ++
> gdb/doc/gdb.texinfo | 15 ++++++++++++++-
> gdb/dummy-frame.c | 1 +
> gdb/dwarf2/frame-tailcall.c | 1 +
> gdb/dwarf2/frame.c | 2 ++
> gdb/frame-unwind.c | 22 +++++++++++++++++++++-
> gdb/frame-unwind.h | 19 +++++++++++++++++++
> gdb/frv-linux-tdep.c | 1 +
> gdb/frv-tdep.c | 1 +
> gdb/ft32-tdep.c | 1 +
> gdb/h8300-tdep.c | 1 +
> gdb/hppa-linux-tdep.c | 1 +
> gdb/hppa-tdep.c | 3 +++
> gdb/i386-obsd-tdep.c | 1 +
> gdb/i386-tdep.c | 5 +++++
> gdb/ia64-tdep.c | 4 ++++
> gdb/inline-frame.c | 1 +
> gdb/iq2000-tdep.c | 1 +
> gdb/jit.c | 1 +
> gdb/lm32-tdep.c | 1 +
> gdb/loongarch-tdep.c | 1 +
> gdb/m32c-tdep.c | 1 +
> gdb/m32r-linux-tdep.c | 1 +
> gdb/m32r-tdep.c | 1 +
> gdb/m68hc11-tdep.c | 1 +
> gdb/m68k-linux-tdep.c | 1 +
> gdb/m68k-tdep.c | 1 +
> gdb/mep-tdep.c | 1 +
> gdb/microblaze-tdep.c | 1 +
> gdb/mips-sde-tdep.c | 1 +
> gdb/mips-tdep.c | 4 ++++
> gdb/mn10300-tdep.c | 1 +
> gdb/moxie-tdep.c | 1 +
> gdb/msp430-tdep.c | 1 +
> gdb/nds32-tdep.c | 2 ++
> gdb/or1k-tdep.c | 1 +
> gdb/ppc-fbsd-tdep.c | 1 +
> gdb/ppc-obsd-tdep.c | 1 +
> gdb/python/py-unwind.c | 1 +
> gdb/record-btrace.c | 2 ++
> gdb/riscv-tdep.c | 1 +
> gdb/rl78-tdep.c | 1 +
> gdb/rs6000-aix-tdep.c | 1 +
> gdb/rs6000-tdep.c | 2 ++
> gdb/rx-tdep.c | 2 ++
> gdb/s12z-tdep.c | 1 +
> gdb/s390-linux-tdep.c | 1 +
> gdb/s390-tdep.c | 2 ++
> gdb/sentinel-frame.c | 1 +
> gdb/sh-tdep.c | 2 ++
> gdb/sparc-netbsd-tdep.c | 1 +
> gdb/sparc-obsd-tdep.c | 1 +
> gdb/sparc-sol2-tdep.c | 1 +
> gdb/sparc-tdep.c | 1 +
> gdb/sparc64-fbsd-tdep.c | 1 +
> gdb/sparc64-netbsd-tdep.c | 1 +
> gdb/sparc64-obsd-tdep.c | 2 ++
> gdb/sparc64-sol2-tdep.c | 1 +
> gdb/sparc64-tdep.c | 1 +
> gdb/tic6x-tdep.c | 2 ++
> gdb/tilegx-tdep.c | 1 +
> gdb/tramp-frame.c | 1 +
> gdb/v850-tdep.c | 1 +
> gdb/vax-tdep.c | 1 +
> gdb/xstormy16-tdep.c | 1 +
> gdb/xtensa-tdep.c | 1 +
> gdb/z80-tdep.c | 1 +
> 81 files changed, 168 insertions(+), 2 deletions(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 361d7726ba0..245b355669a 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -164,6 +164,10 @@ maintenance print remote-registers
> which registers were included in the last stop reply packet received by
> GDB.
>
> +mainenance info frame-unwinders
> + Add a CLASS column to the output. This class is a somewhat arbitrary
> + grouping of unwinders, based on which area of GDB adds the unwinder.
> +
> show configuration
> Now includes the version of GNU Readline library that GDB is using.
>
> diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
> index bc8746e27f0..e5498089ca9 100644
> --- a/gdb/aarch64-tdep.c
> +++ b/gdb/aarch64-tdep.c
> @@ -1209,6 +1209,7 @@ static frame_unwind aarch64_prologue_unwind =
> {
> "aarch64 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> aarch64_prologue_frame_unwind_stop_reason,
> aarch64_prologue_this_id,
> aarch64_prologue_prev_register,
> @@ -1304,6 +1305,7 @@ static frame_unwind aarch64_stub_unwind =
> {
> "aarch64 stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> aarch64_stub_frame_unwind_stop_reason,
> aarch64_stub_this_id,
> aarch64_prologue_prev_register,
> diff --git a/gdb/alpha-mdebug-tdep.c b/gdb/alpha-mdebug-tdep.c
> index abded2ac192..b087afabae7 100644
> --- a/gdb/alpha-mdebug-tdep.c
> +++ b/gdb/alpha-mdebug-tdep.c
> @@ -334,6 +334,7 @@ static const struct frame_unwind alpha_mdebug_frame_unwind =
> {
> "alpha mdebug",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> alpha_mdebug_frame_this_id,
> alpha_mdebug_frame_prev_register,
> diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
> index 301ab5cd01d..4ce45d29ade 100644
> --- a/gdb/alpha-tdep.c
> +++ b/gdb/alpha-tdep.c
> @@ -1011,6 +1011,7 @@ static const struct frame_unwind alpha_sigtramp_frame_unwind =
> {
> "alpha sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> alpha_sigtramp_frame_this_id,
> alpha_sigtramp_frame_prev_register,
> @@ -1430,6 +1431,7 @@ static const struct frame_unwind alpha_heuristic_frame_unwind =
> {
> "alpha prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> alpha_heuristic_frame_this_id,
> alpha_heuristic_frame_prev_register,
> diff --git a/gdb/amd64-obsd-tdep.c b/gdb/amd64-obsd-tdep.c
> index 5b1e77b3e86..5359959e3bb 100644
> --- a/gdb/amd64-obsd-tdep.c
> +++ b/gdb/amd64-obsd-tdep.c
> @@ -409,6 +409,7 @@ static const struct frame_unwind amd64obsd_trapframe_unwind =
> which really is not what we want here. */
> "amd64 openbsd trap",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> amd64obsd_trapframe_this_id,
> amd64obsd_trapframe_prev_register,
> diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
> index e03180b08af..f1cd1fdef09 100644
> --- a/gdb/amd64-tdep.c
> +++ b/gdb/amd64-tdep.c
> @@ -2670,6 +2670,7 @@ static const struct frame_unwind amd64_frame_unwind =
> {
> "amd64 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> amd64_frame_unwind_stop_reason,
> amd64_frame_this_id,
> amd64_frame_prev_register,
> @@ -2816,6 +2817,7 @@ static const struct frame_unwind amd64_sigtramp_frame_unwind =
> {
> "amd64 sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> amd64_sigtramp_frame_unwind_stop_reason,
> amd64_sigtramp_frame_this_id,
> amd64_sigtramp_frame_prev_register,
> @@ -3008,6 +3010,7 @@ static const struct frame_unwind amd64_epilogue_override_frame_unwind =
> {
> "amd64 epilogue override",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> amd64_epilogue_frame_unwind_stop_reason,
> amd64_epilogue_frame_this_id,
> amd64_frame_prev_register,
> @@ -3019,6 +3022,7 @@ static const struct frame_unwind amd64_epilogue_frame_unwind =
> {
> "amd64 epilogue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> amd64_epilogue_frame_unwind_stop_reason,
> amd64_epilogue_frame_this_id,
> amd64_frame_prev_register,
> diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
> index e3e815e1123..ec32a57d7ea 100644
> --- a/gdb/amd64-windows-tdep.c
> +++ b/gdb/amd64-windows-tdep.c
> @@ -1188,6 +1188,7 @@ static const struct frame_unwind amd64_windows_frame_unwind =
> {
> "amd64 windows",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> &amd64_windows_frame_this_id,
> &amd64_windows_frame_prev_register,
> diff --git a/gdb/amdgpu-tdep.c b/gdb/amdgpu-tdep.c
> index 6fe79732158..b8a5fd80fa0 100644
> --- a/gdb/amdgpu-tdep.c
> +++ b/gdb/amdgpu-tdep.c
> @@ -892,6 +892,7 @@ amdgpu_frame_prev_register (const frame_info_ptr &this_frame, void **this_cache,
> static const frame_unwind amdgpu_frame_unwind = {
> "amdgpu",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> amdgpu_frame_this_id,
> amdgpu_frame_prev_register,
> diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
> index 9adf2959cf3..a4ab78d8ade 100644
> --- a/gdb/arc-tdep.c
> +++ b/gdb/arc-tdep.c
> @@ -1913,6 +1913,7 @@ arc_sigtramp_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind arc_frame_unwind = {
> "arc prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> arc_frame_this_id,
> arc_frame_prev_register,
> @@ -1929,6 +1930,7 @@ static const struct frame_unwind arc_frame_unwind = {
> static const struct frame_unwind arc_sigtramp_frame_unwind = {
> "arc sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> arc_sigtramp_frame_this_id,
> arc_sigtramp_frame_prev_register,
> diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
> index c27b2a2e1af..657ecd57098 100644
> --- a/gdb/arm-tdep.c
> +++ b/gdb/arm-tdep.c
> @@ -2469,6 +2469,7 @@ arm_prologue_prev_register (const frame_info_ptr &this_frame,
> static frame_unwind arm_prologue_unwind = {
> "arm prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> arm_prologue_unwind_stop_reason,
> arm_prologue_this_id,
> arm_prologue_prev_register,
> @@ -3188,6 +3189,7 @@ arm_exidx_unwind_sniffer (const struct frame_unwind *self,
> struct frame_unwind arm_exidx_unwind = {
> "arm exidx",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> arm_prologue_this_id,
> arm_prologue_prev_register,
> @@ -3298,6 +3300,7 @@ static const struct frame_unwind arm_epilogue_frame_unwind =
> {
> "arm epilogue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> arm_epilogue_frame_this_id,
> arm_epilogue_frame_prev_register,
> @@ -3427,6 +3430,7 @@ arm_stub_unwind_sniffer (const struct frame_unwind *self,
> struct frame_unwind arm_stub_unwind = {
> "arm stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> arm_stub_this_id,
> arm_prologue_prev_register,
> @@ -3953,6 +3957,7 @@ struct frame_unwind arm_m_exception_unwind =
> {
> "arm m exception lockup sec_fnc",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> arm_m_exception_frame_unwind_stop_reason,
> arm_m_exception_this_id,
> arm_m_exception_prev_register,
> diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c
> index 9c97d3cf1c7..08b3cb146f4 100644
> --- a/gdb/avr-tdep.c
> +++ b/gdb/avr-tdep.c
> @@ -1158,6 +1158,7 @@ avr_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind avr_frame_unwind = {
> "avr prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> avr_frame_this_id,
> avr_frame_prev_register,
> diff --git a/gdb/bfin-tdep.c b/gdb/bfin-tdep.c
> index 1fa7a66d043..60838f0548e 100644
> --- a/gdb/bfin-tdep.c
> +++ b/gdb/bfin-tdep.c
> @@ -376,6 +376,7 @@ static const struct frame_unwind bfin_frame_unwind =
> {
> "bfin prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> bfin_frame_this_id,
> bfin_frame_prev_register,
> diff --git a/gdb/bpf-tdep.c b/gdb/bpf-tdep.c
> index 79a442068b5..1f53d63c982 100644
> --- a/gdb/bpf-tdep.c
> +++ b/gdb/bpf-tdep.c
> @@ -185,6 +185,7 @@ static const struct frame_unwind bpf_frame_unwind =
> {
> "bpf prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> bpf_frame_unwind_stop_reason,
> bpf_frame_this_id,
> bpf_frame_prev_register,
> diff --git a/gdb/cris-tdep.c b/gdb/cris-tdep.c
> index 8562def71a6..4db2a234819 100644
> --- a/gdb/cris-tdep.c
> +++ b/gdb/cris-tdep.c
> @@ -439,6 +439,7 @@ static const struct frame_unwind cris_sigtramp_frame_unwind =
> {
> "cris sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> cris_sigtramp_frame_this_id,
> cris_sigtramp_frame_prev_register,
> @@ -904,6 +905,7 @@ static const struct frame_unwind cris_frame_unwind =
> {
> "cris prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> cris_frame_this_id,
> cris_frame_prev_register,
> diff --git a/gdb/csky-tdep.c b/gdb/csky-tdep.c
> index d69b8e5a2ca..6e8426fe2d8 100644
> --- a/gdb/csky-tdep.c
> +++ b/gdb/csky-tdep.c
> @@ -2162,6 +2162,7 @@ csky_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind csky_unwind_cache = {
> "cski prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> csky_frame_this_id,
> csky_frame_prev_register,
> @@ -2296,6 +2297,7 @@ csky_stub_prev_register (const frame_info_ptr &this_frame,
> static frame_unwind csky_stub_unwind = {
> "csky stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> csky_stub_this_id,
> csky_stub_prev_register,
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 85ac3d9aab6..115c1f46b7f 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -42237,7 +42237,20 @@ architecture, then enabling this flag does not cause them to be used.
>
> @kindex maint info frame-unwinders
> @item maint info frame-unwinders
> -List the frame unwinders currently in effect, starting with the highest priority.
> +List the frame unwinders currently in effect, starting with the highest
> +priority. This also lists the unwinder class, which is mostly defined by
> +which area of @value{GDBN} uses it. The currently available classes are:
> +
> +@table @samp
> +@item GDB
> +Internal unwinders, added by @value{GDBN} core.
> +@item EXTENSION
> +Unwinders added by extension languages.
> +@item DEBUGINFO
> +Unwinders installed by debug information readers.
> +@item ARCH
> +Unwinders installed by the architecture specific code.
> +@end table
>
> @kindex maint set worker-threads
> @kindex maint show worker-threads
> diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c
> index 9f540d02f1a..e7de15b5c4d 100644
> --- a/gdb/dummy-frame.c
> +++ b/gdb/dummy-frame.c
> @@ -379,6 +379,7 @@ const struct frame_unwind dummy_frame_unwind =
> {
> "dummy",
> DUMMY_FRAME,
> + FRAME_UNWIND_GDB,
> default_frame_unwind_stop_reason,
> dummy_frame_this_id,
> dummy_frame_prev_register,
> diff --git a/gdb/dwarf2/frame-tailcall.c b/gdb/dwarf2/frame-tailcall.c
> index 6ecf8a0b15d..50efd4eb5ff 100644
> --- a/gdb/dwarf2/frame-tailcall.c
> +++ b/gdb/dwarf2/frame-tailcall.c
> @@ -472,6 +472,7 @@ const struct frame_unwind dwarf2_tailcall_frame_unwind =
> {
> "dwarf2 tailcall",
> TAILCALL_FRAME,
> + FRAME_UNWIND_DEBUGINFO,
> default_frame_unwind_stop_reason,
> tailcall_frame_this_id,
> tailcall_frame_prev_register,
> diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c
> index 6d8a4fb5a9e..492b6928c62 100644
> --- a/gdb/dwarf2/frame.c
> +++ b/gdb/dwarf2/frame.c
> @@ -1341,6 +1341,7 @@ static const struct frame_unwind dwarf2_frame_unwind =
> {
> "dwarf2",
> NORMAL_FRAME,
> + FRAME_UNWIND_DEBUGINFO,
> dwarf2_frame_unwind_stop_reason,
> dwarf2_frame_this_id,
> dwarf2_frame_prev_register,
> @@ -1353,6 +1354,7 @@ static const struct frame_unwind dwarf2_signal_frame_unwind =
> {
> "dwarf2 signal",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_DEBUGINFO,
> dwarf2_frame_unwind_stop_reason,
> dwarf2_frame_this_id,
> dwarf2_frame_prev_register,
> diff --git a/gdb/frame-unwind.c b/gdb/frame-unwind.c
> index e61f6244913..d61f06d3305 100644
> --- a/gdb/frame-unwind.c
> +++ b/gdb/frame-unwind.c
> @@ -31,6 +31,16 @@
> #include "cli/cli-cmds.h"
> #include "inferior.h"
>
> +/* Conversion list between the enum for frame_unwind_class and
> + string. */
> +static const char * unwind_class_conversion[] =
> +{
> + "GDB",
> + "EXTENSION",
> + "DEBUGINFO",
> + "ARCH",
> +};
> +
> /* Default sniffers, that must always be the first in the unwinder list,
> no matter the architecture. */
> static constexpr auto standard_unwinders =
> @@ -72,6 +82,13 @@ get_frame_unwind_table (struct gdbarch *gdbarch)
> return table;
> }
>
> +static const char *
> +frame_unwinder_class_str (frame_unwind_class uclass)
> +{
> + gdb_assert (uclass < UNWIND_CLASS_NUMBER);
> + return unwind_class_conversion[uclass];
> +}
> +
> void
> frame_unwind_prepend_unwinder (struct gdbarch *gdbarch,
> const struct frame_unwind *unwinder)
> @@ -319,9 +336,10 @@ maintenance_info_frame_unwinders (const char *args, int from_tty)
> std::vector<const frame_unwind *> *table = get_frame_unwind_table (gdbarch);
>
> ui_out *uiout = current_uiout;
> - ui_out_emit_table table_emitter (uiout, 2, -1, "FrameUnwinders");
> + ui_out_emit_table table_emitter (uiout, 3, -1, "FrameUnwinders");
> uiout->table_header (27, ui_left, "name", "Name");
> uiout->table_header (25, ui_left, "type", "Type");
> + uiout->table_header (9, ui_left, "class", "Class");
> uiout->table_body ();
>
> for (auto unwinder : *table)
> @@ -329,6 +347,8 @@ maintenance_info_frame_unwinders (const char *args, int from_tty)
> ui_out_emit_list tuple_emitter (uiout, nullptr);
> uiout->field_string ("name", unwinder->name);
> uiout->field_string ("type", frame_type_str (unwinder->type));
> + uiout->field_string ("class", frame_unwinder_class_str (
> + unwinder->unwinder_class));
> uiout->text ("\n");
> }
> }
> diff --git a/gdb/frame-unwind.h b/gdb/frame-unwind.h
> index 53fcd6869e9..ef8bbe091b5 100644
> --- a/gdb/frame-unwind.h
> +++ b/gdb/frame-unwind.h
> @@ -156,12 +156,31 @@ typedef void (frame_dealloc_cache_ftype) (frame_info *self,
> typedef gdbarch *(frame_prev_arch_ftype) (const frame_info_ptr &this_frame,
> void **this_prologue_cache);
>
> +/* Unwinders are classified by what part of GDB code created it. */
> +enum frame_unwind_class
> +{
> + /* This is mostly handled by core GDB code. */
> + FRAME_UNWIND_GDB,
> + /* This unwinder was added by one of GDB's extension languages. */
> + FRAME_UNWIND_EXTENSION,
> + /* The unwinder was created and mostly handles debug information. */
> + FRAME_UNWIND_DEBUGINFO,
> + /* The unwinder was created and handles target dependent things. */
> + FRAME_UNWIND_ARCH,
> + /* Meta enum value, to ensure we're always sent a valid unwinder class. */
> + UNWIND_CLASS_NUMBER,
> +};
> +
> struct frame_unwind
> {
> const char *name;
> /* The frame's type. Should this instead be a collection of
> predicates that test the frame for various attributes? */
> enum frame_type 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;
> /* Should an attribute indicating the frame's address-in-block go
> here? */
> frame_unwind_stop_reason_ftype *stop_reason;
> diff --git a/gdb/frv-linux-tdep.c b/gdb/frv-linux-tdep.c
> index 46424453ef0..7a7c4904475 100644
> --- a/gdb/frv-linux-tdep.c
> +++ b/gdb/frv-linux-tdep.c
> @@ -336,6 +336,7 @@ static const struct frame_unwind frv_linux_sigtramp_frame_unwind =
> {
> "frv linux sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> frv_linux_sigtramp_frame_this_id,
> frv_linux_sigtramp_frame_prev_register,
> diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c
> index 6ae3f0d0f55..a1845a25750 100644
> --- a/gdb/frv-tdep.c
> +++ b/gdb/frv-tdep.c
> @@ -1407,6 +1407,7 @@ frv_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind frv_frame_unwind = {
> "frv prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> frv_frame_this_id,
> frv_frame_prev_register,
> diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
> index 15a585a356e..e3827ad96e7 100644
> --- a/gdb/ft32-tdep.c
> +++ b/gdb/ft32-tdep.c
> @@ -529,6 +529,7 @@ static const struct frame_unwind ft32_frame_unwind =
> {
> "ft32 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ft32_frame_this_id,
> ft32_frame_prev_register,
> diff --git a/gdb/h8300-tdep.c b/gdb/h8300-tdep.c
> index e91d664ffa3..5b4466ed316 100644
> --- a/gdb/h8300-tdep.c
> +++ b/gdb/h8300-tdep.c
> @@ -503,6 +503,7 @@ h8300_frame_prev_register (const frame_info_ptr &this_frame, void **this_cache,
> static const struct frame_unwind h8300_frame_unwind = {
> "h8300 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> h8300_frame_this_id,
> h8300_frame_prev_register,
> diff --git a/gdb/hppa-linux-tdep.c b/gdb/hppa-linux-tdep.c
> index 8f73f8d2374..2619b60655a 100644
> --- a/gdb/hppa-linux-tdep.c
> +++ b/gdb/hppa-linux-tdep.c
> @@ -311,6 +311,7 @@ hppa_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind hppa_linux_sigtramp_frame_unwind = {
> "hppa linux sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> hppa_linux_sigtramp_frame_this_id,
> hppa_linux_sigtramp_frame_prev_register,
> diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
> index ad93c2b2048..2447b87ebae 100644
> --- a/gdb/hppa-tdep.c
> +++ b/gdb/hppa-tdep.c
> @@ -2286,6 +2286,7 @@ static const struct frame_unwind hppa_frame_unwind =
> {
> "hppa unwind table",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> hppa_frame_this_id,
> hppa_frame_prev_register,
> @@ -2399,6 +2400,7 @@ static const struct frame_unwind hppa_fallback_frame_unwind =
> {
> "hppa prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> hppa_fallback_frame_this_id,
> hppa_fallback_frame_prev_register,
> @@ -2480,6 +2482,7 @@ hppa_stub_unwind_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind hppa_stub_frame_unwind = {
> "hppa stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> hppa_stub_frame_this_id,
> hppa_stub_frame_prev_register,
> diff --git a/gdb/i386-obsd-tdep.c b/gdb/i386-obsd-tdep.c
> index 3539c6599a0..1d2b1a09d16 100644
> --- a/gdb/i386-obsd-tdep.c
> +++ b/gdb/i386-obsd-tdep.c
> @@ -396,6 +396,7 @@ static const struct frame_unwind i386obsd_trapframe_unwind = {
> frame, but SIGTRAMP_FRAME would print <signal handler called>,
> which really is not what we want here. */
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> i386obsd_trapframe_this_id,
> i386obsd_trapframe_prev_register,
> diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
> index a552a2bee8f..6defd225bdb 100644
> --- a/gdb/i386-tdep.c
> +++ b/gdb/i386-tdep.c
> @@ -2143,6 +2143,7 @@ static const struct frame_unwind i386_frame_unwind =
> {
> "i386 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> i386_frame_unwind_stop_reason,
> i386_frame_this_id,
> i386_frame_prev_register,
> @@ -2298,6 +2299,7 @@ static const struct frame_unwind i386_epilogue_override_frame_unwind =
> {
> "i386 epilogue override",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> i386_epilogue_frame_unwind_stop_reason,
> i386_epilogue_frame_this_id,
> i386_epilogue_frame_prev_register,
> @@ -2309,6 +2311,7 @@ static const struct frame_unwind i386_epilogue_frame_unwind =
> {
> "i386 epilogue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> i386_epilogue_frame_unwind_stop_reason,
> i386_epilogue_frame_this_id,
> i386_epilogue_frame_prev_register,
> @@ -2391,6 +2394,7 @@ static const struct frame_unwind i386_stack_tramp_frame_unwind =
> {
> "i386 stack tramp",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> i386_epilogue_frame_unwind_stop_reason,
> i386_epilogue_frame_this_id,
> i386_epilogue_frame_prev_register,
> @@ -2540,6 +2544,7 @@ static const struct frame_unwind i386_sigtramp_frame_unwind =
> {
> "i386 sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> i386_sigtramp_frame_unwind_stop_reason,
> i386_sigtramp_frame_this_id,
> i386_sigtramp_frame_prev_register,
> diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
> index b0c1ad3d0ab..b10cc251bf1 100644
> --- a/gdb/ia64-tdep.c
> +++ b/gdb/ia64-tdep.c
> @@ -2166,6 +2166,7 @@ static const struct frame_unwind ia64_frame_unwind =
> {
> "ia64 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> &ia64_frame_this_id,
> &ia64_frame_prev_register,
> @@ -2355,6 +2356,7 @@ static const struct frame_unwind ia64_sigtramp_frame_unwind =
> {
> "ia64 sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ia64_sigtramp_frame_this_id,
> ia64_sigtramp_frame_prev_register,
> @@ -3015,6 +3017,7 @@ static const struct frame_unwind ia64_libunwind_frame_unwind =
> {
> "ia64 libunwind",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ia64_libunwind_frame_this_id,
> ia64_libunwind_frame_prev_register,
> @@ -3104,6 +3107,7 @@ static const struct frame_unwind ia64_libunwind_sigtramp_frame_unwind =
> {
> "ia64 libunwind sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ia64_libunwind_sigtramp_frame_this_id,
> ia64_libunwind_sigtramp_frame_prev_register,
> diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c
> index 759c526a7c2..8b3057159dc 100644
> --- a/gdb/inline-frame.c
> +++ b/gdb/inline-frame.c
> @@ -272,6 +272,7 @@ inline_frame_sniffer (const struct frame_unwind *self,
> const struct frame_unwind inline_frame_unwind = {
> "inline",
> INLINE_FRAME,
> + FRAME_UNWIND_GDB,
> default_frame_unwind_stop_reason,
> inline_frame_this_id,
> inline_frame_prev_register,
> diff --git a/gdb/iq2000-tdep.c b/gdb/iq2000-tdep.c
> index 5776c66f78a..e0db1b0de4e 100644
> --- a/gdb/iq2000-tdep.c
> +++ b/gdb/iq2000-tdep.c
> @@ -427,6 +427,7 @@ iq2000_frame_this_id (const frame_info_ptr &this_frame, void **this_cache,
> static const struct frame_unwind iq2000_frame_unwind = {
> "iq2000 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> iq2000_frame_this_id,
> iq2000_frame_prev_register,
> diff --git a/gdb/jit.c b/gdb/jit.c
> index 77d41bf86ba..33a19d2ba4d 100644
> --- a/gdb/jit.c
> +++ b/gdb/jit.c
> @@ -1112,6 +1112,7 @@ static const struct frame_unwind jit_frame_unwind =
> {
> "jit",
> NORMAL_FRAME,
> + FRAME_UNWIND_EXTENSION,
> default_frame_unwind_stop_reason,
> jit_frame_this_id,
> jit_frame_prev_register,
> diff --git a/gdb/lm32-tdep.c b/gdb/lm32-tdep.c
> index 98a07281051..4eb5f2ad426 100644
> --- a/gdb/lm32-tdep.c
> +++ b/gdb/lm32-tdep.c
> @@ -450,6 +450,7 @@ lm32_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind lm32_frame_unwind = {
> "lm32 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> lm32_frame_this_id,
> lm32_frame_prev_register,
> diff --git a/gdb/loongarch-tdep.c b/gdb/loongarch-tdep.c
> index e91a69b73b9..4f00deb677e 100644
> --- a/gdb/loongarch-tdep.c
> +++ b/gdb/loongarch-tdep.c
> @@ -457,6 +457,7 @@ loongarch_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind loongarch_frame_unwind = {
> "loongarch prologue",
> /*.type =*/NORMAL_FRAME,
> + /*.unwinder_class=*/FRAME_UNWIND_ARCH,
> /*.stop_reason =*/default_frame_unwind_stop_reason,
> /*.this_id =*/loongarch_frame_this_id,
> /*.prev_register =*/loongarch_frame_prev_register,
> diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c
> index 28dfb2fb7c6..bce12c5fae7 100644
> --- a/gdb/m32c-tdep.c
> +++ b/gdb/m32c-tdep.c
> @@ -1958,6 +1958,7 @@ m32c_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind m32c_unwind = {
> "m32c prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m32c_this_id,
> m32c_prev_register,
> diff --git a/gdb/m32r-linux-tdep.c b/gdb/m32r-linux-tdep.c
> index 8eea6620df9..11a150a92b8 100644
> --- a/gdb/m32r-linux-tdep.c
> +++ b/gdb/m32r-linux-tdep.c
> @@ -304,6 +304,7 @@ m32r_linux_sigtramp_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind m32r_linux_sigtramp_frame_unwind = {
> "m32r linux sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m32r_linux_sigtramp_frame_this_id,
> m32r_linux_sigtramp_frame_prev_register,
> diff --git a/gdb/m32r-tdep.c b/gdb/m32r-tdep.c
> index c6428f6db6f..aadb8c00d86 100644
> --- a/gdb/m32r-tdep.c
> +++ b/gdb/m32r-tdep.c
> @@ -834,6 +834,7 @@ m32r_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind m32r_frame_unwind = {
> "m32r prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m32r_frame_this_id,
> m32r_frame_prev_register,
> diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
> index 12cd0efbbe7..e14ac622fda 100644
> --- a/gdb/m68hc11-tdep.c
> +++ b/gdb/m68hc11-tdep.c
> @@ -936,6 +936,7 @@ m68hc11_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind m68hc11_frame_unwind = {
> "m68hc11 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m68hc11_frame_this_id,
> m68hc11_frame_prev_register,
> diff --git a/gdb/m68k-linux-tdep.c b/gdb/m68k-linux-tdep.c
> index 7250ce09826..7cca4f86394 100644
> --- a/gdb/m68k-linux-tdep.c
> +++ b/gdb/m68k-linux-tdep.c
> @@ -318,6 +318,7 @@ static const struct frame_unwind m68k_linux_sigtramp_frame_unwind =
> {
> "m68k linux sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m68k_linux_sigtramp_frame_this_id,
> m68k_linux_sigtramp_frame_prev_register,
> diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c
> index 375d5e6e54c..2ff507e7816 100644
> --- a/gdb/m68k-tdep.c
> +++ b/gdb/m68k-tdep.c
> @@ -1011,6 +1011,7 @@ static const struct frame_unwind m68k_frame_unwind =
> {
> "m68k prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> m68k_frame_this_id,
> m68k_frame_prev_register,
> diff --git a/gdb/mep-tdep.c b/gdb/mep-tdep.c
> index a4ef343f9dc..7dd6371f995 100644
> --- a/gdb/mep-tdep.c
> +++ b/gdb/mep-tdep.c
> @@ -2064,6 +2064,7 @@ mep_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind mep_frame_unwind = {
> "mep prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mep_frame_this_id,
> mep_frame_prev_register,
> diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c
> index 609c665f2af..7a56471a4dd 100644
> --- a/gdb/microblaze-tdep.c
> +++ b/gdb/microblaze-tdep.c
> @@ -482,6 +482,7 @@ static const struct frame_unwind microblaze_frame_unwind =
> {
> "microblaze prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> microblaze_frame_this_id,
> microblaze_frame_prev_register,
> diff --git a/gdb/mips-sde-tdep.c b/gdb/mips-sde-tdep.c
> index 90988cdfdac..18cb9485639 100644
> --- a/gdb/mips-sde-tdep.c
> +++ b/gdb/mips-sde-tdep.c
> @@ -164,6 +164,7 @@ static const struct frame_unwind mips_sde_frame_unwind =
> {
> "mips sde sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mips_sde_frame_this_id,
> mips_sde_frame_prev_register,
> diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
> index c00efbd02ad..f5eb2093c8b 100644
> --- a/gdb/mips-tdep.c
> +++ b/gdb/mips-tdep.c
> @@ -2929,6 +2929,7 @@ static const struct frame_unwind mips_insn16_frame_unwind =
> {
> "mips insn16 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mips_insn16_frame_this_id,
> mips_insn16_frame_prev_register,
> @@ -3365,6 +3366,7 @@ static const struct frame_unwind mips_micro_frame_unwind =
> {
> "mips micro prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mips_micro_frame_this_id,
> mips_micro_frame_prev_register,
> @@ -3744,6 +3746,7 @@ static const struct frame_unwind mips_insn32_frame_unwind =
> {
> "mips insn32 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mips_insn32_frame_this_id,
> mips_insn32_frame_prev_register,
> @@ -3860,6 +3863,7 @@ static const struct frame_unwind mips_stub_frame_unwind =
> {
> "mips stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mips_stub_frame_this_id,
> mips_stub_frame_prev_register,
> diff --git a/gdb/mn10300-tdep.c b/gdb/mn10300-tdep.c
> index d44eebfcb17..565300afd3c 100644
> --- a/gdb/mn10300-tdep.c
> +++ b/gdb/mn10300-tdep.c
> @@ -1130,6 +1130,7 @@ mn10300_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind mn10300_frame_unwind = {
> "mn10300 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> mn10300_frame_this_id,
> mn10300_frame_prev_register,
> diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c
> index 29ad1f2bb2e..82d3478ed68 100644
> --- a/gdb/moxie-tdep.c
> +++ b/gdb/moxie-tdep.c
> @@ -588,6 +588,7 @@ moxie_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind moxie_frame_unwind = {
> "moxie prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> moxie_frame_this_id,
> moxie_frame_prev_register,
> diff --git a/gdb/msp430-tdep.c b/gdb/msp430-tdep.c
> index 41a8f990a16..6d7fee230c1 100644
> --- a/gdb/msp430-tdep.c
> +++ b/gdb/msp430-tdep.c
> @@ -545,6 +545,7 @@ msp430_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind msp430_unwind = {
> "msp430 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> msp430_this_id,
> msp430_prev_register,
> diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c
> index 8ad51d0798b..910a6f7a1d0 100644
> --- a/gdb/nds32-tdep.c
> +++ b/gdb/nds32-tdep.c
> @@ -992,6 +992,7 @@ static const struct frame_unwind nds32_frame_unwind =
> {
> "nds32 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> nds32_frame_this_id,
> nds32_frame_prev_register,
> @@ -1376,6 +1377,7 @@ static const struct frame_unwind nds32_epilogue_frame_unwind =
> {
> "nds32 epilogue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> nds32_epilogue_frame_this_id,
> nds32_epilogue_frame_prev_register,
> diff --git a/gdb/or1k-tdep.c b/gdb/or1k-tdep.c
> index 290f748cc56..6e0466c3408 100644
> --- a/gdb/or1k-tdep.c
> +++ b/gdb/or1k-tdep.c
> @@ -1128,6 +1128,7 @@ or1k_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind or1k_frame_unwind = {
> "or1k prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> or1k_frame_this_id,
> or1k_frame_prev_register,
> diff --git a/gdb/ppc-fbsd-tdep.c b/gdb/ppc-fbsd-tdep.c
> index 3f0f93f1ac0..12eb396a0e3 100644
> --- a/gdb/ppc-fbsd-tdep.c
> +++ b/gdb/ppc-fbsd-tdep.c
> @@ -265,6 +265,7 @@ ppcfbsd_sigtramp_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind ppcfbsd_sigtramp_frame_unwind = {
> "ppc freebsd sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ppcfbsd_sigtramp_frame_this_id,
> ppcfbsd_sigtramp_frame_prev_register,
> diff --git a/gdb/ppc-obsd-tdep.c b/gdb/ppc-obsd-tdep.c
> index 1bd79b3b3e1..ceb8b5d85db 100644
> --- a/gdb/ppc-obsd-tdep.c
> +++ b/gdb/ppc-obsd-tdep.c
> @@ -234,6 +234,7 @@ ppcobsd_sigtramp_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind ppcobsd_sigtramp_frame_unwind = {
> "ppc openbsd sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> ppcobsd_sigtramp_frame_this_id,
> ppcobsd_sigtramp_frame_prev_register,
> diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
> index 68deaf98d81..ab32f5057f9 100644
> --- a/gdb/python/py-unwind.c
> +++ b/gdb/python/py-unwind.c
> @@ -984,6 +984,7 @@ pyuw_on_new_gdbarch (gdbarch *newarch)
>
> 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;
> diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
> index bf4a368f4fe..47f2a7f6510 100644
> --- a/gdb/record-btrace.c
> +++ b/gdb/record-btrace.c
> @@ -1944,6 +1944,7 @@ const struct frame_unwind record_btrace_frame_unwind =
> {
> "record-btrace",
> NORMAL_FRAME,
> + FRAME_UNWIND_GDB,
> record_btrace_frame_unwind_stop_reason,
> record_btrace_frame_this_id,
> record_btrace_frame_prev_register,
> @@ -1956,6 +1957,7 @@ const struct frame_unwind record_btrace_tailcall_frame_unwind =
> {
> "record-btrace tailcall",
> TAILCALL_FRAME,
> + FRAME_UNWIND_GDB,
> record_btrace_frame_unwind_stop_reason,
> record_btrace_frame_this_id,
> record_btrace_frame_prev_register,
> diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
> index 932708ca4e9..2a292cc4ff8 100644
> --- a/gdb/riscv-tdep.c
> +++ b/gdb/riscv-tdep.c
> @@ -3904,6 +3904,7 @@ static const struct frame_unwind riscv_frame_unwind =
> {
> /*.name =*/ "riscv prologue",
> /*.type =*/ NORMAL_FRAME,
> + /*.unwinder_class=*/FRAME_UNWIND_ARCH,
> /*.stop_reason =*/ default_frame_unwind_stop_reason,
> /*.this_id =*/ riscv_frame_this_id,
> /*.prev_register =*/ riscv_frame_prev_register,
> diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c
> index 46a7ee9c3d4..0fcd5f9f1f3 100644
> --- a/gdb/rl78-tdep.c
> +++ b/gdb/rl78-tdep.c
> @@ -1187,6 +1187,7 @@ static const struct frame_unwind rl78_unwind =
> {
> "rl78 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> rl78_this_id,
> rl78_prev_register,
> diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c
> index 3cc0232a691..f1c31ae27ea 100644
> --- a/gdb/rs6000-aix-tdep.c
> +++ b/gdb/rs6000-aix-tdep.c
> @@ -331,6 +331,7 @@ aix_sighandle_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind aix_sighandle_frame_unwind = {
> "rs6000 aix sighandle",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> aix_sighandle_frame_this_id,
> aix_sighandle_frame_prev_register,
> diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
> index a36c337c625..e3bffa8f33d 100644
> --- a/gdb/rs6000-tdep.c
> +++ b/gdb/rs6000-tdep.c
> @@ -3841,6 +3841,7 @@ static const struct frame_unwind rs6000_frame_unwind =
> {
> "rs6000 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> rs6000_frame_this_id,
> rs6000_frame_prev_register,
> @@ -3982,6 +3983,7 @@ static const struct frame_unwind rs6000_epilogue_frame_unwind =
> {
> "rs6000 epilogue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> rs6000_epilogue_frame_this_id, rs6000_epilogue_frame_prev_register,
> NULL,
> diff --git a/gdb/rx-tdep.c b/gdb/rx-tdep.c
> index 6b12fe0a314..6cb74c23a3c 100644
> --- a/gdb/rx-tdep.c
> +++ b/gdb/rx-tdep.c
> @@ -634,6 +634,7 @@ rx_exception_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind rx_frame_unwind = {
> "rx prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> rx_frame_this_id,
> rx_frame_prev_register,
> @@ -648,6 +649,7 @@ static const struct frame_unwind rx_exception_unwind = {
> "rx exception",
> /* SIGTRAMP_FRAME could be used here, but backtraces are less informative. */
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> rx_frame_this_id,
> rx_frame_prev_register,
> diff --git a/gdb/s12z-tdep.c b/gdb/s12z-tdep.c
> index c24c75665ed..7fa73cf6b8c 100644
> --- a/gdb/s12z-tdep.c
> +++ b/gdb/s12z-tdep.c
> @@ -444,6 +444,7 @@ s12z_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind s12z_frame_unwind = {
> "s12z prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> s12z_frame_this_id,
> s12z_frame_prev_register,
> diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
> index bc1db550d2e..556fad64926 100644
> --- a/gdb/s390-linux-tdep.c
> +++ b/gdb/s390-linux-tdep.c
> @@ -544,6 +544,7 @@ s390_sigtramp_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind s390_sigtramp_frame_unwind = {
> "s390 linux sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> s390_sigtramp_frame_this_id,
> s390_sigtramp_frame_prev_register,
> diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
> index be176f07c6f..f0af9a8796d 100644
> --- a/gdb/s390-tdep.c
> +++ b/gdb/s390-tdep.c
> @@ -2649,6 +2649,7 @@ s390_frame_prev_register (const frame_info_ptr &this_frame,
> static const struct frame_unwind s390_frame_unwind = {
> "s390 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> s390_frame_this_id,
> s390_frame_prev_register,
> @@ -2743,6 +2744,7 @@ s390_stub_frame_sniffer (const struct frame_unwind *self,
> static const struct frame_unwind s390_stub_frame_unwind = {
> "s390 stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> s390_stub_frame_this_id,
> s390_stub_frame_prev_register,
> diff --git a/gdb/sentinel-frame.c b/gdb/sentinel-frame.c
> index 4eaeae0d254..9fe4036dbbe 100644
> --- a/gdb/sentinel-frame.c
> +++ b/gdb/sentinel-frame.c
> @@ -82,6 +82,7 @@ const struct frame_unwind sentinel_frame_unwind =
> {
> "sentinel",
> SENTINEL_FRAME,
> + FRAME_UNWIND_GDB,
> default_frame_unwind_stop_reason,
> sentinel_frame_this_id,
> sentinel_frame_prev_register,
> diff --git a/gdb/sh-tdep.c b/gdb/sh-tdep.c
> index d211265c15f..c8809e3018e 100644
> --- a/gdb/sh-tdep.c
> +++ b/gdb/sh-tdep.c
> @@ -1953,6 +1953,7 @@ sh_frame_this_id (const frame_info_ptr &this_frame, void **this_cache,
> static const struct frame_unwind sh_frame_unwind = {
> "sh prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sh_frame_this_id,
> sh_frame_prev_register,
> @@ -2020,6 +2021,7 @@ static const struct frame_unwind sh_stub_unwind =
> {
> "sh stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sh_stub_this_id,
> sh_frame_prev_register,
> diff --git a/gdb/sparc-netbsd-tdep.c b/gdb/sparc-netbsd-tdep.c
> index fc22e66826f..5b3dd067375 100644
> --- a/gdb/sparc-netbsd-tdep.c
> +++ b/gdb/sparc-netbsd-tdep.c
> @@ -252,6 +252,7 @@ static const struct frame_unwind sparc32nbsd_sigcontext_frame_unwind =
> {
> "sparc32 netbsd sigcontext",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc32nbsd_sigcontext_frame_this_id,
> sparc32nbsd_sigcontext_frame_prev_register,
> diff --git a/gdb/sparc-obsd-tdep.c b/gdb/sparc-obsd-tdep.c
> index 3182a7778d3..049c315fa14 100644
> --- a/gdb/sparc-obsd-tdep.c
> +++ b/gdb/sparc-obsd-tdep.c
> @@ -138,6 +138,7 @@ static const struct frame_unwind sparc32obsd_sigtramp_frame_unwind =
> {
> "sparc32 openbsd sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc32obsd_sigtramp_frame_this_id,
> sparc32obsd_sigtramp_frame_prev_register,
> diff --git a/gdb/sparc-sol2-tdep.c b/gdb/sparc-sol2-tdep.c
> index aea3766d9b5..bb9c8a549b1 100644
> --- a/gdb/sparc-sol2-tdep.c
> +++ b/gdb/sparc-sol2-tdep.c
> @@ -183,6 +183,7 @@ static const struct frame_unwind sparc32_sol2_sigtramp_frame_unwind =
> {
> "sparc32 solaris sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc32_sol2_sigtramp_frame_this_id,
> sparc32_sol2_sigtramp_frame_prev_register,
> diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
> index b48b130c0c5..d69ab87be09 100644
> --- a/gdb/sparc-tdep.c
> +++ b/gdb/sparc-tdep.c
> @@ -1350,6 +1350,7 @@ static const struct frame_unwind sparc32_frame_unwind =
> {
> "sparc32 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc32_frame_this_id,
> sparc32_frame_prev_register,
> diff --git a/gdb/sparc64-fbsd-tdep.c b/gdb/sparc64-fbsd-tdep.c
> index a30c7c448e5..1d4c075a961 100644
> --- a/gdb/sparc64-fbsd-tdep.c
> +++ b/gdb/sparc64-fbsd-tdep.c
> @@ -200,6 +200,7 @@ static const struct frame_unwind sparc64fbsd_sigtramp_frame_unwind =
> {
> "sparc64 freebsd sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64fbsd_sigtramp_frame_this_id,
> sparc64fbsd_sigtramp_frame_prev_register,
> diff --git a/gdb/sparc64-netbsd-tdep.c b/gdb/sparc64-netbsd-tdep.c
> index b101f4970d9..82eb99f57c1 100644
> --- a/gdb/sparc64-netbsd-tdep.c
> +++ b/gdb/sparc64-netbsd-tdep.c
> @@ -226,6 +226,7 @@ static const struct frame_unwind sparc64nbsd_sigcontext_frame_unwind =
> {
> "sparc64 netbsd sigcontext",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64nbsd_sigcontext_frame_this_id,
> sparc64nbsd_sigcontext_frame_prev_register,
> diff --git a/gdb/sparc64-obsd-tdep.c b/gdb/sparc64-obsd-tdep.c
> index cef6efd3379..e81afa604e7 100644
> --- a/gdb/sparc64-obsd-tdep.c
> +++ b/gdb/sparc64-obsd-tdep.c
> @@ -224,6 +224,7 @@ static const struct frame_unwind sparc64obsd_frame_unwind =
> {
> "sparc64 openbsd sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64obsd_frame_this_id,
> sparc64obsd_frame_prev_register,
> @@ -308,6 +309,7 @@ static const struct frame_unwind sparc64obsd_trapframe_unwind =
> {
> "sparc64 openbsd trap",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64obsd_trapframe_this_id,
> sparc64obsd_trapframe_prev_register,
> diff --git a/gdb/sparc64-sol2-tdep.c b/gdb/sparc64-sol2-tdep.c
> index b7ca4ca1f5b..e8d09e2516e 100644
> --- a/gdb/sparc64-sol2-tdep.c
> +++ b/gdb/sparc64-sol2-tdep.c
> @@ -186,6 +186,7 @@ static const struct frame_unwind sparc64_sol2_sigtramp_frame_unwind =
> {
> "sparc64 solaris sigtramp",
> SIGTRAMP_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64_sol2_sigtramp_frame_this_id,
> sparc64_sol2_sigtramp_frame_prev_register,
> diff --git a/gdb/sparc64-tdep.c b/gdb/sparc64-tdep.c
> index dc8032f2969..90b04fc0ff1 100644
> --- a/gdb/sparc64-tdep.c
> +++ b/gdb/sparc64-tdep.c
> @@ -1139,6 +1139,7 @@ static const struct frame_unwind sparc64_frame_unwind =
> {
> "sparc64 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> sparc64_frame_this_id,
> sparc64_frame_prev_register,
> diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c
> index 6732478eb09..bac8ba84ed0 100644
> --- a/gdb/tic6x-tdep.c
> +++ b/gdb/tic6x-tdep.c
> @@ -456,6 +456,7 @@ static const struct frame_unwind tic6x_frame_unwind =
> {
> "tic6x prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> tic6x_frame_this_id,
> tic6x_frame_prev_register,
> @@ -519,6 +520,7 @@ static const struct frame_unwind tic6x_stub_unwind =
> {
> "tic6x stub",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> tic6x_stub_this_id,
> tic6x_frame_prev_register,
> diff --git a/gdb/tilegx-tdep.c b/gdb/tilegx-tdep.c
> index 92f2be0b208..16cd25f4635 100644
> --- a/gdb/tilegx-tdep.c
> +++ b/gdb/tilegx-tdep.c
> @@ -903,6 +903,7 @@ tilegx_frame_base_address (const frame_info_ptr &this_frame, void **this_cache)
> static const struct frame_unwind tilegx_frame_unwind = {
> "tilegx prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> tilegx_frame_this_id,
> tilegx_frame_prev_register,
> diff --git a/gdb/tramp-frame.c b/gdb/tramp-frame.c
> index 4f7c62d11fa..6368f67a2e7 100644
> --- a/gdb/tramp-frame.c
> +++ b/gdb/tramp-frame.c
> @@ -166,6 +166,7 @@ tramp_frame_prepend_unwinder (struct gdbarch *gdbarch,
> 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;
> diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c
> index de1cc6c47bd..d3f1af75417 100644
> --- a/gdb/v850-tdep.c
> +++ b/gdb/v850-tdep.c
> @@ -1323,6 +1323,7 @@ v850_frame_this_id (const frame_info_ptr &this_frame, void **this_cache,
> static const struct frame_unwind v850_frame_unwind = {
> "v850 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> v850_frame_this_id,
> v850_frame_prev_register,
> diff --git a/gdb/vax-tdep.c b/gdb/vax-tdep.c
> index a42c872feff..25d07c59376 100644
> --- a/gdb/vax-tdep.c
> +++ b/gdb/vax-tdep.c
> @@ -390,6 +390,7 @@ static const struct frame_unwind vax_frame_unwind =
> {
> "vax prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> vax_frame_this_id,
> vax_frame_prev_register,
> diff --git a/gdb/xstormy16-tdep.c b/gdb/xstormy16-tdep.c
> index 766d1d144be..e01da4ecab4 100644
> --- a/gdb/xstormy16-tdep.c
> +++ b/gdb/xstormy16-tdep.c
> @@ -731,6 +731,7 @@ xstormy16_frame_base_address (const frame_info_ptr &this_frame, void **this_cach
> static const struct frame_unwind xstormy16_frame_unwind = {
> "xstormy16 prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> xstormy16_frame_this_id,
> xstormy16_frame_prev_register,
> diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
> index d7a56ccc33c..d12dfdc7347 100644
> --- a/gdb/xtensa-tdep.c
> +++ b/gdb/xtensa-tdep.c
> @@ -1501,6 +1501,7 @@ xtensa_unwind =
> {
> "xtensa prologue",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> xtensa_frame_this_id,
> xtensa_frame_prev_register,
> diff --git a/gdb/z80-tdep.c b/gdb/z80-tdep.c
> index c442b60623b..66a12cd3be7 100644
> --- a/gdb/z80-tdep.c
> +++ b/gdb/z80-tdep.c
> @@ -1068,6 +1068,7 @@ z80_frame_unwind =
> {
> "z80",
> NORMAL_FRAME,
> + FRAME_UNWIND_ARCH,
> default_frame_unwind_stop_reason,
> z80_frame_this_id,
> z80_frame_prev_register,
> --
> 2.47.0
next prev parent reply other threads:[~2025-01-14 15:30 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-10 19:51 [PATCH v8 0/5] Modernize frame unwinders and add disable feature Guinevere Larsen
2024-12-10 19:51 ` [PATCH v8 1/5] gdb: make gdbarch store a vector of frame unwinders Guinevere Larsen
2025-01-14 14:28 ` Andrew Burgess
2025-01-14 20:34 ` Guinevere Larsen
2024-12-10 19:51 ` [PATCH v8 2/5] gdb: add "unwinder class" to " Guinevere Larsen
2025-01-14 15:28 ` Andrew Burgess [this message]
2024-12-10 19:51 ` [PATCH v8 3/5] gdb: Migrate frame unwinders to use C++ classes Guinevere Larsen
2025-01-14 17:13 ` Andrew Burgess
2024-12-10 19:51 ` [PATCH v8 4/5] gdb: introduce ability to disable frame unwinders Guinevere Larsen
2025-01-16 12:06 ` Andrew Burgess
2025-01-17 12:40 ` Guinevere Larsen
2025-01-17 13:55 ` Andrew Burgess
2025-01-17 14:47 ` Guinevere Larsen
2025-01-16 16:22 ` Andrew Burgess
2024-12-10 19:51 ` [PATCH v8 5/5] gdb/testsuite: Test for a backtrace through object without debuginfo Guinevere Larsen
2025-01-16 14:37 ` Andrew Burgess
2025-01-16 18:42 ` Guinevere Larsen
2025-01-17 13:58 ` Andrew Burgess
2025-01-18 8:07 ` Tom de Vries
2025-01-20 12:26 ` [PATCH] gdb/testsuite: Fix file location for gdb.base/backtrace-through-cu-nodebug Guinevere Larsen
2025-01-20 12:46 ` Tom de Vries
2025-01-20 12:48 ` Guinevere Larsen
2025-01-07 12:11 ` [PING][PATCH v8 0/5] Modernize frame unwinders and add disable feature Guinevere Larsen
2025-01-17 14:49 ` [PATCH " Guinevere Larsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878qrdqurr.fsf@redhat.com \
--to=aburgess@redhat.com \
--cc=eliz@gnu.org \
--cc=gdb-patches@sourceware.org \
--cc=guinevere@redhat.com \
--cc=simon.marchi@efficios.com \
--cc=thiago.bauermann@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox