This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Call target_can_download_tracepoint if there are tracepoints to download


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=dd2e65cc2c48f2fe1343840b610bc6dd4246f35b

commit dd2e65cc2c48f2fe1343840b610bc6dd4246f35b
Author: Yao Qi <yao.qi@linaro.org>
Date:   Thu Sep 10 12:31:36 2015 +0100

    Call target_can_download_tracepoint if there are tracepoints to download
    
    Nowadays, GDB calls target_can_download_tracepoint at the entry of
    download_tracepoint_locations, which is called by.
    update_global_location_list.  Sometimes, it is not needed to call
    target_can_download_tracepoint at all because there is no tracepoint
    created.  In remote target, target_can_download_tracepoint send
    qTStatus to the remote in order to know whether tracepoint can be
    downloaded or not.  This means some redundant qTStatus packets are
    sent.
    
    This patch is to teach GDB to call target_can_download_tracepoint
    lazily, only on the moment there are tracepoint to download.
    gdb.perf/single-step.exp (with a local patch to measure RSP packets)
    shows the number of RSP packets is reduced because there is no
    tracepoint at all, so GDB doesn't send qTStatus any more.
    
                           # of RSP packets
                           original  patched
    single-step rsp 1000   7000      6000
    single-step rsp 2000   14000     12000
    single-step rsp 3000   21000     18000
    single-step rsp 4000   28000     24000
    
    gdb:
    
    2015-09-10  Yao Qi  <yao.qi@linaro.org>
    
    	* breakpoint.c (download_tracepoint_locations): New local
    	can_download_tracepoint.  Check the result of
    	target_can_download_tracepoint and save it in
    	can_download_tracepoint if there are tracepoints to download.
    	* linux-nat.h (enum tribool): Move it to ...
    	* common/common-types.h: ... here.

Diff:
---
 gdb/ChangeLog             |  9 +++++++++
 gdb/breakpoint.c          | 15 ++++++++++++---
 gdb/common/common-types.h |  2 ++
 gdb/linux-nat.h           |  1 -
 4 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 85d8bc2..ba521c0 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,12 @@
+2015-09-10  Yao Qi  <yao.qi@linaro.org>
+
+	* breakpoint.c (download_tracepoint_locations): New local
+	can_download_tracepoint.  Check the result of
+	target_can_download_tracepoint and save it in
+	can_download_tracepoint if there are tracepoints to download.
+	* linux-nat.h (enum tribool): Move it to ...
+	* common/common-types.h: ... here.
+
 2015-09-09  Pedro Alves  <palves@redhat.com>
 
 	* inf-loop.c (inferior_event_handler): Delete INF_TIMER case.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 4709de7..520793a 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -12146,9 +12146,7 @@ download_tracepoint_locations (void)
 {
   struct breakpoint *b;
   struct cleanup *old_chain;
-
-  if (!target_can_download_tracepoint ())
-    return;
+  enum tribool can_download_tracepoint = TRIBOOL_UNKNOWN;
 
   old_chain = save_current_space_and_thread ();
 
@@ -12163,6 +12161,17 @@ download_tracepoint_locations (void)
 	   : !may_insert_tracepoints))
 	continue;
 
+      if (can_download_tracepoint == TRIBOOL_UNKNOWN)
+	{
+	  if (target_can_download_tracepoint ())
+	    can_download_tracepoint = TRIBOOL_TRUE;
+	  else
+	    can_download_tracepoint = TRIBOOL_FALSE;
+	}
+
+      if (can_download_tracepoint == TRIBOOL_FALSE)
+	break;
+
       for (bl = b->loc; bl; bl = bl->next)
 	{
 	  /* In tracepoint, locations are _never_ duplicated, so
diff --git a/gdb/common/common-types.h b/gdb/common/common-types.h
index 55b41ab..3f60a9a 100644
--- a/gdb/common/common-types.h
+++ b/gdb/common/common-types.h
@@ -58,4 +58,6 @@ typedef unsigned long long ULONGEST;
 /* * The largest CORE_ADDR value.  */
 #define CORE_ADDR_MAX (~ (CORE_ADDR) 0)
 
+enum tribool { TRIBOOL_UNKNOWN = -1, TRIBOOL_FALSE = 0, TRIBOOL_TRUE = 1 };
+
 #endif /* COMMON_TYPES_H */
diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h
index 81b3ded..f7b45f7 100644
--- a/gdb/linux-nat.h
+++ b/gdb/linux-nat.h
@@ -116,7 +116,6 @@ struct lwp_info
 extern struct lwp_info *lwp_list;
 
 /* Does the current host support PTRACE_GETREGSET?  */
-enum tribool { TRIBOOL_UNKNOWN = -1, TRIBOOL_FALSE = 0, TRIBOOL_TRUE = 1 };
 extern enum tribool have_ptrace_getregset;
 
 /* Iterate over each active thread (light-weight process).  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]