mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Declare that musttail calls in variadic functions forward the ellipsis
Summary: There is no functionality change here except in the way we assemble and dump musttail calls in variadic functions. There's really no need to separate out the bits for musttail and "is forwarding varargs" on call instructions. A musttail call by definition has to forward the ellipsis or it would fail verification. Reviewers: chandlerc, nlewycky Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D4892 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216423 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1819,7 +1819,8 @@ bool LLParser::ParseType(Type *&Result, bool AllowVoid) {
|
||||
/// Arg
|
||||
/// ::= Type OptionalAttributes Value OptionalAttributes
|
||||
bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
|
||||
PerFunctionState &PFS) {
|
||||
PerFunctionState &PFS, bool IsMustTailCall,
|
||||
bool InVarArgsFunc) {
|
||||
if (ParseToken(lltok::lparen, "expected '(' in call"))
|
||||
return true;
|
||||
|
||||
@@ -1830,6 +1831,17 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
|
||||
ParseToken(lltok::comma, "expected ',' in argument list"))
|
||||
return true;
|
||||
|
||||
// Parse an ellipsis if this is a musttail call in a variadic function.
|
||||
if (Lex.getKind() == lltok::dotdotdot) {
|
||||
const char *Msg = "unexpected ellipsis in argument list for ";
|
||||
if (!IsMustTailCall)
|
||||
return TokError(Twine(Msg) + "non-musttail call");
|
||||
if (!InVarArgsFunc)
|
||||
return TokError(Twine(Msg) + "musttail call in non-varargs function");
|
||||
Lex.Lex(); // Lex the '...', it is purely for readability.
|
||||
return ParseToken(lltok::rparen, "expected ')' at end of argument list");
|
||||
}
|
||||
|
||||
// Parse the argument.
|
||||
LocTy ArgLoc;
|
||||
Type *ArgTy = nullptr;
|
||||
@@ -1846,6 +1858,10 @@ bool LLParser::ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
|
||||
ArgAttrs)));
|
||||
}
|
||||
|
||||
if (IsMustTailCall && InVarArgsFunc)
|
||||
return TokError("expected '...' at end of argument list for musttail call "
|
||||
"in varargs function");
|
||||
|
||||
Lex.Lex(); // Lex the ')'.
|
||||
return false;
|
||||
}
|
||||
@@ -4214,7 +4230,8 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
|
||||
ParseOptionalReturnAttrs(RetAttrs) ||
|
||||
ParseType(RetType, RetTypeLoc, true /*void allowed*/) ||
|
||||
ParseValID(CalleeID) ||
|
||||
ParseParameterList(ArgList, PFS) ||
|
||||
ParseParameterList(ArgList, PFS, TCK == CallInst::TCK_MustTail,
|
||||
PFS.getFunction().isVarArg()) ||
|
||||
ParseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps, false,
|
||||
BuiltinLoc))
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user