| 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 {
 | 
| 
 |