diff options
author | Kostya Serebryany <kcc@google.com> | 2015-10-14 00:21:05 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2015-10-14 00:21:05 +0000 |
commit | 5cb86d5a401d33e2abc7d65864682f738917e471 (patch) | |
tree | 819f68dc6a4fee51ca1d663a05f0e2a301aa25df | |
parent | e7dc8bf9c24ca4edd7bbaccf6fe4366208dccff5 (diff) | |
download | bcm5719-llvm-5cb86d5a401d33e2abc7d65864682f738917e471.tar.gz bcm5719-llvm-5cb86d5a401d33e2abc7d65864682f738917e471.zip |
[asan] Disabling speculative loads under asan. Patch by Mike Aizatsky
llvm-svn: 250259
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll | 40 |
2 files changed, 45 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 2a93e0d64d6..5caffee8fe7 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -3187,7 +3187,11 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V, const LoadInst *LI = cast<LoadInst>(Inst); if (!LI->isUnordered() || // Speculative load may create a race that did not exist in the source. - LI->getParent()->getParent()->hasFnAttribute(Attribute::SanitizeThread)) + LI->getParent()->getParent()->hasFnAttribute( + Attribute::SanitizeThread) || + // Speculative load may load data from dirty regions. + LI->getParent()->getParent()->hasFnAttribute( + Attribute::SanitizeAddress)) return false; const DataLayout &DL = LI->getModule()->getDataLayout(); return isDereferenceableAndAlignedPointer( diff --git a/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll b/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll new file mode 100644 index 00000000000..063bde83f7b --- /dev/null +++ b/llvm/test/Transforms/SimplifyCFG/no_speculative_loads_with_asan.ll @@ -0,0 +1,40 @@ +; RUN: opt -simplifycfg -S %s | FileCheck %s +; Make sure we don't speculate loads under AddressSanitizer. +@g = global i32 0, align 4 + +define i32 @TestNoAsan(i32 %cond) nounwind readonly uwtable { +entry: + %tobool = icmp eq i32 %cond, 0 + br i1 %tobool, label %return, label %if.then + +if.then: ; preds = %entry + %0 = load i32, i32* @g, align 4 + br label %return + +return: ; preds = %entry, %if.then + %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] + ret i32 %retval +; CHECK-LABEL: @TestNoAsan +; CHECK: %[[LOAD:[^ ]*]] = load +; CHECK: select{{.*}}[[LOAD]] +; CHECK: ret i32 +} + +define i32 @TestAsan(i32 %cond) nounwind readonly uwtable sanitize_address { +entry: + %tobool = icmp eq i32 %cond, 0 + br i1 %tobool, label %return, label %if.then + +if.then: ; preds = %entry + %0 = load i32, i32* @g, align 4 + br label %return + +return: ; preds = %entry, %if.then + %retval = phi i32 [ %0, %if.then ], [ 0, %entry ] + ret i32 %retval +; CHECK-LABEL: @TestAsan +; CHECK: br i1 +; CHECK: load i32, i32* @g +; CHECK: br label +; CHECK: ret i32 +} |