* tracepoint.c (tfile_xfer_partial): If there's no traceframe
	selected, don't try iterating over the traceframe's blocks.
	(tfile_has_stack): If there's no traceframe selected, then there's
	no stack.
	(tfile_has_registers): If there's no traceframe selected, then
	there's no registers.

	gdb/testsuite/
	* gdb.trace/tfile.exp: Test that with no traceframe selected,
	there's no stack or registers.
This commit is contained in:
Pedro Alves 2011-01-28 16:18:55 +00:00
parent e8c9e0a18f
commit ffd5ec2486
4 changed files with 55 additions and 29 deletions

View File

@ -1,3 +1,12 @@
2011-01-28 Pedro Alves <pedro@codesourcery.com>
* tracepoint.c (tfile_xfer_partial): If there's no traceframe
selected, don't try iterating over the traceframe's blocks.
(tfile_has_stack): If there's no traceframe selected, then there's
no stack.
(tfile_has_registers): If there's no traceframe selected, then
there's no registers.
2011-01-28 Pedro Alves <pedro@codesourcery.com>
* target.c (memory_xfer_partial): No need to restore shadows if we

View File

@ -1,3 +1,8 @@
2011-01-28 Pedro Alves <pedro@codesourcery.com>
* gdb.trace/tfile.exp: Test that with no traceframe selected,
there's no stack or registers.
2011-01-26 Tom Tromey <tromey@redhat.com>
* gdb.python/py-prettyprint.exp (run_lang_tests): Ensure no blank

View File

@ -92,6 +92,14 @@ Trace buffer has 256 bytes of 4096 bytes free \\(93% full\\).*
Looking at trace frame 0, tracepoint .*" \
"tstatus on trace file"
gdb_test "tfind end" "No longer looking at any trace frame" "leave tfind mode"
gdb_test "backtrace" "No stack\." \
"no stack if no traceframe selected"
gdb_test "info registers" "The program has no registers now\." \
"no registers if no traceframe selected"
# Now start afresh, using only a trace file.
gdb_exit

View File

@ -3970,8 +3970,6 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
const char *annex, gdb_byte *readbuf,
const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
{
int pos;
/* We're only doing regular memory for now. */
if (object != TARGET_OBJECT_MEMORY)
return -1;
@ -3979,36 +3977,42 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
if (readbuf == NULL)
error (_("tfile_xfer_partial: trace file is read-only"));
/* Iterate through the traceframe's blocks, looking for memory. */
pos = 0;
while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
if (traceframe_number != -1)
{
ULONGEST maddr, amt;
unsigned short mlen;
int pos = 0;
tfile_read ((gdb_byte *) &maddr, 8);
maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
gdbarch_byte_order (target_gdbarch));
tfile_read ((gdb_byte *) &mlen, 2);
mlen = (unsigned short)
extract_unsigned_integer ((gdb_byte *) &mlen, 2,
gdbarch_byte_order (target_gdbarch));
/* If the block includes the first part of the desired range,
return as much it has; GDB will re-request the remainder,
which might be in a different block of this trace frame. */
if (maddr <= offset && offset < (maddr + mlen))
/* Iterate through the traceframe's blocks, looking for
memory. */
while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
{
amt = (maddr + mlen) - offset;
if (amt > len)
amt = len;
ULONGEST maddr, amt;
unsigned short mlen;
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
tfile_read (readbuf, amt);
return amt;
tfile_read ((gdb_byte *) &maddr, 8);
maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
byte_order);
tfile_read ((gdb_byte *) &mlen, 2);
mlen = (unsigned short)
extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
/* If the block includes the first part of the desired
range, return as much it has; GDB will re-request the
remainder, which might be in a different block of this
trace frame. */
if (maddr <= offset && offset < (maddr + mlen))
{
amt = (maddr + mlen) - offset;
if (amt > len)
amt = len;
tfile_read (readbuf, amt);
return amt;
}
/* Skip over this block. */
pos += (8 + 2 + mlen);
}
/* Skip over this block. */
pos += (8 + 2 + mlen);
}
/* It's unduly pedantic to refuse to look at the executable for
@ -4095,13 +4099,13 @@ tfile_has_memory (struct target_ops *ops)
static int
tfile_has_stack (struct target_ops *ops)
{
return 1;
return traceframe_number != -1;
}
static int
tfile_has_registers (struct target_ops *ops)
{
return 1;
return traceframe_number != -1;
}
static void