[llvm-commits] CVS: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Feb 10 11:42:02 PST 2004


Changes in directory llvm/lib/Transforms/Instrumentation:

BlockProfiling.cpp updated: 1.5 -> 1.6

---
Log message:

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.


---
Diffs of the changes:  (+24 -17)

Index: llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp
diff -u llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.5 llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.6
--- llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp:1.5	Fri Jan  9 00:11:48 2004
+++ llvm/lib/Transforms/Instrumentation/BlockProfiling.cpp	Tue Feb 10 11:41:01 2004
@@ -31,7 +31,7 @@
   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 @@
   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,





More information about the llvm-commits mailing list