Kill one of EmitCallArgs overloads. NFC.

llvm-svn: 216635
This commit is contained in:
Alexey Samsonov 2014-08-28 00:22:11 +00:00
parent 4f1a54a41a
commit cbe875a507
4 changed files with 38 additions and 54 deletions

View File

@ -1716,8 +1716,7 @@ CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D,
Args.add(RValue::get(Src), QT);
// Skip over first argument (Src).
EmitCallArgs(Args, FPT->isVariadic(), FPT->param_type_begin() + 1,
FPT->param_type_end(), E->arg_begin() + 1, E->arg_end());
EmitCallArgs(Args, FPT, E->arg_begin() + 1, E->arg_end(), /*ParamsToSkip*/ 1);
EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, RequiredArgs::All),
Callee, ReturnValueSlot(), Args, D);

View File

@ -3320,7 +3320,7 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType, llvm::Value *Callee,
CallArgList Args;
EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), E->arg_begin(),
E->arg_end(), ForceColumnInfo);
E->arg_end(), /*ParamsToSkip*/ 0, ForceColumnInfo);
const CGFunctionInfo &FnInfo =
CGM.getTypes().arrangeFreeFunctionCall(Args, FnType);

View File

@ -1232,15 +1232,13 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
llvm::Value *allocSize =
EmitCXXNewAllocSize(*this, E, minElements, numElements,
allocSizeWithoutCookie);
allocatorArgs.add(RValue::get(allocSize), sizeType);
// We start at 1 here because the first argument (the allocation size)
// has already been emitted.
EmitCallArgs(allocatorArgs, allocatorType->isVariadic(),
allocatorType->param_type_begin() + 1,
allocatorType->param_type_end(), E->placement_arg_begin(),
E->placement_arg_end());
EmitCallArgs(allocatorArgs, allocatorType, E->placement_arg_begin(),
E->placement_arg_end(), /*ParamsToSkip*/ 1);
// Emit the allocation call. If the allocator is a global placement
// operator, just "inline" it directly.

View File

@ -2617,62 +2617,49 @@ public:
void EmitCallArgs(CallArgList &Args, const T *CallArgTypeInfo,
CallExpr::const_arg_iterator ArgBeg,
CallExpr::const_arg_iterator ArgEnd,
bool ForceColumnInfo = false) {
if (CallArgTypeInfo) {
EmitCallArgs(Args, CallArgTypeInfo->isVariadic(),
CallArgTypeInfo->param_type_begin(),
CallArgTypeInfo->param_type_end(), ArgBeg, ArgEnd,
ForceColumnInfo);
} else {
// T::param_type_iterator might not have a default ctor.
const QualType *NoIter = nullptr;
EmitCallArgs(Args, /*AllowExtraArguments=*/true, NoIter, NoIter, ArgBeg,
ArgEnd, ForceColumnInfo);
}
}
template<typename ArgTypeIterator>
void EmitCallArgs(CallArgList& Args,
bool AllowExtraArguments,
ArgTypeIterator ArgTypeBeg,
ArgTypeIterator ArgTypeEnd,
CallExpr::const_arg_iterator ArgBeg,
CallExpr::const_arg_iterator ArgEnd,
bool ForceColumnInfo = false) {
unsigned ParamsToSkip = 0, bool ForceColumnInfo = false) {
SmallVector<QualType, 16> ArgTypes;
CallExpr::const_arg_iterator Arg = ArgBeg;
// First, use the argument types that the type info knows about
for (ArgTypeIterator I = ArgTypeBeg, E = ArgTypeEnd; I != E; ++I, ++Arg) {
assert(Arg != ArgEnd && "Running over edge of argument list!");
assert((ParamsToSkip == 0 || CallArgTypeInfo) &&
"Can't skip parameters if type info is not provided");
if (CallArgTypeInfo) {
// First, use the argument types that the type info knows about
for (auto I = CallArgTypeInfo->param_type_begin() + ParamsToSkip,
E = CallArgTypeInfo->param_type_end();
I != E; ++I, ++Arg) {
assert(Arg != ArgEnd && "Running over edge of argument list!");
#ifndef NDEBUG
QualType ArgType = *I;
QualType ActualArgType = Arg->getType();
if (ArgType->isPointerType() && ActualArgType->isPointerType()) {
QualType ActualBaseType =
ActualArgType->getAs<PointerType>()->getPointeeType();
QualType ArgBaseType =
ArgType->getAs<PointerType>()->getPointeeType();
if (ArgBaseType->isVariableArrayType()) {
if (const VariableArrayType *VAT =
getContext().getAsVariableArrayType(ActualBaseType)) {
if (!VAT->getSizeExpr())
ActualArgType = ArgType;
QualType ArgType = *I;
QualType ActualArgType = Arg->getType();
if (ArgType->isPointerType() && ActualArgType->isPointerType()) {
QualType ActualBaseType =
ActualArgType->getAs<PointerType>()->getPointeeType();
QualType ArgBaseType =
ArgType->getAs<PointerType>()->getPointeeType();
if (ArgBaseType->isVariableArrayType()) {
if (const VariableArrayType *VAT =
getContext().getAsVariableArrayType(ActualBaseType)) {
if (!VAT->getSizeExpr())
ActualArgType = ArgType;
}
}
}
}
assert(getContext().getCanonicalType(ArgType.getNonReferenceType()).
getTypePtr() ==
getContext().getCanonicalType(ActualArgType).getTypePtr() &&
"type mismatch in call argument!");
assert(getContext()
.getCanonicalType(ArgType.getNonReferenceType())
.getTypePtr() ==
getContext().getCanonicalType(ActualArgType).getTypePtr() &&
"type mismatch in call argument!");
#endif
ArgTypes.push_back(*I);
ArgTypes.push_back(*I);
}
}
// Either we've emitted all the call args, or we have a call to variadic
// function or some other call that allows extra arguments.
assert((Arg == ArgEnd || AllowExtraArguments) &&
"Extra arguments in non-variadic function!");
// function.
assert(
(Arg == ArgEnd || !CallArgTypeInfo || CallArgTypeInfo->isVariadic()) &&
"Extra arguments in non-variadic function!");
// If we still have any arguments, emit them using the type of the argument.
for (; Arg != ArgEnd; ++Arg)