[Sanitizer] Expose StackTrace::GetPreviousInstructionPc() to get PC of call instructi...
authorAlexey Samsonov <samsonov@google.com>
Tue, 18 Dec 2012 09:57:34 +0000 (09:57 +0000)
committerAlexey Samsonov <samsonov@google.com>
Tue, 18 Dec 2012 09:57:34 +0000 (09:57 +0000)
llvm-svn: 170424

compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.cc
compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.h
compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
compiler-rt/lib/ubsan/ubsan_diag.cc

index 7525895..109a674 100644 (file)
@@ -25,10 +25,7 @@ static const char *StripPathPrefix(const char *filepath,
 }
 
 // ----------------------- StackTrace ----------------------------- {{{1
-// PCs in stack traces are actually the return addresses, that is,
-// addresses of the next instructions after the call. That's why we
-// decrement them.
-static uptr patch_pc(uptr pc) {
+uptr StackTrace::GetPreviousInstructionPc(uptr pc) {
 #ifdef __arm__
   // Cancel Thumb bit.
   pc = pc & (~1);
@@ -71,7 +68,9 @@ void StackTrace::PrintStack(const uptr *addr, uptr size,
   InternalScopedBuffer<AddressInfo> addr_frames(64);
   uptr frame_num = 0;
   for (uptr i = 0; i < size && addr[i]; i++) {
-    uptr pc = patch_pc(addr[i]);
+    // PCs in stack traces are actually the return addresses, that is,
+    // addresses of the next instructions after the call.
+    uptr pc = GetPreviousInstructionPc(addr[i]);
     uptr addr_frames_num = 0;  // The number of stack frames for current
                                // instruction address.
     if (symbolize_callback) {
index 90ad31f..597d24f 100644 (file)
@@ -49,6 +49,7 @@ struct StackTrace {
   void PopStackFrames(uptr count);
 
   static uptr GetCurrentPc();
+  static uptr GetPreviousInstructionPc(uptr pc);
 
   static uptr CompressStack(StackTrace *stack,
                             u32 *compressed, uptr size);
index 239aa27..b0dedda 100644 (file)
@@ -177,8 +177,8 @@ ScopedInterceptor::~ScopedInterceptor() {
     StatInc(thr, StatInt_##func); \
     const uptr caller_pc = GET_CALLER_PC(); \
     ScopedInterceptor si(thr, #func, caller_pc); \
-    /* Subtract one from pc as we need current instruction address */ \
-    const uptr pc = __sanitizer::StackTrace::GetCurrentPc() - 1; \
+    const uptr pc = __sanitizer::StackTrace::GetPreviousInstructionPc( \
+        __sanitizer::StackTrace::GetCurrentPc()); \
     (void)pc; \
 /**/
 
index 517ce6b..a726f4b 100644 (file)
@@ -24,13 +24,11 @@ Location __ubsan::getCallerLocation(uptr CallerLoc) {
   if (!CallerLoc)
     return Location();
 
-  // Adjust to find the call instruction.
-  // FIXME: This is not portable.
-  --CallerLoc;
+  uptr Loc = StackTrace::GetPreviousInstructionPc(CallerLoc);
 
   AddressInfo Info;
-  if (!SymbolizeCode(CallerLoc, &Info, 1) || !Info.module || !*Info.module)
-    return Location(CallerLoc);
+  if (!SymbolizeCode(Loc, &Info, 1) || !Info.module || !*Info.module)
+    return Location(Loc);
 
   if (!Info.function)
     return ModuleLocation(Info.module, Info.module_offset);