[RFA/7.8] user breakpoint not inserted if software-single-step at same location

Message ID 538EAACD.8000700@codesourcery.com
State Committed
Headers

Commit Message

Yao Qi June 4, 2014, 5:12 a.m. UTC
  On 06/03/2014 08:19 PM, Pedro Alves wrote:
> On 06/03/2014 01:12 PM, Andreas Schwab wrote:
>> Pedro Alves <palves@redhat.com> writes:
>>
>>> Ah, thanks.  We need to replace then with asm("nop") then.
>>
>> nop isn't portable.
> 
> Yes, but it doesn't matter what the instruction is as
> long as it's a single instruction that doesn't do much.
> For archs that don't have "nop" (like e.g., IA64), we can
> just use #ifdef to pick another insn.
> 

Pedro, here is the patch to tweak sss-bp-on-user-bp.exp.
I give up on looking for a portable "nop" for various arch.  In
stead, we can use disassemble to get the next instruction address
and set breakpoint there.  See details in the commit log below.
  

Comments

Pedro Alves June 4, 2014, 8:01 a.m. UTC | #1
On 06/04/2014 06:12 AM, Yao Qi wrote:
> On 06/03/2014 08:19 PM, Pedro Alves wrote:
>> On 06/03/2014 01:12 PM, Andreas Schwab wrote:
>>> Pedro Alves <palves@redhat.com> writes:
>>>
>>>> Ah, thanks.  We need to replace then with asm("nop") then.
>>>
>>> nop isn't portable.
>>
>> Yes, but it doesn't matter what the instruction is as
>> long as it's a single instruction that doesn't do much.
>> For archs that don't have "nop" (like e.g., IA64), we can
>> just use #ifdef to pick another insn.
>>
> 
> Pedro, here is the patch to tweak sss-bp-on-user-bp.exp.
> I give up on looking for a portable "nop" for various arch.  In
> stead, we can use disassemble to get the next instruction address
> and set breakpoint there.  See details in the commit log below.

Good idea.  Patch is OK.

Thanks!
  
Yao Qi June 4, 2014, 12:56 p.m. UTC | #2
On 06/04/2014 04:01 PM, Pedro Alves wrote:
> Good idea.  Patch is OK.

Patch is pushed in, thanks for the review.
  

Patch

diff --git a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
index ff82051..edc2e8c 100644
--- a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
+++ b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.c
@@ -21,10 +21,10 @@ 
 int
 main (void)
 {
-  /* Assume writes to integers compile to a single instruction.  */
   volatile int i = 0;
 
   i = 1;     /* set foo break here */
-  i = 2;     /* set bar break here */
+  i = 2;
+
   return 0;
 }
diff --git a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
index 2a12ad6..0b39fc1 100644
--- a/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
+++ b/gdb/testsuite/gdb.base/sss-bp-on-user-bp.exp
@@ -32,7 +32,21 @@  if ![runto_main] then {
 gdb_breakpoint [gdb_get_line_number "set foo break here"]
 gdb_continue_to_breakpoint "first breakpoint" ".* set foo break here .*"
 
-gdb_breakpoint [gdb_get_line_number "set bar break here"]
+# Get the address of the next instruction and set a breakpoint there.
+set next_insn_addr ""
+set test "disassemble main"
+gdb_test_multiple $test $test {
+    -re ".*=> $hex <\\+$decimal>:\[^\r\n\]+\r\n   ($hex) .*$gdb_prompt $" {
+	set next_insn_addr $expect_out(1,string)
+	pass $test
+    }
+}
+
+if { $next_insn_addr == "" } {
+    return -1
+}
+
+gdb_test "b *$next_insn_addr" "Breakpoint .*"
 
 # So that GDB doesn't try to remove the regular breakpoint when the
 # step finishes.
@@ -43,9 +57,9 @@  gdb_test_no_output "set breakpoint always-inserted on"
 # remove it.  But, a regular breakpoint is planted there already, and
 # with always-inserted on, should remain planted when the step
 # finishes.
-gdb_test "si" "Breakpoint .* bar break .*"
+gdb_test "si" "Breakpoint .*"
 
 # If the breakpoint is still correctly inserted, then this jump should
 # re-trigger it.  Otherwise, GDB will lose control and the program
 # will exit.  See PR breakpoints/17000.
-gdb_test "jump *\$pc" "Breakpoint .* bar break .*"
+gdb_test "jump *\$pc" "Breakpoint .*"