aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog18
-rw-r--r--gdb/NEWS4
-rw-r--r--gdb/doc/ChangeLog5
-rw-r--r--gdb/doc/gdb.texinfo24
-rw-r--r--gdb/dwarf2-frame-tailcall.c3
-rw-r--r--gdb/dwarf2-frame.c31
-rw-r--r--gdb/dwarf2-frame.h6
-rw-r--r--gdb/dwarf2read.c4
-rw-r--r--gdb/dwarf2read.h4
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/maint.exp4
11 files changed, 106 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 605aeef..26c1fd4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,21 @@
+2018-07-26 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * dwarf2-frame-tailcall.c (tailcall_frame_sniffer): Exit early if
+ DWARF unwinders are disabled.
+ * dwarf2-frame.c: Add dwarf2read.h include.
+ (dwarf2_frame_sniffer): Exit early if DWARF unwinders are
+ disabled.
+ (dwarf2_frame_unwinders_enabled_p): Define.
+ (show_dwarf_unwinders_enabled_p): New function.
+ (_initialize_dwarf2_frame): Register switch to control DWARF
+ unwinder use.
+ * dwarf2-frame.h (dwarf2_frame_unwinders_enabled_p): Declare.
+ * dwarf2read.c (set_dwarf_cmdlist): Remove static keyword.
+ (show_dwarf_cmdlist): Remove static keyword.
+ * dwarf2read.h (set_dwarf_cmdlist): Declare.
+ (show_dwarf_cmdlist): Declare.
+ * NEWS: Document new feature.
+
2018-07-26 Tom de Vries <tdevries@suse.de>
PR breakpoints/23366
diff --git a/gdb/NEWS b/gdb/NEWS
index 76b963e..669ed2d 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -27,6 +27,10 @@ tfaas COMMAND
output).
Shortcut for 'thread apply all -s frame apply all -s COMMAND'.
+maint set dwarf unwinders (on|off)
+maint show dwarf unwinders
+ Control whether DWARF unwinders can be used.
+
* Changed commands
thread apply [all | COUNT | -COUNT] [FLAG]... COMMAND
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index d2bd383..1bcf9df 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-26 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (Maintenance Commands): Add description of
+ maintenance command to control dwarf unwinders.
+
2018-07-12 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* gdb.texinfo (Debugging Programs with Multiple Threads):
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index b36a39b..b95c2b4 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -35986,6 +35986,30 @@ compilation units will be stored in memory longer, and more total
memory will be used. Setting it to zero disables caching, which will
slow down @value{GDBN} startup, but reduce memory consumption.
+@kindex maint set dwarf unwinders
+@kindex maint show dwarf unwinders
+@item maint set dwarf unwinders
+@itemx maint show dwarf unwinders
+Control use of the DWARF frame unwinders.
+
+@cindex DWARF frame unwinders
+Many targets that support DWARF debugging use @value{GDBN}'s DWARF
+frame unwinders to build the backtrace. Many of these targets will
+also have a second mechanism for building the backtrace for use in
+cases where DWARF information is not available, this second mechanism
+is often an analysis of a function's prologue.
+
+In order to extend testing coverage of the second level stack
+unwinding mechanisms it is helpful to be able to disable the DWARF
+stack unwinders, this can be done with this switch.
+
+In normal use of @value{GDBN} disabling the DWARF unwinders is not
+advisable, there are cases that are better handled through DWARF than
+prologue analysis, and the debug experience is likely to be better
+with the DWARF frame unwinders enabled.
+
+If DWARF frame unwinders are not supported for a particular target
+architecture, then enabling this flag does not cause them to be used.
@kindex maint set profile
@kindex maint show profile
@cindex profiling GDB
diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c
index 1d3e1f4..f565a2e 100644
--- a/gdb/dwarf2-frame-tailcall.c
+++ b/gdb/dwarf2-frame-tailcall.c
@@ -318,6 +318,9 @@ tailcall_frame_sniffer (const struct frame_unwind *self,
int next_levels;
struct tailcall_cache *cache;
+ if (!dwarf2_frame_unwinders_enabled_p)
+ return 0;
+
/* Inner tail call element does not make sense for a sentinel frame. */
next_frame = get_next_frame (this_frame);
if (next_frame == NULL)
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 91e16cf..58f1ba4 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -35,6 +35,7 @@
#include "complaints.h"
#include "dwarf2-frame.h"
+#include "dwarf2read.h"
#include "ax.h"
#include "dwarf2loc.h"
#include "dwarf2-frame-tailcall.h"
@@ -169,6 +170,9 @@ static CORE_ADDR read_encoded_value (struct comp_unit *unit, gdb_byte encoding,
CORE_ADDR func_base);
+/* See dwarf2-frame.h. */
+int dwarf2_frame_unwinders_enabled_p = 1;
+
/* Store the length the expression for the CFA in the `cfa_reg' field,
which is unused in that case. */
#define cfa_exp_len cfa_reg
@@ -1326,6 +1330,9 @@ static int
dwarf2_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame, void **this_cache)
{
+ if (!dwarf2_frame_unwinders_enabled_p)
+ return 0;
+
/* Grab an address that is guarenteed to reside somewhere within the
function. get_frame_pc(), with a no-return next function, can
end up returning something past the end of this function's body.
@@ -2394,12 +2401,36 @@ dwarf2_build_frame_info (struct objfile *objfile)
set_objfile_data (objfile, dwarf2_frame_objfile_data, fde_table2);
}
+/* Handle 'maintenance show dwarf unwinders'. */
+
+static void
+show_dwarf_unwinders_enabled_p (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c,
+ const char *value)
+{
+ fprintf_filtered (file,
+ _("The DWARF stack unwinders are currently %s.\n"),
+ value);
+}
+
void
_initialize_dwarf2_frame (void)
{
dwarf2_frame_data = gdbarch_data_register_pre_init (dwarf2_frame_init);
dwarf2_frame_objfile_data = register_objfile_data ();
+ add_setshow_boolean_cmd ("unwinders", class_obscure,
+ &dwarf2_frame_unwinders_enabled_p , _("\
+Set whether the DWARF stack frame unwinders are used."), _("\
+Show whether the DWARF stack frame unwinders are used."), _("\
+When enabled the DWARF stack frame unwinders can be used for architectures\n\
+that support the DWARF unwinders. Enabling the DWARF unwinders for an\n\
+architecture that doesn't support them will have no effect."),
+ NULL,
+ show_dwarf_unwinders_enabled_p,
+ &set_dwarf_cmdlist,
+ &show_dwarf_cmdlist);
+
#if GDB_SELF_TEST
selftests::register_test_foreach_arch ("execute_cfa_program",
selftests::execute_cfa_program_test);
diff --git a/gdb/dwarf2-frame.h b/gdb/dwarf2-frame.h
index 471281a..52316e5 100644
--- a/gdb/dwarf2-frame.h
+++ b/gdb/dwarf2-frame.h
@@ -210,6 +210,12 @@ struct dwarf2_frame_state
bool armcc_cfa_offsets_reversed = false;
};
+/* When this is true the DWARF frame unwinders can be used if they are
+ registered with the gdbarch. Not all architectures can or do use the
+ DWARF unwinders. Setting this to true on a target that does not
+ otherwise support the DWARF unwinders has no effect. */
+extern int dwarf2_frame_unwinders_enabled_p;
+
/* Set the architecture-specific register state initialization
function for GDBARCH to INIT_REG. */
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index de6b9f1..d16700f 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -25345,8 +25345,8 @@ partial_die_eq (const void *item_lhs, const void *item_rhs)
return part_die_lhs->sect_off == part_die_rhs->sect_off;
}
-static struct cmd_list_element *set_dwarf_cmdlist;
-static struct cmd_list_element *show_dwarf_cmdlist;
+struct cmd_list_element *set_dwarf_cmdlist;
+struct cmd_list_element *show_dwarf_cmdlist;
static void
set_dwarf_cmd (const char *args, int from_tty)
diff --git a/gdb/dwarf2read.h b/gdb/dwarf2read.h
index 74335d7..6e37c5d 100644
--- a/gdb/dwarf2read.h
+++ b/gdb/dwarf2read.h
@@ -23,6 +23,10 @@
#include "filename-seen-cache.h"
#include "gdb_obstack.h"
+/* Hold 'maintenance (set|show) dwarf' commands. */
+extern struct cmd_list_element *set_dwarf_cmdlist;
+extern struct cmd_list_element *show_dwarf_cmdlist;
+
typedef struct dwarf2_per_cu_data *dwarf2_per_cu_ptr;
DEF_VEC_P (dwarf2_per_cu_ptr);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index aa8b06a..cdba393 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-26 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.base/maint.exp: Add check that dwarf unwinders control flag
+ is visible.
+
2018-07-26 Tom de Vries <tdevries@suse.de>
PR breakpoints/23366
diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp
index 92086ee..ee0d089 100644
--- a/gdb/testsuite/gdb.base/maint.exp
+++ b/gdb/testsuite/gdb.base/maint.exp
@@ -526,6 +526,10 @@ gdb_test_no_output "maint info line-table xxx.c" \
set timeout $oldtimeout
+# Just check that the DWARF unwinders control flag is visible.
+gdb_test "maint show dwarf unwinders" \
+ "The DWARF stack unwinders are currently (on|off)\\."
+
#============test help on maint commands
test_prefix_command_help {"maint info" "maintenance info"} {