[UBSan] Get pc/bp for stack unwinding as early as possible.
authorAlexey Samsonov <vonosmas@gmail.com>
Tue, 29 Jul 2014 23:22:41 +0000 (23:22 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Tue, 29 Jul 2014 23:22:41 +0000 (23:22 +0000)
This will ensure that stack frames in error reports will not
contain internal UBSan failures, and frame #0 will be the
actual place in the program where the error happens.

llvm-svn: 214245

compiler-rt/lib/sanitizer_common/sanitizer_stacktrace.h
compiler-rt/lib/ubsan/ubsan_diag.h
compiler-rt/lib/ubsan/ubsan_handlers_cxx.cc

index fcaa777..75ab3a0 100644 (file)
@@ -88,6 +88,10 @@ struct StackTrace {
   uptr local_stack;                           \
   uptr sp = (uptr)&local_stack
 
+#define GET_CALLER_PC_BP \
+  uptr bp = GET_CURRENT_FRAME();              \
+  uptr pc = GET_CALLER_PC();
+
 // Use this macro if you want to print stack trace with the current
 // function in the top frame.
 #define GET_CURRENT_PC_BP_SP \
index 247ecdd..71c1344 100644 (file)
@@ -206,12 +206,6 @@ public:
 
 void MaybePrintStackTrace(uptr pc, uptr bp);
 
-#define MAYBE_PRINT_STACK_TRACE() do { \
-  GET_CALLER_PC_BP_SP; \
-  (void)sp; \
-  MaybePrintStackTrace(pc, bp); \
-} while (0)
-
 } // namespace __ubsan
 
 #endif // UBSAN_DIAG_H
index 0abeaa6..7014c68 100644 (file)
@@ -28,7 +28,7 @@ namespace __ubsan {
 
 static void HandleDynamicTypeCacheMiss(
     DynamicTypeCacheMissData *Data, ValueHandle Pointer, ValueHandle Hash,
-    bool Abort) {
+    bool Abort, uptr pc, uptr bp) {
   if (checkDynamicType((void*)Pointer, Data->TypeInfo, Hash))
     // Just a cache miss. The type matches after all.
     return;
@@ -60,16 +60,18 @@ static void HandleDynamicTypeCacheMiss(
       << MangledName(DTI.getSubobjectTypeName())
       << Range(Pointer, Pointer + sizeof(uptr), "vptr for %2 base class of %1");
 
-  MAYBE_PRINT_STACK_TRACE();
+  MaybePrintStackTrace(pc, bp);
   if (Abort)
     Die();
 }
 
 void __ubsan::__ubsan_handle_dynamic_type_cache_miss(
     DynamicTypeCacheMissData *Data, ValueHandle Pointer, ValueHandle Hash) {
-  HandleDynamicTypeCacheMiss(Data, Pointer, Hash, false);
+  GET_CALLER_PC_BP;
+  HandleDynamicTypeCacheMiss(Data, Pointer, Hash, false, pc, bp);
 }
 void __ubsan::__ubsan_handle_dynamic_type_cache_miss_abort(
     DynamicTypeCacheMissData *Data, ValueHandle Pointer, ValueHandle Hash) {
-  HandleDynamicTypeCacheMiss(Data, Pointer, Hash, true);
+  GET_CALLER_PC_BP;
+  HandleDynamicTypeCacheMiss(Data, Pointer, Hash, true, pc, bp);
 }