mirror of
https://github.com/intel/llvm.git
synced 2026-02-09 01:52:26 +08:00
[MSan] Disable sanitization for __sanitizer_dtor_callback.
Summary: Eliminate unnecessary instrumentation at __sanitizer_dtor_callback call sites. Fixes https://github.com/google/sanitizers/issues/861. Reviewers: eugenis, kcc Reviewed By: eugenis Subscribers: vitalybuka, llvm-commits, cfe-commits, hiraditya Differential Revision: https://reviews.llvm.org/D38063 llvm-svn: 313831
This commit is contained in:
@@ -1577,6 +1577,7 @@ namespace {
|
||||
|
||||
static void EmitSanitizerDtorCallback(CodeGenFunction &CGF, llvm::Value *Ptr,
|
||||
CharUnits::QuantityType PoisonSize) {
|
||||
CodeGenFunction::SanitizerScope SanScope(&CGF);
|
||||
// Pass in void pointer and size of region as arguments to runtime
|
||||
// function
|
||||
llvm::Value *Args[] = {CGF.Builder.CreateBitCast(Ptr, CGF.VoidPtrTy),
|
||||
|
||||
@@ -55,16 +55,19 @@ Defaulted_Non_Trivial def_non_trivial;
|
||||
// to confirm that all invoked dtors have member poisoning
|
||||
// instrumentation inserted.
|
||||
// CHECK-LABEL: define {{.*}}SimpleD2Ev
|
||||
// CHECK-NOT: store i{{[0-9]+}} 0, {{.*}}@__msan_param_tls
|
||||
// CHECK: call void @__sanitizer_dtor_callback
|
||||
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define {{.*}}InlinedD2Ev
|
||||
// CHECK-NOT: store i{{[0-9]+}} 0, {{.*}}@__msan_param_tls
|
||||
// CHECK: call void @__sanitizer_dtor_callback
|
||||
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK-LABEL: define {{.*}}Defaulted_Non_TrivialD2Ev
|
||||
// CHECK-NOT: store i{{[0-9]+}} 0, {{.*}}@__msan_param_tls
|
||||
// CHECK: call void @__sanitizer_dtor_callback
|
||||
// CHECK-NOT: call void @__sanitizer_dtor_callback
|
||||
// CHECK: ret void
|
||||
|
||||
@@ -2588,6 +2588,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
|
||||
|
||||
void visitCallSite(CallSite CS) {
|
||||
Instruction &I = *CS.getInstruction();
|
||||
if (I.getMetadata("nosanitize")) return;
|
||||
assert((CS.isCall() || CS.isInvoke()) && "Unknown type of CallSite");
|
||||
if (CS.isCall()) {
|
||||
CallInst *Call = cast<CallInst>(&I);
|
||||
|
||||
16
llvm/test/Instrumentation/MemorySanitizer/call-nosanitize.ll
Normal file
16
llvm/test/Instrumentation/MemorySanitizer/call-nosanitize.ll
Normal file
@@ -0,0 +1,16 @@
|
||||
; Verify that calls with !nosanitize are not instrumented by MSan.
|
||||
; RUN: opt < %s -msan -S | FileCheck %s
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
declare void @bar(i32 %x)
|
||||
|
||||
define void @foo() {
|
||||
call void @bar(i32 7), !nosanitize !{}
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @foo
|
||||
; CHECK-NOT: store i{{[0-9]+}} 0, {{.*}} @__msan_param_tls
|
||||
; CHECK: call void @bar
|
||||
; CHECK: ret void
|
||||
Reference in New Issue
Block a user