aboutsummaryrefslogtreecommitdiff
path: root/src/google_breakpad/processor/stack_frame.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/google_breakpad/processor/stack_frame.h')
-rw-r--r--src/google_breakpad/processor/stack_frame.h30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/google_breakpad/processor/stack_frame.h b/src/google_breakpad/processor/stack_frame.h
index 2f31e5c1..e8803804 100644
--- a/src/google_breakpad/processor/stack_frame.h
+++ b/src/google_breakpad/processor/stack_frame.h
@@ -83,11 +83,31 @@ struct StackFrame {
}
};
- // The program counter location as an absolute virtual address. For the
- // innermost called frame in a stack, this will be an exact program counter
- // or instruction pointer value. For all other frames, this will be within
- // the instruction that caused execution to branch to a called function,
- // but may not necessarily point to the exact beginning of that instruction.
+ // Return the actual return address, as saved on the stack or in a
+ // register. See the comments for 'instruction', below, for details.
+ virtual u_int64_t ReturnAddress() const { return instruction; }
+
+ // The program counter location as an absolute virtual address.
+ //
+ // - For the innermost called frame in a stack, this will be an exact
+ // program counter or instruction pointer value.
+ //
+ // - For all other frames, this address is within the instruction that
+ // caused execution to branch to this frame's callee (although it may
+ // not point to the exact beginning of that instruction). This ensures
+ // that, when we look up the source code location for this frame, we
+ // get the source location of the call, not of the point at which
+ // control will resume when the call returns, which may be on the next
+ // line. (If the compiler knows the callee never returns, it may even
+ // place the call instruction at the very end of the caller's machine
+ // code, such that the "return address" (which will never be used)
+ // immediately after the call instruction is in an entirely different
+ // function, perhaps even from a different source file.)
+ //
+ // On some architectures, the return address as saved on the stack or in
+ // a register is fine for looking up the point of the call. On others, it
+ // requires adjustment. ReturnAddress returns the address as saved by the
+ // machine.
u_int64_t instruction;
// The module in which the instruction resides.