diff options
author | eutarass | 2011-08-29 17:25:01 +0000 |
---|---|---|
committer | eutarass | 2011-08-29 17:25:01 +0000 |
commit | 73b987ff123090d182d7cbf43438fccfca731050 (patch) | |
tree | 8164f79f9204acf953ae9548bcc7d86b393dad5b | |
parent | 412252cefce30a26901c58b3151fb52e848cadfd (diff) | |
download | org.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.tar.gz org.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.tar.xz org.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.zip |
TCF Agent: improved stack tracing speed.
-rw-r--r-- | framework/cpudefs.c | 4 | ||||
-rw-r--r-- | framework/cpudefs.h | 1 | ||||
-rw-r--r-- | services/stacktrace.c | 11 |
3 files changed, 5 insertions, 11 deletions
diff --git a/framework/cpudefs.c b/framework/cpudefs.c index 97231826..fbdfa28a 100644 --- a/framework/cpudefs.c +++ b/framework/cpudefs.c @@ -78,7 +78,9 @@ int write_reg_value(StackFrame * frame, RegisterDefinition * reg_def, uint64_t v buf[reg_def->big_endian ? reg_def->size - i - 1 : i] = (uint8_t)value; value = value >> 8; } - return write_reg_bytes(frame, reg_def, 0, reg_def->size, buf); + if (write_reg_bytes(frame, reg_def, 0, reg_def->size, buf) < 0) return -1; + if (!frame->is_top_frame) frame->has_reg_data = 1; + return 0; } ContextAddress get_regs_PC(Context * ctx) { diff --git a/framework/cpudefs.h b/framework/cpudefs.h index 6c73f08b..17a9a89f 100644 --- a/framework/cpudefs.h +++ b/framework/cpudefs.h @@ -113,6 +113,7 @@ typedef struct StackTracingInfo { typedef struct StackFrame { int is_top_frame; + int has_reg_data; Context * ctx; ContextAddress fp; /* frame address */ RegisterData * regs; /* register values */ diff --git a/services/stacktrace.c b/services/stacktrace.c index 2b78b9ad..927621fa 100644 --- a/services/stacktrace.c +++ b/services/stacktrace.c @@ -74,15 +74,6 @@ static void invalidate_stack_trace(StackTrace * stack) { stack->valid = 0; } -static int has_registers(StackFrame * frame) { - uint64_t v; - RegisterDefinition * r; - for (r = get_reg_definitions(frame->ctx); r->name != NULL; r++) { - if (read_reg_value(frame, r, &v) == 0) return 1; - } - return 0; -} - static void trace_stack(Context * ctx, StackTrace * stack) { int i; int error = 0; @@ -140,7 +131,7 @@ static void trace_stack(Context * ctx, StackTrace * stack) { frame = down; } - if (!frame.is_top_frame && has_registers(&frame)) add_frame(stack, &frame); + if (frame.has_reg_data) add_frame(stack, &frame); else loc_free(frame.regs); if (get_error_code(error) == ERR_CACHE_MISS) { |