From ffd5ec2486b4786e903d72aca3cc42aade30b15f Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 28 Jan 2011 16:18:55 +0000 Subject: [PATCH] gdb/ * 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. --- gdb/ChangeLog | 9 +++++ gdb/testsuite/ChangeLog | 5 +++ gdb/testsuite/gdb.trace/tfile.exp | 8 ++++ gdb/tracepoint.c | 62 ++++++++++++++++--------------- 4 files changed, 55 insertions(+), 29 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aab7ed1a0e..fd1bf3a039 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2011-01-28 Pedro Alves + + * 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 * target.c (memory_xfer_partial): No need to restore shadows if we diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3b9b284955..1e7543e58b 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-28 Pedro Alves + + * gdb.trace/tfile.exp: Test that with no traceframe selected, + there's no stack or registers. + 2011-01-26 Tom Tromey * gdb.python/py-prettyprint.exp (run_lang_tests): Ensure no blank diff --git a/gdb/testsuite/gdb.trace/tfile.exp b/gdb/testsuite/gdb.trace/tfile.exp index ec21a89335..0614423d6b 100644 --- a/gdb/testsuite/gdb.trace/tfile.exp +++ b/gdb/testsuite/gdb.trace/tfile.exp @@ -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 diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index b15f75da87..59fb593617 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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