summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-23 17:44:53 +0000
committerChris Lattner <sabre@nondot.org>2003-10-23 17:44:53 +0000
commit05c71fb3e6eabf3260a47ecb2ea785b64b06b917 (patch)
tree0cc35b7e880b43835bb70dd52dcfc6ce278b00a5
parent7d56d2c6fb50a829b6ddc1e98bfd886ef643a058 (diff)
downloadllvm-05c71fb3e6eabf3260a47ecb2ea785b64b06b917.tar.gz
* 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.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index e70dd20a83e5..04567e1316fd 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(),