diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
| commit | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (patch) | |
| tree | a6140557876943cdd800ee997c9317283394b22c /lib/Analysis/MemoryBuiltins.cpp | |
| parent | f03b5bed27d0d2eafd68562ce14f8b5e3f1f0801 (diff) | |
Notes
Diffstat (limited to 'lib/Analysis/MemoryBuiltins.cpp')
| -rw-r--r-- | lib/Analysis/MemoryBuiltins.cpp | 67 | 
1 files changed, 23 insertions, 44 deletions
diff --git a/lib/Analysis/MemoryBuiltins.cpp b/lib/Analysis/MemoryBuiltins.cpp index 08b41fee44594..8ddac8ffb971c 100644 --- a/lib/Analysis/MemoryBuiltins.cpp +++ b/lib/Analysis/MemoryBuiltins.cpp @@ -15,6 +15,7 @@  #include "llvm/Analysis/MemoryBuiltins.h"  #include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/Statistic.h" +#include "llvm/Analysis/TargetLibraryInfo.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/IR/DataLayout.h"  #include "llvm/IR/GlobalVariable.h" @@ -25,7 +26,6 @@  #include "llvm/Support/Debug.h"  #include "llvm/Support/MathExtras.h"  #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetLibraryInfo.h"  #include "llvm/Transforms/Utils/Local.h"  using namespace llvm; @@ -206,7 +206,7 @@ const CallInst *llvm::extractMallocCall(const Value *I,    return isMallocLikeFn(I, TLI) ? dyn_cast<CallInst>(I) : nullptr;  } -static Value *computeArraySize(const CallInst *CI, const DataLayout *DL, +static Value *computeArraySize(const CallInst *CI, const DataLayout &DL,                                 const TargetLibraryInfo *TLI,                                 bool LookThroughSExt = false) {    if (!CI) @@ -214,12 +214,12 @@ static Value *computeArraySize(const CallInst *CI, const DataLayout *DL,    // The size of the malloc's result type must be known to determine array size.    Type *T = getMallocAllocatedType(CI, TLI); -  if (!T || !T->isSized() || !DL) +  if (!T || !T->isSized())      return nullptr; -  unsigned ElementSize = DL->getTypeAllocSize(T); +  unsigned ElementSize = DL.getTypeAllocSize(T);    if (StructType *ST = dyn_cast<StructType>(T)) -    ElementSize = DL->getStructLayout(ST)->getSizeInBytes(); +    ElementSize = DL.getStructLayout(ST)->getSizeInBytes();    // If malloc call's arg can be determined to be a multiple of ElementSize,    // return the multiple.  Otherwise, return NULL. @@ -232,23 +232,6 @@ static Value *computeArraySize(const CallInst *CI, const DataLayout *DL,    return nullptr;  } -/// isArrayMalloc - Returns the corresponding CallInst if the instruction -/// is a call to malloc whose array size can be determined and the array size -/// is not constant 1.  Otherwise, return NULL. -const CallInst *llvm::isArrayMalloc(const Value *I, -                                    const DataLayout *DL, -                                    const TargetLibraryInfo *TLI) { -  const CallInst *CI = extractMallocCall(I, TLI); -  Value *ArraySize = computeArraySize(CI, DL, TLI); - -  if (ConstantInt *ConstSize = dyn_cast_or_null<ConstantInt>(ArraySize)) -    if (ConstSize->isOne()) -      return CI; - -  // CI is a non-array malloc or we can't figure out that it is an array malloc. -  return nullptr; -} -  /// getMallocType - Returns the PointerType resulting from the malloc call.  /// The PointerType depends on the number of bitcast uses of the malloc call:  ///   0: PointerType is the calls' return type. @@ -297,7 +280,7 @@ Type *llvm::getMallocAllocatedType(const CallInst *CI,  /// then return that multiple.  For non-array mallocs, the multiple is  /// constant 1.  Otherwise, return NULL for mallocs whose array size cannot be  /// determined. -Value *llvm::getMallocArraySize(CallInst *CI, const DataLayout *DL, +Value *llvm::getMallocArraySize(CallInst *CI, const DataLayout &DL,                                  const TargetLibraryInfo *TLI,                                  bool LookThroughSExt) {    assert(isMallocLikeFn(CI, TLI) && "getMallocArraySize and not malloc call"); @@ -319,7 +302,7 @@ const CallInst *llvm::isFreeCall(const Value *I, const TargetLibraryInfo *TLI) {    if (!CI || isa<IntrinsicInst>(CI))      return nullptr;    Function *Callee = CI->getCalledFunction(); -  if (Callee == nullptr || !Callee->isDeclaration()) +  if (Callee == nullptr)      return nullptr;    StringRef FnName = Callee->getName(); @@ -367,11 +350,8 @@ const CallInst *llvm::isFreeCall(const Value *I, const TargetLibraryInfo *TLI) {  /// object size in Size if successful, and false otherwise.  /// If RoundToAlign is true, then Size is rounded up to the aligment of allocas,  /// byval arguments, and global variables. -bool llvm::getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout *DL, +bool llvm::getObjectSize(const Value *Ptr, uint64_t &Size, const DataLayout &DL,                           const TargetLibraryInfo *TLI, bool RoundToAlign) { -  if (!DL) -    return false; -    ObjectSizeOffsetVisitor Visitor(DL, TLI, Ptr->getContext(), RoundToAlign);    SizeOffsetType Data = Visitor.compute(const_cast<Value*>(Ptr));    if (!Visitor.bothKnown(Data)) @@ -399,17 +379,17 @@ APInt ObjectSizeOffsetVisitor::align(APInt Size, uint64_t Align) {    return Size;  } -ObjectSizeOffsetVisitor::ObjectSizeOffsetVisitor(const DataLayout *DL, +ObjectSizeOffsetVisitor::ObjectSizeOffsetVisitor(const DataLayout &DL,                                                   const TargetLibraryInfo *TLI,                                                   LLVMContext &Context,                                                   bool RoundToAlign) -: DL(DL), TLI(TLI), RoundToAlign(RoundToAlign) { +    : DL(DL), TLI(TLI), RoundToAlign(RoundToAlign) {    // Pointer size must be rechecked for each object visited since it could have    // a different address space.  }  SizeOffsetType ObjectSizeOffsetVisitor::compute(Value *V) { -  IntTyBits = DL->getPointerTypeSizeInBits(V->getType()); +  IntTyBits = DL.getPointerTypeSizeInBits(V->getType());    Zero = APInt::getNullValue(IntTyBits);    V = V->stripPointerCasts(); @@ -449,7 +429,7 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitAllocaInst(AllocaInst &I) {    if (!I.getAllocatedType()->isSized())      return unknown(); -  APInt Size(IntTyBits, DL->getTypeAllocSize(I.getAllocatedType())); +  APInt Size(IntTyBits, DL.getTypeAllocSize(I.getAllocatedType()));    if (!I.isArrayAllocation())      return std::make_pair(align(Size, I.getAlignment()), Zero); @@ -468,7 +448,7 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitArgument(Argument &A) {      return unknown();    }    PointerType *PT = cast<PointerType>(A.getType()); -  APInt Size(IntTyBits, DL->getTypeAllocSize(PT->getElementType())); +  APInt Size(IntTyBits, DL.getTypeAllocSize(PT->getElementType()));    return std::make_pair(align(Size, A.getParamAlignment()), Zero);  } @@ -541,7 +521,7 @@ ObjectSizeOffsetVisitor::visitExtractValueInst(ExtractValueInst&) {  SizeOffsetType ObjectSizeOffsetVisitor::visitGEPOperator(GEPOperator &GEP) {    SizeOffsetType PtrData = compute(GEP.getPointerOperand());    APInt Offset(IntTyBits, 0); -  if (!bothKnown(PtrData) || !GEP.accumulateConstantOffset(*DL, Offset)) +  if (!bothKnown(PtrData) || !GEP.accumulateConstantOffset(DL, Offset))      return unknown();    return std::make_pair(PtrData.first, PtrData.second + Offset); @@ -557,7 +537,7 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitGlobalVariable(GlobalVariable &GV){    if (!GV.hasDefinitiveInitializer())      return unknown(); -  APInt Size(IntTyBits, DL->getTypeAllocSize(GV.getType()->getElementType())); +  APInt Size(IntTyBits, DL.getTypeAllocSize(GV.getType()->getElementType()));    return std::make_pair(align(Size, GV.getAlignment()), Zero);  } @@ -593,19 +573,18 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitInstruction(Instruction &I) {    return unknown();  } -ObjectSizeOffsetEvaluator::ObjectSizeOffsetEvaluator(const DataLayout *DL, -                                                     const TargetLibraryInfo *TLI, -                                                     LLVMContext &Context, -                                                     bool RoundToAlign) -: DL(DL), TLI(TLI), Context(Context), Builder(Context, TargetFolder(DL)), -  RoundToAlign(RoundToAlign) { +ObjectSizeOffsetEvaluator::ObjectSizeOffsetEvaluator( +    const DataLayout &DL, const TargetLibraryInfo *TLI, LLVMContext &Context, +    bool RoundToAlign) +    : DL(DL), TLI(TLI), Context(Context), Builder(Context, TargetFolder(DL)), +      RoundToAlign(RoundToAlign) {    // IntTy and Zero must be set for each compute() since the address space may    // be different for later objects.  }  SizeOffsetEvalType ObjectSizeOffsetEvaluator::compute(Value *V) {    // XXX - Are vectors of pointers possible here? -  IntTy = cast<IntegerType>(DL->getIntPtrType(V->getType())); +  IntTy = cast<IntegerType>(DL.getIntPtrType(V->getType()));    Zero = ConstantInt::get(IntTy, 0);    SizeOffsetEvalType Result = compute_(V); @@ -687,7 +666,7 @@ SizeOffsetEvalType ObjectSizeOffsetEvaluator::visitAllocaInst(AllocaInst &I) {    assert(I.isArrayAllocation());    Value *ArraySize = I.getArraySize();    Value *Size = ConstantInt::get(ArraySize->getType(), -                                 DL->getTypeAllocSize(I.getAllocatedType())); +                                 DL.getTypeAllocSize(I.getAllocatedType()));    Size = Builder.CreateMul(Size, ArraySize);    return std::make_pair(Size, Zero);  } @@ -739,7 +718,7 @@ ObjectSizeOffsetEvaluator::visitGEPOperator(GEPOperator &GEP) {    if (!bothKnown(PtrData))      return unknown(); -  Value *Offset = EmitGEPOffset(&Builder, *DL, &GEP, /*NoAssumptions=*/true); +  Value *Offset = EmitGEPOffset(&Builder, DL, &GEP, /*NoAssumptions=*/true);    Offset = Builder.CreateAdd(PtrData.second, Offset);    return std::make_pair(PtrData.first, Offset);  }  | 
