Skip to content

Commit

Permalink
Call target_can_download_tracepoint if there are tracepoints to download
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Yao Qi committed Sep 10, 2015
1 parent 55edd97 commit dd2e65c
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 4 deletions.
9 changes: 9 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
15 changes: 12 additions & 3 deletions gdb/breakpoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ();

Expand All @@ -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
Expand Down
2 changes: 2 additions & 0 deletions gdb/common/common-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
1 change: 0 additions & 1 deletion gdb/linux-nat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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). */
Expand Down

0 comments on commit dd2e65c

Please sign in to comment.