[PATCH 2/2] Find the next matched trace file in 'tfile target'.

Yao Qi
2013-02-25T02:58:52Z

The previous patch exposes a bug in tfile target when finding a trace
frame. Every time, GDB will scan tfile from the starting offset and
initialize trace frame number to zero. When TYPE is not tfind_number,
it means GDB wants to find the *next* matched trace frame of current
one. So we need to check the tfile trace frame number iterator is
greater than the current trace frame number (which means *next*).
This is mainly what this patch does.

Regression tested on x86_64-linux.

gdb:

2013-02-25 Yao Qi <yao@codesourcery.com>

* tracepoint.c (tfile_trace_find): Find the next matched trace
frame.
---
gdb/tracepoint.c | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index ca104aa..f7a3650 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -4324,22 +4324,34 @@ tfile_trace_find (enum trace_find_type type, int num,
break;
case tfind_pc:
tfaddr = tfile_get_traceframe_address (tframe_offset);
- if (tfaddr == addr1)
+ if (tfaddr == addr1
+ /* Looks for the next trace frame if matched. */
+ && (tfnum > traceframe_number
+ || (tfnum == traceframe_number && tfnum == 0)))
found = 1;
break;
case tfind_tp:
tp = get_tracepoint (num);
- if (tp && tpnum == tp->number_on_target)
+ if (tp && tpnum == tp->number_on_target
+ /* Looks for the next trace frame if matched. */
+ && (tfnum > traceframe_number
+ || (tfnum == traceframe_number && tfnum == 0)))
found = 1;
break;
case tfind_range:
tfaddr = tfile_get_traceframe_address (tframe_offset);
- if (addr1 <= tfaddr && tfaddr <= addr2)
+ if (addr1 <= tfaddr && tfaddr <= addr2
+ /* Looks for the next trace frame if matched. */
+ && (tfnum > traceframe_number
+ || (tfnum == traceframe_number && tfnum == 0)))
found = 1;
break;
case tfind_outside:
tfaddr = tfile_get_traceframe_address (tframe_offset);
- if (!(addr1 <= tfaddr && tfaddr <= addr2))
+ if (!(addr1 <= tfaddr && tfaddr <= addr2)
+ /* Looks for the next trace frame if matched. */
+ && (tfnum > traceframe_number
+ || (tfnum == traceframe_number && tfnum == 0)))
found = 1;
break;
default:
--
1.7.7.6