public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-mmetzger-btrace: archer: update
@ 2013-02-22 12:15 mmetzger
0 siblings, 0 replies; only message in thread
From: mmetzger @ 2013-02-22 12:15 UTC (permalink / raw)
To: archer-commits
The branch, archer-mmetzger-btrace has been updated
via 5dd7aa460b03c158b938fa76ff6c83927d597bd8 (commit)
from 25be2d9660d4357cf0d08c52fd96f8df29d389b0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 5dd7aa460b03c158b938fa76ff6c83927d597bd8
Author: Markus Metzger <markus.t.metzger@intel.com>
Date: Thu Feb 21 14:39:03 2013 +0100
archer: update
Add kernel check before cpuid check.
Incorporate feedback on command naming.
Incorporate feedback on record renaming.
Drop the "record list" command.
Change-Id: Ife0675a1e30e91c1b28abbdc9b52f05ce6709caf
Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
-----------------------------------------------------------------------
Summary of changes:
gdb/amd64-linux-tdep.c | 3 +-
gdb/arm-tdep.c | 5 +-
gdb/btrace.h | 20 +-
gdb/common/linux-btrace.c | 120 ++++++++++++-
gdb/i386-tdep.c | 28 ++--
gdb/linux-record.c | 4 +-
gdb/record-btrace.c | 429 +++++++++++++++++++++++++--------------------
gdb/record-full.c | 51 +++---
gdb/record.c | 325 ++++++++++++++--------------------
gdb/target.c | 47 ++----
gdb/target.h | 45 ++---
11 files changed, 575 insertions(+), 502 deletions(-)
First 500 lines of diff:
diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
index d07f948..88c291d 100644
--- a/gdb/amd64-linux-tdep.c
+++ b/gdb/amd64-linux-tdep.c
@@ -1204,8 +1204,7 @@ amd64_linux_syscall_record (struct regcache *regcache)
amd64_linux_record_tdep.arg2,
&addr);
if (record_full_arch_list_add_mem
- (addr,
- amd64_linux_record_tdep.size_ulong))
+ (addr, amd64_linux_record_tdep.size_ulong))
return -1;
}
goto record_regs;
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 4dbaec7..7c91717 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -12607,8 +12607,7 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
{
if (record_full_arch_list_add_reg
- (arm_record.regcache ,
- arm_record.arm_regs[no_of_rec]))
+ (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
ret = -1;
}
}
@@ -12619,7 +12618,7 @@ arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
{
if (record_full_arch_list_add_mem
((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
- arm_record.arm_mems[no_of_rec].len))
+ arm_record.arm_mems[no_of_rec].len))
ret = -1;
}
}
diff --git a/gdb/btrace.h b/gdb/btrace.h
index 61404e7..d56bfa4 100644
--- a/gdb/btrace.h
+++ b/gdb/btrace.h
@@ -31,17 +31,17 @@
struct thread_info;
struct btrace_thread_info;
-/* Branch trace iteration state for the "record disassemble" command. */
-struct btrace_disas_state
+/* Branch trace iteration state for "record instruction-history". */
+struct btrace_insn_iterator
{
- /* The instruction index range [begin; end[ that has been disassembled last.
- If end < begin, nothing has been disassembled, yet. */
+ /* The instruction index range [begin; end[ that has been covered last time.
+ If end < begin, the branch trace has just been updated. */
unsigned int begin;
unsigned int end;
};
-/* Branch trace iteration state for the "record backtrace" command. */
-struct btrace_bt_state
+/* Branch trace iteration state for "record function-call-history". */
+struct btrace_function_iterator
{
/* The instruction index range [begin; end[ that has been covered last time.
If end < begin, the branch trace has just been updated. */
@@ -75,11 +75,11 @@ struct btrace_thread_info
VEC_length() one after the tail */
int iterator;
- /* The iteration state for "record disassemble". */
- struct btrace_disas_state disas;
+ /* The instruction history iterator. */
+ struct btrace_insn_iterator insn_iterator;
- /* The iteration state for "record backtrace". */
- struct btrace_bt_state bt;
+ /* The function call history iterator. */
+ struct btrace_function_iterator call_iterator;
};
/* Enable branch tracing for a thread. */
diff --git a/gdb/common/linux-btrace.c b/gdb/common/linux-btrace.c
index 9db6730..dbb9000 100644
--- a/gdb/common/linux-btrace.c
+++ b/gdb/common/linux-btrace.c
@@ -38,6 +38,10 @@
#include <sys/syscall.h>
#include <sys/mman.h>
#include <sys/user.h>
+#include <sys/ptrace.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
#if defined(__GNUC__)
# define memory_barrier() asm volatile ("" : : : "memory")
@@ -242,11 +246,95 @@ perf_event_read_bts (struct btrace_target_info* tinfo, const uint8_t *begin,
return btrace;
}
+/* Check whether the kernel supports branch tracing. */
+
+static int
+kernel_supports_btrace (void)
+{
+ struct perf_event_attr attr;
+ pid_t child, pid;
+ int status, file;
+
+ errno = 0;
+ child = fork ();
+ switch (child)
+ {
+ case -1:
+ warning (_("test branch tracing: cannot fork: %s."), strerror (errno));
+ return 0;
+
+ case 0:
+ status = ptrace (PTRACE_TRACEME, 0, NULL, NULL);
+ if (status != 0)
+ {
+ warning (_("test branch tracing: cannot PTRACE_TRACEME: %s."),
+ strerror (errno));
+ _exit (1);
+ }
+
+ status = raise (SIGTRAP);
+ if (status != 0)
+ {
+ warning (_("test branch tracing: cannot raise SIGTRAP: %s."),
+ strerror (errno));
+ _exit (1);
+ }
+
+ _exit (1);
+
+ default:
+ pid = waitpid (child, &status, 0);
+ if (pid != child)
+ {
+ warning (_("test branch tracing: bad pid %ld, error: %s."),
+ (long) pid, strerror (errno));
+ return 0;
+ }
+
+ if (!WIFSTOPPED (status))
+ {
+ warning (_("test branch tracing: expected stop. status: %d."),
+ status);
+ return 0;
+ }
+
+ memset (&attr, 0, sizeof (attr));
+
+ attr.type = PERF_TYPE_HARDWARE;
+ attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
+ attr.sample_period = 1;
+ attr.sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_ADDR;
+ attr.exclude_kernel = 1;
+ attr.exclude_hv = 1;
+ attr.exclude_idle = 1;
+
+ file = syscall (SYS_perf_event_open, &attr, child, -1, -1, 0);
+ if (file >= 0)
+ close (file);
+
+ kill (child, SIGKILL);
+ ptrace (PTRACE_KILL, child, NULL, NULL);
+
+ pid = waitpid (child, &status, 0);
+ if (pid != child)
+ {
+ warning (_("test branch tracing: bad pid %ld, error: %s."),
+ (long) pid, strerror (errno));
+ if (!WIFSIGNALED (status))
+ warning (_("test branch tracing: expected killed. status: %d."),
+ status);
+ }
+
+ return (file >= 0);
+ }
+}
+
/* Check whether an Intel cpu supports branch tracing. */
static int
intel_supports_btrace (void)
{
+#if defined __i386__ || defined __x86_64__
unsigned int cpuid, model, family;
__asm__ __volatile__ ("movl $1, %%eax;"
@@ -283,12 +371,18 @@ intel_supports_btrace (void)
}
return 1;
+
+#else /* !defined __i386__ && !defined __x86_64__ */
+
+ return 0;
+
+#endif /* !defined __i386__ && !defined __x86_64__ */
}
-/* See linux-btrace.h. */
+/* Check whether the cpu supports branch tracing. */
-int
-linux_supports_btrace (void)
+static int
+cpu_supports_btrace (void)
{
#if defined __i386__ || defined __x86_64__
char vendor[13];
@@ -324,6 +418,26 @@ linux_supports_btrace (void)
/* See linux-btrace.h. */
int
+linux_supports_btrace (void)
+{
+ static int cached;
+
+ if (cached == 0)
+ {
+ if (!kernel_supports_btrace ())
+ cached = -1;
+ else if (!cpu_supports_btrace ())
+ cached = -1;
+ else
+ cached = 1;
+ }
+
+ return cached > 0;
+}
+
+/* See linux-btrace.h. */
+
+int
linux_btrace_has_changed (struct btrace_target_info *tinfo)
{
volatile struct perf_event_mmap_page *header = perf_event_header (tinfo);
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 7a87c42..61ccc3e 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -5152,8 +5152,8 @@ Do you want to stop the program?"),
case 0xb6:
case 0xb7:
I386_RECORD_FULL_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM])
- ? ((opcode & 0x7) | ir.rex_b)
- : ((opcode & 0x7) & 0x3));
+ ? ((opcode & 0x7) | ir.rex_b)
+ : ((opcode & 0x7) & 0x3));
break;
case 0xb8: /* mov R, Iv */
@@ -5726,7 +5726,8 @@ Do you want to stop the program?"),
case 0xdf:
if (0xe0 == ir.modrm)
{
- if (record_full_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM))
+ if (record_full_arch_list_add_reg (ir.regcache,
+ I386_EAX_REGNUM))
return -1;
}
else if ((0x0f == ir.modrm >> 4) || (0x0e == ir.modrm >> 4))
@@ -5939,7 +5940,7 @@ Do you want to stop the program?"),
return -1;
if (ir.mod == 3)
I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b)
- : (ir.rm & 0x3));
+ : (ir.rm & 0x3));
else
{
if (i386_record_lea_modrm (&ir))
@@ -6490,7 +6491,7 @@ Do you want to stop the program?"),
if (ir.mod == 3 || ir.regmap[X86_RECORD_R8_REGNUM])
{
I386_RECORD_FULL_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM]
- ? (ir.reg | rex_r) : ir.rm);
+ ? (ir.reg | rex_r) : ir.rm);
}
else
{
@@ -6683,7 +6684,8 @@ no_support_3dnow_data:
record_full_arch_list_add_reg (ir.regcache, i);
if (i386_mxcsr_regnum_p (gdbarch, I387_MXCSR_REGNUM(tdep)))
- record_full_arch_list_add_reg (ir.regcache, I387_MXCSR_REGNUM(tdep));
+ record_full_arch_list_add_reg (ir.regcache,
+ I387_MXCSR_REGNUM(tdep));
for (i = I387_ST0_REGNUM (tdep);
i386_fp_regnum_p (gdbarch, i); i++)
@@ -7077,7 +7079,7 @@ reswitch_prefix_add:
if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.reg))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_XMM0_REGNUM (tdep) + ir.reg);
+ I387_XMM0_REGNUM (tdep) + ir.reg);
if ((opcode & 0xfffffffc) == 0x660f3a60)
I386_RECORD_FULL_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM);
break;
@@ -7110,7 +7112,7 @@ reswitch_prefix_add:
I387_XMM0_REGNUM (tdep) + ir.rm))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_XMM0_REGNUM (tdep) + ir.rm);
+ I387_XMM0_REGNUM (tdep) + ir.rm);
}
else
{
@@ -7265,7 +7267,7 @@ reswitch_prefix_add:
if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.reg))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_MM0_REGNUM (tdep) + ir.reg);
+ I387_MM0_REGNUM (tdep) + ir.reg);
break;
case 0x0f71: /* psllw */
@@ -7276,7 +7278,7 @@ reswitch_prefix_add:
if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_MM0_REGNUM (tdep) + ir.rm);
+ I387_MM0_REGNUM (tdep) + ir.rm);
break;
case 0x660f71: /* psllw */
@@ -7288,7 +7290,7 @@ reswitch_prefix_add:
if (!i386_xmm_regnum_p (gdbarch, I387_XMM0_REGNUM (tdep) + ir.rm))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_XMM0_REGNUM (tdep) + ir.rm);
+ I387_XMM0_REGNUM (tdep) + ir.rm);
break;
case 0x0f7e: /* movd */
@@ -7316,7 +7318,7 @@ reswitch_prefix_add:
if (!i386_mmx_regnum_p (gdbarch, I387_MM0_REGNUM (tdep) + ir.rm))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_MM0_REGNUM (tdep) + ir.rm);
+ I387_MM0_REGNUM (tdep) + ir.rm);
}
else
{
@@ -7343,7 +7345,7 @@ reswitch_prefix_add:
I387_XMM0_REGNUM (tdep) + ir.rm))
goto no_support;
record_full_arch_list_add_reg (ir.regcache,
- I387_XMM0_REGNUM (tdep) + ir.rm);
+ I387_XMM0_REGNUM (tdep) + ir.rm);
}
else
{
diff --git a/gdb/linux-record.c b/gdb/linux-record.c
index ef32229..e4c1f96 100644
--- a/gdb/linux-record.c
+++ b/gdb/linux-record.c
@@ -1963,8 +1963,8 @@ Do you want to stop the program?"),
regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents);
if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
- maxevents *
- tdep->size_epoll_event))
+ (maxevents
+ * tdep->size_epoll_event)))
return -1;
}
break;
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 6725f16..68ccf19 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -39,18 +39,17 @@ static struct target_ops record_btrace_ops;
/* A new thread observer enabling branch tracing for the new thread. */
static struct observer *record_btrace_thread_observer;
-/* The record backtrace state. */
-
-struct rec_bt_state
+/* A recorded function segment. */
+struct btrace_function
{
- /* The last function symbol. */
+ /* The function symbol. */
struct minimal_symbol *mfun;
struct symbol *fun;
- /* The name of the last function. */
+ /* The name of the function. */
const char *function;
- /* The last file name. */
+ /* The name of the file in which the function is defined. */
const char *filename;
/* The min and max line in the above file. */
@@ -58,19 +57,18 @@ struct rec_bt_state
int end;
};
-/* A vector of record backtrace states. */
-typedef struct rec_bt_state rec_bt_s;
-DEF_VEC_O (rec_bt_s);
-
-/* Define debug output flags. */
+/* A vector of recorded function segments. */
+typedef struct btrace_function btr_fun_s;
+DEF_VEC_O (btr_fun_s);
+/* Debug output flags. */
enum record_btrace_debug_flag
{
/* Print an overview of record-btrace functions. */
debug_functions = 1 << 0,
- /* Print details on "record backtrace". */
- debug_backtrace = 1 << 1
+ /* Print details on "record function-call-history". */
+ debug_call_history = 1 << 1
};
/* Print a record-btrace debug message. Use do ... while (0) to avoid
@@ -86,29 +84,30 @@ enum record_btrace_debug_flag
while (0)
#define DEBUG_FUN(msg, args...) DEBUG (debug_functions, msg, ##args)
-#define DEBUG_BT(msg, args...) DEBUG (debug_backtrace, "[bt] " msg, ##args)
+#define DEBUG_CALL(msg, args...) \
+ DEBUG (debug_call_history, "[hist: call] " msg, ##args)
-/* Initialize the "record disassemble" iteration state. */
+/* Initialize the instruction iterator. */
static void
-btrace_init_disas_state (struct btrace_thread_info *btinfo)
+btrace_init_insn_iterator (struct btrace_thread_info *btinfo)
{
- DEBUG_FUN ("init disas iterator");
+ DEBUG_FUN ("init insn iterator");
- btinfo->disas.begin = 1;
- btinfo->disas.end = 0;
+ btinfo->insn_iterator.begin = 1;
+ btinfo->insn_iterator.end = 0;
}
-/* Initialize the "record backtrace" iteration state. */
+/* Initialize the function call iterator. */
static void
-btrace_init_bt_state (struct btrace_thread_info *btinfo)
+btrace_init_call_iterator (struct btrace_thread_info *btinfo)
{
- DEBUG_FUN ("init bt iterator");
+ DEBUG_FUN ("init call iterator");
- btinfo->bt.begin = 1;
- btinfo->bt.end = 0;
+ btinfo->call_iterator.begin = 1;
+ btinfo->call_iterator.end = 0;
}
/* Compute the instruction trace from the block trace. */
@@ -143,7 +142,7 @@ compute_itrace (VEC (btrace_block_s) *btrace)
/* We should hit the end of the block. Warn if we went too far. */
if (block->end < ip)
{
- warning (_("Trace disassembly may be corrupted."));
+ warning (_("Recorded trace may be corrupted."));
break;
}
@@ -159,7 +158,7 @@ compute_itrace (VEC (btrace_block_s) *btrace)
/* Make sure we terminate if we fail to compute the size. */
if (size <= 0)
{
- warning (_("Trace disassembly may be incomplete."));
+ warning (_("Recorded trace may be incomplete."));
break;
}
@@ -205,12 +204,12 @@ fetch_btrace (struct thread_info *tp)
btinfo->itrace = compute_itrace (btinfo->btrace);
- /* Re-initialize branch trace iterators. */
- btrace_init_disas_state (btinfo);
- btrace_init_bt_state (btinfo);
+ /* Initialize branch trace iterators. */
+ btrace_init_insn_iterator (btinfo);
+ btrace_init_call_iterator (btinfo);
}
-/* Update the branch trace for the current thread and return a pointer to it's
+/* Update the branch trace for the current thread and return a pointer to its
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2013-02-22 12:15 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-22 12:15 [SCM] archer-mmetzger-btrace: archer: update mmetzger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).