Print a more useful BP value from MSVC-built ASan runtimes
authorReid Kleckner <rnk@google.com>
Fri, 5 Aug 2016 16:01:57 +0000 (16:01 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 5 Aug 2016 16:01:57 +0000 (16:01 +0000)
MSVC doesn't have an exact equivalent for __builtin_frame_address, but
_AddressOfReturnAddress() + sizeof(void*) should be equivalent for all
frames build with -fno-omit-frame-pointer.

llvm-svn: 277826

compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h

index 720672d..bb25cf4 100644 (file)
@@ -296,12 +296,12 @@ inline void Trap() {
 }
 #else
 extern "C" void* _ReturnAddress(void);
+extern "C" void* _AddressOfReturnAddress(void);
 # pragma intrinsic(_ReturnAddress)
+# pragma intrinsic(_AddressOfReturnAddress)
 # define GET_CALLER_PC() (uptr)_ReturnAddress()
 // CaptureStackBackTrace doesn't need to know BP on Windows.
-// FIXME: This macro is still used when printing error reports though it's not
-// clear if the BP value is needed in the ASan reports on Windows.
-# define GET_CURRENT_FRAME() (uptr)0xDEADBEEF
+# define GET_CURRENT_FRAME() (((uptr)_AddressOfReturnAddress()) + sizeof(uptr))
 
 extern "C" void __ud2(void);
 # pragma intrinsic(__ud2)