diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-01-19 11:34:18 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2012-01-19 11:34:18 +0000 |
commit | 9cfa194cc62026fc7c6e82f7303eee8ad4d10cf4 (patch) | |
tree | c0062d9ad2b6b0a459373809f24ba0466b16abff /lib/asan/asan_stack.h | |
parent | ca2278dacaf75a6c45473d962a331181883df02c (diff) |
EHABI-based stack trace on ARM.
The change removes the unused FLAG_fast_unwind, and forces EHABI-based unwind
on ARM, and fast (FP-based) unwind everywhere else.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@148468 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/asan/asan_stack.h')
-rw-r--r-- | lib/asan/asan_stack.h | 38 |
1 files changed, 14 insertions, 24 deletions
diff --git a/lib/asan/asan_stack.h b/lib/asan/asan_stack.h index 4b54e084f..1327d2c78 100644 --- a/lib/asan/asan_stack.h +++ b/lib/asan/asan_stack.h @@ -43,16 +43,16 @@ struct AsanStackTrace { } } + void GetStackTrace(size_t max_s, uintptr_t pc, uintptr_t bp); + void FastUnwindStack(uintptr_t pc, uintptr_t bp); -// static _Unwind_Reason_Code Unwind_Trace( -// struct _Unwind_Context *ctx, void *param); + static uintptr_t GetCurrentPc(); static size_t CompressStack(AsanStackTrace *stack, uint32_t *compressed, size_t size); static void UncompressStack(AsanStackTrace *stack, uint32_t *compressed, size_t size); - size_t full_frame_count; }; } // namespace __asan @@ -61,37 +61,27 @@ struct AsanStackTrace { // The pc will be in the position 0 of the resulting stack trace. // The bp may refer to the current frame or to the caller's frame. // fast_unwind is currently unused. -#define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, fast_unwind, pc, bp) \ - AsanStackTrace stack; \ - { \ - uintptr_t saved_pc = pc; \ - uintptr_t saved_bp = bp; \ - stack.size = 0; \ - stack.full_frame_count = 0; \ - stack.trace[0] = saved_pc; \ - if ((max_s) > 1) { \ - stack.max_size = max_s; \ - stack.FastUnwindStack(saved_pc, saved_bp); \ - } \ - } \ +#define GET_STACK_TRACE_WITH_PC_AND_BP(max_s, pc, bp) \ + AsanStackTrace stack; \ + stack.GetStackTrace(max_s, pc, bp); \ // NOTE: A Rule of thumb is to retrieve stack trace in the interceptors // as early as possible (in functions exposed to the user), as we generally // don't want stack trace to contain functions from ASan internals. -#define GET_STACK_TRACE_HERE(max_size, fast_unwind) \ - GET_STACK_TRACE_WITH_PC_AND_BP(max_size, fast_unwind, \ - AsanStackTrace::GetCurrentPc(), GET_CURRENT_FRAME()) \ +#define GET_STACK_TRACE_HERE(max_size) \ + GET_STACK_TRACE_WITH_PC_AND_BP(max_size, \ + AsanStackTrace::GetCurrentPc(), GET_CURRENT_FRAME()) \ -#define GET_STACK_TRACE_HERE_FOR_MALLOC \ - GET_STACK_TRACE_HERE(FLAG_malloc_context_size, FLAG_fast_unwind) +#define GET_STACK_TRACE_HERE_FOR_MALLOC \ + GET_STACK_TRACE_HERE(FLAG_malloc_context_size) -#define GET_STACK_TRACE_HERE_FOR_FREE(ptr) \ - GET_STACK_TRACE_HERE(FLAG_malloc_context_size, FLAG_fast_unwind) +#define GET_STACK_TRACE_HERE_FOR_FREE(ptr) \ + GET_STACK_TRACE_HERE(FLAG_malloc_context_size) #define PRINT_CURRENT_STACK() \ { \ - GET_STACK_TRACE_HERE(kStackTraceMax, false); \ + GET_STACK_TRACE_HERE(kStackTraceMax); \ stack.PrintStack(); \ } \ |