1*e440b493SArthur Eubanks //===-- Lint.cpp - Check for common errors in LLVM IR ---------------------===// 2*e440b493SArthur Eubanks // 3*e440b493SArthur Eubanks // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e440b493SArthur Eubanks // See https://llvm.org/LICENSE.txt for license information. 5*e440b493SArthur Eubanks // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e440b493SArthur Eubanks // 7*e440b493SArthur Eubanks //===----------------------------------------------------------------------===// 8*e440b493SArthur Eubanks // 9*e440b493SArthur Eubanks // This pass statically checks for common and easily-identified constructs 10*e440b493SArthur Eubanks // which produce undefined or likely unintended behavior in LLVM IR. 11*e440b493SArthur Eubanks // 12*e440b493SArthur Eubanks // It is not a guarantee of correctness, in two ways. First, it isn't 13*e440b493SArthur Eubanks // comprehensive. There are checks which could be done statically which are 14*e440b493SArthur Eubanks // not yet implemented. Some of these are indicated by TODO comments, but 15*e440b493SArthur Eubanks // those aren't comprehensive either. Second, many conditions cannot be 16*e440b493SArthur Eubanks // checked statically. This pass does no dynamic instrumentation, so it 17*e440b493SArthur Eubanks // can't check for all possible problems. 18*e440b493SArthur Eubanks // 19*e440b493SArthur Eubanks // Another limitation is that it assumes all code will be executed. A store 20*e440b493SArthur Eubanks // through a null pointer in a basic block which is never reached is harmless, 21*e440b493SArthur Eubanks // but this pass will warn about it anyway. This is the main reason why most 22*e440b493SArthur Eubanks // of these checks live here instead of in the Verifier pass. 23*e440b493SArthur Eubanks // 24*e440b493SArthur Eubanks // Optimization passes may make conditions that this pass checks for more or 25*e440b493SArthur Eubanks // less obvious. If an optimization pass appears to be introducing a warning, 26*e440b493SArthur Eubanks // it may be that the optimization pass is merely exposing an existing 27*e440b493SArthur Eubanks // condition in the code. 28*e440b493SArthur Eubanks // 29*e440b493SArthur Eubanks // This code may be run before instcombine. In many cases, instcombine checks 30*e440b493SArthur Eubanks // for the same kinds of things and turns instructions with undefined behavior 31*e440b493SArthur Eubanks // into unreachable (or equivalent). Because of this, this pass makes some 32*e440b493SArthur Eubanks // effort to look through bitcasts and so on. 33*e440b493SArthur Eubanks // 34*e440b493SArthur Eubanks //===----------------------------------------------------------------------===// 35*e440b493SArthur Eubanks 36*e440b493SArthur Eubanks #include "llvm/Analysis/Lint.h" 37*e440b493SArthur Eubanks #include "llvm/ADT/APInt.h" 38*e440b493SArthur Eubanks #include "llvm/ADT/ArrayRef.h" 39*e440b493SArthur Eubanks #include "llvm/ADT/SmallPtrSet.h" 40*e440b493SArthur Eubanks #include "llvm/ADT/Twine.h" 41*e440b493SArthur Eubanks #include "llvm/Analysis/AliasAnalysis.h" 42*e440b493SArthur Eubanks #include "llvm/Analysis/AssumptionCache.h" 43*e440b493SArthur Eubanks #include "llvm/Analysis/ConstantFolding.h" 44*e440b493SArthur Eubanks #include "llvm/Analysis/InstructionSimplify.h" 45*e440b493SArthur Eubanks #include "llvm/Analysis/Loads.h" 46*e440b493SArthur Eubanks #include "llvm/Analysis/MemoryLocation.h" 47*e440b493SArthur Eubanks #include "llvm/Analysis/Passes.h" 48*e440b493SArthur Eubanks #include "llvm/Analysis/TargetLibraryInfo.h" 49*e440b493SArthur Eubanks #include "llvm/Analysis/ValueTracking.h" 50*e440b493SArthur Eubanks #include "llvm/IR/Argument.h" 51*e440b493SArthur Eubanks #include "llvm/IR/BasicBlock.h" 52*e440b493SArthur Eubanks #include "llvm/IR/Constant.h" 53*e440b493SArthur Eubanks #include "llvm/IR/Constants.h" 54*e440b493SArthur Eubanks #include "llvm/IR/DataLayout.h" 55*e440b493SArthur Eubanks #include "llvm/IR/DerivedTypes.h" 56*e440b493SArthur Eubanks #include "llvm/IR/Dominators.h" 57*e440b493SArthur Eubanks #include "llvm/IR/Function.h" 58*e440b493SArthur Eubanks #include "llvm/IR/GlobalVariable.h" 59*e440b493SArthur Eubanks #include "llvm/IR/InstVisitor.h" 60*e440b493SArthur Eubanks #include "llvm/IR/InstrTypes.h" 61*e440b493SArthur Eubanks #include "llvm/IR/Instruction.h" 62*e440b493SArthur Eubanks #include "llvm/IR/Instructions.h" 63*e440b493SArthur Eubanks #include "llvm/IR/IntrinsicInst.h" 64*e440b493SArthur Eubanks #include "llvm/IR/LegacyPassManager.h" 65*e440b493SArthur Eubanks #include "llvm/IR/Module.h" 66*e440b493SArthur Eubanks #include "llvm/IR/Type.h" 67*e440b493SArthur Eubanks #include "llvm/IR/Value.h" 68*e440b493SArthur Eubanks #include "llvm/InitializePasses.h" 69*e440b493SArthur Eubanks #include "llvm/Pass.h" 70*e440b493SArthur Eubanks #include "llvm/Support/Casting.h" 71*e440b493SArthur Eubanks #include "llvm/Support/Debug.h" 72*e440b493SArthur Eubanks #include "llvm/Support/KnownBits.h" 73*e440b493SArthur Eubanks #include "llvm/Support/MathExtras.h" 74*e440b493SArthur Eubanks #include "llvm/Support/raw_ostream.h" 75*e440b493SArthur Eubanks #include <cassert> 76*e440b493SArthur Eubanks #include <cstdint> 77*e440b493SArthur Eubanks #include <iterator> 78*e440b493SArthur Eubanks #include <string> 79*e440b493SArthur Eubanks 80*e440b493SArthur Eubanks using namespace llvm; 81*e440b493SArthur Eubanks 82*e440b493SArthur Eubanks namespace { 83*e440b493SArthur Eubanks namespace MemRef { 84*e440b493SArthur Eubanks static const unsigned Read = 1; 85*e440b493SArthur Eubanks static const unsigned Write = 2; 86*e440b493SArthur Eubanks static const unsigned Callee = 4; 87*e440b493SArthur Eubanks static const unsigned Branchee = 8; 88*e440b493SArthur Eubanks } // end namespace MemRef 89*e440b493SArthur Eubanks 90*e440b493SArthur Eubanks class Lint : public FunctionPass, public InstVisitor<Lint> { 91*e440b493SArthur Eubanks friend class InstVisitor<Lint>; 92*e440b493SArthur Eubanks 93*e440b493SArthur Eubanks void visitFunction(Function &F); 94*e440b493SArthur Eubanks 95*e440b493SArthur Eubanks void visitCallBase(CallBase &CB); 96*e440b493SArthur Eubanks void visitMemoryReference(Instruction &I, Value *Ptr, uint64_t Size, 97*e440b493SArthur Eubanks MaybeAlign Alignment, Type *Ty, unsigned Flags); 98*e440b493SArthur Eubanks void visitEHBeginCatch(IntrinsicInst *II); 99*e440b493SArthur Eubanks void visitEHEndCatch(IntrinsicInst *II); 100*e440b493SArthur Eubanks 101*e440b493SArthur Eubanks void visitReturnInst(ReturnInst &I); 102*e440b493SArthur Eubanks void visitLoadInst(LoadInst &I); 103*e440b493SArthur Eubanks void visitStoreInst(StoreInst &I); 104*e440b493SArthur Eubanks void visitXor(BinaryOperator &I); 105*e440b493SArthur Eubanks void visitSub(BinaryOperator &I); 106*e440b493SArthur Eubanks void visitLShr(BinaryOperator &I); 107*e440b493SArthur Eubanks void visitAShr(BinaryOperator &I); 108*e440b493SArthur Eubanks void visitShl(BinaryOperator &I); 109*e440b493SArthur Eubanks void visitSDiv(BinaryOperator &I); 110*e440b493SArthur Eubanks void visitUDiv(BinaryOperator &I); 111*e440b493SArthur Eubanks void visitSRem(BinaryOperator &I); 112*e440b493SArthur Eubanks void visitURem(BinaryOperator &I); 113*e440b493SArthur Eubanks void visitAllocaInst(AllocaInst &I); 114*e440b493SArthur Eubanks void visitVAArgInst(VAArgInst &I); 115*e440b493SArthur Eubanks void visitIndirectBrInst(IndirectBrInst &I); 116*e440b493SArthur Eubanks void visitExtractElementInst(ExtractElementInst &I); 117*e440b493SArthur Eubanks void visitInsertElementInst(InsertElementInst &I); 118*e440b493SArthur Eubanks void visitUnreachableInst(UnreachableInst &I); 119*e440b493SArthur Eubanks 120*e440b493SArthur Eubanks Value *findValue(Value *V, bool OffsetOk) const; 121*e440b493SArthur Eubanks Value *findValueImpl(Value *V, bool OffsetOk, 122*e440b493SArthur Eubanks SmallPtrSetImpl<Value *> &Visited) const; 123*e440b493SArthur Eubanks 124*e440b493SArthur Eubanks public: 125*e440b493SArthur Eubanks Module *Mod; 126*e440b493SArthur Eubanks const DataLayout *DL; 127*e440b493SArthur Eubanks AliasAnalysis *AA; 128*e440b493SArthur Eubanks AssumptionCache *AC; 129*e440b493SArthur Eubanks DominatorTree *DT; 130*e440b493SArthur Eubanks TargetLibraryInfo *TLI; 131*e440b493SArthur Eubanks 132*e440b493SArthur Eubanks std::string Messages; 133*e440b493SArthur Eubanks raw_string_ostream MessagesStr; 134*e440b493SArthur Eubanks 135*e440b493SArthur Eubanks static char ID; // Pass identification, replacement for typeid 136*e440b493SArthur Eubanks Lint() : FunctionPass(ID), MessagesStr(Messages) { 137*e440b493SArthur Eubanks initializeLintPass(*PassRegistry::getPassRegistry()); 138*e440b493SArthur Eubanks } 139*e440b493SArthur Eubanks 140*e440b493SArthur Eubanks bool runOnFunction(Function &F) override; 141*e440b493SArthur Eubanks 142*e440b493SArthur Eubanks void getAnalysisUsage(AnalysisUsage &AU) const override { 143*e440b493SArthur Eubanks AU.setPreservesAll(); 144*e440b493SArthur Eubanks AU.addRequired<AAResultsWrapperPass>(); 145*e440b493SArthur Eubanks AU.addRequired<AssumptionCacheTracker>(); 146*e440b493SArthur Eubanks AU.addRequired<TargetLibraryInfoWrapperPass>(); 147*e440b493SArthur Eubanks AU.addRequired<DominatorTreeWrapperPass>(); 148*e440b493SArthur Eubanks } 149*e440b493SArthur Eubanks void print(raw_ostream &O, const Module *M) const override {} 150*e440b493SArthur Eubanks 151*e440b493SArthur Eubanks void WriteValues(ArrayRef<const Value *> Vs) { 152*e440b493SArthur Eubanks for (const Value *V : Vs) { 153*e440b493SArthur Eubanks if (!V) 154*e440b493SArthur Eubanks continue; 155*e440b493SArthur Eubanks if (isa<Instruction>(V)) { 156*e440b493SArthur Eubanks MessagesStr << *V << '\n'; 157*e440b493SArthur Eubanks } else { 158*e440b493SArthur Eubanks V->printAsOperand(MessagesStr, true, Mod); 159*e440b493SArthur Eubanks MessagesStr << '\n'; 160*e440b493SArthur Eubanks } 161*e440b493SArthur Eubanks } 162*e440b493SArthur Eubanks } 163*e440b493SArthur Eubanks 164*e440b493SArthur Eubanks /// A check failed, so printout out the condition and the message. 165*e440b493SArthur Eubanks /// 166*e440b493SArthur Eubanks /// This provides a nice place to put a breakpoint if you want to see why 167*e440b493SArthur Eubanks /// something is not correct. 168*e440b493SArthur Eubanks void CheckFailed(const Twine &Message) { MessagesStr << Message << '\n'; } 169*e440b493SArthur Eubanks 170*e440b493SArthur Eubanks /// A check failed (with values to print). 171*e440b493SArthur Eubanks /// 172*e440b493SArthur Eubanks /// This calls the Message-only version so that the above is easier to set 173*e440b493SArthur Eubanks /// a breakpoint on. 174*e440b493SArthur Eubanks template <typename T1, typename... Ts> 175*e440b493SArthur Eubanks void CheckFailed(const Twine &Message, const T1 &V1, const Ts &...Vs) { 176*e440b493SArthur Eubanks CheckFailed(Message); 177*e440b493SArthur Eubanks WriteValues({V1, Vs...}); 178*e440b493SArthur Eubanks } 179*e440b493SArthur Eubanks }; 180*e440b493SArthur Eubanks } // end anonymous namespace 181*e440b493SArthur Eubanks 182*e440b493SArthur Eubanks char Lint::ID = 0; 183*e440b493SArthur Eubanks INITIALIZE_PASS_BEGIN(Lint, "lint", "Statically lint-checks LLVM IR", 184*e440b493SArthur Eubanks false, true) 185*e440b493SArthur Eubanks INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 186*e440b493SArthur Eubanks INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 187*e440b493SArthur Eubanks INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 188*e440b493SArthur Eubanks INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) 189*e440b493SArthur Eubanks INITIALIZE_PASS_END(Lint, "lint", "Statically lint-checks LLVM IR", 190*e440b493SArthur Eubanks false, true) 191*e440b493SArthur Eubanks 192*e440b493SArthur Eubanks // Assert - We know that cond should be true, if not print an error message. 193*e440b493SArthur Eubanks #define Assert(C, ...) \ 194*e440b493SArthur Eubanks do { if (!(C)) { CheckFailed(__VA_ARGS__); return; } } while (false) 195*e440b493SArthur Eubanks 196*e440b493SArthur Eubanks // Lint::run - This is the main Analysis entry point for a 197*e440b493SArthur Eubanks // function. 198*e440b493SArthur Eubanks // 199*e440b493SArthur Eubanks bool Lint::runOnFunction(Function &F) { 200*e440b493SArthur Eubanks Mod = F.getParent(); 201*e440b493SArthur Eubanks DL = &F.getParent()->getDataLayout(); 202*e440b493SArthur Eubanks AA = &getAnalysis<AAResultsWrapperPass>().getAAResults(); 203*e440b493SArthur Eubanks AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); 204*e440b493SArthur Eubanks DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); 205*e440b493SArthur Eubanks TLI = &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); 206*e440b493SArthur Eubanks visit(F); 207*e440b493SArthur Eubanks dbgs() << MessagesStr.str(); 208*e440b493SArthur Eubanks Messages.clear(); 209*e440b493SArthur Eubanks return false; 210*e440b493SArthur Eubanks } 211*e440b493SArthur Eubanks 212*e440b493SArthur Eubanks void Lint::visitFunction(Function &F) { 213*e440b493SArthur Eubanks // This isn't undefined behavior, it's just a little unusual, and it's a 214*e440b493SArthur Eubanks // fairly common mistake to neglect to name a function. 215*e440b493SArthur Eubanks Assert(F.hasName() || F.hasLocalLinkage(), 216*e440b493SArthur Eubanks "Unusual: Unnamed function with non-local linkage", &F); 217*e440b493SArthur Eubanks 218*e440b493SArthur Eubanks // TODO: Check for irreducible control flow. 219*e440b493SArthur Eubanks } 220*e440b493SArthur Eubanks 221*e440b493SArthur Eubanks void Lint::visitCallBase(CallBase &I) { 222*e440b493SArthur Eubanks Value *Callee = I.getCalledOperand(); 223*e440b493SArthur Eubanks 224*e440b493SArthur Eubanks visitMemoryReference(I, Callee, MemoryLocation::UnknownSize, None, nullptr, 225*e440b493SArthur Eubanks MemRef::Callee); 226*e440b493SArthur Eubanks 227*e440b493SArthur Eubanks if (Function *F = dyn_cast<Function>(findValue(Callee, 228*e440b493SArthur Eubanks /*OffsetOk=*/false))) { 229*e440b493SArthur Eubanks Assert(I.getCallingConv() == F->getCallingConv(), 230*e440b493SArthur Eubanks "Undefined behavior: Caller and callee calling convention differ", 231*e440b493SArthur Eubanks &I); 232*e440b493SArthur Eubanks 233*e440b493SArthur Eubanks FunctionType *FT = F->getFunctionType(); 234*e440b493SArthur Eubanks unsigned NumActualArgs = I.arg_size(); 235*e440b493SArthur Eubanks 236*e440b493SArthur Eubanks Assert(FT->isVarArg() ? FT->getNumParams() <= NumActualArgs 237*e440b493SArthur Eubanks : FT->getNumParams() == NumActualArgs, 238*e440b493SArthur Eubanks "Undefined behavior: Call argument count mismatches callee " 239*e440b493SArthur Eubanks "argument count", 240*e440b493SArthur Eubanks &I); 241*e440b493SArthur Eubanks 242*e440b493SArthur Eubanks Assert(FT->getReturnType() == I.getType(), 243*e440b493SArthur Eubanks "Undefined behavior: Call return type mismatches " 244*e440b493SArthur Eubanks "callee return type", 245*e440b493SArthur Eubanks &I); 246*e440b493SArthur Eubanks 247*e440b493SArthur Eubanks // Check argument types (in case the callee was casted) and attributes. 248*e440b493SArthur Eubanks // TODO: Verify that caller and callee attributes are compatible. 249*e440b493SArthur Eubanks Function::arg_iterator PI = F->arg_begin(), PE = F->arg_end(); 250*e440b493SArthur Eubanks auto AI = I.arg_begin(), AE = I.arg_end(); 251*e440b493SArthur Eubanks for (; AI != AE; ++AI) { 252*e440b493SArthur Eubanks Value *Actual = *AI; 253*e440b493SArthur Eubanks if (PI != PE) { 254*e440b493SArthur Eubanks Argument *Formal = &*PI++; 255*e440b493SArthur Eubanks Assert(Formal->getType() == Actual->getType(), 256*e440b493SArthur Eubanks "Undefined behavior: Call argument type mismatches " 257*e440b493SArthur Eubanks "callee parameter type", 258*e440b493SArthur Eubanks &I); 259*e440b493SArthur Eubanks 260*e440b493SArthur Eubanks // Check that noalias arguments don't alias other arguments. This is 261*e440b493SArthur Eubanks // not fully precise because we don't know the sizes of the dereferenced 262*e440b493SArthur Eubanks // memory regions. 263*e440b493SArthur Eubanks if (Formal->hasNoAliasAttr() && Actual->getType()->isPointerTy()) { 264*e440b493SArthur Eubanks AttributeList PAL = I.getAttributes(); 265*e440b493SArthur Eubanks unsigned ArgNo = 0; 266*e440b493SArthur Eubanks for (auto BI = I.arg_begin(); BI != AE; ++BI, ++ArgNo) { 267*e440b493SArthur Eubanks // Skip ByVal arguments since they will be memcpy'd to the callee's 268*e440b493SArthur Eubanks // stack so we're not really passing the pointer anyway. 269*e440b493SArthur Eubanks if (PAL.hasParamAttribute(ArgNo, Attribute::ByVal)) 270*e440b493SArthur Eubanks continue; 271*e440b493SArthur Eubanks // If both arguments are readonly, they have no dependence. 272*e440b493SArthur Eubanks if (Formal->onlyReadsMemory() && I.onlyReadsMemory(ArgNo)) 273*e440b493SArthur Eubanks continue; 274*e440b493SArthur Eubanks if (AI != BI && (*BI)->getType()->isPointerTy()) { 275*e440b493SArthur Eubanks AliasResult Result = AA->alias(*AI, *BI); 276*e440b493SArthur Eubanks Assert(Result != MustAlias && Result != PartialAlias, 277*e440b493SArthur Eubanks "Unusual: noalias argument aliases another argument", &I); 278*e440b493SArthur Eubanks } 279*e440b493SArthur Eubanks } 280*e440b493SArthur Eubanks } 281*e440b493SArthur Eubanks 282*e440b493SArthur Eubanks // Check that an sret argument points to valid memory. 283*e440b493SArthur Eubanks if (Formal->hasStructRetAttr() && Actual->getType()->isPointerTy()) { 284*e440b493SArthur Eubanks Type *Ty = 285*e440b493SArthur Eubanks cast<PointerType>(Formal->getType())->getElementType(); 286*e440b493SArthur Eubanks visitMemoryReference(I, Actual, DL->getTypeStoreSize(Ty), 287*e440b493SArthur Eubanks DL->getABITypeAlign(Ty), Ty, 288*e440b493SArthur Eubanks MemRef::Read | MemRef::Write); 289*e440b493SArthur Eubanks } 290*e440b493SArthur Eubanks } 291*e440b493SArthur Eubanks } 292*e440b493SArthur Eubanks } 293*e440b493SArthur Eubanks 294*e440b493SArthur Eubanks if (const auto *CI = dyn_cast<CallInst>(&I)) { 295*e440b493SArthur Eubanks if (CI->isTailCall()) { 296*e440b493SArthur Eubanks const AttributeList &PAL = CI->getAttributes(); 297*e440b493SArthur Eubanks unsigned ArgNo = 0; 298*e440b493SArthur Eubanks for (Value *Arg : I.args()) { 299*e440b493SArthur Eubanks // Skip ByVal arguments since they will be memcpy'd to the callee's 300*e440b493SArthur Eubanks // stack anyway. 301*e440b493SArthur Eubanks if (PAL.hasParamAttribute(ArgNo++, Attribute::ByVal)) 302*e440b493SArthur Eubanks continue; 303*e440b493SArthur Eubanks Value *Obj = findValue(Arg, /*OffsetOk=*/true); 304*e440b493SArthur Eubanks Assert(!isa<AllocaInst>(Obj), 305*e440b493SArthur Eubanks "Undefined behavior: Call with \"tail\" keyword references " 306*e440b493SArthur Eubanks "alloca", 307*e440b493SArthur Eubanks &I); 308*e440b493SArthur Eubanks } 309*e440b493SArthur Eubanks } 310*e440b493SArthur Eubanks } 311*e440b493SArthur Eubanks 312*e440b493SArthur Eubanks 313*e440b493SArthur Eubanks if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) 314*e440b493SArthur Eubanks switch (II->getIntrinsicID()) { 315*e440b493SArthur Eubanks default: break; 316*e440b493SArthur Eubanks 317*e440b493SArthur Eubanks // TODO: Check more intrinsics 318*e440b493SArthur Eubanks 319*e440b493SArthur Eubanks case Intrinsic::memcpy: { 320*e440b493SArthur Eubanks MemCpyInst *MCI = cast<MemCpyInst>(&I); 321*e440b493SArthur Eubanks // TODO: If the size is known, use it. 322*e440b493SArthur Eubanks visitMemoryReference(I, MCI->getDest(), MemoryLocation::UnknownSize, 323*e440b493SArthur Eubanks MCI->getDestAlign(), nullptr, MemRef::Write); 324*e440b493SArthur Eubanks visitMemoryReference(I, MCI->getSource(), MemoryLocation::UnknownSize, 325*e440b493SArthur Eubanks MCI->getSourceAlign(), nullptr, MemRef::Read); 326*e440b493SArthur Eubanks 327*e440b493SArthur Eubanks // Check that the memcpy arguments don't overlap. The AliasAnalysis API 328*e440b493SArthur Eubanks // isn't expressive enough for what we really want to do. Known partial 329*e440b493SArthur Eubanks // overlap is not distinguished from the case where nothing is known. 330*e440b493SArthur Eubanks auto Size = LocationSize::unknown(); 331*e440b493SArthur Eubanks if (const ConstantInt *Len = 332*e440b493SArthur Eubanks dyn_cast<ConstantInt>(findValue(MCI->getLength(), 333*e440b493SArthur Eubanks /*OffsetOk=*/false))) 334*e440b493SArthur Eubanks if (Len->getValue().isIntN(32)) 335*e440b493SArthur Eubanks Size = LocationSize::precise(Len->getValue().getZExtValue()); 336*e440b493SArthur Eubanks Assert(AA->alias(MCI->getSource(), Size, MCI->getDest(), Size) != 337*e440b493SArthur Eubanks MustAlias, 338*e440b493SArthur Eubanks "Undefined behavior: memcpy source and destination overlap", &I); 339*e440b493SArthur Eubanks break; 340*e440b493SArthur Eubanks } 341*e440b493SArthur Eubanks case Intrinsic::memcpy_inline: { 342*e440b493SArthur Eubanks MemCpyInlineInst *MCII = cast<MemCpyInlineInst>(&I); 343*e440b493SArthur Eubanks const uint64_t Size = MCII->getLength()->getValue().getLimitedValue(); 344*e440b493SArthur Eubanks visitMemoryReference(I, MCII->getDest(), Size, MCII->getDestAlign(), 345*e440b493SArthur Eubanks nullptr, MemRef::Write); 346*e440b493SArthur Eubanks visitMemoryReference(I, MCII->getSource(), Size, MCII->getSourceAlign(), 347*e440b493SArthur Eubanks nullptr, MemRef::Read); 348*e440b493SArthur Eubanks 349*e440b493SArthur Eubanks // Check that the memcpy arguments don't overlap. The AliasAnalysis API 350*e440b493SArthur Eubanks // isn't expressive enough for what we really want to do. Known partial 351*e440b493SArthur Eubanks // overlap is not distinguished from the case where nothing is known. 352*e440b493SArthur Eubanks const LocationSize LS = LocationSize::precise(Size); 353*e440b493SArthur Eubanks Assert(AA->alias(MCII->getSource(), LS, MCII->getDest(), LS) != MustAlias, 354*e440b493SArthur Eubanks "Undefined behavior: memcpy source and destination overlap", &I); 355*e440b493SArthur Eubanks break; 356*e440b493SArthur Eubanks } 357*e440b493SArthur Eubanks case Intrinsic::memmove: { 358*e440b493SArthur Eubanks MemMoveInst *MMI = cast<MemMoveInst>(&I); 359*e440b493SArthur Eubanks // TODO: If the size is known, use it. 360*e440b493SArthur Eubanks visitMemoryReference(I, MMI->getDest(), MemoryLocation::UnknownSize, 361*e440b493SArthur Eubanks MMI->getDestAlign(), nullptr, MemRef::Write); 362*e440b493SArthur Eubanks visitMemoryReference(I, MMI->getSource(), MemoryLocation::UnknownSize, 363*e440b493SArthur Eubanks MMI->getSourceAlign(), nullptr, MemRef::Read); 364*e440b493SArthur Eubanks break; 365*e440b493SArthur Eubanks } 366*e440b493SArthur Eubanks case Intrinsic::memset: { 367*e440b493SArthur Eubanks MemSetInst *MSI = cast<MemSetInst>(&I); 368*e440b493SArthur Eubanks // TODO: If the size is known, use it. 369*e440b493SArthur Eubanks visitMemoryReference(I, MSI->getDest(), MemoryLocation::UnknownSize, 370*e440b493SArthur Eubanks MSI->getDestAlign(), nullptr, MemRef::Write); 371*e440b493SArthur Eubanks break; 372*e440b493SArthur Eubanks } 373*e440b493SArthur Eubanks 374*e440b493SArthur Eubanks case Intrinsic::vastart: 375*e440b493SArthur Eubanks Assert(I.getParent()->getParent()->isVarArg(), 376*e440b493SArthur Eubanks "Undefined behavior: va_start called in a non-varargs function", 377*e440b493SArthur Eubanks &I); 378*e440b493SArthur Eubanks 379*e440b493SArthur Eubanks visitMemoryReference(I, I.getArgOperand(0), MemoryLocation::UnknownSize, 380*e440b493SArthur Eubanks None, nullptr, MemRef::Read | MemRef::Write); 381*e440b493SArthur Eubanks break; 382*e440b493SArthur Eubanks case Intrinsic::vacopy: 383*e440b493SArthur Eubanks visitMemoryReference(I, I.getArgOperand(0), MemoryLocation::UnknownSize, 384*e440b493SArthur Eubanks None, nullptr, MemRef::Write); 385*e440b493SArthur Eubanks visitMemoryReference(I, I.getArgOperand(1), MemoryLocation::UnknownSize, 386*e440b493SArthur Eubanks None, nullptr, MemRef::Read); 387*e440b493SArthur Eubanks break; 388*e440b493SArthur Eubanks case Intrinsic::vaend: 389*e440b493SArthur Eubanks visitMemoryReference(I, I.getArgOperand(0), MemoryLocation::UnknownSize, 390*e440b493SArthur Eubanks None, nullptr, MemRef::Read | MemRef::Write); 391*e440b493SArthur Eubanks break; 392*e440b493SArthur Eubanks 393*e440b493SArthur Eubanks case Intrinsic::stackrestore: 394*e440b493SArthur Eubanks // Stackrestore doesn't read or write memory, but it sets the 395*e440b493SArthur Eubanks // stack pointer, which the compiler may read from or write to 396*e440b493SArthur Eubanks // at any time, so check it for both readability and writeability. 397*e440b493SArthur Eubanks visitMemoryReference(I, I.getArgOperand(0), MemoryLocation::UnknownSize, 398*e440b493SArthur Eubanks None, nullptr, MemRef::Read | MemRef::Write); 399*e440b493SArthur Eubanks break; 400*e440b493SArthur Eubanks } 401*e440b493SArthur Eubanks } 402*e440b493SArthur Eubanks 403*e440b493SArthur Eubanks void Lint::visitReturnInst(ReturnInst &I) { 404*e440b493SArthur Eubanks Function *F = I.getParent()->getParent(); 405*e440b493SArthur Eubanks Assert(!F->doesNotReturn(), 406*e440b493SArthur Eubanks "Unusual: Return statement in function with noreturn attribute", &I); 407*e440b493SArthur Eubanks 408*e440b493SArthur Eubanks if (Value *V = I.getReturnValue()) { 409*e440b493SArthur Eubanks Value *Obj = findValue(V, /*OffsetOk=*/true); 410*e440b493SArthur Eubanks Assert(!isa<AllocaInst>(Obj), "Unusual: Returning alloca value", &I); 411*e440b493SArthur Eubanks } 412*e440b493SArthur Eubanks } 413*e440b493SArthur Eubanks 414*e440b493SArthur Eubanks // TODO: Check that the reference is in bounds. 415*e440b493SArthur Eubanks // TODO: Check readnone/readonly function attributes. 416*e440b493SArthur Eubanks void Lint::visitMemoryReference(Instruction &I, Value *Ptr, uint64_t Size, 417*e440b493SArthur Eubanks MaybeAlign Align, Type *Ty, unsigned Flags) { 418*e440b493SArthur Eubanks // If no memory is being referenced, it doesn't matter if the pointer 419*e440b493SArthur Eubanks // is valid. 420*e440b493SArthur Eubanks if (Size == 0) 421*e440b493SArthur Eubanks return; 422*e440b493SArthur Eubanks 423*e440b493SArthur Eubanks Value *UnderlyingObject = findValue(Ptr, /*OffsetOk=*/true); 424*e440b493SArthur Eubanks Assert(!isa<ConstantPointerNull>(UnderlyingObject), 425*e440b493SArthur Eubanks "Undefined behavior: Null pointer dereference", &I); 426*e440b493SArthur Eubanks Assert(!isa<UndefValue>(UnderlyingObject), 427*e440b493SArthur Eubanks "Undefined behavior: Undef pointer dereference", &I); 428*e440b493SArthur Eubanks Assert(!isa<ConstantInt>(UnderlyingObject) || 429*e440b493SArthur Eubanks !cast<ConstantInt>(UnderlyingObject)->isMinusOne(), 430*e440b493SArthur Eubanks "Unusual: All-ones pointer dereference", &I); 431*e440b493SArthur Eubanks Assert(!isa<ConstantInt>(UnderlyingObject) || 432*e440b493SArthur Eubanks !cast<ConstantInt>(UnderlyingObject)->isOne(), 433*e440b493SArthur Eubanks "Unusual: Address one pointer dereference", &I); 434*e440b493SArthur Eubanks 435*e440b493SArthur Eubanks if (Flags & MemRef::Write) { 436*e440b493SArthur Eubanks if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(UnderlyingObject)) 437*e440b493SArthur Eubanks Assert(!GV->isConstant(), "Undefined behavior: Write to read-only memory", 438*e440b493SArthur Eubanks &I); 439*e440b493SArthur Eubanks Assert(!isa<Function>(UnderlyingObject) && 440*e440b493SArthur Eubanks !isa<BlockAddress>(UnderlyingObject), 441*e440b493SArthur Eubanks "Undefined behavior: Write to text section", &I); 442*e440b493SArthur Eubanks } 443*e440b493SArthur Eubanks if (Flags & MemRef::Read) { 444*e440b493SArthur Eubanks Assert(!isa<Function>(UnderlyingObject), "Unusual: Load from function body", 445*e440b493SArthur Eubanks &I); 446*e440b493SArthur Eubanks Assert(!isa<BlockAddress>(UnderlyingObject), 447*e440b493SArthur Eubanks "Undefined behavior: Load from block address", &I); 448*e440b493SArthur Eubanks } 449*e440b493SArthur Eubanks if (Flags & MemRef::Callee) { 450*e440b493SArthur Eubanks Assert(!isa<BlockAddress>(UnderlyingObject), 451*e440b493SArthur Eubanks "Undefined behavior: Call to block address", &I); 452*e440b493SArthur Eubanks } 453*e440b493SArthur Eubanks if (Flags & MemRef::Branchee) { 454*e440b493SArthur Eubanks Assert(!isa<Constant>(UnderlyingObject) || 455*e440b493SArthur Eubanks isa<BlockAddress>(UnderlyingObject), 456*e440b493SArthur Eubanks "Undefined behavior: Branch to non-blockaddress", &I); 457*e440b493SArthur Eubanks } 458*e440b493SArthur Eubanks 459*e440b493SArthur Eubanks // Check for buffer overflows and misalignment. 460*e440b493SArthur Eubanks // Only handles memory references that read/write something simple like an 461*e440b493SArthur Eubanks // alloca instruction or a global variable. 462*e440b493SArthur Eubanks int64_t Offset = 0; 463*e440b493SArthur Eubanks if (Value *Base = GetPointerBaseWithConstantOffset(Ptr, Offset, *DL)) { 464*e440b493SArthur Eubanks // OK, so the access is to a constant offset from Ptr. Check that Ptr is 465*e440b493SArthur Eubanks // something we can handle and if so extract the size of this base object 466*e440b493SArthur Eubanks // along with its alignment. 467*e440b493SArthur Eubanks uint64_t BaseSize = MemoryLocation::UnknownSize; 468*e440b493SArthur Eubanks MaybeAlign BaseAlign; 469*e440b493SArthur Eubanks 470*e440b493SArthur Eubanks if (AllocaInst *AI = dyn_cast<AllocaInst>(Base)) { 471*e440b493SArthur Eubanks Type *ATy = AI->getAllocatedType(); 472*e440b493SArthur Eubanks if (!AI->isArrayAllocation() && ATy->isSized()) 473*e440b493SArthur Eubanks BaseSize = DL->getTypeAllocSize(ATy); 474*e440b493SArthur Eubanks BaseAlign = AI->getAlign(); 475*e440b493SArthur Eubanks } else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Base)) { 476*e440b493SArthur Eubanks // If the global may be defined differently in another compilation unit 477*e440b493SArthur Eubanks // then don't warn about funky memory accesses. 478*e440b493SArthur Eubanks if (GV->hasDefinitiveInitializer()) { 479*e440b493SArthur Eubanks Type *GTy = GV->getValueType(); 480*e440b493SArthur Eubanks if (GTy->isSized()) 481*e440b493SArthur Eubanks BaseSize = DL->getTypeAllocSize(GTy); 482*e440b493SArthur Eubanks BaseAlign = GV->getAlign(); 483*e440b493SArthur Eubanks if (!BaseAlign && GTy->isSized()) 484*e440b493SArthur Eubanks BaseAlign = DL->getABITypeAlign(GTy); 485*e440b493SArthur Eubanks } 486*e440b493SArthur Eubanks } 487*e440b493SArthur Eubanks 488*e440b493SArthur Eubanks // Accesses from before the start or after the end of the object are not 489*e440b493SArthur Eubanks // defined. 490*e440b493SArthur Eubanks Assert(Size == MemoryLocation::UnknownSize || 491*e440b493SArthur Eubanks BaseSize == MemoryLocation::UnknownSize || 492*e440b493SArthur Eubanks (Offset >= 0 && Offset + Size <= BaseSize), 493*e440b493SArthur Eubanks "Undefined behavior: Buffer overflow", &I); 494*e440b493SArthur Eubanks 495*e440b493SArthur Eubanks // Accesses that say that the memory is more aligned than it is are not 496*e440b493SArthur Eubanks // defined. 497*e440b493SArthur Eubanks if (!Align && Ty && Ty->isSized()) 498*e440b493SArthur Eubanks Align = DL->getABITypeAlign(Ty); 499*e440b493SArthur Eubanks if (BaseAlign && Align) 500*e440b493SArthur Eubanks Assert(*Align <= commonAlignment(*BaseAlign, Offset), 501*e440b493SArthur Eubanks "Undefined behavior: Memory reference address is misaligned", &I); 502*e440b493SArthur Eubanks } 503*e440b493SArthur Eubanks } 504*e440b493SArthur Eubanks 505*e440b493SArthur Eubanks void Lint::visitLoadInst(LoadInst &I) { 506*e440b493SArthur Eubanks visitMemoryReference(I, I.getPointerOperand(), 507*e440b493SArthur Eubanks DL->getTypeStoreSize(I.getType()), I.getAlign(), 508*e440b493SArthur Eubanks I.getType(), MemRef::Read); 509*e440b493SArthur Eubanks } 510*e440b493SArthur Eubanks 511*e440b493SArthur Eubanks void Lint::visitStoreInst(StoreInst &I) { 512*e440b493SArthur Eubanks visitMemoryReference(I, I.getPointerOperand(), 513*e440b493SArthur Eubanks DL->getTypeStoreSize(I.getOperand(0)->getType()), 514*e440b493SArthur Eubanks I.getAlign(), I.getOperand(0)->getType(), MemRef::Write); 515*e440b493SArthur Eubanks } 516*e440b493SArthur Eubanks 517*e440b493SArthur Eubanks void Lint::visitXor(BinaryOperator &I) { 518*e440b493SArthur Eubanks Assert(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)), 519*e440b493SArthur Eubanks "Undefined result: xor(undef, undef)", &I); 520*e440b493SArthur Eubanks } 521*e440b493SArthur Eubanks 522*e440b493SArthur Eubanks void Lint::visitSub(BinaryOperator &I) { 523*e440b493SArthur Eubanks Assert(!isa<UndefValue>(I.getOperand(0)) || !isa<UndefValue>(I.getOperand(1)), 524*e440b493SArthur Eubanks "Undefined result: sub(undef, undef)", &I); 525*e440b493SArthur Eubanks } 526*e440b493SArthur Eubanks 527*e440b493SArthur Eubanks void Lint::visitLShr(BinaryOperator &I) { 528*e440b493SArthur Eubanks if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(1), 529*e440b493SArthur Eubanks /*OffsetOk=*/false))) 530*e440b493SArthur Eubanks Assert(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), 531*e440b493SArthur Eubanks "Undefined result: Shift count out of range", &I); 532*e440b493SArthur Eubanks } 533*e440b493SArthur Eubanks 534*e440b493SArthur Eubanks void Lint::visitAShr(BinaryOperator &I) { 535*e440b493SArthur Eubanks if (ConstantInt *CI = 536*e440b493SArthur Eubanks dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false))) 537*e440b493SArthur Eubanks Assert(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), 538*e440b493SArthur Eubanks "Undefined result: Shift count out of range", &I); 539*e440b493SArthur Eubanks } 540*e440b493SArthur Eubanks 541*e440b493SArthur Eubanks void Lint::visitShl(BinaryOperator &I) { 542*e440b493SArthur Eubanks if (ConstantInt *CI = 543*e440b493SArthur Eubanks dyn_cast<ConstantInt>(findValue(I.getOperand(1), /*OffsetOk=*/false))) 544*e440b493SArthur Eubanks Assert(CI->getValue().ult(cast<IntegerType>(I.getType())->getBitWidth()), 545*e440b493SArthur Eubanks "Undefined result: Shift count out of range", &I); 546*e440b493SArthur Eubanks } 547*e440b493SArthur Eubanks 548*e440b493SArthur Eubanks static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, 549*e440b493SArthur Eubanks AssumptionCache *AC) { 550*e440b493SArthur Eubanks // Assume undef could be zero. 551*e440b493SArthur Eubanks if (isa<UndefValue>(V)) 552*e440b493SArthur Eubanks return true; 553*e440b493SArthur Eubanks 554*e440b493SArthur Eubanks VectorType *VecTy = dyn_cast<VectorType>(V->getType()); 555*e440b493SArthur Eubanks if (!VecTy) { 556*e440b493SArthur Eubanks KnownBits Known = computeKnownBits(V, DL, 0, AC, dyn_cast<Instruction>(V), DT); 557*e440b493SArthur Eubanks return Known.isZero(); 558*e440b493SArthur Eubanks } 559*e440b493SArthur Eubanks 560*e440b493SArthur Eubanks // Per-component check doesn't work with zeroinitializer 561*e440b493SArthur Eubanks Constant *C = dyn_cast<Constant>(V); 562*e440b493SArthur Eubanks if (!C) 563*e440b493SArthur Eubanks return false; 564*e440b493SArthur Eubanks 565*e440b493SArthur Eubanks if (C->isZeroValue()) 566*e440b493SArthur Eubanks return true; 567*e440b493SArthur Eubanks 568*e440b493SArthur Eubanks // For a vector, KnownZero will only be true if all values are zero, so check 569*e440b493SArthur Eubanks // this per component 570*e440b493SArthur Eubanks for (unsigned I = 0, N = cast<FixedVectorType>(VecTy)->getNumElements(); 571*e440b493SArthur Eubanks I != N; ++I) { 572*e440b493SArthur Eubanks Constant *Elem = C->getAggregateElement(I); 573*e440b493SArthur Eubanks if (isa<UndefValue>(Elem)) 574*e440b493SArthur Eubanks return true; 575*e440b493SArthur Eubanks 576*e440b493SArthur Eubanks KnownBits Known = computeKnownBits(Elem, DL); 577*e440b493SArthur Eubanks if (Known.isZero()) 578*e440b493SArthur Eubanks return true; 579*e440b493SArthur Eubanks } 580*e440b493SArthur Eubanks 581*e440b493SArthur Eubanks return false; 582*e440b493SArthur Eubanks } 583*e440b493SArthur Eubanks 584*e440b493SArthur Eubanks void Lint::visitSDiv(BinaryOperator &I) { 585*e440b493SArthur Eubanks Assert(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), 586*e440b493SArthur Eubanks "Undefined behavior: Division by zero", &I); 587*e440b493SArthur Eubanks } 588*e440b493SArthur Eubanks 589*e440b493SArthur Eubanks void Lint::visitUDiv(BinaryOperator &I) { 590*e440b493SArthur Eubanks Assert(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), 591*e440b493SArthur Eubanks "Undefined behavior: Division by zero", &I); 592*e440b493SArthur Eubanks } 593*e440b493SArthur Eubanks 594*e440b493SArthur Eubanks void Lint::visitSRem(BinaryOperator &I) { 595*e440b493SArthur Eubanks Assert(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), 596*e440b493SArthur Eubanks "Undefined behavior: Division by zero", &I); 597*e440b493SArthur Eubanks } 598*e440b493SArthur Eubanks 599*e440b493SArthur Eubanks void Lint::visitURem(BinaryOperator &I) { 600*e440b493SArthur Eubanks Assert(!isZero(I.getOperand(1), I.getModule()->getDataLayout(), DT, AC), 601*e440b493SArthur Eubanks "Undefined behavior: Division by zero", &I); 602*e440b493SArthur Eubanks } 603*e440b493SArthur Eubanks 604*e440b493SArthur Eubanks void Lint::visitAllocaInst(AllocaInst &I) { 605*e440b493SArthur Eubanks if (isa<ConstantInt>(I.getArraySize())) 606*e440b493SArthur Eubanks // This isn't undefined behavior, it's just an obvious pessimization. 607*e440b493SArthur Eubanks Assert(&I.getParent()->getParent()->getEntryBlock() == I.getParent(), 608*e440b493SArthur Eubanks "Pessimization: Static alloca outside of entry block", &I); 609*e440b493SArthur Eubanks 610*e440b493SArthur Eubanks // TODO: Check for an unusual size (MSB set?) 611*e440b493SArthur Eubanks } 612*e440b493SArthur Eubanks 613*e440b493SArthur Eubanks void Lint::visitVAArgInst(VAArgInst &I) { 614*e440b493SArthur Eubanks visitMemoryReference(I, I.getOperand(0), MemoryLocation::UnknownSize, None, 615*e440b493SArthur Eubanks nullptr, MemRef::Read | MemRef::Write); 616*e440b493SArthur Eubanks } 617*e440b493SArthur Eubanks 618*e440b493SArthur Eubanks void Lint::visitIndirectBrInst(IndirectBrInst &I) { 619*e440b493SArthur Eubanks visitMemoryReference(I, I.getAddress(), MemoryLocation::UnknownSize, None, 620*e440b493SArthur Eubanks nullptr, MemRef::Branchee); 621*e440b493SArthur Eubanks 622*e440b493SArthur Eubanks Assert(I.getNumDestinations() != 0, 623*e440b493SArthur Eubanks "Undefined behavior: indirectbr with no destinations", &I); 624*e440b493SArthur Eubanks } 625*e440b493SArthur Eubanks 626*e440b493SArthur Eubanks void Lint::visitExtractElementInst(ExtractElementInst &I) { 627*e440b493SArthur Eubanks if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getIndexOperand(), 628*e440b493SArthur Eubanks /*OffsetOk=*/false))) 629*e440b493SArthur Eubanks Assert( 630*e440b493SArthur Eubanks CI->getValue().ult( 631*e440b493SArthur Eubanks cast<FixedVectorType>(I.getVectorOperandType())->getNumElements()), 632*e440b493SArthur Eubanks "Undefined result: extractelement index out of range", &I); 633*e440b493SArthur Eubanks } 634*e440b493SArthur Eubanks 635*e440b493SArthur Eubanks void Lint::visitInsertElementInst(InsertElementInst &I) { 636*e440b493SArthur Eubanks if (ConstantInt *CI = dyn_cast<ConstantInt>(findValue(I.getOperand(2), 637*e440b493SArthur Eubanks /*OffsetOk=*/false))) 638*e440b493SArthur Eubanks Assert(CI->getValue().ult( 639*e440b493SArthur Eubanks cast<FixedVectorType>(I.getType())->getNumElements()), 640*e440b493SArthur Eubanks "Undefined result: insertelement index out of range", &I); 641*e440b493SArthur Eubanks } 642*e440b493SArthur Eubanks 643*e440b493SArthur Eubanks void Lint::visitUnreachableInst(UnreachableInst &I) { 644*e440b493SArthur Eubanks // This isn't undefined behavior, it's merely suspicious. 645*e440b493SArthur Eubanks Assert(&I == &I.getParent()->front() || 646*e440b493SArthur Eubanks std::prev(I.getIterator())->mayHaveSideEffects(), 647*e440b493SArthur Eubanks "Unusual: unreachable immediately preceded by instruction without " 648*e440b493SArthur Eubanks "side effects", 649*e440b493SArthur Eubanks &I); 650*e440b493SArthur Eubanks } 651*e440b493SArthur Eubanks 652*e440b493SArthur Eubanks /// findValue - Look through bitcasts and simple memory reference patterns 653*e440b493SArthur Eubanks /// to identify an equivalent, but more informative, value. If OffsetOk 654*e440b493SArthur Eubanks /// is true, look through getelementptrs with non-zero offsets too. 655*e440b493SArthur Eubanks /// 656*e440b493SArthur Eubanks /// Most analysis passes don't require this logic, because instcombine 657*e440b493SArthur Eubanks /// will simplify most of these kinds of things away. But it's a goal of 658*e440b493SArthur Eubanks /// this Lint pass to be useful even on non-optimized IR. 659*e440b493SArthur Eubanks Value *Lint::findValue(Value *V, bool OffsetOk) const { 660*e440b493SArthur Eubanks SmallPtrSet<Value *, 4> Visited; 661*e440b493SArthur Eubanks return findValueImpl(V, OffsetOk, Visited); 662*e440b493SArthur Eubanks } 663*e440b493SArthur Eubanks 664*e440b493SArthur Eubanks /// findValueImpl - Implementation helper for findValue. 665*e440b493SArthur Eubanks Value *Lint::findValueImpl(Value *V, bool OffsetOk, 666*e440b493SArthur Eubanks SmallPtrSetImpl<Value *> &Visited) const { 667*e440b493SArthur Eubanks // Detect self-referential values. 668*e440b493SArthur Eubanks if (!Visited.insert(V).second) 669*e440b493SArthur Eubanks return UndefValue::get(V->getType()); 670*e440b493SArthur Eubanks 671*e440b493SArthur Eubanks // TODO: Look through sext or zext cast, when the result is known to 672*e440b493SArthur Eubanks // be interpreted as signed or unsigned, respectively. 673*e440b493SArthur Eubanks // TODO: Look through eliminable cast pairs. 674*e440b493SArthur Eubanks // TODO: Look through calls with unique return values. 675*e440b493SArthur Eubanks // TODO: Look through vector insert/extract/shuffle. 676*e440b493SArthur Eubanks V = OffsetOk ? getUnderlyingObject(V) : V->stripPointerCasts(); 677*e440b493SArthur Eubanks if (LoadInst *L = dyn_cast<LoadInst>(V)) { 678*e440b493SArthur Eubanks BasicBlock::iterator BBI = L->getIterator(); 679*e440b493SArthur Eubanks BasicBlock *BB = L->getParent(); 680*e440b493SArthur Eubanks SmallPtrSet<BasicBlock *, 4> VisitedBlocks; 681*e440b493SArthur Eubanks for (;;) { 682*e440b493SArthur Eubanks if (!VisitedBlocks.insert(BB).second) 683*e440b493SArthur Eubanks break; 684*e440b493SArthur Eubanks if (Value *U = 685*e440b493SArthur Eubanks FindAvailableLoadedValue(L, BB, BBI, DefMaxInstsToScan, AA)) 686*e440b493SArthur Eubanks return findValueImpl(U, OffsetOk, Visited); 687*e440b493SArthur Eubanks if (BBI != BB->begin()) break; 688*e440b493SArthur Eubanks BB = BB->getUniquePredecessor(); 689*e440b493SArthur Eubanks if (!BB) break; 690*e440b493SArthur Eubanks BBI = BB->end(); 691*e440b493SArthur Eubanks } 692*e440b493SArthur Eubanks } else if (PHINode *PN = dyn_cast<PHINode>(V)) { 693*e440b493SArthur Eubanks if (Value *W = PN->hasConstantValue()) 694*e440b493SArthur Eubanks return findValueImpl(W, OffsetOk, Visited); 695*e440b493SArthur Eubanks } else if (CastInst *CI = dyn_cast<CastInst>(V)) { 696*e440b493SArthur Eubanks if (CI->isNoopCast(*DL)) 697*e440b493SArthur Eubanks return findValueImpl(CI->getOperand(0), OffsetOk, Visited); 698*e440b493SArthur Eubanks } else if (ExtractValueInst *Ex = dyn_cast<ExtractValueInst>(V)) { 699*e440b493SArthur Eubanks if (Value *W = FindInsertedValue(Ex->getAggregateOperand(), 700*e440b493SArthur Eubanks Ex->getIndices())) 701*e440b493SArthur Eubanks if (W != V) 702*e440b493SArthur Eubanks return findValueImpl(W, OffsetOk, Visited); 703*e440b493SArthur Eubanks } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 704*e440b493SArthur Eubanks // Same as above, but for ConstantExpr instead of Instruction. 705*e440b493SArthur Eubanks if (Instruction::isCast(CE->getOpcode())) { 706*e440b493SArthur Eubanks if (CastInst::isNoopCast(Instruction::CastOps(CE->getOpcode()), 707*e440b493SArthur Eubanks CE->getOperand(0)->getType(), CE->getType(), 708*e440b493SArthur Eubanks *DL)) 709*e440b493SArthur Eubanks return findValueImpl(CE->getOperand(0), OffsetOk, Visited); 710*e440b493SArthur Eubanks } else if (CE->getOpcode() == Instruction::ExtractValue) { 711*e440b493SArthur Eubanks ArrayRef<unsigned> Indices = CE->getIndices(); 712*e440b493SArthur Eubanks if (Value *W = FindInsertedValue(CE->getOperand(0), Indices)) 713*e440b493SArthur Eubanks if (W != V) 714*e440b493SArthur Eubanks return findValueImpl(W, OffsetOk, Visited); 715*e440b493SArthur Eubanks } 716*e440b493SArthur Eubanks } 717*e440b493SArthur Eubanks 718*e440b493SArthur Eubanks // As a last resort, try SimplifyInstruction or constant folding. 719*e440b493SArthur Eubanks if (Instruction *Inst = dyn_cast<Instruction>(V)) { 720*e440b493SArthur Eubanks if (Value *W = SimplifyInstruction(Inst, {*DL, TLI, DT, AC})) 721*e440b493SArthur Eubanks return findValueImpl(W, OffsetOk, Visited); 722*e440b493SArthur Eubanks } else if (auto *C = dyn_cast<Constant>(V)) { 723*e440b493SArthur Eubanks Value *W = ConstantFoldConstant(C, *DL, TLI); 724*e440b493SArthur Eubanks if (W != V) 725*e440b493SArthur Eubanks return findValueImpl(W, OffsetOk, Visited); 726*e440b493SArthur Eubanks } 727*e440b493SArthur Eubanks 728*e440b493SArthur Eubanks return V; 729*e440b493SArthur Eubanks } 730*e440b493SArthur Eubanks 731*e440b493SArthur Eubanks //===----------------------------------------------------------------------===// 732*e440b493SArthur Eubanks // Implement the public interfaces to this file... 733*e440b493SArthur Eubanks //===----------------------------------------------------------------------===// 734*e440b493SArthur Eubanks 735*e440b493SArthur Eubanks FunctionPass *llvm::createLintPass() { 736*e440b493SArthur Eubanks return new Lint(); 737*e440b493SArthur Eubanks } 738*e440b493SArthur Eubanks 739*e440b493SArthur Eubanks /// lintFunction - Check a function for errors, printing messages on stderr. 740*e440b493SArthur Eubanks /// 741*e440b493SArthur Eubanks void llvm::lintFunction(const Function &f) { 742*e440b493SArthur Eubanks Function &F = const_cast<Function&>(f); 743*e440b493SArthur Eubanks assert(!F.isDeclaration() && "Cannot lint external functions"); 744*e440b493SArthur Eubanks 745*e440b493SArthur Eubanks legacy::FunctionPassManager FPM(F.getParent()); 746*e440b493SArthur Eubanks Lint *V = new Lint(); 747*e440b493SArthur Eubanks FPM.add(V); 748*e440b493SArthur Eubanks FPM.run(F); 749*e440b493SArthur Eubanks } 750*e440b493SArthur Eubanks 751*e440b493SArthur Eubanks /// lintModule - Check a module for errors, printing messages on stderr. 752*e440b493SArthur Eubanks /// 753*e440b493SArthur Eubanks void llvm::lintModule(const Module &M) { 754*e440b493SArthur Eubanks legacy::PassManager PM; 755*e440b493SArthur Eubanks Lint *V = new Lint(); 756*e440b493SArthur Eubanks PM.add(V); 757*e440b493SArthur Eubanks PM.run(const_cast<Module&>(M)); 758*e440b493SArthur Eubanks } 759