diff options
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 18 | ||||
-rw-r--r-- | gdb/NEWS | 4 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 24 | ||||
-rw-r--r-- | gdb/dwarf2-frame-tailcall.c | 3 | ||||
-rw-r--r-- | gdb/dwarf2-frame.c | 31 | ||||
-rw-r--r-- | gdb/dwarf2-frame.h | 6 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 4 | ||||
-rw-r--r-- | gdb/dwarf2read.h | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/maint.exp | 4 |
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 @@ -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"} { |