From 8b51bab4958c0dddbfbbff92bc2ed0522dfec87b Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Wed, 5 Dec 2012 14:39:55 +0000 Subject: [msan] Instrument bswap intrinsic. llvm-svn: 169383 --- .../Transforms/Instrumentation/MemorySanitizer.cpp | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'llvm/lib') 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 { 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(&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 { // will get propagated to a void RetVal. if (Call->isTailCall() && Call->getType() != Call->getParent()->getType()) Call->setTailCall(false); - if (isa(&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(&I) && "intrinsics are handled elsewhere"); } IRBuilder<> IRB(&I); unsigned ArgOffset = 0; -- cgit v1.2.3