diff options
author | Markus Metzger <markus.t.metzger@intel.com> | 2014-02-03 11:40:50 +0100 |
---|---|---|
committer | Markus Metzger <markus.t.metzger@intel.com> | 2015-07-02 12:54:20 +0200 |
commit | 9be54cae43929ab989fcd44dfcf8d3313a55f7a0 (patch) | |
tree | 94df2cf071445b2fc70446451ce78b4cb441cded /gdb/common | |
parent | 010a18a1b12ec6d5219b7e602aa6abe12344dd1a (diff) | |
download | gdb-9be54cae43929ab989fcd44dfcf8d3313a55f7a0.zip gdb-9be54cae43929ab989fcd44dfcf8d3313a55f7a0.tar.gz gdb-9be54cae43929ab989fcd44dfcf8d3313a55f7a0.tar.bz2 |
btrace: store raw btrace data
Store the raw branch trace data that has been read from the target.
This data can be used for maintenance commands as well as for generating
a core file for the "record save" command.
gdb/
* btrace.c (btrace_fetch): Append the new trace data.
(btrace_clear): Clear the stored trace data.
* btrace.h (btrace_thread_info) <data>: New.
* common/btrace-common.h (btrace_data_clear)
(btrace_data_append): New.
* common/btrace-common.c (btrace_data_clear)
(btrace_data_append): New.
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/btrace-common.c | 87 | ||||
-rw-r--r-- | gdb/common/btrace-common.h | 9 |
2 files changed, 96 insertions, 0 deletions
diff --git a/gdb/common/btrace-common.c b/gdb/common/btrace-common.c index 676428e..95193eb 100644 --- a/gdb/common/btrace-common.c +++ b/gdb/common/btrace-common.c @@ -91,3 +91,90 @@ btrace_data_empty (struct btrace_data *data) internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); } + +/* See btrace-common.h. */ + +void +btrace_data_clear (struct btrace_data *data) +{ + btrace_data_fini (data); + btrace_data_init (data); +} + +/* See btrace-common.h. */ + +int +btrace_data_append (struct btrace_data *dst, + const struct btrace_data *src) +{ + switch (src->format) + { + case BTRACE_FORMAT_NONE: + return 0; + + case BTRACE_FORMAT_BTS: + switch (dst->format) + { + default: + return -1; + + case BTRACE_FORMAT_NONE: + dst->format = BTRACE_FORMAT_BTS; + dst->variant.bts.blocks = NULL; + + /* Fall-through. */ + case BTRACE_FORMAT_BTS: + { + unsigned int blk; + + /* We copy blocks in reverse order to have the oldest block at + index zero. */ + blk = VEC_length (btrace_block_s, src->variant.bts.blocks); + while (blk != 0) + { + btrace_block_s *block; + + block = VEC_index (btrace_block_s, src->variant.bts.blocks, + --blk); + + VEC_safe_push (btrace_block_s, dst->variant.bts.blocks, block); + } + } + } + return 0; + + case BTRACE_FORMAT_PT: + switch (dst->format) + { + default: + return -1; + + case BTRACE_FORMAT_NONE: + dst->format = BTRACE_FORMAT_PT; + dst->variant.pt.data = NULL; + dst->variant.pt.size = 0; + + /* fall-through. */ + case BTRACE_FORMAT_BTS: + { + gdb_byte *data; + unsigned long size; + + size = src->variant.pt.size + dst->variant.pt.size; + data = xmalloc (size); + + memcpy (data, dst->variant.pt.data, dst->variant.pt.size); + memcpy (data + dst->variant.pt.size, src->variant.pt.data, + src->variant.pt.size); + + xfree (dst->variant.pt.data); + + dst->variant.pt.data = data; + dst->variant.pt.size = size; + } + } + return 0; + } + + internal_error (__FILE__, __LINE__, _("Unkown branch trace format.")); +} diff --git a/gdb/common/btrace-common.h b/gdb/common/btrace-common.h index ebae17e..f22efc5 100644 --- a/gdb/common/btrace-common.h +++ b/gdb/common/btrace-common.h @@ -214,7 +214,16 @@ extern void btrace_data_init (struct btrace_data *data); /* Cleanup DATA. */ extern void btrace_data_fini (struct btrace_data *data); +/* Clear DATA. */ +extern void btrace_data_clear (struct btrace_data *data); + /* Return non-zero if DATA is empty; zero otherwise. */ extern int btrace_data_empty (struct btrace_data *data); +/* Append the branch trace data from SRC to the end of DST. + Both SRC and DST must use the same format. + Returns zero on success; a negative number otherwise. */ +extern int btrace_data_append (struct btrace_data *dst, + const struct btrace_data *src); + #endif /* BTRACE_COMMON_H */ |