1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

Add a missing function.

llvm-svn: 110195
This commit is contained in:
Torok Edwin 2010-08-04 11:42:45 +00:00
parent 50fb0419ea
commit 967fc5164f
2 changed files with 50 additions and 0 deletions

View File

@ -98,6 +98,7 @@ namespace llvm {
virtual bool runOnFunction(Function &F);
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
void print(raw_ostream &OS, const Module* = 0) const;
Value *computeAllocationCountValue(Value *P, const Type *&Ty) const;
private:
Function *FF;
TargetData *TD;

View File

@ -144,6 +144,55 @@ const SCEV *PointerTracking::computeAllocationCount(Value *P,
return SE->getCouldNotCompute();
}
Value *PointerTracking::computeAllocationCountValue(Value *P, const Type *&Ty) const
{
Value *V = P->stripPointerCasts();
if (AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
Ty = AI->getAllocatedType();
// arraySize elements of type Ty.
return AI->getArraySize();
}
if (CallInst *CI = extractMallocCall(V)) {
Ty = getMallocAllocatedType(CI);
if (!Ty)
return 0;
Value *arraySize = getMallocArraySize(CI, TD);
if (!arraySize) {
Ty = Type::getInt8Ty(P->getContext());
return CI->getArgOperand(0);
}
// arraySize elements of type Ty.
return arraySize;
}
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
if (GV->hasDefinitiveInitializer()) {
Constant *C = GV->getInitializer();
if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
Ty = ATy->getElementType();
return ConstantInt::get(Type::getInt32Ty(P->getContext()),
ATy->getNumElements());
}
}
Ty = cast<PointerType>(GV->getType())->getElementType();
return ConstantInt::get(Type::getInt32Ty(P->getContext()), 1);
//TODO: implement more tracking for globals
}
if (CallInst *CI = dyn_cast<CallInst>(V)) {
CallSite CS(CI);
Function *F = dyn_cast<Function>(CS.getCalledValue()->stripPointerCasts());
if (F == reallocFunc) {
Ty = Type::getInt8Ty(P->getContext());
// realloc allocates arg1 bytes.
return CS.getArgument(1);
}
}
return 0;
}
// Calculates the number of elements of type Ty allocated for P.
const SCEV *PointerTracking::computeAllocationCountForType(Value *P,
const Type *Ty)