summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2012-11-29 14:32:03 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2012-11-29 14:32:03 +0000
commit6d988b423acf37ed4d0b50b2678a18f65ab1a207 (patch)
treee4230470c15030a893c1c5965392659271f7298e /lib/Transforms
parent7f128ea00c5358729906a9b98f844e887a1c3d73 (diff)
downloadllvm-6d988b423acf37ed4d0b50b2678a18f65ab1a207.tar.gz
llvm-6d988b423acf37ed4d0b50b2678a18f65ab1a207.tar.bz2
llvm-6d988b423acf37ed4d0b50b2678a18f65ab1a207.tar.xz
[msan] Basic handling of inline asm.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168884 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Instrumentation/MemorySanitizer.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 46d22aacf9..d745a0c47a 100644
--- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -1065,10 +1065,19 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
Instruction &I = *CS.getInstruction();
assert((CS.isCall() || CS.isInvoke()) && "Unknown type of CallSite");
if (CS.isCall()) {
+ CallInst *Call = cast<CallInst>(&I);
+
+ // For inline asm, do the usual thing: check argument shadow and mark all
+ // outputs as clean. Note that any side effects of the inline asm that are
+ // not immediately visible in its constraints are not handled.
+ if (Call->isInlineAsm()) {
+ visitInstruction(I);
+ return;
+ }
+
// Allow only tail calls with the same types, otherwise
// we may have a false positive: shadow for a non-void RetVal
// will get propagated to a void RetVal.
- CallInst *Call = cast<CallInst>(&I);
if (Call->isTailCall() && Call->getType() != Call->getParent()->getType())
Call->setTailCall(false);
if (isa<IntrinsicInst>(&I)) {