diff options
author | Chris Lattner <sabre@nondot.org> | 2003-10-23 17:44:53 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-10-23 17:44:53 +0000 |
commit | 05c71fb3e6eabf3260a47ecb2ea785b64b06b917 (patch) | |
tree | 0cc35b7e880b43835bb70dd52dcfc6ce278b00a5 | |
parent | 7d56d2c6fb50a829b6ddc1e98bfd886ef643a058 (diff) | |
download | llvm-05c71fb3e6eabf3260a47ecb2ea785b64b06b917.zip llvm-05c71fb3e6eabf3260a47ecb2ea785b64b06b917.tar.gz llvm-05c71fb3e6eabf3260a47ecb2ea785b64b06b917.tar.bz2 |
* 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
-rw-r--r-- | llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp index e70dd20..04567e1 100644 --- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/llvm/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<InvokeInst>(Call)) { New = new InvokeInst(NF, II->getNormalDest(), II->getExceptionalDest(), |