diff options
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/gdbarch.c | 6 | ||||
-rw-r--r-- | gdb/gdbarch.h | 4 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 2 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 25 | ||||
-rw-r--r-- | gdb/stap-probe.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp | 22 |
8 files changed, 43 insertions, 48 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 611a10e..16d09dc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2019-07-17 Andrew Burgess <andrew.burgess@embecosm.com> + + PR breakpoints/24541 + * gdbarch.c: Regenerate. + * gdbarch.h: Regenerate. + * gdbarch.sh: Adjust return type and parameter types for + 'stap_adjust_register'. + (i386_stap_adjust_register): Adjust signature and return new + register name. + * stap-probe.c (stap_parse_register_operand): Adjust use of + 'gdbarch_stap_adjust_register'. + 2019-07-17 Tom Tromey <tromey@adacore.com> * s390-linux-nat.c (s390_watch_area): Remove typedef. Don't diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index cc7d0ac..725b98f 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -4530,14 +4530,14 @@ gdbarch_stap_adjust_register_p (struct gdbarch *gdbarch) return gdbarch->stap_adjust_register != NULL; } -void -gdbarch_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p, std::string ®name, int regnum) +std::string +gdbarch_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p, const std::string ®name, int regnum) { gdb_assert (gdbarch != NULL); gdb_assert (gdbarch->stap_adjust_register != NULL); if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_stap_adjust_register called\n"); - gdbarch->stap_adjust_register (gdbarch, p, regname, regnum); + return gdbarch->stap_adjust_register (gdbarch, p, regname, regnum); } void diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 0857d2f..c3556d3 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -1376,8 +1376,8 @@ extern void set_gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, gdbar extern int gdbarch_stap_adjust_register_p (struct gdbarch *gdbarch); -typedef void (gdbarch_stap_adjust_register_ftype) (struct gdbarch *gdbarch, struct stap_parse_info *p, std::string ®name, int regnum); -extern void gdbarch_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p, std::string ®name, int regnum); +typedef std::string (gdbarch_stap_adjust_register_ftype) (struct gdbarch *gdbarch, struct stap_parse_info *p, const std::string ®name, int regnum); +extern std::string gdbarch_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p, const std::string ®name, int regnum); extern void set_gdbarch_stap_adjust_register (struct gdbarch *gdbarch, gdbarch_stap_adjust_register_ftype *stap_adjust_register); /* DTrace related functions. diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index f3d1bf4..2f9fbbc 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1053,7 +1053,7 @@ M;int;stap_parse_special_token;struct stap_parse_info *p;p # replace the register name from %ax to %eax. # # The rationale for this can be found at PR breakpoints/24541. -M;void;stap_adjust_register;struct stap_parse_info *p, std::string \®name, int regnum;p, regname, regnum +M;std::string;stap_adjust_register;struct stap_parse_info *p, const std::string \®name, int regnum;p, regname, regnum # DTrace related functions. diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index aac9baa0..ccec6d1 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -4389,27 +4389,24 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch, /* Implementation of 'gdbarch_stap_adjust_register', as defined in gdbarch.h. */ -static void +static std::string i386_stap_adjust_register (struct gdbarch *gdbarch, struct stap_parse_info *p, - std::string ®name, int regnum) + const std::string ®name, int regnum) { static const std::unordered_set<std::string> reg_assoc = { "ax", "bx", "cx", "dx", "si", "di", "bp", "sp" }; - if (register_size (gdbarch, regnum) >= TYPE_LENGTH (p->arg_type)) - { - /* If we're dealing with a register whose size is greater or - equal than the size specified by the "[-]N@" prefix, then we - don't need to do anything. */ - return; - } + /* If we are dealing with a register whose size is less than the size + specified by the "[-]N@" prefix, and it is one of the registers that + we know has an extended variant available, then use the extended + version of the register instead. */ + if (register_size (gdbarch, regnum) < TYPE_LENGTH (p->arg_type) + && reg_assoc.find (regname) != reg_assoc.end ()) + return "e" + regname; - if (reg_assoc.find (regname) != reg_assoc.end ()) - { - /* Use the extended version of the register. */ - regname = "e" + regname; - } + /* Otherwise, just use the requested register. */ + return regname; } diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c index 866b41e..b6de873 100644 --- a/gdb/stap-probe.c +++ b/gdb/stap-probe.c @@ -774,23 +774,24 @@ stap_parse_register_operand (struct stap_parse_info *p) code would like to perform on the register name. */ if (gdbarch_stap_adjust_register_p (gdbarch)) { - std::string oldregname = regname; + std::string newregname + = gdbarch_stap_adjust_register (gdbarch, p, regname, regnum); - gdbarch_stap_adjust_register (gdbarch, p, regname, regnum); - - if (regname != oldregname) + if (regname != newregname) { /* This is just a check we perform to make sure that the arch-dependent code has provided us with a valid register name. */ - regnum = user_reg_map_name_to_regnum (gdbarch, regname.c_str (), - regname.size ()); + regnum = user_reg_map_name_to_regnum (gdbarch, newregname.c_str (), + newregname.size ()); if (regnum == -1) internal_error (__FILE__, __LINE__, _("Invalid register name '%s' after replacing it" " (previous name was '%s')"), - regname.c_str (), oldregname.c_str ()); + newregname.c_str (), regname.c_str ()); + + regname = newregname; } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c24eed9..4d7c4a7 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-07-17 Andrew Burgess <andrew.burgess@embecosm.com> + + PR breakpoints/24541 + * gdb.mi/mi-catch-cpp-exceptions.exp: Remove kfail due to 24541. + 2019-07-14 Tom de Vries <tdevries@suse.de> PR testsuite/24760 diff --git a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp index 80ecabb..9b64fb1 100644 --- a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp +++ b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp @@ -130,27 +130,7 @@ with_test_prefix "all with invalid regexp" { setup_catchpoint "throw" "-r blahblah" setup_catchpoint "rethrow" "-r woofwoof" setup_catchpoint "catch" "-r miowmiow" - - # Would like to use 'continue_to_breakpoint_in_main' here, if - # there wasn't a bug that requires a use of kfail. - - mi_send_resuming_command "exec-continue" \ - "exec-continue" - set testname "run until breakpoint in main" - gdb_expect { - -re "could not find minimal symbol for typeinfo address.*$mi_gdb_prompt$" { - kfail "gdb/24541" "${testname}" - } - -re "\\*stopped,bkptno=\"$decimal\",reason=\"breakpoint-hit\",disp=\"keep\".*func=\"__cxa_throw\".*$mi_gdb_prompt$" { - kfail "gdb/24541" "${testname}" - } - -re "\\*stopped,reason=\"breakpoint-hit\".*func=\"main\".*line=\"${main_lineno}\".*$mi_gdb_prompt$" { - pass "${testname}" - } - timeout { - fail "${testname} (timeout)" - } - } + continue_to_breakpoint_in_main } # Now check that all of the commands with a regexp that does match, |