@@ -600,7 +600,8 @@ bool LLParser::parseDeclare() {
600
600
}
601
601
602
602
Function *F;
603
- if (parseFunctionHeader (F, false ))
603
+ SmallVector<unsigned > UnnamedArgNums;
604
+ if (parseFunctionHeader (F, false , UnnamedArgNums))
604
605
return true ;
605
606
for (auto &MD : MDs)
606
607
F->addMetadata (MD.first , *MD.second );
@@ -614,8 +615,10 @@ bool LLParser::parseDefine() {
614
615
Lex.Lex ();
615
616
616
617
Function *F;
617
- return parseFunctionHeader (F, true ) || parseOptionalFunctionMetadata (*F) ||
618
- parseFunctionBody (*F);
618
+ SmallVector<unsigned > UnnamedArgNums;
619
+ return parseFunctionHeader (F, true , UnnamedArgNums) ||
620
+ parseOptionalFunctionMetadata (*F) ||
621
+ parseFunctionBody (*F, UnnamedArgNums);
619
622
}
620
623
621
624
// / parseGlobalType
@@ -2953,6 +2956,15 @@ bool LLParser::parseOptionalOperandBundles(
2953
2956
return false ;
2954
2957
}
2955
2958
2959
+ bool LLParser::checkValueID (LocTy Loc, StringRef Kind, StringRef Prefix,
2960
+ unsigned NextID, unsigned ID) const {
2961
+ if (ID < NextID)
2962
+ return error (Loc, Kind + " expected to be numbered '" + Prefix +
2963
+ Twine (NextID) + " ' or greater" );
2964
+
2965
+ return false ;
2966
+ }
2967
+
2956
2968
// / parseArgumentList - parse the argument list for a function type or function
2957
2969
// / prototype.
2958
2970
// / ::= '(' ArgTypeListI ')'
@@ -2963,6 +2975,7 @@ bool LLParser::parseOptionalOperandBundles(
2963
2975
// / ::= ArgType (',' ArgType)*
2964
2976
// /
2965
2977
bool LLParser::parseArgumentList (SmallVectorImpl<ArgInfo> &ArgList,
2978
+ SmallVectorImpl<unsigned > &UnnamedArgNums,
2966
2979
bool &IsVarArg) {
2967
2980
unsigned CurValID = 0 ;
2968
2981
IsVarArg = false ;
@@ -2989,12 +3002,19 @@ bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
2989
3002
if (Lex.getKind () == lltok::LocalVar) {
2990
3003
Name = Lex.getStrVal ();
2991
3004
Lex.Lex ();
2992
- } else if (Lex.getKind () == lltok::LocalVarID) {
2993
- if (Lex.getUIntVal () != CurValID)
2994
- return error (TypeLoc, " argument expected to be numbered '%" +
2995
- Twine (CurValID) + " '" );
2996
- ++CurValID;
2997
- Lex.Lex ();
3005
+ } else {
3006
+ unsigned ArgID;
3007
+ if (Lex.getKind () == lltok::LocalVarID) {
3008
+ ArgID = Lex.getUIntVal ();
3009
+ if (checkValueID (TypeLoc, " argument" , " %" , CurValID, ArgID))
3010
+ return true ;
3011
+ Lex.Lex ();
3012
+ } else {
3013
+ ArgID = CurValID;
3014
+ }
3015
+
3016
+ UnnamedArgNums.push_back (ArgID);
3017
+ CurValID = ArgID + 1 ;
2998
3018
}
2999
3019
3000
3020
if (!FunctionType::isValidArgumentType (ArgTy))
@@ -3023,13 +3043,17 @@ bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
3023
3043
Name = Lex.getStrVal ();
3024
3044
Lex.Lex ();
3025
3045
} else {
3046
+ unsigned ArgID;
3026
3047
if (Lex.getKind () == lltok::LocalVarID) {
3027
- if ( Lex.getUIntVal () != CurValID)
3028
- return error ( TypeLoc, " argument expected to be numbered '% " +
3029
- Twine (CurValID) + " ' " ) ;
3048
+ ArgID = Lex.getUIntVal ();
3049
+ if ( checkValueID ( TypeLoc, " argument" , " % " , CurValID, ArgID))
3050
+ return true ;
3030
3051
Lex.Lex ();
3052
+ } else {
3053
+ ArgID = CurValID;
3031
3054
}
3032
- ++CurValID;
3055
+ UnnamedArgNums.push_back (ArgID);
3056
+ CurValID = ArgID + 1 ;
3033
3057
Name = " " ;
3034
3058
}
3035
3059
@@ -3055,7 +3079,8 @@ bool LLParser::parseFunctionType(Type *&Result) {
3055
3079
3056
3080
SmallVector<ArgInfo, 8 > ArgList;
3057
3081
bool IsVarArg;
3058
- if (parseArgumentList (ArgList, IsVarArg))
3082
+ SmallVector<unsigned > UnnamedArgNums;
3083
+ if (parseArgumentList (ArgList, UnnamedArgNums, IsVarArg))
3059
3084
return true ;
3060
3085
3061
3086
// Reject names on the arguments lists.
@@ -3291,13 +3316,18 @@ bool LLParser::parseTargetExtType(Type *&Result) {
3291
3316
// ===----------------------------------------------------------------------===//
3292
3317
3293
3318
LLParser::PerFunctionState::PerFunctionState (LLParser &p, Function &f,
3294
- int functionNumber)
3319
+ int functionNumber,
3320
+ ArrayRef<unsigned > UnnamedArgNums)
3295
3321
: P(p), F(f), FunctionNumber(functionNumber) {
3296
3322
3297
3323
// Insert unnamed arguments into the NumberedVals list.
3298
- for (Argument &A : F.args ())
3299
- if (!A.hasName ())
3300
- NumberedVals.push_back (&A);
3324
+ auto It = UnnamedArgNums.begin ();
3325
+ for (Argument &A : F.args ()) {
3326
+ if (!A.hasName ()) {
3327
+ unsigned ArgNum = *It++;
3328
+ NumberedVals.add (ArgNum, &A);
3329
+ }
3330
+ }
3301
3331
}
3302
3332
3303
3333
LLParser::PerFunctionState::~PerFunctionState () {
@@ -3378,7 +3408,7 @@ Value *LLParser::PerFunctionState::getVal(const std::string &Name, Type *Ty,
3378
3408
3379
3409
Value *LLParser::PerFunctionState::getVal (unsigned ID, Type *Ty, LocTy Loc) {
3380
3410
// Look this name up in the normal function symbol table.
3381
- Value *Val = ID < NumberedVals.size () ? NumberedVals[ID] : nullptr ;
3411
+ Value *Val = NumberedVals.get (ID) ;
3382
3412
3383
3413
// If this is a forward reference for the value, see if we already created a
3384
3414
// forward ref record.
@@ -3426,11 +3456,11 @@ bool LLParser::PerFunctionState::setInstName(int NameID,
3426
3456
if (NameStr.empty ()) {
3427
3457
// If neither a name nor an ID was specified, just use the next ID.
3428
3458
if (NameID == -1 )
3429
- NameID = NumberedVals.size ();
3459
+ NameID = NumberedVals.getNext ();
3430
3460
3431
- if (unsigned (NameID) != NumberedVals.size ())
3432
- return P. error (NameLoc, " instruction expected to be numbered '% " +
3433
- Twine (NumberedVals. size ()) + " ' " ) ;
3461
+ if (P. checkValueID (NameLoc, " instruction " , " % " , NumberedVals.getNext (),
3462
+ NameID))
3463
+ return true ;
3434
3464
3435
3465
auto FI = ForwardRefValIDs.find (NameID);
3436
3466
if (FI != ForwardRefValIDs.end ()) {
@@ -3445,7 +3475,7 @@ bool LLParser::PerFunctionState::setInstName(int NameID,
3445
3475
ForwardRefValIDs.erase (FI);
3446
3476
}
3447
3477
3448
- NumberedVals.push_back ( Inst);
3478
+ NumberedVals.add (NameID, Inst);
3449
3479
return false ;
3450
3480
}
3451
3481
@@ -3492,15 +3522,15 @@ BasicBlock *LLParser::PerFunctionState::defineBB(const std::string &Name,
3492
3522
int NameID, LocTy Loc) {
3493
3523
BasicBlock *BB;
3494
3524
if (Name.empty ()) {
3495
- if (NameID != -1 && unsigned (NameID) != NumberedVals.size ()) {
3496
- P.error (Loc, " label expected to be numbered '" +
3497
- Twine (NumberedVals.size ()) + " '" );
3498
- return nullptr ;
3525
+ if (NameID != -1 ) {
3526
+ if (P.checkValueID (Loc, " label" , " " , NumberedVals.getNext (), NameID))
3527
+ return nullptr ;
3528
+ } else {
3529
+ NameID = NumberedVals.getNext ();
3499
3530
}
3500
- BB = getBB (NumberedVals. size () , Loc);
3531
+ BB = getBB (NameID , Loc);
3501
3532
if (!BB) {
3502
- P.error (Loc, " unable to create block numbered '" +
3503
- Twine (NumberedVals.size ()) + " '" );
3533
+ P.error (Loc, " unable to create block numbered '" + Twine (NameID) + " '" );
3504
3534
return nullptr ;
3505
3535
}
3506
3536
} else {
@@ -3517,8 +3547,8 @@ BasicBlock *LLParser::PerFunctionState::defineBB(const std::string &Name,
3517
3547
3518
3548
// Remove the block from forward ref sets.
3519
3549
if (Name.empty ()) {
3520
- ForwardRefValIDs.erase (NumberedVals. size () );
3521
- NumberedVals.push_back ( BB);
3550
+ ForwardRefValIDs.erase (NameID );
3551
+ NumberedVals.add (NameID, BB);
3522
3552
} else {
3523
3553
// BB forward references are already in the function symbol table.
3524
3554
ForwardRefVals.erase (Name);
@@ -5962,7 +5992,8 @@ bool LLParser::parseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc,
5962
5992
// / OptionalCallingConv OptRetAttrs OptUnnamedAddr Type GlobalName
5963
5993
// / '(' ArgList ')' OptAddrSpace OptFuncAttrs OptSection OptionalAlign
5964
5994
// / OptGC OptionalPrefix OptionalPrologue OptPersonalityFn
5965
- bool LLParser::parseFunctionHeader (Function *&Fn, bool IsDefine) {
5995
+ bool LLParser::parseFunctionHeader (Function *&Fn, bool IsDefine,
5996
+ SmallVectorImpl<unsigned > &UnnamedArgNums) {
5966
5997
// parse the linkage.
5967
5998
LocTy LinkageLoc = Lex.getLoc ();
5968
5999
unsigned Linkage;
@@ -6050,7 +6081,7 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
6050
6081
Constant *PersonalityFn = nullptr ;
6051
6082
Comdat *C;
6052
6083
6053
- if (parseArgumentList (ArgList, IsVarArg) ||
6084
+ if (parseArgumentList (ArgList, UnnamedArgNums, IsVarArg) ||
6054
6085
parseOptionalUnnamedAddr (UnnamedAddr) ||
6055
6086
parseOptionalProgramAddrSpace (AddrSpace) ||
6056
6087
parseFnAttributeValuePairs (FuncAttrs, FwdRefAttrGrps, false ,
@@ -6245,15 +6276,16 @@ bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6245
6276
6246
6277
// / parseFunctionBody
6247
6278
// / ::= '{' BasicBlock+ UseListOrderDirective* '}'
6248
- bool LLParser::parseFunctionBody (Function &Fn) {
6279
+ bool LLParser::parseFunctionBody (Function &Fn,
6280
+ ArrayRef<unsigned > UnnamedArgNums) {
6249
6281
if (Lex.getKind () != lltok::lbrace)
6250
6282
return tokError (" expected '{' in function body" );
6251
6283
Lex.Lex (); // eat the {.
6252
6284
6253
6285
int FunctionNumber = -1 ;
6254
6286
if (!Fn.hasName ()) FunctionNumber = NumberedVals.size ()-1 ;
6255
6287
6256
- PerFunctionState PFS (*this , Fn, FunctionNumber);
6288
+ PerFunctionState PFS (*this , Fn, FunctionNumber, UnnamedArgNums );
6257
6289
6258
6290
// Resolve block addresses and allow basic blocks to be forward-declared
6259
6291
// within this function.
0 commit comments