aboutsummaryrefslogtreecommitdiff
path: root/src/google_breakpad/processor/stack_frame_cpu.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/google_breakpad/processor/stack_frame_cpu.h')
-rw-r--r--src/google_breakpad/processor/stack_frame_cpu.h44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/google_breakpad/processor/stack_frame_cpu.h b/src/google_breakpad/processor/stack_frame_cpu.h
index c5bddffb..0996886f 100644
--- a/src/google_breakpad/processor/stack_frame_cpu.h
+++ b/src/google_breakpad/processor/stack_frame_cpu.h
@@ -139,28 +139,44 @@ struct StackFramePPC : public StackFrame {
};
struct StackFrameAMD64 : public StackFrame {
- // ContextValidity has one entry for each relevant hardware pointer register
- // (%rip and %rsp) and one entry for each nonvolatile (callee-save) register.
- //FIXME: validate this list
+ // ContextValidity has one entry for each register that we might be able
+ // to recover.
enum ContextValidity {
- CONTEXT_VALID_NONE = 0,
- CONTEXT_VALID_RIP = 1 << 0,
- CONTEXT_VALID_RSP = 1 << 1,
- CONTEXT_VALID_RBP = 1 << 2,
+ CONTEXT_VALID_NONE = 0,
+ CONTEXT_VALID_RAX = 1 << 0,
+ CONTEXT_VALID_RDX = 1 << 1,
+ CONTEXT_VALID_RCX = 1 << 2,
+ CONTEXT_VALID_RBX = 1 << 3,
+ CONTEXT_VALID_RSI = 1 << 4,
+ CONTEXT_VALID_RDI = 1 << 5,
+ CONTEXT_VALID_RBP = 1 << 6,
+ CONTEXT_VALID_RSP = 1 << 7,
+ CONTEXT_VALID_R8 = 1 << 8,
+ CONTEXT_VALID_R9 = 1 << 9,
+ CONTEXT_VALID_R10 = 1 << 10,
+ CONTEXT_VALID_R11 = 1 << 11,
+ CONTEXT_VALID_R12 = 1 << 12,
+ CONTEXT_VALID_R13 = 1 << 13,
+ CONTEXT_VALID_R14 = 1 << 14,
+ CONTEXT_VALID_R15 = 1 << 15,
+ CONTEXT_VALID_RIP = 1 << 16,
CONTEXT_VALID_ALL = -1
};
StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {}
- // Register state. This is only fully valid for the topmost frame in a
- // stack. In other frames, the values of nonvolatile registers may be
- // present, given sufficient debugging information. Refer to
- // context_validity.
+ // Register state. This is only fully valid for the topmost frame in a
+ // stack. In other frames, which registers are present depends on what
+ // debugging information we had available. Refer to context_validity.
MDRawContextAMD64 context;
- // context_validity is actually ContextValidity, but int is used because
- // the OR operator doesn't work well with enumerated types. This indicates
- // which fields in context are valid.
+ // For each register in context whose value has been recovered, we set
+ // the corresponding CONTEXT_VALID_ bit in context_validity.
+ //
+ // context_validity's type should actually be ContextValidity, but
+ // we use int instead because the bitwise inclusive or operator
+ // yields an int when applied to enum values, and C++ doesn't
+ // silently convert from ints to enums.
int context_validity;
};