summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2012-12-05 14:39:55 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2012-12-05 14:39:55 +0000
commit8b51bab4958c0dddbfbbff92bc2ed0522dfec87b (patch)
tree61eb0c507acec13d6c2264238931a214a0766012 /llvm/lib
parentbc09a7ea8535dbd57b34da434ea4c7ea8810341f (diff)
downloadbcm5719-llvm-8b51bab4958c0dddbfbbff92bc2ed0522dfec87b.tar.gz
bcm5719-llvm-8b51bab4958c0dddbfbbff92bc2ed0522dfec87b.zip
[msan] Instrument bswap intrinsic.
llvm-svn: 169383
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 183403d5fcc..342751296b4 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -1101,6 +1101,25 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
VAHelper->visitVACopyInst(I);
}
+ void handleBswap(IntrinsicInst &I) {
+ IRBuilder<> IRB(&I);
+ Value *Op = I.getArgOperand(0);
+ Type *OpType = Op->getType();
+ Function *BswapFunc = Intrinsic::getDeclaration(
+ F.getParent(), Intrinsic::bswap, ArrayRef<Type*>(&OpType, 1));
+ setShadow(&I, IRB.CreateCall(BswapFunc, getShadow(Op)));
+ setOrigin(&I, getOrigin(Op));
+ }
+
+ void visitIntrinsicInst(IntrinsicInst &I) {
+ switch (I.getIntrinsicID()) {
+ case llvm::Intrinsic::bswap:
+ handleBswap(I); break;
+ default:
+ visitInstruction(I); break;
+ }
+ }
+
void visitCallSite(CallSite CS) {
Instruction &I = *CS.getInstruction();
assert((CS.isCall() || CS.isInvoke()) && "Unknown type of CallSite");
@@ -1120,12 +1139,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
// will get propagated to a void RetVal.
if (Call->isTailCall() && Call->getType() != Call->getParent()->getType())
Call->setTailCall(false);
- if (isa<IntrinsicInst>(&I)) {
- // All intrinsics we care about are handled in corresponding visit*
- // methods. Add checks for the arguments, mark retval as clean.
- visitInstruction(I);
- return;
- }
+
+ assert(!isa<IntrinsicInst>(&I) && "intrinsics are handled elsewhere");
}
IRBuilder<> IRB(&I);
unsigned ArgOffset = 0;
OpenPOWER on IntegriCloud