mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-24 08:24:33 +00:00
* We were forgetting to pass varargs arguments through a call
* 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
This commit is contained in:
@ -380,6 +380,17 @@ void DAE::RemoveDeadArgumentsFromFunction(Function *F) {
|
|||||||
DeadRetVal.erase(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());
|
FunctionType *NFTy = FunctionType::get(RetTy, Params, FTy->isVarArg());
|
||||||
|
|
||||||
// Create the new function body and insert it into the module...
|
// 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
|
if (!DeadArguments.count(I)) // Remove operands for dead arguments
|
||||||
Args.push_back(*AI);
|
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;
|
Instruction *New;
|
||||||
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
|
||||||
New = new InvokeInst(NF, II->getNormalDest(), II->getExceptionalDest(),
|
New = new InvokeInst(NF, II->getNormalDest(), II->getExceptionalDest(),
|
||||||
|
Reference in New Issue
Block a user