[compiler-rt] r277874 - Fix two tests in Win64 ASan

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 5 14:47:46 PDT 2016


Author: rnk
Date: Fri Aug  5 16:47:46 2016
New Revision: 277874

URL: http://llvm.org/viewvc/llvm-project?rev=277874&view=rev
Log:
Fix two tests in Win64 ASan

Go back to intercepting kernel32!RaiseException, and only go for
ntdll!RtlRaiseException if that fails. Fixes throw_and_catch.cc test.

Work around an issue in LLVM's win64 epilogues. We end up with an
epilogue that looks like this, and it drives the Win64 unwinder crazy
until stack overflow:
        call    ill_cc!__asan_handle_no_return
        xor     eax,eax
        add     rsp,40h // epilogue starts
        pop     rbp     // CSR
        ud2             // Trap here
        ret             // Ret?
        nop     word ptr [rax+rax]
        sub     rsp,28h // Next function

Will file a PR soon.

Modified:
    compiler-rt/trunk/lib/asan/asan_win.cc
    compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc
    compiler-rt/trunk/test/asan/TestCases/ill.cc

Modified: compiler-rt/trunk/lib/asan/asan_win.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win.cc?rev=277874&r1=277873&r2=277874&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_win.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_win.cc Fri Aug  5 16:47:46 2016
@@ -80,6 +80,11 @@ INTERCEPTOR_WINAPI(void, RtlRaiseExcepti
   REAL(RtlRaiseException)(ExceptionRecord);
 }
 
+INTERCEPTOR_WINAPI(void, RaiseException, void *a, void *b, void *c, void *d) {
+  CHECK(REAL(RaiseException));
+  __asan_handle_no_return();
+  REAL(RaiseException)(a, b, c, d);
+}
 
 #ifdef _WIN64
 
@@ -138,10 +143,6 @@ namespace __asan {
 
 void InitializePlatformInterceptors() {
   ASAN_INTERCEPT_FUNC(CreateThread);
-  // RtlRaiseException is always linked dynamically.
-  CHECK(::__interception::OverrideFunction("RtlRaiseException",
-                                           (uptr)WRAP(RtlRaiseException),
-                                           (uptr *)&REAL(RtlRaiseException)));
 
 #ifdef _WIN64
   ASAN_INTERCEPT_FUNC(__C_specific_handler);
@@ -149,6 +150,16 @@ void InitializePlatformInterceptors() {
   ASAN_INTERCEPT_FUNC(_except_handler3);
   ASAN_INTERCEPT_FUNC(_except_handler4);
 #endif
+
+  // Try to intercept kernel32!RaiseException, and if that fails, intercept
+  // ntdll!RtlRaiseException instead.
+  if (!::__interception::OverrideFunction("RaiseException",
+                                          (uptr)WRAP(RaiseException),
+                                          (uptr *)&REAL(RaiseException))) {
+    CHECK(::__interception::OverrideFunction("RtlRaiseException",
+                                             (uptr)WRAP(RtlRaiseException),
+                                             (uptr *)&REAL(RtlRaiseException)));
+  }
 }
 
 void AsanApplyToGlobals(globals_op_fptr op, const void *needle) {

Modified: compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc?rev=277874&r1=277873&r2=277874&view=diff
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc (original)
+++ compiler-rt/trunk/test/asan/TestCases/Windows/dll_host.cc Fri Aug  5 16:47:46 2016
@@ -24,6 +24,7 @@
 // IMPORT: __asan_wrap_HeapReAlloc
 // IMPORT: __asan_wrap_HeapSize
 // IMPORT: __asan_wrap_CreateThread
+// IMPORT: __asan_wrap_RaiseException
 // IMPORT: __asan_wrap_RtlRaiseException
 //
 // The exception handlers differ in 32-bit and 64-bit, so we ignore them:

Modified: compiler-rt/trunk/test/asan/TestCases/ill.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/ill.cc?rev=277874&r1=277873&r2=277874&view=diff
==============================================================================
--- compiler-rt/trunk/test/asan/TestCases/ill.cc (original)
+++ compiler-rt/trunk/test/asan/TestCases/ill.cc Fri Aug  5 16:47:46 2016
@@ -9,7 +9,7 @@
 #include <windows.h>
 #endif
 
-int main() {
+int main(int argc, char **argv) {
 #ifdef _WIN32
   // Sometimes on Windows this test generates a WER fault dialog. Suppress that.
   UINT new_flags = SEM_FAILCRITICALERRORS |
@@ -21,7 +21,10 @@ int main() {
   SetErrorMode(existing_flags | new_flags);
 #endif
 
-  __builtin_trap();
+  if (argc)
+    __builtin_trap();
+  // Unreachable code to avoid confusing the Windows unwinder.
+  SetErrorMode(0);
 }
 // CHECK0-NOT: ERROR: AddressSanitizer
 // CHECK1: ERROR: AddressSanitizer: {{ILL|illegal-instruction}} on unknown address {{0x0*}}




More information about the llvm-commits mailing list