54
54
55
55
using namespace llvm ;
56
56
57
+ // Avoid large gaps in the NumberedVals vector.
58
+ static const size_t MaxNumberedValSkip = 1000 ;
59
+
57
60
static std::string getTypeString (Type *T) {
58
61
std::string Result;
59
62
raw_string_ostream Tmp (Result);
@@ -572,7 +575,8 @@ bool LLParser::parseDeclare() {
572
575
}
573
576
574
577
Function *F;
575
- if (parseFunctionHeader (F, false ))
578
+ SmallVector<unsigned > UnnamedArgNums;
579
+ if (parseFunctionHeader (F, false , UnnamedArgNums))
576
580
return true ;
577
581
for (auto &MD : MDs)
578
582
F->addMetadata (MD.first , *MD.second );
@@ -586,8 +590,10 @@ bool LLParser::parseDefine() {
586
590
Lex.Lex ();
587
591
588
592
Function *F;
589
- return parseFunctionHeader (F, true ) || parseOptionalFunctionMetadata (*F) ||
590
- parseFunctionBody (*F);
593
+ SmallVector<unsigned > UnnamedArgNums;
594
+ return parseFunctionHeader (F, true , UnnamedArgNums) ||
595
+ parseOptionalFunctionMetadata (*F) ||
596
+ parseFunctionBody (*F, UnnamedArgNums);
591
597
}
592
598
593
599
// / parseGlobalType
@@ -2925,6 +2931,19 @@ bool LLParser::parseOptionalOperandBundles(
2925
2931
return false ;
2926
2932
}
2927
2933
2934
+ bool LLParser::checkValueID (LocTy Loc, StringRef Kind, StringRef Prefix,
2935
+ unsigned NextID, unsigned ID) const {
2936
+ if (ID < NextID)
2937
+ return error (Loc, Kind + " expected to be numbered '" + Prefix +
2938
+ Twine (NextID) + " ' or greater" );
2939
+
2940
+ if (ID > NextID + MaxNumberedValSkip)
2941
+ return error (Loc, " value numbers can skip at most " +
2942
+ Twine (MaxNumberedValSkip) + " values" );
2943
+
2944
+ return false ;
2945
+ }
2946
+
2928
2947
// / parseArgumentList - parse the argument list for a function type or function
2929
2948
// / prototype.
2930
2949
// / ::= '(' ArgTypeListI ')'
@@ -2935,6 +2954,7 @@ bool LLParser::parseOptionalOperandBundles(
2935
2954
// / ::= ArgType (',' ArgType)*
2936
2955
// /
2937
2956
bool LLParser::parseArgumentList (SmallVectorImpl<ArgInfo> &ArgList,
2957
+ SmallVectorImpl<unsigned > &UnnamedArgNums,
2938
2958
bool &IsVarArg) {
2939
2959
unsigned CurValID = 0 ;
2940
2960
IsVarArg = false ;
@@ -2961,12 +2981,19 @@ bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
2961
2981
if (Lex.getKind () == lltok::LocalVar) {
2962
2982
Name = Lex.getStrVal ();
2963
2983
Lex.Lex ();
2964
- } else if (Lex.getKind () == lltok::LocalVarID) {
2965
- if (Lex.getUIntVal () != CurValID)
2966
- return error (TypeLoc, " argument expected to be numbered '%" +
2967
- Twine (CurValID) + " '" );
2968
- ++CurValID;
2969
- Lex.Lex ();
2984
+ } else {
2985
+ unsigned ArgID;
2986
+ if (Lex.getKind () == lltok::LocalVarID) {
2987
+ ArgID = Lex.getUIntVal ();
2988
+ if (checkValueID (TypeLoc, " argument" , " %" , CurValID, ArgID))
2989
+ return true ;
2990
+ Lex.Lex ();
2991
+ } else {
2992
+ ArgID = CurValID;
2993
+ }
2994
+
2995
+ UnnamedArgNums.push_back (ArgID);
2996
+ CurValID = ArgID + 1 ;
2970
2997
}
2971
2998
2972
2999
if (!FunctionType::isValidArgumentType (ArgTy))
@@ -2995,13 +3022,17 @@ bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
2995
3022
Name = Lex.getStrVal ();
2996
3023
Lex.Lex ();
2997
3024
} else {
3025
+ unsigned ArgID;
2998
3026
if (Lex.getKind () == lltok::LocalVarID) {
2999
- if ( Lex.getUIntVal () != CurValID)
3000
- return error ( TypeLoc, " argument expected to be numbered '% " +
3001
- Twine (CurValID) + " ' " ) ;
3027
+ ArgID = Lex.getUIntVal ();
3028
+ if ( checkValueID ( TypeLoc, " argument" , " % " , CurValID, ArgID))
3029
+ return true ;
3002
3030
Lex.Lex ();
3031
+ } else {
3032
+ ArgID = CurValID;
3003
3033
}
3004
- ++CurValID;
3034
+ UnnamedArgNums.push_back (ArgID);
3035
+ CurValID = ArgID + 1 ;
3005
3036
Name = " " ;
3006
3037
}
3007
3038
@@ -3027,7 +3058,8 @@ bool LLParser::parseFunctionType(Type *&Result) {
3027
3058
3028
3059
SmallVector<ArgInfo, 8 > ArgList;
3029
3060
bool IsVarArg;
3030
- if (parseArgumentList (ArgList, IsVarArg))
3061
+ SmallVector<unsigned > UnnamedArgNums;
3062
+ if (parseArgumentList (ArgList, UnnamedArgNums, IsVarArg))
3031
3063
return true ;
3032
3064
3033
3065
// Reject names on the arguments lists.
@@ -3263,13 +3295,19 @@ bool LLParser::parseTargetExtType(Type *&Result) {
3263
3295
// ===----------------------------------------------------------------------===//
3264
3296
3265
3297
LLParser::PerFunctionState::PerFunctionState (LLParser &p, Function &f,
3266
- int functionNumber)
3298
+ int functionNumber,
3299
+ ArrayRef<unsigned > UnnamedArgNums)
3267
3300
: P(p), F(f), FunctionNumber(functionNumber) {
3268
3301
3269
3302
// Insert unnamed arguments into the NumberedVals list.
3270
- for (Argument &A : F.args ())
3271
- if (!A.hasName ())
3303
+ auto It = UnnamedArgNums.begin ();
3304
+ for (Argument &A : F.args ()) {
3305
+ if (!A.hasName ()) {
3306
+ unsigned ArgNum = *It++;
3307
+ NumberedVals.resize (ArgNum);
3272
3308
NumberedVals.push_back (&A);
3309
+ }
3310
+ }
3273
3311
}
3274
3312
3275
3313
LLParser::PerFunctionState::~PerFunctionState () {
@@ -3400,9 +3438,9 @@ bool LLParser::PerFunctionState::setInstName(int NameID,
3400
3438
if (NameID == -1 )
3401
3439
NameID = NumberedVals.size ();
3402
3440
3403
- if (unsigned (NameID) != NumberedVals.size ())
3404
- return P. error (NameLoc, " instruction expected to be numbered '% " +
3405
- Twine (NumberedVals. size ()) + " ' " ) ;
3441
+ if (P. checkValueID (NameLoc, " instruction " , " % " , NumberedVals.size (),
3442
+ NameID))
3443
+ return true ;
3406
3444
3407
3445
auto FI = ForwardRefValIDs.find (NameID);
3408
3446
if (FI != ForwardRefValIDs.end ()) {
@@ -3417,6 +3455,9 @@ bool LLParser::PerFunctionState::setInstName(int NameID,
3417
3455
ForwardRefValIDs.erase (FI);
3418
3456
}
3419
3457
3458
+ // Fill in skipped IDs using nullptr.
3459
+ NumberedVals.resize (unsigned (NameID));
3460
+
3420
3461
NumberedVals.push_back (Inst);
3421
3462
return false ;
3422
3463
}
@@ -3464,12 +3505,13 @@ BasicBlock *LLParser::PerFunctionState::defineBB(const std::string &Name,
3464
3505
int NameID, LocTy Loc) {
3465
3506
BasicBlock *BB;
3466
3507
if (Name.empty ()) {
3467
- if (NameID != -1 && unsigned (NameID) != NumberedVals.size ()) {
3468
- P.error (Loc, " label expected to be numbered '" +
3469
- Twine (NumberedVals.size ()) + " '" );
3470
- return nullptr ;
3508
+ if (NameID != -1 ) {
3509
+ if (P.checkValueID (Loc, " label" , " " , NumberedVals.size (), NameID))
3510
+ return nullptr ;
3511
+ } else {
3512
+ NameID = NumberedVals.size ();
3471
3513
}
3472
- BB = getBB (NumberedVals. size () , Loc);
3514
+ BB = getBB (NameID , Loc);
3473
3515
if (!BB) {
3474
3516
P.error (Loc, " unable to create block numbered '" +
3475
3517
Twine (NumberedVals.size ()) + " '" );
@@ -3489,7 +3531,8 @@ BasicBlock *LLParser::PerFunctionState::defineBB(const std::string &Name,
3489
3531
3490
3532
// Remove the block from forward ref sets.
3491
3533
if (Name.empty ()) {
3492
- ForwardRefValIDs.erase (NumberedVals.size ());
3534
+ ForwardRefValIDs.erase (NameID);
3535
+ NumberedVals.resize (NameID);
3493
3536
NumberedVals.push_back (BB);
3494
3537
} else {
3495
3538
// BB forward references are already in the function symbol table.
@@ -5934,7 +5977,8 @@ bool LLParser::parseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc,
5934
5977
// / OptionalCallingConv OptRetAttrs OptUnnamedAddr Type GlobalName
5935
5978
// / '(' ArgList ')' OptAddrSpace OptFuncAttrs OptSection OptionalAlign
5936
5979
// / OptGC OptionalPrefix OptionalPrologue OptPersonalityFn
5937
- bool LLParser::parseFunctionHeader (Function *&Fn, bool IsDefine) {
5980
+ bool LLParser::parseFunctionHeader (Function *&Fn, bool IsDefine,
5981
+ SmallVectorImpl<unsigned > &UnnamedArgNums) {
5938
5982
// parse the linkage.
5939
5983
LocTy LinkageLoc = Lex.getLoc ();
5940
5984
unsigned Linkage;
@@ -6022,7 +6066,7 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
6022
6066
Constant *PersonalityFn = nullptr ;
6023
6067
Comdat *C;
6024
6068
6025
- if (parseArgumentList (ArgList, IsVarArg) ||
6069
+ if (parseArgumentList (ArgList, UnnamedArgNums, IsVarArg) ||
6026
6070
parseOptionalUnnamedAddr (UnnamedAddr) ||
6027
6071
parseOptionalProgramAddrSpace (AddrSpace) ||
6028
6072
parseFnAttributeValuePairs (FuncAttrs, FwdRefAttrGrps, false ,
@@ -6217,15 +6261,16 @@ bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6217
6261
6218
6262
// / parseFunctionBody
6219
6263
// / ::= '{' BasicBlock+ UseListOrderDirective* '}'
6220
- bool LLParser::parseFunctionBody (Function &Fn) {
6264
+ bool LLParser::parseFunctionBody (Function &Fn,
6265
+ ArrayRef<unsigned > UnnamedArgNums) {
6221
6266
if (Lex.getKind () != lltok::lbrace)
6222
6267
return tokError (" expected '{' in function body" );
6223
6268
Lex.Lex (); // eat the {.
6224
6269
6225
6270
int FunctionNumber = -1 ;
6226
6271
if (!Fn.hasName ()) FunctionNumber = NumberedVals.size ()-1 ;
6227
6272
6228
- PerFunctionState PFS (*this , Fn, FunctionNumber);
6273
+ PerFunctionState PFS (*this , Fn, FunctionNumber, UnnamedArgNums );
6229
6274
6230
6275
// Resolve block addresses and allow basic blocks to be forward-declared
6231
6276
// within this function.
0 commit comments