gdb/
Fix ia64 shadowing of breakpoints in multiple slots of a single bundle. * ia64-tdep.c (ia64_memory_insert_breakpoint): New call of make_show_memory_breakpoints_cleanup with parameter 0. Move the reading of SHADOW_CONTENTS to this memory state point of code. Update comment for the memory re-read. gdb/testsuite/ * gdb.base/breakpoint-shadow.exp (Second breakpoint placed): Initialize $bpt2address. (Second breakpoint address is valid on ia64) (Third breakpoint on ia64 in the Second breakpoint's bundle): New.
This commit is contained in:
parent
7e12722200
commit
b554e4bd53
|
@ -1,3 +1,11 @@
|
||||||
|
2009-09-08 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Fix ia64 shadowing of breakpoints in multiple slots of a single bundle.
|
||||||
|
* ia64-tdep.c (ia64_memory_insert_breakpoint): New call
|
||||||
|
of make_show_memory_breakpoints_cleanup with parameter 0. Move the
|
||||||
|
reading of SHADOW_CONTENTS to this memory state point of code. Update
|
||||||
|
comment for the memory re-read.
|
||||||
|
|
||||||
2009-09-07 Michael Snyder <msnyder@vmware.com>
|
2009-09-07 Michael Snyder <msnyder@vmware.com>
|
||||||
|
|
||||||
* record.c: Minor comment and white space fix-ups.
|
* record.c: Minor comment and white space fix-ups.
|
||||||
|
|
|
@ -622,27 +622,37 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
|
||||||
|
|
||||||
addr &= ~0x0f;
|
addr &= ~0x0f;
|
||||||
|
|
||||||
/* Disable the automatic memory restoration from breakpoints while
|
/* Enable the automatic memory restoration from breakpoints while
|
||||||
we read our instruction bundle. Otherwise, the general restoration
|
we read our instruction bundle for the purpose of SHADOW_CONTENTS.
|
||||||
mechanism kicks in and we would possibly remove parts of the adjacent
|
Otherwise, we could possibly store into the shadow parts of the adjacent
|
||||||
placed breakpoints. It is due to our SHADOW_CONTENTS overlapping the real
|
placed breakpoints. It is due to our SHADOW_CONTENTS overlapping the real
|
||||||
breakpoint instruction bits region. */
|
breakpoint instruction bits region. */
|
||||||
cleanup = make_show_memory_breakpoints_cleanup (1);
|
cleanup = make_show_memory_breakpoints_cleanup (0);
|
||||||
val = target_read_memory (addr, bundle, BUNDLE_LEN);
|
val = target_read_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
|
||||||
|
/* Slot number 2 may skip at most 2 bytes at the beginning. */
|
||||||
|
bp_tgt->shadow_len = BUNDLE_LEN - 2;
|
||||||
|
|
||||||
|
/* Store the whole bundle, except for the initial skipped bytes by the slot
|
||||||
|
number interpreted as bytes offset in PLACED_ADDRESS. */
|
||||||
|
memcpy (bp_tgt->shadow_contents, bundle + slotnum, bp_tgt->shadow_len);
|
||||||
|
|
||||||
|
/* Re-read the same bundle as above except that, this time, read it in order
|
||||||
|
to compute the new bundle inside which we will be inserting the
|
||||||
|
breakpoint. Therefore, disable the automatic memory restoration from
|
||||||
|
breakpoints while we read our instruction bundle. Otherwise, the general
|
||||||
|
restoration mechanism kicks in and we would possibly remove parts of the
|
||||||
|
adjacent placed breakpoints. It is due to our SHADOW_CONTENTS overlapping
|
||||||
|
the real breakpoint instruction bits region. */
|
||||||
|
make_show_memory_breakpoints_cleanup (1);
|
||||||
|
val |= target_read_memory (addr, bundle, BUNDLE_LEN);
|
||||||
|
|
||||||
/* Check for L type instruction in slot 1, if present then bump up the slot
|
/* Check for L type instruction in slot 1, if present then bump up the slot
|
||||||
number to the slot 2. */
|
number to the slot 2. */
|
||||||
template = extract_bit_field (bundle, 0, 5);
|
template = extract_bit_field (bundle, 0, 5);
|
||||||
if (slotnum == 1 && template_encoding_table[template][slotnum] == L)
|
if (slotnum == 1 && template_encoding_table[template][slotnum] == L)
|
||||||
slotnum = 2;
|
slotnum = 2;
|
||||||
|
|
||||||
/* Slot number 2 may skip at most 2 bytes at the beginning. */
|
|
||||||
bp_tgt->placed_size = bp_tgt->shadow_len = BUNDLE_LEN - 2;
|
|
||||||
|
|
||||||
/* Store the whole bundle, except for the initial skipped bytes by the slot
|
|
||||||
number interpreted as bytes offset in PLACED_ADDRESS. */
|
|
||||||
memcpy (bp_tgt->shadow_contents, bundle + slotnum, bp_tgt->shadow_len);
|
|
||||||
|
|
||||||
/* Breakpoints already present in the code will get deteacted and not get
|
/* Breakpoints already present in the code will get deteacted and not get
|
||||||
reinserted by bp_loc_is_permanent. Multiple breakpoints at the same
|
reinserted by bp_loc_is_permanent. Multiple breakpoints at the same
|
||||||
location cannot induce the internal error as they are optimized into
|
location cannot induce the internal error as they are optimized into
|
||||||
|
@ -654,6 +664,8 @@ ia64_memory_insert_breakpoint (struct gdbarch *gdbarch,
|
||||||
paddress (gdbarch, bp_tgt->placed_address));
|
paddress (gdbarch, bp_tgt->placed_address));
|
||||||
replace_slotN_contents (bundle, IA64_BREAKPOINT, slotnum);
|
replace_slotN_contents (bundle, IA64_BREAKPOINT, slotnum);
|
||||||
|
|
||||||
|
bp_tgt->placed_size = bp_tgt->shadow_len;
|
||||||
|
|
||||||
if (val == 0)
|
if (val == 0)
|
||||||
val = target_write_memory (addr + slotnum, bundle + slotnum,
|
val = target_write_memory (addr + slotnum, bundle + slotnum,
|
||||||
bp_tgt->shadow_len);
|
bp_tgt->shadow_len);
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
2009-09-08 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
* gdb.base/breakpoint-shadow.exp (Second breakpoint placed): Initialize
|
||||||
|
$bpt2address.
|
||||||
|
(Second breakpoint address is valid on ia64)
|
||||||
|
(Third breakpoint on ia64 in the Second breakpoint's bundle): New.
|
||||||
|
|
||||||
2009-09-03 Joseph Myers <joseph@codesourcery.com>
|
2009-09-03 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* gdb.base/ending-run.exp: Restrict regular expression matching
|
* gdb.base/ending-run.exp: Restrict regular expression matching
|
||||||
|
|
|
@ -48,7 +48,29 @@ gdb_test_multiple "disass main" $test {
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
|
gdb_test "b [gdb_get_line_number "break-first"]" "Breakpoint \[0-9\] at .*" "First breakpoint placed"
|
||||||
gdb_test "b [gdb_get_line_number "break-second"]" "Breakpoint \[0-9\] at .*" "Second breakpoint placed"
|
set test "Second breakpoint placed"
|
||||||
|
gdb_test_multiple "b [gdb_get_line_number "break-second"]" $test {
|
||||||
|
-re "Breakpoint \[0-9\] at (0x\[0-9a-f\]*):.*" {
|
||||||
|
pass $test
|
||||||
|
set bpt2address $expect_out(1,string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if [istarget "ia64-*-*"] then {
|
||||||
|
# Unoptimized code should not use the 3rd slot for the first instruction of
|
||||||
|
# a source line. This is important for our test, because we want both
|
||||||
|
# breakpoints ("Second breakpoint" and the following one) to be in the same
|
||||||
|
# bundle.
|
||||||
|
|
||||||
|
set test "Second breakpoint address is valid on ia64"
|
||||||
|
if [string match "*\[01\]" $bpt2address] {
|
||||||
|
pass $test
|
||||||
|
|
||||||
|
gdb_test "b *($bpt2address + 1)" "Breakpoint \[0-9\] at .*" "Third breakpoint on ia64 in the Second breakpoint's bundle"
|
||||||
|
} else {
|
||||||
|
unresolved $test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
set test "disassembly with breakpoints"
|
set test "disassembly with breakpoints"
|
||||||
gdb_test_multiple "disass main" $test {
|
gdb_test_multiple "disass main" $test {
|
||||||
|
|
Loading…
Reference in New Issue