From patchwork Tue Sep 1 08:41:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 8542 Received: (qmail 80586 invoked by alias); 1 Sep 2015 08:42:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 80574 invoked by uid 89); 1 Sep 2015 08:42:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pa0-f42.google.com Received: from mail-pa0-f42.google.com (HELO mail-pa0-f42.google.com) (209.85.220.42) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 01 Sep 2015 08:42:13 +0000 Received: by pacwb2 with SMTP id wb2so2529185pac.3 for ; Tue, 01 Sep 2015 01:42:11 -0700 (PDT) X-Received: by 10.66.190.99 with SMTP id gp3mr44239881pac.113.1441096931348; Tue, 01 Sep 2015 01:42:11 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id hk4sm12344228pdb.22.2015.09.01.01.42.08 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 01 Sep 2015 01:42:10 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 1/2] [gdbserver] Rename supports_conditional_breakpoints to supports_hardware_single_step Date: Tue, 1 Sep 2015 09:41:54 +0100 Message-Id: <1441096915-23615-2-git-send-email-yao.qi@linaro.org> In-Reply-To: <1441096915-23615-1-git-send-email-yao.qi@linaro.org> References: <1441096915-23615-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes In my patch https://sourceware.org/ml/gdb-patches/2015-04/msg01110.html a new target_ops hook supports_conditional_breakpoints was added to disable conditional breakpoints if target doesn't have hardware single step. This patch is to generalize this hook from supports_conditional_breakpoints to supports_hardware_single_step, so that the following patch can use it. gdb/gdbserver: 2015-09-01 Yao Qi * linux-low.c (linux_supports_conditional_breakpoints): Rename it to ... (linux_supports_hardware_single_step): ... New function. (linux_target_ops): Update. * lynx-low.c (lynx_target_ops): Set field supports_hardware_single_step to target_can_do_hardware_single_step. * nto-low.c (nto_target_ops): Likewise. * spu-low.c (spu_target_ops): Likewise. * win32-low.c (win32_target_ops): Likewise. * target.c (target_can_do_hardware_single_step): New function. * target.h (struct target_ops) : Remove. : New field. (target_supports_conditional_breakpoints): Remove. (target_supports_hardware_single_step): New macro. (target_can_do_hardware_single_step): Declare. * server.c (handle_query): Use target_supports_hardware_single_step instead of target_supports_conditional_breakpoints. --- gdb/gdbserver/linux-low.c | 11 +++-------- gdb/gdbserver/lynx-low.c | 5 +---- gdb/gdbserver/nto-low.c | 5 +---- gdb/gdbserver/server.c | 12 +++++++++--- gdb/gdbserver/spu-low.c | 2 +- gdb/gdbserver/target.c | 8 ++++++++ gdb/gdbserver/target.h | 13 +++++++------ gdb/gdbserver/win32-low.c | 5 +---- 8 files changed, 31 insertions(+), 30 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index f4c6029..9ae0522 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5524,16 +5524,11 @@ linux_supports_stopped_by_hw_breakpoint (void) return USE_SIGTRAP_SIGINFO; } -/* Implement the supports_conditional_breakpoints target_ops - method. */ +/* Implement the supports_hardware_single_step target_ops method. */ static int -linux_supports_conditional_breakpoints (void) +linux_supports_hardware_single_step (void) { - /* 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. */ return can_hardware_single_step (); } @@ -6886,7 +6881,7 @@ static struct target_ops linux_target_ops = { linux_supports_stopped_by_sw_breakpoint, linux_stopped_by_hw_breakpoint, linux_supports_stopped_by_hw_breakpoint, - linux_supports_conditional_breakpoints, + linux_supports_hardware_single_step, linux_stopped_by_watchpoint, linux_stopped_data_address, #if defined(__UCLIBC__) && defined(HAS_NOMMU) \ diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c index 1a187c8..c5eb8fd 100644 --- a/gdb/gdbserver/lynx-low.c +++ b/gdb/gdbserver/lynx-low.c @@ -747,10 +747,7 @@ static struct target_ops lynx_target_ops = { NULL, /* supports_stopped_by_sw_breakpoint */ NULL, /* stopped_by_hw_breakpoint */ NULL, /* supports_stopped_by_hw_breakpoint */ - /* Although lynx has hardware single step, still disable this - feature for lynx, because it is implemented in linux-low.c instead - of in generic code. */ - NULL, /* supports_conditional_breakpoints */ + target_can_do_hardware_single_step, NULL, /* stopped_by_watchpoint */ NULL, /* stopped_data_address */ NULL, /* read_offsets */ diff --git a/gdb/gdbserver/nto-low.c b/gdb/gdbserver/nto-low.c index 19f492f..fa216a9 100644 --- a/gdb/gdbserver/nto-low.c +++ b/gdb/gdbserver/nto-low.c @@ -950,10 +950,7 @@ static struct target_ops nto_target_ops = { NULL, /* supports_stopped_by_sw_breakpoint */ NULL, /* stopped_by_hw_breakpoint */ NULL, /* supports_stopped_by_hw_breakpoint */ - /* Although nto has hardware single step, still disable this - feature for not, because it is implemented in linux-low.c instead - of in generic code. */ - NULL, /* supports_conditional_breakpoints */ + target_can_do_hardware_single_step, nto_stopped_by_watchpoint, nto_stopped_data_address, NULL, /* nto_read_offsets */ diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index c52cf16..5c0d83d 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -2192,9 +2192,15 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) strcat (own_buf, ";tracenz+"); } - /* Support target-side breakpoint conditions and commands. */ - if (target_supports_conditional_breakpoints ()) - strcat (own_buf, ";ConditionalBreakpoints+"); + if (target_supports_hardware_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+"); if (target_supports_agent ()) diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c index 878ed82..074417a 100644 --- a/gdb/gdbserver/spu-low.c +++ b/gdb/gdbserver/spu-low.c @@ -666,7 +666,7 @@ static struct target_ops spu_target_ops = { NULL, /* supports_stopped_by_sw_breakpoint */ NULL, /* stopped_by_hw_breakpoint */ NULL, /* supports_stopped_by_hw_breakpoint */ - NULL, /* supports_conditional_breakpoints */ + NULL, /* supports_hardware_single_step */ NULL, NULL, NULL, diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c index 7540f2f..17ff7a6 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -216,3 +216,11 @@ kill_inferior (int pid) return (*the_target->kill) (pid); } + +/* Target can do hardware single step. */ + +int +target_can_do_hardware_single_step (void) +{ + return 1; +} diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index 3e3b80f..7df8df3 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -225,9 +225,8 @@ struct target_ops HW breakpoint triggering. */ int (*supports_stopped_by_hw_breakpoint) (void); - /* Returns true if the target can evaluate conditions of - breakpoints. */ - int (*supports_conditional_breakpoints) (void); + /* Returns true if the target can do hardware single step. */ + int (*supports_hardware_single_step) (void); /* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise. */ @@ -609,9 +608,9 @@ int kill_inferior (int); (the_target->supports_stopped_by_hw_breakpoint ? \ (*the_target->supports_stopped_by_hw_breakpoint) () : 0) -#define target_supports_conditional_breakpoints() \ - (the_target->supports_conditional_breakpoints ? \ - (*the_target->supports_conditional_breakpoints) () : 0) +#define target_supports_hardware_single_step() \ + (the_target->supports_hardware_single_step ? \ + (*the_target->supports_hardware_single_step) () : 0) #define target_stopped_by_hw_breakpoint() \ (the_target->stopped_by_hw_breakpoint ? \ @@ -649,4 +648,6 @@ int set_desired_thread (int id); const char *target_pid_to_str (ptid_t); +int target_can_do_hardware_single_step (void); + #endif /* TARGET_H */ diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 86386ce..212c3c2 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -1810,10 +1810,7 @@ static struct target_ops win32_target_ops = { NULL, /* supports_stopped_by_sw_breakpoint */ NULL, /* stopped_by_hw_breakpoint */ NULL, /* supports_stopped_by_hw_breakpoint */ - /* Although win32-i386 has hardware single step, still disable this - feature for win32, because it is implemented in linux-low.c instead - of in generic code. */ - NULL, /* supports_conditional_breakpoints */ + target_can_do_hardware_single_step, win32_stopped_by_watchpoint, win32_stopped_data_address, NULL, /* read_offsets */