From 9273a903117c06b5fdb2d657022e5abc14cef295 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 23 Oct 2003 17:44:53 +0000 Subject: [PATCH] * We were forgetting to pass varargs arguments through a call * Add a work around for bug PR56, gross but necessary for now. llvm-svn: 9428 --- lib/Transforms/IPO/DeadArgumentElimination.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index e70dd20a83e..04567e1316f 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -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(Call)) { New = new InvokeInst(NF, II->getNormalDest(), II->getExceptionalDest(),