summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-10 17:41:01 +0000
committerChris Lattner <sabre@nondot.org>2004-02-10 17:41:01 +0000
commit3232bbb9d865c72256edb90814b46186eea042cd (patch)
treeb96c8b65e3888c1b9ab0949d29f56c911d741c62 /llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
parentb94ff3c67cd5b8345ac44767a83a80b139bebe65 (diff)
downloadbcm5719-llvm-3232bbb9d865c72256edb90814b46186eea042cd.tar.gz
bcm5719-llvm-3232bbb9d865c72256edb90814b46186eea042cd.zip
initialization calls now return argc. If the program uses the argc value
passed into main, make sure they use the return value of the init call instead of the one passed in. llvm-svn: 11262
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp b/llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
index 7b38d70d9e3..8dacc92bc26 100644
--- a/llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
+++ b/llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
@@ -31,7 +31,7 @@ static void insertInitializationCall(Function *MainFn, const char *FnName,
const Type *ArgVTy = PointerType::get(PointerType::get(Type::SByteTy));
const Type *UIntPtr = PointerType::get(Type::UIntTy);
Module &M = *MainFn->getParent();
- Function *InitFn = M.getOrInsertFunction(FnName, Type::VoidTy, Type::IntTy,
+ Function *InitFn = M.getOrInsertFunction(FnName, Type::IntTy, Type::IntTy,
ArgVTy, UIntPtr, Type::UIntTy, 0);
// This could force argc and argv into programs that wouldn't otherwise have
@@ -45,38 +45,45 @@ static void insertInitializationCall(Function *MainFn, const char *FnName,
BasicBlock::iterator InsertPos = Entry->begin();
while (isa<AllocaInst>(InsertPos)) ++InsertPos;
+ ConstantPointerRef *ArrayCPR = ConstantPointerRef::get(Array);
+ std::vector<Constant*> GEPIndices(2, Constant::getNullValue(Type::LongTy));
+ Args[2] = ConstantExpr::getGetElementPtr(ArrayCPR, GEPIndices);
+
+ unsigned NumElements =
+ cast<ArrayType>(Array->getType()->getElementType())->getNumElements();
+ Args[3] = ConstantUInt::get(Type::UIntTy, NumElements);
+
+ Instruction *InitCall = new CallInst(InitFn, Args, "newargc", InsertPos);
+
+ // If argc or argv are not available in main, just pass null values in.
Function::aiterator AI;
switch (MainFn->asize()) {
default:
case 2:
AI = MainFn->abegin(); ++AI;
if (AI->getType() != ArgVTy) {
- Args[1] = new CastInst(AI, ArgVTy, "argv.cast", InsertPos);
+ InitCall->setOperand(2, new CastInst(AI, ArgVTy, "argv.cast", InitCall));
} else {
- Args[1] = AI;
+ InitCall->setOperand(2, AI);
}
case 1:
AI = MainFn->abegin();
+ // If the program looked at argc, have it look at the return value of the
+ // init call instead.
if (AI->getType() != Type::IntTy) {
- Args[0] = new CastInst(AI, Type::IntTy, "argc.cast", InsertPos);
+ if (!AI->use_empty())
+ AI->replaceAllUsesWith(new CastInst(InitCall, AI->getType(), "",
+ InsertPos));
+ InitCall->setOperand(1, new CastInst(AI, Type::IntTy, "argc.cast",
+ InitCall));
} else {
- Args[0] = AI;
+ AI->replaceAllUsesWith(InitCall);
+ InitCall->setOperand(1, AI);
}
- case 0:
- break;
+ case 0: break;
}
-
- ConstantPointerRef *ArrayCPR = ConstantPointerRef::get(Array);
- std::vector<Constant*> GEPIndices(2, Constant::getNullValue(Type::LongTy));
- Args[2] = ConstantExpr::getGetElementPtr(ArrayCPR, GEPIndices);
-
- unsigned NumElements =
- cast<ArrayType>(Array->getType()->getElementType())->getNumElements();
- Args[3] = ConstantUInt::get(Type::UIntTy, NumElements);
-
- new CallInst(InitFn, Args, "", InsertPos);
}
static void IncrementCounterInBlock(BasicBlock *BB, unsigned CounterNum,
OpenPOWER on IntegriCloud