[llvm] r370258 - [ASan] Make insertion of version mismatch guard configurable

Julian Lettner via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 28 13:40:56 PDT 2019


Author: yln
Date: Wed Aug 28 13:40:55 2019
New Revision: 370258

URL: http://llvm.org/viewvc/llvm-project?rev=370258&view=rev
Log:
[ASan] Make insertion of version mismatch guard configurable

By default ASan calls a versioned function
`__asan_version_mismatch_check_vXXX` from the ASan module constructor to
check that the compiler ABI version and runtime ABI version are
compatible. This ensures that we get a predictable linker error instead
of hard-to-debug runtime errors.

Sometimes, however, we want to skip this safety guard. This new command
line option allows us to do just that.

rdar://47891956

Reviewed By: kubamracek

Differential Revision: https://reviews.llvm.org/D66826

Added:
    llvm/trunk/test/Instrumentation/AddressSanitizer/version-mismatch-check.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=370258&r1=370257&r2=370258&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Wed Aug 28 13:40:55 2019
@@ -193,6 +193,11 @@ static cl::opt<bool> ClRecover(
     cl::desc("Enable recovery mode (continue-after-error)."),
     cl::Hidden, cl::init(false));
 
+static cl::opt<bool> ClInsertVersionCheck(
+    "asan-guard-against-version-mismatch",
+    cl::desc("Guard against compiler/runtime version mismatch."),
+    cl::Hidden, cl::init(true));
+
 // This flag may need to be replaced with -f[no-]asan-reads.
 static cl::opt<bool> ClInstrumentReads("asan-instrument-reads",
                                        cl::desc("instrument read instructions"),
@@ -2426,8 +2431,9 @@ bool ModuleAddressSanitizer::instrumentM
 
   // Create a module constructor. A destructor is created lazily because not all
   // platforms, and not all modules need it.
+  std::string AsanVersion = std::to_string(GetAsanVersion(M));
   std::string VersionCheckName =
-      kAsanVersionCheckNamePrefix + std::to_string(GetAsanVersion(M));
+      ClInsertVersionCheck ? (kAsanVersionCheckNamePrefix + AsanVersion) : "";
   std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions(
       M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{},
       /*InitArgs=*/{}, VersionCheckName);

Added: llvm/trunk/test/Instrumentation/AddressSanitizer/version-mismatch-check.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/version-mismatch-check.ll?rev=370258&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/version-mismatch-check.ll (added)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/version-mismatch-check.ll Wed Aug 28 13:40:55 2019
@@ -0,0 +1,12 @@
+; Check that the ASan module constructor guards against compiler/runtime version
+; mismatch.
+
+; RUN: opt < %s -asan-module                                        -S | FileCheck %s
+; RUN: opt < %s -asan-module -asan-guard-against-version-mismatch=0 -S | FileCheck %s --check-prefix=NOGUARD
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: define internal void @asan.module_ctor()
+; CHECK:         call void @__asan_version_mismatch_check_v
+; NOGUARD-NOT:   call void @__asan_version_mismatch_check_v




More information about the llvm-commits mailing list