Index: base/debug/stack_trace_android.cc |
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc |
index 4c11a244d6ee2f5513c560f67702de21ab924c5c..487cbc495c6b07bcea869bb88e94b280ff5a57ef 100644 |
--- a/base/debug/stack_trace_android.cc |
+++ b/base/debug/stack_trace_android.cc |
@@ -5,49 +5,40 @@ |
#include "base/debug/stack_trace.h" |
#include <android/log.h> |
-#include <unwind.h> // TODO(dmikurube): Remove. See http://crbug.com/236855. |
+#include <unwind.h> |
#include "base/debug/proc_maps_linux.h" |
#include "base/strings/stringprintf.h" |
-// TODO(dmikurube): Remove when Bionic's get_backtrace() gets popular. |
-// See http://crbug.com/236855. |
namespace { |
-/* depends how the system includes define this */ |
-#ifdef HAVE_UNWIND_CONTEXT_STRUCT |
-typedef struct _Unwind_Context __unwind_context; |
-#else |
-typedef _Unwind_Context __unwind_context; |
-#endif |
+struct StackCrawlState { |
+ StackCrawlState(uintptr_t* frames, size_t max_depth) |
+ : frames(frames), |
+ frame_count(0), |
+ max_depth(max_depth), |
+ have_skipped_self(false) {} |
-struct stack_crawl_state_t { |
uintptr_t* frames; |
size_t frame_count; |
size_t max_depth; |
bool have_skipped_self; |
- |
- stack_crawl_state_t(uintptr_t* frames, size_t max_depth) |
- : frames(frames), |
- frame_count(0), |
- max_depth(max_depth), |
- have_skipped_self(false) { |
- } |
}; |
-static _Unwind_Reason_Code tracer(__unwind_context* context, void* arg) { |
- stack_crawl_state_t* state = static_cast<stack_crawl_state_t*>(arg); |
- |
+// Clang's unwind.h doesn't provide _Unwind_GetIP on ARM, refer to |
+// http://llvm.org/bugs/show_bug.cgi?id=16564 for details. |
#if defined(__clang__) |
- // Vanilla Clang's unwind.h doesn't have _Unwind_GetIP for ARM. |
- // See http://crbug.com/236855, too. |
+uintptr_t _Unwind_GetIP(_Unwind_Context* context) { |
uintptr_t ip = 0; |
_Unwind_VRS_Get(context, _UVRSC_CORE, 15, _UVRSD_UINT32, &ip); |
- ip &= ~(uintptr_t)0x1; // remove thumb mode bit |
-#else |
- uintptr_t ip = _Unwind_GetIP(context); |
+ return ip & ~static_cast<uintptr_t>(0x1); // Remove thumb mode bit. |
+} |
#endif |
+_Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context, void* arg) { |
+ StackCrawlState* state = static_cast<StackCrawlState*>(arg); |
+ uintptr_t ip = _Unwind_GetIP(context); |
+ |
// The first stack frame is this function itself. Skip it. |
if (ip != 0 && !state->have_skipped_self) { |
state->have_skipped_self = true; |
@@ -57,8 +48,7 @@ static _Unwind_Reason_Code tracer(__unwind_context* context, void* arg) { |
state->frames[state->frame_count++] = ip; |
if (state->frame_count >= state->max_depth) |
return _URC_END_OF_STACK; |
- else |
- return _URC_NO_REASON; |
+ return _URC_NO_REASON; |
} |
} // namespace |
@@ -79,12 +69,9 @@ bool EnableInProcessStackDumping() { |
} |
StackTrace::StackTrace() { |
- // TODO(dmikurube): Replace it with Bionic's get_backtrace(). |
- // See http://crbug.com/236855. |
- stack_crawl_state_t state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces); |
- _Unwind_Backtrace(tracer, &state); |
+ StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), kMaxTraces); |
+ _Unwind_Backtrace(&TraceStackFrame, &state); |
count_ = state.frame_count; |
- // TODO(dmikurube): Symbolize in Chrome. |
} |
void StackTrace::PrintBacktrace() const { |