diff options
Diffstat (limited to 'libsanitizer/sanitizer_common/sanitizer_stacktrace.cc')
-rw-r--r-- | libsanitizer/sanitizer_common/sanitizer_stacktrace.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc index 915c4b8050a..037a7c3f9c0 100644 --- a/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc +++ b/libsanitizer/sanitizer_common/sanitizer_stacktrace.cc @@ -31,7 +31,12 @@ static uptr patch_pc(uptr pc) { // Cancel Thumb bit. pc = pc & (~1); #endif +#if defined(__powerpc__) || defined(__powerpc64__) + // PCs are always 4 byte aligned. + return pc - 4; +#else return pc - 1; +#endif } static void PrintStackFramePrefix(uptr frame_num, uptr pc) { @@ -75,7 +80,8 @@ void StackTrace::PrintStack(const uptr *addr, uptr size, Printf(" %s\n", StripPathPrefix(buff.data(), strip_file_prefix)); frame_num++; } - } else if (symbolize) { + } + if (symbolize && addr_frames_num == 0) { // Use our own (online) symbolizer, if necessary. addr_frames_num = SymbolizeCode(pc, addr_frames.data(), addr_frames.size()); @@ -135,12 +141,20 @@ void StackTrace::FastUnwindStack(uptr pc, uptr bp, } } +void StackTrace::PopStackFrames(uptr count) { + CHECK(size >= count); + size -= count; + for (uptr i = 0; i < size; i++) { + trace[i] = trace[i + count]; + } +} + // On 32-bits we don't compress stack traces. // On 64-bits we compress stack traces: if a given pc differes slightly from // the previous one, we record a 31-bit offset instead of the full pc. SANITIZER_INTERFACE_ATTRIBUTE uptr StackTrace::CompressStack(StackTrace *stack, u32 *compressed, uptr size) { -#if __WORDSIZE == 32 +#if SANITIZER_WORDSIZE == 32 // Don't compress, just copy. uptr res = 0; for (uptr i = 0; i < stack->size && i < size; i++) { @@ -181,7 +195,7 @@ uptr StackTrace::CompressStack(StackTrace *stack, u32 *compressed, uptr size) { compressed[c_index] = 0; if (c_index + 1 < size) compressed[c_index + 1] = 0; -#endif // __WORDSIZE +#endif // SANITIZER_WORDSIZE // debug-only code #if 0 @@ -204,7 +218,7 @@ uptr StackTrace::CompressStack(StackTrace *stack, u32 *compressed, uptr size) { SANITIZER_INTERFACE_ATTRIBUTE void StackTrace::UncompressStack(StackTrace *stack, u32 *compressed, uptr size) { -#if __WORDSIZE == 32 +#if SANITIZER_WORDSIZE == 32 // Don't uncompress, just copy. stack->size = 0; for (uptr i = 0; i < size && i < kStackTraceMax; i++) { @@ -239,7 +253,7 @@ void StackTrace::UncompressStack(StackTrace *stack, stack->trace[stack->size++] = pc; prev_pc = pc; } -#endif // __WORDSIZE +#endif // SANITIZER_WORDSIZE } } // namespace __sanitizer |