2010-04-05 Stan Shebs <stan@codesourcery.com>

* tracepoint.c: Include gdbcore.h.
	(tfile_xfer_partial): Return partial results, also try reading
	from executable.
	(tfile_has_all_memory): New function.
	(init_tfile_ops): Use it.

	* gdb.trace/tfile.c: Add a variable split across two blocks, and a
	constant global.
	* gdb.trace/tfile.exp: Try to print them.
This commit is contained in:
Stan Shebs 2010-04-05 21:57:18 +00:00
parent 9cdcc3e8b3
commit fce3c1f0f1
5 changed files with 102 additions and 21 deletions

View File

@ -1,3 +1,11 @@
2010-04-05 Stan Shebs <stan@codesourcery.com>
* tracepoint.c: Include gdbcore.h.
(tfile_xfer_partial): Return partial results, also try reading
from executable.
(tfile_has_all_memory): New function.
(init_tfile_ops): Use it.
2010-04-05 Sergio Durigan Junior <sergiodj@redhat.com>
PR gdb/10736:
@ -81,6 +89,7 @@
* remote.c (remote_parse_stop_reply): Use hex_string instead
of phex_nz for error.
>>>>>>> 1.11571
2010-04-01 Stan Shebs <stan@codesourcery.com>
Nathan Sidwell <nathan@codesourcery.com>

View File

@ -1,3 +1,9 @@
2010-04-05 Stan Shebs <stan@codesourcery.com>
* gdb.trace/tfile.c: Add a variable split across two blocks, and a
constant global.
* gdb.trace/tfile.exp: Try to print them.
2010-04-04 Stan Shebs <stan@codesourcery.com>
* gdb.base/completion.exp: Update for new "info watchpoints".

View File

@ -15,6 +15,10 @@ char *tfsizeptr;
int testglob = 31415;
int testglob2 = 271828;
const int constglob = 10000;
int
start_trace_file (char *filename)
{
@ -40,12 +44,30 @@ finish_trace_file (int fd)
close (fd);
}
void
add_memory_block (char *addr, int size)
{
short short_x;
long long ll_x;
*((char *) trptr) = 'M';
trptr += 1;
ll_x = (long) addr;
memcpy (trptr, &ll_x, sizeof (long long));
trptr += sizeof (long long);
short_x = size;
memcpy (trptr, &short_x, 2);
trptr += 2;
memcpy (trptr, addr, size);
trptr += size;
}
void
write_basic_trace_file (void)
{
int fd, int_x;
short short_x;
long long ll_x;
fd = start_trace_file ("basic.tf");
@ -82,16 +104,10 @@ write_basic_trace_file (void)
trptr += 2;
tfsizeptr = trptr;
trptr += 4;
*((char *) trptr) = 'M';
trptr += 1;
ll_x = (long) &testglob;
memcpy (trptr, &ll_x, sizeof (long long));
trptr += sizeof (long long);
short_x = sizeof (testglob);
memcpy (trptr, &short_x, 2);
trptr += 2;
memcpy (trptr, &testglob, sizeof (testglob));
trptr += sizeof (testglob);
add_memory_block (&testglob, sizeof (testglob));
/* Divide a variable between two separate memory blocks. */
add_memory_block (&testglob2, 1);
add_memory_block (((char*) &testglob2) + 1, sizeof (testglob2) - 1);
/* Go back and patch in the frame size. */
int_x = trptr - tfsizeptr - sizeof (int);
memcpy (tfsizeptr, &int_x, 4);

View File

@ -74,8 +74,15 @@ gdb_test "tfind 0" \
\#0 write_basic_trace_file ().*" \
"tfind 0 on trace file"
# Note that there is no tracepoint collecting these globals, we
# just happen to know they are covered by the trace frame.
gdb_test "print testglob" " = 31415" "print testglob on trace file"
gdb_test "print testglob2" " = 271828" "print testglob2 on trace file"
gdb_test "print constglob" " = 10000" "print constglob on trace file"
gdb_test "tfind" "Target failed to find requested trace frame." \
"tfind does not find a second frame in trace file"

View File

@ -45,6 +45,7 @@
#include "filenames.h"
#include "gdbthread.h"
#include "stack.h"
#include "gdbcore.h"
#include "ax.h"
#include "ax-gdb.h"
@ -3793,7 +3794,7 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
{
char block_type;
int pos, gotten;
ULONGEST maddr;
ULONGEST maddr, amt;
unsigned short mlen;
/* We're only doing regular memory for now. */
@ -3831,15 +3832,18 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
perror_with_name (trace_filename);
else if (gotten < 2)
error (_("Premature end of file while reading trace file"));
if (maddr <= offset && (offset + len) <= (maddr + mlen))
/* 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))
{
gotten = read (trace_fd, readbuf, mlen);
if (gotten < 0)
perror_with_name (trace_filename);
else if (gotten < mlen)
error (_("Premature end of file qwhile reading trace file"));
amt = (maddr + mlen) - offset;
if (amt > len)
amt = len;
return mlen;
read (trace_fd, readbuf, amt);
return amt;
}
lseek (trace_fd, mlen, SEEK_CUR);
pos += (8 + 2 + mlen);
@ -3854,6 +3858,38 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
break;
}
}
/* It's unduly pedantic to refuse to look at the executable for
read-only pieces; so do the equivalent of readonly regions aka
QTro packet. */
/* FIXME account for relocation at some point */
if (exec_bfd)
{
asection *s;
bfd_size_type size;
bfd_vma lma;
for (s = exec_bfd->sections; s; s = s->next)
{
if ((s->flags & SEC_LOAD) == 0 ||
(s->flags & SEC_READONLY) == 0)
continue;
lma = s->lma;
size = bfd_get_section_size (s);
if (lma <= offset && offset < (lma + size))
{
amt = (lma + size) - offset;
if (amt > len)
amt = len;
amt = bfd_get_section_contents (exec_bfd, s,
readbuf, offset - lma, amt);
return amt;
}
}
}
/* Indicate failure to find the requested memory block. */
return -1;
}
@ -3922,6 +3958,12 @@ tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
return 0;
}
static int
tfile_has_all_memory (struct target_ops *ops)
{
return 1;
}
static int
tfile_has_memory (struct target_ops *ops)
{
@ -3958,6 +4000,7 @@ init_tfile_ops (void)
/* core_stratum might seem more logical, but GDB doesn't like having
more than one core_stratum vector. */
tfile_ops.to_stratum = process_stratum;
tfile_ops.to_has_all_memory = tfile_has_all_memory;
tfile_ops.to_has_memory = tfile_has_memory;
tfile_ops.to_has_stack = tfile_has_stack;
tfile_ops.to_has_registers = tfile_has_registers;