diff options
author | Pedro Alves <palves@redhat.com> | 2014-11-12 10:10:48 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2014-11-12 10:32:53 +0000 |
commit | ae9bb220caeb7d51fce6f54a182477247d8e3ac3 (patch) | |
tree | 18462743c2f94ff69124e00172aa0d3a9f0ffe3f /gdb/gdbarch.c | |
parent | 6bb3e67958b0ee59f1b69619761e6d5ad1f7544b (diff) | |
download | gdb-ae9bb220caeb7d51fce6f54a182477247d8e3ac3.zip gdb-ae9bb220caeb7d51fce6f54a182477247d8e3ac3.tar.gz gdb-ae9bb220caeb7d51fce6f54a182477247d8e3ac3.tar.bz2 |
add a default method for gdbarch_skip_permanent_breakpoint
breakpoint.c uses gdbarch_breakpoint_from_pc to determine whether a
breakpoint location points at a permanent breakpoint:
static int
bp_loc_is_permanent (struct bp_location *loc)
{
...
addr = loc->address;
bpoint = gdbarch_breakpoint_from_pc (loc->gdbarch, &addr, &len);
...
if (target_read_memory (loc->address, target_mem, len) == 0
&& memcmp (target_mem, bpoint, len) == 0)
retval = 1;
...
So I think we should default the gdbarch_skip_permanent_breakpoint
hook to advancing the PC by the length of the breakpoint instruction,
as determined by gdbarch_breakpoint_from_pc. I believe that simple
implementation does the right thing for most architectures. If
there's an oddball architecture where that doesn't work, then it
should override the hook, just like it should be overriding the hook
if there was no default anyway.
The only two implementation of skip_permanent_breakpoint are
i386_skip_permanent_breakpoint, for x86, and
hppa_skip_permanent_breakpoint, for PA-RISC/HP-UX
The x86 implementation is trivial, and can clearly be replaced by the
new default.
I don't know about the HP-UX one though, I know almost nothing about
PA. It may well be advancing the PC ends up being equivalent.
Otherwise, it must be that "jump $pc_after_bp" doesn't work either...
Tested on x86_64 Fedora 20 native and gdbserver.
gdb/
2014-11-12 Pedro Alves <palves@redhat.com>
* arch-utils.c (default_skip_permanent_breakpoint): New function.
* arch-utils.h (default_skip_permanent_breakpoint): New
declaration.
* gdbarch.sh (skip_permanent_breakpoint): Now an 'f' function.
Install default_skip_permanent_breakpoint as default method.
* i386-tdep.c (i386_skip_permanent_breakpoint): Delete function.
(i386_gdbarch_init): Don't install it.
* infrun.c (resume): Assume there's always a
gdbarch_skip_permanent_breakpoint implementation.
* gdbarch.h, gdbarch.c: Regenerate.
Diffstat (limited to 'gdb/gdbarch.c')
-rw-r--r-- | gdb/gdbarch.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 2984358..bd53acc 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -393,6 +393,7 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->elf_make_msymbol_special = default_elf_make_msymbol_special; gdbarch->coff_make_msymbol_special = default_coff_make_msymbol_special; gdbarch->register_reggroup_p = default_register_reggroup_p; + gdbarch->skip_permanent_breakpoint = default_skip_permanent_breakpoint; gdbarch->displaced_step_hw_singlestep = default_displaced_step_hw_singlestep; gdbarch->displaced_step_fixup = NULL; gdbarch->displaced_step_free_closure = NULL; @@ -581,7 +582,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of gcore_bfd_target, has predicate. */ /* Skip verify of vtable_function_descriptors, invalid_p == 0 */ /* Skip verify of vbit_in_delta, invalid_p == 0 */ - /* Skip verify of skip_permanent_breakpoint, has predicate. */ + /* Skip verify of skip_permanent_breakpoint, invalid_p == 0 */ /* Skip verify of max_insn_length, has predicate. */ /* Skip verify of displaced_step_copy_insn, has predicate. */ /* Skip verify of displaced_step_hw_singlestep, invalid_p == 0 */ @@ -1190,9 +1191,6 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: skip_main_prologue = <%s>\n", host_address_to_string (gdbarch->skip_main_prologue)); fprintf_unfiltered (file, - "gdbarch_dump: gdbarch_skip_permanent_breakpoint_p() = %d\n", - gdbarch_skip_permanent_breakpoint_p (gdbarch)); - fprintf_unfiltered (file, "gdbarch_dump: skip_permanent_breakpoint = <%s>\n", host_address_to_string (gdbarch->skip_permanent_breakpoint)); fprintf_unfiltered (file, @@ -3465,13 +3463,6 @@ set_gdbarch_vbit_in_delta (struct gdbarch *gdbarch, gdbarch->vbit_in_delta = vbit_in_delta; } -int -gdbarch_skip_permanent_breakpoint_p (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - return gdbarch->skip_permanent_breakpoint != NULL; -} - void gdbarch_skip_permanent_breakpoint (struct gdbarch *gdbarch, struct regcache *regcache) { |