mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
[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 llvm-svn: 370258
This commit is contained in:
parent
3c9c5131da
commit
422b6b1146
@ -193,6 +193,11 @@ static cl::opt<bool> ClRecover(
|
|||||||
cl::desc("Enable recovery mode (continue-after-error)."),
|
cl::desc("Enable recovery mode (continue-after-error)."),
|
||||||
cl::Hidden, cl::init(false));
|
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.
|
// This flag may need to be replaced with -f[no-]asan-reads.
|
||||||
static cl::opt<bool> ClInstrumentReads("asan-instrument-reads",
|
static cl::opt<bool> ClInstrumentReads("asan-instrument-reads",
|
||||||
cl::desc("instrument read instructions"),
|
cl::desc("instrument read instructions"),
|
||||||
@ -2426,8 +2431,9 @@ bool ModuleAddressSanitizer::instrumentModule(Module &M) {
|
|||||||
|
|
||||||
// Create a module constructor. A destructor is created lazily because not all
|
// Create a module constructor. A destructor is created lazily because not all
|
||||||
// platforms, and not all modules need it.
|
// platforms, and not all modules need it.
|
||||||
|
std::string AsanVersion = std::to_string(GetAsanVersion(M));
|
||||||
std::string VersionCheckName =
|
std::string VersionCheckName =
|
||||||
kAsanVersionCheckNamePrefix + std::to_string(GetAsanVersion(M));
|
ClInsertVersionCheck ? (kAsanVersionCheckNamePrefix + AsanVersion) : "";
|
||||||
std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions(
|
std::tie(AsanCtorFunction, std::ignore) = createSanitizerCtorAndInitFunctions(
|
||||||
M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{},
|
M, kAsanModuleCtorName, kAsanInitName, /*InitArgTypes=*/{},
|
||||||
/*InitArgs=*/{}, VersionCheckName);
|
/*InitArgs=*/{}, VersionCheckName);
|
||||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user