//
// The LLVM Compiler Infrastructure
//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Pass all the same arguments.
Args.assign(CS.arg_begin(), CS.arg_begin()+NumArgs);
+ // Drop any attributes that were on the vararg arguments.
+ const ParamAttrsList *PAL = CS.getParamAttrs();
+ if (PAL && PAL->getParamIndex(PAL->size() - 1) > NumArgs) {
+ ParamAttrsVector ParamAttrsVec;
+ for (unsigned i = 0; PAL->getParamIndex(i) <= NumArgs; ++i) {
+ ParamAttrsWithIndex PAWI;
+ PAWI = ParamAttrsWithIndex::get(PAL->getParamIndex(i),
+ PAL->getParamAttrsAtIndex(i));
+ ParamAttrsVec.push_back(PAWI);
+ }
+ PAL = ParamAttrsList::get(ParamAttrsVec);
+ }
+
Instruction *New;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {
New = new InvokeInst(NF, II->getNormalDest(), II->getUnwindDest(),
Args.begin(), Args.end(), "", Call);
cast<InvokeInst>(New)->setCallingConv(CS.getCallingConv());
- cast<InvokeInst>(New)->setParamAttrs(CS.getParamAttrs());
+ cast<InvokeInst>(New)->setParamAttrs(PAL);
} else {
New = new CallInst(NF, Args.begin(), Args.end(), "", Call);
cast<CallInst>(New)->setCallingConv(CS.getCallingConv());
- cast<CallInst>(New)->setParamAttrs(CS.getParamAttrs());
+ cast<CallInst>(New)->setParamAttrs(PAL);
if (cast<CallInst>(Call)->isTailCall())
cast<CallInst>(New)->setTailCall();
}
const ParamAttrsList *PAL = F->getParamAttrs();
// The existing function return attributes.
- uint16_t RAttrs = PAL ? PAL->getParamAttrs(0) : 0;
+ ParameterAttributes RAttrs = PAL ? PAL->getParamAttrs(0) : ParamAttr::None;
// Make the function return void if the return value is dead.
const Type *RetTy = FTy->getReturnType();
if (DeadRetVal.count(F)) {
RetTy = Type::VoidTy;
- RAttrs &= ~ParamAttr::VoidTypeIncompatible;
+ RAttrs &= ~ParamAttr::typeIncompatible(RetTy);
DeadRetVal.erase(F);
}
++I, ++index)
if (!DeadArguments.count(I)) {
Params.push_back(I->getType());
- uint16_t Attrs = PAL ? PAL->getParamAttrs(index) : 0;
+ ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index) :
+ ParamAttr::None;
if (Attrs)
ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Params.size(), Attrs));
}
PAL = CS.getParamAttrs();
// The call return attributes.
- uint16_t RAttrs = PAL ? PAL->getParamAttrs(0) : 0;
+ ParameterAttributes RAttrs = PAL ? PAL->getParamAttrs(0) : ParamAttr::None;
// Adjust in case the function was changed to return void.
- if (NF->getReturnType() == Type::VoidTy)
- RAttrs &= ~ParamAttr::VoidTypeIncompatible;
+ RAttrs &= ~ParamAttr::typeIncompatible(NF->getReturnType());
if (RAttrs)
ParamAttrsVec.push_back(ParamAttrsWithIndex::get(0, RAttrs));
I != E; ++I, ++AI, ++index)
if (!DeadArguments.count(I)) { // Remove operands for dead arguments
Args.push_back(*AI);
- uint16_t Attrs = PAL ? PAL->getParamAttrs(index) : 0;
+ ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index) :
+ ParamAttr::None;
if (Attrs)
ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs));
}
- // Reconstruct the ParamAttrsList based on the vector we constructed.
- PAL = ParamAttrsList::get(ParamAttrsVec);
-
if (ExtraArgHack)
Args.push_back(UndefValue::get(Type::Int32Ty));
- // Push any varargs arguments on the list
- for (; AI != CS.arg_end(); ++AI)
+ // Push any varargs arguments on the list. Don't forget their attributes.
+ for (; AI != CS.arg_end(); ++AI) {
Args.push_back(*AI);
+ ParameterAttributes Attrs = PAL ? PAL->getParamAttrs(index++) :
+ ParamAttr::None;
+ if (Attrs)
+ ParamAttrsVec.push_back(ParamAttrsWithIndex::get(Args.size(), Attrs));
+ }
+
+ // Reconstruct the ParamAttrsList based on the vector we constructed.
+ PAL = ParamAttrsList::get(ParamAttrsVec);
Instruction *New;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) {