* We were forgetting to pass varargs arguments through a call
authorChris Lattner <sabre@nondot.org>
Thu, 23 Oct 2003 17:44:53 +0000 (17:44 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 Oct 2003 17:44:53 +0000 (17:44 +0000)
* Add a work around for bug PR56, gross but necessary for now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9428 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/DeadArgumentElimination.cpp

index e70dd20a83e5a5660266bdd5569fc4bfcf36910f..04567e1316fdbf273884b207a0a2c1a2024a30ae 100644 (file)
@@ -380,6 +380,17 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
     DeadRetVal.erase(F);
   }
 
+  // Work around LLVM bug PR56: the CWriter cannot emit varargs functions which
+  // have zero fixed arguments.
+  //
+  // FIXME: once this bug is fixed in the CWriter, this hack should be removed.
+  //
+  bool ExtraArgHack = false;
+  if (Params.empty() && FTy->isVarArg()) {
+    ExtraArgHack = true;
+    Params.push_back(Type::IntTy);
+  }
+
   FunctionType *NFTy = FunctionType::get(RetTy, Params, FTy->isVarArg());
 
   // Create the new function body and insert it into the module...
@@ -400,6 +411,13 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
       if (!DeadArguments.count(I))      // Remove operands for dead arguments
         Args.push_back(*AI);
 
+    if (ExtraArgHack)
+      Args.push_back(Constant::getNullValue(Type::IntTy));
+
+    // Push any varargs arguments on the list
+    for (; AI != CS.arg_end(); ++AI)
+      Args.push_back(*AI);
+
     Instruction *New;
     if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
       New = new InvokeInst(NF, II->getNormalDest(), II->getExceptionalDest(),