aboutsummaryrefslogtreecommitdiff
path: root/src/processor/stackwalker_arm.cc
diff options
context:
space:
mode:
authorSiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-10-10 21:41:52 +0000
committerSiyangXie@gmail.com <SiyangXie@gmail.com@4c0a9323-5329-0410-9bdc-e9ce6186880e>2012-10-10 21:41:52 +0000
commitbab770045bb2cdedce4046400544904fc40c6703 (patch)
tree48e0bf03581bbe0d393746a9051d564ae9e29c53 /src/processor/stackwalker_arm.cc
parentMake Linux signal handler more robust. (diff)
downloadbreakpad-bab770045bb2cdedce4046400544904fc40c6703.tar.xz
Refactor the logic of resolving source line info into helper class.
http://breakpad.appspot.com/459002/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1068 4c0a9323-5329-0410-9bdc-e9ce6186880e
Diffstat (limited to 'src/processor/stackwalker_arm.cc')
-rw-r--r--src/processor/stackwalker_arm.cc55
1 files changed, 28 insertions, 27 deletions
diff --git a/src/processor/stackwalker_arm.cc b/src/processor/stackwalker_arm.cc
index 0a3c522d..3beaa449 100644
--- a/src/processor/stackwalker_arm.cc
+++ b/src/processor/stackwalker_arm.cc
@@ -33,6 +33,8 @@
//
// Author: Mark Mentovai, Ted Mielczarek, Jim Blandy
+#include <vector>
+
#include "google_breakpad/processor/call_stack.h"
#include "google_breakpad/processor/memory_region.h"
#include "google_breakpad/processor/source_line_resolver_interface.h"
@@ -45,14 +47,13 @@
namespace google_breakpad {
-StackwalkerARM::StackwalkerARM(const SystemInfo *system_info,
- const MDRawContextARM *context,
+StackwalkerARM::StackwalkerARM(const SystemInfo* system_info,
+ const MDRawContextARM* context,
int fp_register,
- MemoryRegion *memory,
- const CodeModules *modules,
- SymbolSupplier *supplier,
- SourceLineResolverInterface *resolver)
- : Stackwalker(system_info, memory, modules, supplier, resolver),
+ MemoryRegion* memory,
+ const CodeModules* modules,
+ StackFrameSymbolizer* resolver_helper)
+ : Stackwalker(system_info, memory, modules, resolver_helper),
context_(context), fp_register_(fp_register),
context_frame_validity_(StackFrameARM::CONTEXT_VALID_ALL) { }
@@ -63,7 +64,7 @@ StackFrame* StackwalkerARM::GetContextFrame() {
return NULL;
}
- StackFrameARM *frame = new StackFrameARM();
+ StackFrameARM* frame = new StackFrameARM();
// The instruction pointer is stored directly in a register (r15), so pull it
// straight out of the CPU context structure.
@@ -75,12 +76,12 @@ StackFrame* StackwalkerARM::GetContextFrame() {
return frame;
}
-StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
- const vector<StackFrame *> &frames,
- CFIFrameInfo *cfi_frame_info) {
- StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());
+StackFrameARM* StackwalkerARM::GetCallerByCFIFrameInfo(
+ const vector<StackFrame*> &frames,
+ CFIFrameInfo* cfi_frame_info) {
+ StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
- static const char *register_names[] = {
+ static const char* register_names[] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
@@ -121,7 +122,7 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
}
}
// If the CFI doesn't recover the PC explicitly, then use .ra.
- if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) {
+ if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) {
CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =
caller_registers.find(".ra");
if (entry != caller_registers.end()) {
@@ -140,7 +141,7 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
}
}
// If the CFI doesn't recover the SP explicitly, then use .cfa.
- if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) {
+ if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) {
CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =
caller_registers.find(".cfa");
if (entry != caller_registers.end()) {
@@ -159,9 +160,9 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
return frame.release();
}
-StackFrameARM *StackwalkerARM::GetCallerByStackScan(
- const vector<StackFrame *> &frames) {
- StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());
+StackFrameARM* StackwalkerARM::GetCallerByStackScan(
+ const vector<StackFrame*> &frames) {
+ StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
u_int32_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP];
u_int32_t caller_sp, caller_pc;
@@ -177,7 +178,7 @@ StackFrameARM *StackwalkerARM::GetCallerByStackScan(
// Create a new stack frame (ownership will be transferred to the caller)
// and fill it in.
- StackFrameARM *frame = new StackFrameARM();
+ StackFrameARM* frame = new StackFrameARM();
frame->trust = StackFrame::FRAME_TRUST_SCAN;
frame->context = last_frame->context;
@@ -189,9 +190,9 @@ StackFrameARM *StackwalkerARM::GetCallerByStackScan(
return frame;
}
-StackFrameARM *StackwalkerARM::GetCallerByFramePointer(
- const vector<StackFrame *> &frames) {
- StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());
+StackFrameARM* StackwalkerARM::GetCallerByFramePointer(
+ const vector<StackFrame*> &frames) {
+ StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
if (!(last_frame->context_validity &
StackFrameARM::RegisterValidFlag(fp_register_))) {
@@ -219,7 +220,7 @@ StackFrameARM *StackwalkerARM::GetCallerByFramePointer(
// Create a new stack frame (ownership will be transferred to the caller)
// and fill it in.
- StackFrameARM *frame = new StackFrameARM();
+ StackFrameARM* frame = new StackFrameARM();
frame->trust = StackFrame::FRAME_TRUST_FP;
frame->context = last_frame->context;
@@ -235,19 +236,19 @@ StackFrameARM *StackwalkerARM::GetCallerByFramePointer(
return frame;
}
-StackFrame* StackwalkerARM::GetCallerFrame(const CallStack *stack) {
+StackFrame* StackwalkerARM::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL;
}
- const vector<StackFrame *> &frames = *stack->frames();
- StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());
+ const vector<StackFrame*> &frames = *stack->frames();
+ StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
scoped_ptr<StackFrameARM> frame;
// See if there is DWARF call frame information covering this address.
scoped_ptr<CFIFrameInfo> cfi_frame_info(
- resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL);
+ frame_symbolizer_->FindCFIFrameInfo(last_frame));
if (cfi_frame_info.get())
frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));