[v3,10/10] Enable conditional breakpoints for targets that support software single step in GDBServer.

Message ID 1448287968-12907-11-git-send-email-antoine.tremblay@ericsson.com
State New, archived
Headers

Commit Message

Antoine Tremblay Nov. 23, 2015, 2:12 p.m. UTC
  This patch enables support for conditional breakpoints if the target supports
software single step.

This was disabled before as the implementations of software single step were too
simple as discussed in
https://sourceware.org/ml/gdb-patches/2015-04/msg01110.html.

Since these issues are now fixed support can be added back.

No regressions, tested on ubuntu 14.04 ARMv7 and x86.
With gdbserver-{native,extended} / { -marm -mthumb }

gdb/gdbserver/ChangeLog:

	* server.c (handle_query): Call target_supports_software_single_step.
---
 gdb/gdbserver/server.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)
  

Comments

Yao Qi Nov. 26, 2015, 10:25 a.m. UTC | #1
Antoine Tremblay <antoine.tremblay@ericsson.com> writes:

> No regressions, tested on ubuntu 14.04 ARMv7 and x86.
> With gdbserver-{native,extended} / { -marm -mthumb }

There should be more PASS in the test result, what are they?
  
Antoine Tremblay Nov. 26, 2015, 3:34 p.m. UTC | #2
On 11/26/2015 05:25 AM, Yao Qi wrote:
> Antoine Tremblay <antoine.tremblay@ericsson.com> writes:
>
>> No regressions, tested on ubuntu 14.04 ARMv7 and x86.
>> With gdbserver-{native,extended} / { -marm -mthumb }
>
> There should be more PASS in the test result, what are they?
>

(gdb) PASS: gdb.base/cond-eval-mode.exp: set breakpoint 
condition-evaluation target
(gdb) PASS: gdb.base/cond-eval-mode.exp: probe for target remote
(gdb) PASS: gdb.base/cond-eval-mode.exp: set remote 
conditional-breakpoints-packet off
(gdb) PASS: gdb.base/cond-eval-mode.exp: set breakpoint 
condition-evaluation target, with support disabled
(gdb) PASS: gdb.base/cond-eval-mode.exp: set remote 
conditional-breakpoints-packet on
(gdb) PASS: gdb.base/cond-eval-mode.exp: restore set breakpoint 
condition-evaluation target
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: break foo
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: condition $bpnum 
cond_global==0
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: break foo
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: condition $bpnum 
cond_global==1
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: b bar
(gdb) PASS: gdb.base/cond-eval-mode.exp: break: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: hbreak foo
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: condition $bpnum 
cond_global==0
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: hbreak foo
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: condition $bpnum 
cond_global==1
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: b bar
(gdb) PASS: gdb.base/cond-eval-mode.exp: hbreak: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: watch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: condition $bpnum 
cond_global==0
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: watch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: condition $bpnum 
cond_global==1
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: b bar
(gdb) PASS: gdb.base/cond-eval-mode.exp: watch: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: rwatch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: condition $bpnum 
cond_global==0
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: rwatch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: condition $bpnum 
cond_global==1
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: b bar
(gdb) PASS: gdb.base/cond-eval-mode.exp: rwatch: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: awatch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: condition $bpnum 
cond_global==0
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: continue
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: awatch global
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: condition $bpnum 
cond_global==1
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: b bar
(gdb) PASS: gdb.base/cond-eval-mode.exp: awatch: continue


Should these be part of the commit log ?

as :

New tests passing  :

PASS: gdb.base/cond-eval-mode.exp: set breakpoint condition-evaluation 
target and related...

Maybe?

Thanks,
Antoine Tremblay
  
Yao Qi Dec. 3, 2015, 9:50 a.m. UTC | #3
Antoine Tremblay <antoine.tremblay@ericsson.com> writes:

Hi,
Sorry I missed this mail...

> New tests passing  :
>
> PASS: gdb.base/cond-eval-mode.exp: set breakpoint condition-evaluation
> target and related...
>
> Maybe?

Yes, this can be added to the commit log in V4.
  

Patch

diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index fd2804b..2216ab8 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2211,13 +2211,9 @@  handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
 	  strcat (own_buf, ";tracenz+");
 	}
 
-      if (target_supports_hardware_single_step ())
+      if (target_supports_hardware_single_step ()
+	  || target_supports_software_single_step () )
 	{
-	  /* Support target-side breakpoint conditions and commands.
-	     GDBserver needs to step over the breakpoint if the condition
-	     is false.  GDBserver software single step is too simple, so
-	     disable conditional breakpoints if the target doesn't have
-	     hardware single step.  */
 	  strcat (own_buf, ";ConditionalBreakpoints+");
 	}
       strcat (own_buf, ";BreakpointCommands+");