1 //===- TGParser.cpp - Parser for TableGen Files ---------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Implement the Parser for TableGen. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "TGParser.h" 15 #include "llvm/ADT/SmallVector.h" 16 #include "llvm/ADT/StringExtras.h" 17 #include "llvm/Support/CommandLine.h" 18 #include "llvm/TableGen/Record.h" 19 #include <algorithm> 20 #include <sstream> 21 using namespace llvm; 22 23 //===----------------------------------------------------------------------===// 24 // Support Code for the Semantic Actions. 25 //===----------------------------------------------------------------------===// 26 27 namespace llvm { 28 struct SubClassReference { 29 SMRange RefRange; 30 Record *Rec; 31 std::vector<Init*> TemplateArgs; 32 SubClassReference() : Rec(0) {} 33 34 bool isInvalid() const { return Rec == 0; } 35 }; 36 37 struct SubMultiClassReference { 38 SMRange RefRange; 39 MultiClass *MC; 40 std::vector<Init*> TemplateArgs; 41 SubMultiClassReference() : MC(0) {} 42 43 bool isInvalid() const { return MC == 0; } 44 void dump() const; 45 }; 46 47 void SubMultiClassReference::dump() const { 48 errs() << "Multiclass:\n"; 49 50 MC->dump(); 51 52 errs() << "Template args:\n"; 53 for (std::vector<Init *>::const_iterator i = TemplateArgs.begin(), 54 iend = TemplateArgs.end(); 55 i != iend; 56 ++i) { 57 (*i)->dump(); 58 } 59 } 60 61 } // end namespace llvm 62 63 bool TGParser::AddValue(Record *CurRec, SMLoc Loc, const RecordVal &RV) { 64 if (CurRec == 0) 65 CurRec = &CurMultiClass->Rec; 66 67 if (RecordVal *ERV = CurRec->getValue(RV.getNameInit())) { 68 // The value already exists in the class, treat this as a set. 69 if (ERV->setValue(RV.getValue())) 70 return Error(Loc, "New definition of '" + RV.getName() + "' of type '" + 71 RV.getType()->getAsString() + "' is incompatible with " + 72 "previous definition of type '" + 73 ERV->getType()->getAsString() + "'"); 74 } else { 75 CurRec->addValue(RV); 76 } 77 return false; 78 } 79 80 /// SetValue - 81 /// Return true on error, false on success. 82 bool TGParser::SetValue(Record *CurRec, SMLoc Loc, Init *ValName, 83 const std::vector<unsigned> &BitList, Init *V) { 84 if (!V) return false; 85 86 if (CurRec == 0) CurRec = &CurMultiClass->Rec; 87 88 RecordVal *RV = CurRec->getValue(ValName); 89 if (RV == 0) 90 return Error(Loc, "Value '" + ValName->getAsUnquotedString() 91 + "' unknown!"); 92 93 // Do not allow assignments like 'X = X'. This will just cause infinite loops 94 // in the resolution machinery. 95 if (BitList.empty()) 96 if (VarInit *VI = dyn_cast<VarInit>(V)) 97 if (VI->getNameInit() == ValName) 98 return false; 99 100 // If we are assigning to a subset of the bits in the value... then we must be 101 // assigning to a field of BitsRecTy, which must have a BitsInit 102 // initializer. 103 // 104 if (!BitList.empty()) { 105 BitsInit *CurVal = dyn_cast<BitsInit>(RV->getValue()); 106 if (CurVal == 0) 107 return Error(Loc, "Value '" + ValName->getAsUnquotedString() 108 + "' is not a bits type"); 109 110 // Convert the incoming value to a bits type of the appropriate size... 111 Init *BI = V->convertInitializerTo(BitsRecTy::get(BitList.size())); 112 if (BI == 0) { 113 return Error(Loc, "Initializer is not compatible with bit range"); 114 } 115 116 // We should have a BitsInit type now. 117 BitsInit *BInit = dyn_cast<BitsInit>(BI); 118 assert(BInit != 0); 119 120 SmallVector<Init *, 16> NewBits(CurVal->getNumBits()); 121 122 // Loop over bits, assigning values as appropriate. 123 for (unsigned i = 0, e = BitList.size(); i != e; ++i) { 124 unsigned Bit = BitList[i]; 125 if (NewBits[Bit]) 126 return Error(Loc, "Cannot set bit #" + utostr(Bit) + " of value '" + 127 ValName->getAsUnquotedString() + "' more than once"); 128 NewBits[Bit] = BInit->getBit(i); 129 } 130 131 for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i) 132 if (NewBits[i] == 0) 133 NewBits[i] = CurVal->getBit(i); 134 135 V = BitsInit::get(NewBits); 136 } 137 138 if (RV->setValue(V)) 139 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + "' of type '" 140 + RV->getType()->getAsString() + 141 "' is incompatible with initializer '" + V->getAsString() 142 + "'"); 143 return false; 144 } 145 146 /// AddSubClass - Add SubClass as a subclass to CurRec, resolving its template 147 /// args as SubClass's template arguments. 148 bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) { 149 Record *SC = SubClass.Rec; 150 // Add all of the values in the subclass into the current class. 151 const std::vector<RecordVal> &Vals = SC->getValues(); 152 for (unsigned i = 0, e = Vals.size(); i != e; ++i) 153 if (AddValue(CurRec, SubClass.RefRange.Start, Vals[i])) 154 return true; 155 156 const std::vector<Init *> &TArgs = SC->getTemplateArgs(); 157 158 // Ensure that an appropriate number of template arguments are specified. 159 if (TArgs.size() < SubClass.TemplateArgs.size()) 160 return Error(SubClass.RefRange.Start, 161 "More template args specified than expected"); 162 163 // Loop over all of the template arguments, setting them to the specified 164 // value or leaving them as the default if necessary. 165 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 166 if (i < SubClass.TemplateArgs.size()) { 167 // If a value is specified for this template arg, set it now. 168 if (SetValue(CurRec, SubClass.RefRange.Start, TArgs[i], 169 std::vector<unsigned>(), SubClass.TemplateArgs[i])) 170 return true; 171 172 // Resolve it next. 173 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i])); 174 175 // Now remove it. 176 CurRec->removeValue(TArgs[i]); 177 178 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { 179 return Error(SubClass.RefRange.Start, 180 "Value not specified for template argument #" 181 + utostr(i) + " (" + TArgs[i]->getAsUnquotedString() 182 + ") of subclass '" + SC->getNameInitAsString() + "'!"); 183 } 184 } 185 186 // Since everything went well, we can now set the "superclass" list for the 187 // current record. 188 const std::vector<Record*> &SCs = SC->getSuperClasses(); 189 ArrayRef<SMRange> SCRanges = SC->getSuperClassRanges(); 190 for (unsigned i = 0, e = SCs.size(); i != e; ++i) { 191 if (CurRec->isSubClassOf(SCs[i])) 192 return Error(SubClass.RefRange.Start, 193 "Already subclass of '" + SCs[i]->getName() + "'!\n"); 194 CurRec->addSuperClass(SCs[i], SCRanges[i]); 195 } 196 197 if (CurRec->isSubClassOf(SC)) 198 return Error(SubClass.RefRange.Start, 199 "Already subclass of '" + SC->getName() + "'!\n"); 200 CurRec->addSuperClass(SC, SubClass.RefRange); 201 return false; 202 } 203 204 /// AddSubMultiClass - Add SubMultiClass as a subclass to 205 /// CurMC, resolving its template args as SubMultiClass's 206 /// template arguments. 207 bool TGParser::AddSubMultiClass(MultiClass *CurMC, 208 SubMultiClassReference &SubMultiClass) { 209 MultiClass *SMC = SubMultiClass.MC; 210 Record *CurRec = &CurMC->Rec; 211 212 const std::vector<RecordVal> &MCVals = CurRec->getValues(); 213 214 // Add all of the values in the subclass into the current class. 215 const std::vector<RecordVal> &SMCVals = SMC->Rec.getValues(); 216 for (unsigned i = 0, e = SMCVals.size(); i != e; ++i) 217 if (AddValue(CurRec, SubMultiClass.RefRange.Start, SMCVals[i])) 218 return true; 219 220 int newDefStart = CurMC->DefPrototypes.size(); 221 222 // Add all of the defs in the subclass into the current multiclass. 223 for (MultiClass::RecordVector::const_iterator i = SMC->DefPrototypes.begin(), 224 iend = SMC->DefPrototypes.end(); 225 i != iend; 226 ++i) { 227 // Clone the def and add it to the current multiclass 228 Record *NewDef = new Record(**i); 229 230 // Add all of the values in the superclass into the current def. 231 for (unsigned i = 0, e = MCVals.size(); i != e; ++i) 232 if (AddValue(NewDef, SubMultiClass.RefRange.Start, MCVals[i])) 233 return true; 234 235 CurMC->DefPrototypes.push_back(NewDef); 236 } 237 238 const std::vector<Init *> &SMCTArgs = SMC->Rec.getTemplateArgs(); 239 240 // Ensure that an appropriate number of template arguments are 241 // specified. 242 if (SMCTArgs.size() < SubMultiClass.TemplateArgs.size()) 243 return Error(SubMultiClass.RefRange.Start, 244 "More template args specified than expected"); 245 246 // Loop over all of the template arguments, setting them to the specified 247 // value or leaving them as the default if necessary. 248 for (unsigned i = 0, e = SMCTArgs.size(); i != e; ++i) { 249 if (i < SubMultiClass.TemplateArgs.size()) { 250 // If a value is specified for this template arg, set it in the 251 // superclass now. 252 if (SetValue(CurRec, SubMultiClass.RefRange.Start, SMCTArgs[i], 253 std::vector<unsigned>(), 254 SubMultiClass.TemplateArgs[i])) 255 return true; 256 257 // Resolve it next. 258 CurRec->resolveReferencesTo(CurRec->getValue(SMCTArgs[i])); 259 260 // Now remove it. 261 CurRec->removeValue(SMCTArgs[i]); 262 263 // If a value is specified for this template arg, set it in the 264 // new defs now. 265 for (MultiClass::RecordVector::iterator j = 266 CurMC->DefPrototypes.begin() + newDefStart, 267 jend = CurMC->DefPrototypes.end(); 268 j != jend; 269 ++j) { 270 Record *Def = *j; 271 272 if (SetValue(Def, SubMultiClass.RefRange.Start, SMCTArgs[i], 273 std::vector<unsigned>(), 274 SubMultiClass.TemplateArgs[i])) 275 return true; 276 277 // Resolve it next. 278 Def->resolveReferencesTo(Def->getValue(SMCTArgs[i])); 279 280 // Now remove it 281 Def->removeValue(SMCTArgs[i]); 282 } 283 } else if (!CurRec->getValue(SMCTArgs[i])->getValue()->isComplete()) { 284 return Error(SubMultiClass.RefRange.Start, 285 "Value not specified for template argument #" 286 + utostr(i) + " (" + SMCTArgs[i]->getAsUnquotedString() 287 + ") of subclass '" + SMC->Rec.getNameInitAsString() + "'!"); 288 } 289 } 290 291 return false; 292 } 293 294 /// ProcessForeachDefs - Given a record, apply all of the variable 295 /// values in all surrounding foreach loops, creating new records for 296 /// each combination of values. 297 bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc) { 298 if (Loops.empty()) 299 return false; 300 301 // We want to instantiate a new copy of CurRec for each combination 302 // of nested loop iterator values. We don't want top instantiate 303 // any copies until we have values for each loop iterator. 304 IterSet IterVals; 305 return ProcessForeachDefs(CurRec, Loc, IterVals); 306 } 307 308 /// ProcessForeachDefs - Given a record, a loop and a loop iterator, 309 /// apply each of the variable values in this loop and then process 310 /// subloops. 311 bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){ 312 // Recursively build a tuple of iterator values. 313 if (IterVals.size() != Loops.size()) { 314 assert(IterVals.size() < Loops.size()); 315 ForeachLoop &CurLoop = Loops[IterVals.size()]; 316 ListInit *List = dyn_cast<ListInit>(CurLoop.ListValue); 317 if (List == 0) { 318 Error(Loc, "Loop list is not a list"); 319 return true; 320 } 321 322 // Process each value. 323 for (int64_t i = 0; i < List->getSize(); ++i) { 324 Init *ItemVal = List->resolveListElementReference(*CurRec, 0, i); 325 IterVals.push_back(IterRecord(CurLoop.IterVar, ItemVal)); 326 if (ProcessForeachDefs(CurRec, Loc, IterVals)) 327 return true; 328 IterVals.pop_back(); 329 } 330 return false; 331 } 332 333 // This is the bottom of the recursion. We have all of the iterator values 334 // for this point in the iteration space. Instantiate a new record to 335 // reflect this combination of values. 336 Record *IterRec = new Record(*CurRec); 337 338 // Set the iterator values now. 339 for (unsigned i = 0, e = IterVals.size(); i != e; ++i) { 340 VarInit *IterVar = IterVals[i].IterVar; 341 TypedInit *IVal = dyn_cast<TypedInit>(IterVals[i].IterValue); 342 if (IVal == 0) { 343 Error(Loc, "foreach iterator value is untyped"); 344 return true; 345 } 346 347 IterRec->addValue(RecordVal(IterVar->getName(), IVal->getType(), false)); 348 349 if (SetValue(IterRec, Loc, IterVar->getName(), 350 std::vector<unsigned>(), IVal)) { 351 Error(Loc, "when instantiating this def"); 352 return true; 353 } 354 355 // Resolve it next. 356 IterRec->resolveReferencesTo(IterRec->getValue(IterVar->getName())); 357 358 // Remove it. 359 IterRec->removeValue(IterVar->getName()); 360 } 361 362 if (Records.getDef(IterRec->getNameInitAsString())) { 363 Error(Loc, "def already exists: " + IterRec->getNameInitAsString()); 364 return true; 365 } 366 367 Records.addDef(IterRec); 368 IterRec->resolveReferences(); 369 return false; 370 } 371 372 //===----------------------------------------------------------------------===// 373 // Parser Code 374 //===----------------------------------------------------------------------===// 375 376 /// isObjectStart - Return true if this is a valid first token for an Object. 377 static bool isObjectStart(tgtok::TokKind K) { 378 return K == tgtok::Class || K == tgtok::Def || 379 K == tgtok::Defm || K == tgtok::Let || 380 K == tgtok::MultiClass || K == tgtok::Foreach; 381 } 382 383 static std::string GetNewAnonymousName() { 384 static unsigned AnonCounter = 0; 385 unsigned Tmp = AnonCounter++; // MSVC2012 ICEs without this. 386 return "anonymous." + utostr(Tmp); 387 } 388 389 /// ParseObjectName - If an object name is specified, return it. Otherwise, 390 /// return 0. 391 /// ObjectName ::= Value [ '#' Value ]* 392 /// ObjectName ::= /*empty*/ 393 /// 394 Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) { 395 switch (Lex.getCode()) { 396 case tgtok::colon: 397 case tgtok::semi: 398 case tgtok::l_brace: 399 // These are all of the tokens that can begin an object body. 400 // Some of these can also begin values but we disallow those cases 401 // because they are unlikely to be useful. 402 return 0; 403 default: 404 break; 405 } 406 407 Record *CurRec = 0; 408 if (CurMultiClass) 409 CurRec = &CurMultiClass->Rec; 410 411 RecTy *Type = 0; 412 if (CurRec) { 413 const TypedInit *CurRecName = dyn_cast<TypedInit>(CurRec->getNameInit()); 414 if (!CurRecName) { 415 TokError("Record name is not typed!"); 416 return 0; 417 } 418 Type = CurRecName->getType(); 419 } 420 421 return ParseValue(CurRec, Type, ParseNameMode); 422 } 423 424 /// ParseClassID - Parse and resolve a reference to a class name. This returns 425 /// null on error. 426 /// 427 /// ClassID ::= ID 428 /// 429 Record *TGParser::ParseClassID() { 430 if (Lex.getCode() != tgtok::Id) { 431 TokError("expected name for ClassID"); 432 return 0; 433 } 434 435 Record *Result = Records.getClass(Lex.getCurStrVal()); 436 if (Result == 0) 437 TokError("Couldn't find class '" + Lex.getCurStrVal() + "'"); 438 439 Lex.Lex(); 440 return Result; 441 } 442 443 /// ParseMultiClassID - Parse and resolve a reference to a multiclass name. 444 /// This returns null on error. 445 /// 446 /// MultiClassID ::= ID 447 /// 448 MultiClass *TGParser::ParseMultiClassID() { 449 if (Lex.getCode() != tgtok::Id) { 450 TokError("expected name for MultiClassID"); 451 return 0; 452 } 453 454 MultiClass *Result = MultiClasses[Lex.getCurStrVal()]; 455 if (Result == 0) 456 TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'"); 457 458 Lex.Lex(); 459 return Result; 460 } 461 462 /// ParseSubClassReference - Parse a reference to a subclass or to a templated 463 /// subclass. This returns a SubClassRefTy with a null Record* on error. 464 /// 465 /// SubClassRef ::= ClassID 466 /// SubClassRef ::= ClassID '<' ValueList '>' 467 /// 468 SubClassReference TGParser:: 469 ParseSubClassReference(Record *CurRec, bool isDefm) { 470 SubClassReference Result; 471 Result.RefRange.Start = Lex.getLoc(); 472 473 if (isDefm) { 474 if (MultiClass *MC = ParseMultiClassID()) 475 Result.Rec = &MC->Rec; 476 } else { 477 Result.Rec = ParseClassID(); 478 } 479 if (Result.Rec == 0) return Result; 480 481 // If there is no template arg list, we're done. 482 if (Lex.getCode() != tgtok::less) { 483 Result.RefRange.End = Lex.getLoc(); 484 return Result; 485 } 486 Lex.Lex(); // Eat the '<' 487 488 if (Lex.getCode() == tgtok::greater) { 489 TokError("subclass reference requires a non-empty list of template values"); 490 Result.Rec = 0; 491 return Result; 492 } 493 494 Result.TemplateArgs = ParseValueList(CurRec, Result.Rec); 495 if (Result.TemplateArgs.empty()) { 496 Result.Rec = 0; // Error parsing value list. 497 return Result; 498 } 499 500 if (Lex.getCode() != tgtok::greater) { 501 TokError("expected '>' in template value list"); 502 Result.Rec = 0; 503 return Result; 504 } 505 Lex.Lex(); 506 Result.RefRange.End = Lex.getLoc(); 507 508 return Result; 509 } 510 511 /// ParseSubMultiClassReference - Parse a reference to a subclass or to a 512 /// templated submulticlass. This returns a SubMultiClassRefTy with a null 513 /// Record* on error. 514 /// 515 /// SubMultiClassRef ::= MultiClassID 516 /// SubMultiClassRef ::= MultiClassID '<' ValueList '>' 517 /// 518 SubMultiClassReference TGParser:: 519 ParseSubMultiClassReference(MultiClass *CurMC) { 520 SubMultiClassReference Result; 521 Result.RefRange.Start = Lex.getLoc(); 522 523 Result.MC = ParseMultiClassID(); 524 if (Result.MC == 0) return Result; 525 526 // If there is no template arg list, we're done. 527 if (Lex.getCode() != tgtok::less) { 528 Result.RefRange.End = Lex.getLoc(); 529 return Result; 530 } 531 Lex.Lex(); // Eat the '<' 532 533 if (Lex.getCode() == tgtok::greater) { 534 TokError("subclass reference requires a non-empty list of template values"); 535 Result.MC = 0; 536 return Result; 537 } 538 539 Result.TemplateArgs = ParseValueList(&CurMC->Rec, &Result.MC->Rec); 540 if (Result.TemplateArgs.empty()) { 541 Result.MC = 0; // Error parsing value list. 542 return Result; 543 } 544 545 if (Lex.getCode() != tgtok::greater) { 546 TokError("expected '>' in template value list"); 547 Result.MC = 0; 548 return Result; 549 } 550 Lex.Lex(); 551 Result.RefRange.End = Lex.getLoc(); 552 553 return Result; 554 } 555 556 /// ParseRangePiece - Parse a bit/value range. 557 /// RangePiece ::= INTVAL 558 /// RangePiece ::= INTVAL '-' INTVAL 559 /// RangePiece ::= INTVAL INTVAL 560 bool TGParser::ParseRangePiece(std::vector<unsigned> &Ranges) { 561 if (Lex.getCode() != tgtok::IntVal) { 562 TokError("expected integer or bitrange"); 563 return true; 564 } 565 int64_t Start = Lex.getCurIntVal(); 566 int64_t End; 567 568 if (Start < 0) 569 return TokError("invalid range, cannot be negative"); 570 571 switch (Lex.Lex()) { // eat first character. 572 default: 573 Ranges.push_back(Start); 574 return false; 575 case tgtok::minus: 576 if (Lex.Lex() != tgtok::IntVal) { 577 TokError("expected integer value as end of range"); 578 return true; 579 } 580 End = Lex.getCurIntVal(); 581 break; 582 case tgtok::IntVal: 583 End = -Lex.getCurIntVal(); 584 break; 585 } 586 if (End < 0) 587 return TokError("invalid range, cannot be negative"); 588 Lex.Lex(); 589 590 // Add to the range. 591 if (Start < End) { 592 for (; Start <= End; ++Start) 593 Ranges.push_back(Start); 594 } else { 595 for (; Start >= End; --Start) 596 Ranges.push_back(Start); 597 } 598 return false; 599 } 600 601 /// ParseRangeList - Parse a list of scalars and ranges into scalar values. 602 /// 603 /// RangeList ::= RangePiece (',' RangePiece)* 604 /// 605 std::vector<unsigned> TGParser::ParseRangeList() { 606 std::vector<unsigned> Result; 607 608 // Parse the first piece. 609 if (ParseRangePiece(Result)) 610 return std::vector<unsigned>(); 611 while (Lex.getCode() == tgtok::comma) { 612 Lex.Lex(); // Eat the comma. 613 614 // Parse the next range piece. 615 if (ParseRangePiece(Result)) 616 return std::vector<unsigned>(); 617 } 618 return Result; 619 } 620 621 /// ParseOptionalRangeList - Parse either a range list in <>'s or nothing. 622 /// OptionalRangeList ::= '<' RangeList '>' 623 /// OptionalRangeList ::= /*empty*/ 624 bool TGParser::ParseOptionalRangeList(std::vector<unsigned> &Ranges) { 625 if (Lex.getCode() != tgtok::less) 626 return false; 627 628 SMLoc StartLoc = Lex.getLoc(); 629 Lex.Lex(); // eat the '<' 630 631 // Parse the range list. 632 Ranges = ParseRangeList(); 633 if (Ranges.empty()) return true; 634 635 if (Lex.getCode() != tgtok::greater) { 636 TokError("expected '>' at end of range list"); 637 return Error(StartLoc, "to match this '<'"); 638 } 639 Lex.Lex(); // eat the '>'. 640 return false; 641 } 642 643 /// ParseOptionalBitList - Parse either a bit list in {}'s or nothing. 644 /// OptionalBitList ::= '{' RangeList '}' 645 /// OptionalBitList ::= /*empty*/ 646 bool TGParser::ParseOptionalBitList(std::vector<unsigned> &Ranges) { 647 if (Lex.getCode() != tgtok::l_brace) 648 return false; 649 650 SMLoc StartLoc = Lex.getLoc(); 651 Lex.Lex(); // eat the '{' 652 653 // Parse the range list. 654 Ranges = ParseRangeList(); 655 if (Ranges.empty()) return true; 656 657 if (Lex.getCode() != tgtok::r_brace) { 658 TokError("expected '}' at end of bit list"); 659 return Error(StartLoc, "to match this '{'"); 660 } 661 Lex.Lex(); // eat the '}'. 662 return false; 663 } 664 665 666 /// ParseType - Parse and return a tblgen type. This returns null on error. 667 /// 668 /// Type ::= STRING // string type 669 /// Type ::= CODE // code type 670 /// Type ::= BIT // bit type 671 /// Type ::= BITS '<' INTVAL '>' // bits<x> type 672 /// Type ::= INT // int type 673 /// Type ::= LIST '<' Type '>' // list<x> type 674 /// Type ::= DAG // dag type 675 /// Type ::= ClassID // Record Type 676 /// 677 RecTy *TGParser::ParseType() { 678 switch (Lex.getCode()) { 679 default: TokError("Unknown token when expecting a type"); return 0; 680 case tgtok::String: Lex.Lex(); return StringRecTy::get(); 681 case tgtok::Code: Lex.Lex(); return StringRecTy::get(); 682 case tgtok::Bit: Lex.Lex(); return BitRecTy::get(); 683 case tgtok::Int: Lex.Lex(); return IntRecTy::get(); 684 case tgtok::Dag: Lex.Lex(); return DagRecTy::get(); 685 case tgtok::Id: 686 if (Record *R = ParseClassID()) return RecordRecTy::get(R); 687 return 0; 688 case tgtok::Bits: { 689 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 690 TokError("expected '<' after bits type"); 691 return 0; 692 } 693 if (Lex.Lex() != tgtok::IntVal) { // Eat '<' 694 TokError("expected integer in bits<n> type"); 695 return 0; 696 } 697 uint64_t Val = Lex.getCurIntVal(); 698 if (Lex.Lex() != tgtok::greater) { // Eat count. 699 TokError("expected '>' at end of bits<n> type"); 700 return 0; 701 } 702 Lex.Lex(); // Eat '>' 703 return BitsRecTy::get(Val); 704 } 705 case tgtok::List: { 706 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 707 TokError("expected '<' after list type"); 708 return 0; 709 } 710 Lex.Lex(); // Eat '<' 711 RecTy *SubType = ParseType(); 712 if (SubType == 0) return 0; 713 714 if (Lex.getCode() != tgtok::greater) { 715 TokError("expected '>' at end of list<ty> type"); 716 return 0; 717 } 718 Lex.Lex(); // Eat '>' 719 return ListRecTy::get(SubType); 720 } 721 } 722 } 723 724 /// ParseIDValue - Parse an ID as a value and decode what it means. 725 /// 726 /// IDValue ::= ID [def local value] 727 /// IDValue ::= ID [def template arg] 728 /// IDValue ::= ID [multiclass local value] 729 /// IDValue ::= ID [multiclass template argument] 730 /// IDValue ::= ID [def name] 731 /// 732 Init *TGParser::ParseIDValue(Record *CurRec, IDParseMode Mode) { 733 assert(Lex.getCode() == tgtok::Id && "Expected ID in ParseIDValue"); 734 std::string Name = Lex.getCurStrVal(); 735 SMLoc Loc = Lex.getLoc(); 736 Lex.Lex(); 737 return ParseIDValue(CurRec, Name, Loc); 738 } 739 740 /// ParseIDValue - This is just like ParseIDValue above, but it assumes the ID 741 /// has already been read. 742 Init *TGParser::ParseIDValue(Record *CurRec, 743 const std::string &Name, SMLoc NameLoc, 744 IDParseMode Mode) { 745 if (CurRec) { 746 if (const RecordVal *RV = CurRec->getValue(Name)) 747 return VarInit::get(Name, RV->getType()); 748 749 Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, ":"); 750 751 if (CurMultiClass) 752 TemplateArgName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, 753 "::"); 754 755 if (CurRec->isTemplateArg(TemplateArgName)) { 756 const RecordVal *RV = CurRec->getValue(TemplateArgName); 757 assert(RV && "Template arg doesn't exist??"); 758 return VarInit::get(TemplateArgName, RV->getType()); 759 } 760 } 761 762 if (CurMultiClass) { 763 Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, 764 "::"); 765 766 if (CurMultiClass->Rec.isTemplateArg(MCName)) { 767 const RecordVal *RV = CurMultiClass->Rec.getValue(MCName); 768 assert(RV && "Template arg doesn't exist??"); 769 return VarInit::get(MCName, RV->getType()); 770 } 771 } 772 773 // If this is in a foreach loop, make sure it's not a loop iterator 774 for (LoopVector::iterator i = Loops.begin(), iend = Loops.end(); 775 i != iend; 776 ++i) { 777 VarInit *IterVar = dyn_cast<VarInit>(i->IterVar); 778 if (IterVar && IterVar->getName() == Name) 779 return IterVar; 780 } 781 782 if (Mode == ParseNameMode) 783 return StringInit::get(Name); 784 785 if (Record *D = Records.getDef(Name)) 786 return DefInit::get(D); 787 788 if (Mode == ParseValueMode) { 789 Error(NameLoc, "Variable not defined: '" + Name + "'"); 790 return 0; 791 } 792 793 return StringInit::get(Name); 794 } 795 796 /// ParseOperation - Parse an operator. This returns null on error. 797 /// 798 /// Operation ::= XOperator ['<' Type '>'] '(' Args ')' 799 /// 800 Init *TGParser::ParseOperation(Record *CurRec) { 801 switch (Lex.getCode()) { 802 default: 803 TokError("unknown operation"); 804 return 0; 805 case tgtok::XHead: 806 case tgtok::XTail: 807 case tgtok::XEmpty: 808 case tgtok::XCast: { // Value ::= !unop '(' Value ')' 809 UnOpInit::UnaryOp Code; 810 RecTy *Type = 0; 811 812 switch (Lex.getCode()) { 813 default: llvm_unreachable("Unhandled code!"); 814 case tgtok::XCast: 815 Lex.Lex(); // eat the operation 816 Code = UnOpInit::CAST; 817 818 Type = ParseOperatorType(); 819 820 if (Type == 0) { 821 TokError("did not get type for unary operator"); 822 return 0; 823 } 824 825 break; 826 case tgtok::XHead: 827 Lex.Lex(); // eat the operation 828 Code = UnOpInit::HEAD; 829 break; 830 case tgtok::XTail: 831 Lex.Lex(); // eat the operation 832 Code = UnOpInit::TAIL; 833 break; 834 case tgtok::XEmpty: 835 Lex.Lex(); // eat the operation 836 Code = UnOpInit::EMPTY; 837 Type = IntRecTy::get(); 838 break; 839 } 840 if (Lex.getCode() != tgtok::l_paren) { 841 TokError("expected '(' after unary operator"); 842 return 0; 843 } 844 Lex.Lex(); // eat the '(' 845 846 Init *LHS = ParseValue(CurRec); 847 if (LHS == 0) return 0; 848 849 if (Code == UnOpInit::HEAD 850 || Code == UnOpInit::TAIL 851 || Code == UnOpInit::EMPTY) { 852 ListInit *LHSl = dyn_cast<ListInit>(LHS); 853 StringInit *LHSs = dyn_cast<StringInit>(LHS); 854 TypedInit *LHSt = dyn_cast<TypedInit>(LHS); 855 if (LHSl == 0 && LHSs == 0 && LHSt == 0) { 856 TokError("expected list or string type argument in unary operator"); 857 return 0; 858 } 859 if (LHSt) { 860 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType()); 861 StringRecTy *SType = dyn_cast<StringRecTy>(LHSt->getType()); 862 if (LType == 0 && SType == 0) { 863 TokError("expected list or string type argumnet in unary operator"); 864 return 0; 865 } 866 } 867 868 if (Code == UnOpInit::HEAD 869 || Code == UnOpInit::TAIL) { 870 if (LHSl == 0 && LHSt == 0) { 871 TokError("expected list type argumnet in unary operator"); 872 return 0; 873 } 874 875 if (LHSl && LHSl->getSize() == 0) { 876 TokError("empty list argument in unary operator"); 877 return 0; 878 } 879 if (LHSl) { 880 Init *Item = LHSl->getElement(0); 881 TypedInit *Itemt = dyn_cast<TypedInit>(Item); 882 if (Itemt == 0) { 883 TokError("untyped list element in unary operator"); 884 return 0; 885 } 886 if (Code == UnOpInit::HEAD) { 887 Type = Itemt->getType(); 888 } else { 889 Type = ListRecTy::get(Itemt->getType()); 890 } 891 } else { 892 assert(LHSt && "expected list type argument in unary operator"); 893 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType()); 894 if (LType == 0) { 895 TokError("expected list type argumnet in unary operator"); 896 return 0; 897 } 898 if (Code == UnOpInit::HEAD) { 899 Type = LType->getElementType(); 900 } else { 901 Type = LType; 902 } 903 } 904 } 905 } 906 907 if (Lex.getCode() != tgtok::r_paren) { 908 TokError("expected ')' in unary operator"); 909 return 0; 910 } 911 Lex.Lex(); // eat the ')' 912 return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec, CurMultiClass); 913 } 914 915 case tgtok::XConcat: 916 case tgtok::XADD: 917 case tgtok::XSRA: 918 case tgtok::XSRL: 919 case tgtok::XSHL: 920 case tgtok::XEq: 921 case tgtok::XStrConcat: { // Value ::= !binop '(' Value ',' Value ')' 922 tgtok::TokKind OpTok = Lex.getCode(); 923 SMLoc OpLoc = Lex.getLoc(); 924 Lex.Lex(); // eat the operation 925 926 BinOpInit::BinaryOp Code; 927 RecTy *Type = 0; 928 929 switch (OpTok) { 930 default: llvm_unreachable("Unhandled code!"); 931 case tgtok::XConcat: Code = BinOpInit::CONCAT;Type = DagRecTy::get(); break; 932 case tgtok::XADD: Code = BinOpInit::ADD; Type = IntRecTy::get(); break; 933 case tgtok::XSRA: Code = BinOpInit::SRA; Type = IntRecTy::get(); break; 934 case tgtok::XSRL: Code = BinOpInit::SRL; Type = IntRecTy::get(); break; 935 case tgtok::XSHL: Code = BinOpInit::SHL; Type = IntRecTy::get(); break; 936 case tgtok::XEq: Code = BinOpInit::EQ; Type = BitRecTy::get(); break; 937 case tgtok::XStrConcat: 938 Code = BinOpInit::STRCONCAT; 939 Type = StringRecTy::get(); 940 break; 941 } 942 943 if (Lex.getCode() != tgtok::l_paren) { 944 TokError("expected '(' after binary operator"); 945 return 0; 946 } 947 Lex.Lex(); // eat the '(' 948 949 SmallVector<Init*, 2> InitList; 950 951 InitList.push_back(ParseValue(CurRec)); 952 if (InitList.back() == 0) return 0; 953 954 while (Lex.getCode() == tgtok::comma) { 955 Lex.Lex(); // eat the ',' 956 957 InitList.push_back(ParseValue(CurRec)); 958 if (InitList.back() == 0) return 0; 959 } 960 961 if (Lex.getCode() != tgtok::r_paren) { 962 TokError("expected ')' in operator"); 963 return 0; 964 } 965 Lex.Lex(); // eat the ')' 966 967 // We allow multiple operands to associative operators like !strconcat as 968 // shorthand for nesting them. 969 if (Code == BinOpInit::STRCONCAT) { 970 while (InitList.size() > 2) { 971 Init *RHS = InitList.pop_back_val(); 972 RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type)) 973 ->Fold(CurRec, CurMultiClass); 974 InitList.back() = RHS; 975 } 976 } 977 978 if (InitList.size() == 2) 979 return (BinOpInit::get(Code, InitList[0], InitList[1], Type)) 980 ->Fold(CurRec, CurMultiClass); 981 982 Error(OpLoc, "expected two operands to operator"); 983 return 0; 984 } 985 986 case tgtok::XIf: 987 case tgtok::XForEach: 988 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 989 TernOpInit::TernaryOp Code; 990 RecTy *Type = 0; 991 992 tgtok::TokKind LexCode = Lex.getCode(); 993 Lex.Lex(); // eat the operation 994 switch (LexCode) { 995 default: llvm_unreachable("Unhandled code!"); 996 case tgtok::XIf: 997 Code = TernOpInit::IF; 998 break; 999 case tgtok::XForEach: 1000 Code = TernOpInit::FOREACH; 1001 break; 1002 case tgtok::XSubst: 1003 Code = TernOpInit::SUBST; 1004 break; 1005 } 1006 if (Lex.getCode() != tgtok::l_paren) { 1007 TokError("expected '(' after ternary operator"); 1008 return 0; 1009 } 1010 Lex.Lex(); // eat the '(' 1011 1012 Init *LHS = ParseValue(CurRec); 1013 if (LHS == 0) return 0; 1014 1015 if (Lex.getCode() != tgtok::comma) { 1016 TokError("expected ',' in ternary operator"); 1017 return 0; 1018 } 1019 Lex.Lex(); // eat the ',' 1020 1021 Init *MHS = ParseValue(CurRec); 1022 if (MHS == 0) return 0; 1023 1024 if (Lex.getCode() != tgtok::comma) { 1025 TokError("expected ',' in ternary operator"); 1026 return 0; 1027 } 1028 Lex.Lex(); // eat the ',' 1029 1030 Init *RHS = ParseValue(CurRec); 1031 if (RHS == 0) return 0; 1032 1033 if (Lex.getCode() != tgtok::r_paren) { 1034 TokError("expected ')' in binary operator"); 1035 return 0; 1036 } 1037 Lex.Lex(); // eat the ')' 1038 1039 switch (LexCode) { 1040 default: llvm_unreachable("Unhandled code!"); 1041 case tgtok::XIf: { 1042 RecTy *MHSTy = 0; 1043 RecTy *RHSTy = 0; 1044 1045 if (TypedInit *MHSt = dyn_cast<TypedInit>(MHS)) 1046 MHSTy = MHSt->getType(); 1047 if (BitsInit *MHSbits = dyn_cast<BitsInit>(MHS)) 1048 MHSTy = BitsRecTy::get(MHSbits->getNumBits()); 1049 if (isa<BitInit>(MHS)) 1050 MHSTy = BitRecTy::get(); 1051 1052 if (TypedInit *RHSt = dyn_cast<TypedInit>(RHS)) 1053 RHSTy = RHSt->getType(); 1054 if (BitsInit *RHSbits = dyn_cast<BitsInit>(RHS)) 1055 RHSTy = BitsRecTy::get(RHSbits->getNumBits()); 1056 if (isa<BitInit>(RHS)) 1057 RHSTy = BitRecTy::get(); 1058 1059 // For UnsetInit, it's typed from the other hand. 1060 if (isa<UnsetInit>(MHS)) 1061 MHSTy = RHSTy; 1062 if (isa<UnsetInit>(RHS)) 1063 RHSTy = MHSTy; 1064 1065 if (!MHSTy || !RHSTy) { 1066 TokError("could not get type for !if"); 1067 return 0; 1068 } 1069 1070 if (MHSTy->typeIsConvertibleTo(RHSTy)) { 1071 Type = RHSTy; 1072 } else if (RHSTy->typeIsConvertibleTo(MHSTy)) { 1073 Type = MHSTy; 1074 } else { 1075 TokError("inconsistent types for !if"); 1076 return 0; 1077 } 1078 break; 1079 } 1080 case tgtok::XForEach: { 1081 TypedInit *MHSt = dyn_cast<TypedInit>(MHS); 1082 if (MHSt == 0) { 1083 TokError("could not get type for !foreach"); 1084 return 0; 1085 } 1086 Type = MHSt->getType(); 1087 break; 1088 } 1089 case tgtok::XSubst: { 1090 TypedInit *RHSt = dyn_cast<TypedInit>(RHS); 1091 if (RHSt == 0) { 1092 TokError("could not get type for !subst"); 1093 return 0; 1094 } 1095 Type = RHSt->getType(); 1096 break; 1097 } 1098 } 1099 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec, 1100 CurMultiClass); 1101 } 1102 } 1103 } 1104 1105 /// ParseOperatorType - Parse a type for an operator. This returns 1106 /// null on error. 1107 /// 1108 /// OperatorType ::= '<' Type '>' 1109 /// 1110 RecTy *TGParser::ParseOperatorType() { 1111 RecTy *Type = 0; 1112 1113 if (Lex.getCode() != tgtok::less) { 1114 TokError("expected type name for operator"); 1115 return 0; 1116 } 1117 Lex.Lex(); // eat the < 1118 1119 Type = ParseType(); 1120 1121 if (Type == 0) { 1122 TokError("expected type name for operator"); 1123 return 0; 1124 } 1125 1126 if (Lex.getCode() != tgtok::greater) { 1127 TokError("expected type name for operator"); 1128 return 0; 1129 } 1130 Lex.Lex(); // eat the > 1131 1132 return Type; 1133 } 1134 1135 1136 /// ParseSimpleValue - Parse a tblgen value. This returns null on error. 1137 /// 1138 /// SimpleValue ::= IDValue 1139 /// SimpleValue ::= INTVAL 1140 /// SimpleValue ::= STRVAL+ 1141 /// SimpleValue ::= CODEFRAGMENT 1142 /// SimpleValue ::= '?' 1143 /// SimpleValue ::= '{' ValueList '}' 1144 /// SimpleValue ::= ID '<' ValueListNE '>' 1145 /// SimpleValue ::= '[' ValueList ']' 1146 /// SimpleValue ::= '(' IDValue DagArgList ')' 1147 /// SimpleValue ::= CONCATTOK '(' Value ',' Value ')' 1148 /// SimpleValue ::= ADDTOK '(' Value ',' Value ')' 1149 /// SimpleValue ::= SHLTOK '(' Value ',' Value ')' 1150 /// SimpleValue ::= SRATOK '(' Value ',' Value ')' 1151 /// SimpleValue ::= SRLTOK '(' Value ',' Value ')' 1152 /// SimpleValue ::= STRCONCATTOK '(' Value ',' Value ')' 1153 /// 1154 Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, 1155 IDParseMode Mode) { 1156 Init *R = 0; 1157 switch (Lex.getCode()) { 1158 default: TokError("Unknown token when parsing a value"); break; 1159 case tgtok::paste: 1160 // This is a leading paste operation. This is deprecated but 1161 // still exists in some .td files. Ignore it. 1162 Lex.Lex(); // Skip '#'. 1163 return ParseSimpleValue(CurRec, ItemType, Mode); 1164 case tgtok::IntVal: R = IntInit::get(Lex.getCurIntVal()); Lex.Lex(); break; 1165 case tgtok::StrVal: { 1166 std::string Val = Lex.getCurStrVal(); 1167 Lex.Lex(); 1168 1169 // Handle multiple consecutive concatenated strings. 1170 while (Lex.getCode() == tgtok::StrVal) { 1171 Val += Lex.getCurStrVal(); 1172 Lex.Lex(); 1173 } 1174 1175 R = StringInit::get(Val); 1176 break; 1177 } 1178 case tgtok::CodeFragment: 1179 R = StringInit::get(Lex.getCurStrVal()); 1180 Lex.Lex(); 1181 break; 1182 case tgtok::question: 1183 R = UnsetInit::get(); 1184 Lex.Lex(); 1185 break; 1186 case tgtok::Id: { 1187 SMLoc NameLoc = Lex.getLoc(); 1188 std::string Name = Lex.getCurStrVal(); 1189 if (Lex.Lex() != tgtok::less) // consume the Id. 1190 return ParseIDValue(CurRec, Name, NameLoc, Mode); // Value ::= IDValue 1191 1192 // Value ::= ID '<' ValueListNE '>' 1193 if (Lex.Lex() == tgtok::greater) { 1194 TokError("expected non-empty value list"); 1195 return 0; 1196 } 1197 1198 // This is a CLASS<initvalslist> expression. This is supposed to synthesize 1199 // a new anonymous definition, deriving from CLASS<initvalslist> with no 1200 // body. 1201 Record *Class = Records.getClass(Name); 1202 if (!Class) { 1203 Error(NameLoc, "Expected a class name, got '" + Name + "'"); 1204 return 0; 1205 } 1206 1207 std::vector<Init*> ValueList = ParseValueList(CurRec, Class); 1208 if (ValueList.empty()) return 0; 1209 1210 if (Lex.getCode() != tgtok::greater) { 1211 TokError("expected '>' at end of value list"); 1212 return 0; 1213 } 1214 Lex.Lex(); // eat the '>' 1215 SMLoc EndLoc = Lex.getLoc(); 1216 1217 // Create the new record, set it as CurRec temporarily. 1218 static unsigned AnonCounter = 0; 1219 Record *NewRec = new Record("anonymous.val."+utostr(AnonCounter++), 1220 NameLoc, 1221 Records, 1222 /*IsAnonymous=*/true); 1223 SubClassReference SCRef; 1224 SCRef.RefRange = SMRange(NameLoc, EndLoc); 1225 SCRef.Rec = Class; 1226 SCRef.TemplateArgs = ValueList; 1227 // Add info about the subclass to NewRec. 1228 if (AddSubClass(NewRec, SCRef)) 1229 return 0; 1230 NewRec->resolveReferences(); 1231 Records.addDef(NewRec); 1232 1233 // The result of the expression is a reference to the new record. 1234 return DefInit::get(NewRec); 1235 } 1236 case tgtok::l_brace: { // Value ::= '{' ValueList '}' 1237 SMLoc BraceLoc = Lex.getLoc(); 1238 Lex.Lex(); // eat the '{' 1239 std::vector<Init*> Vals; 1240 1241 if (Lex.getCode() != tgtok::r_brace) { 1242 Vals = ParseValueList(CurRec); 1243 if (Vals.empty()) return 0; 1244 } 1245 if (Lex.getCode() != tgtok::r_brace) { 1246 TokError("expected '}' at end of bit list value"); 1247 return 0; 1248 } 1249 Lex.Lex(); // eat the '}' 1250 1251 SmallVector<Init *, 16> NewBits(Vals.size()); 1252 1253 for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 1254 Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get()); 1255 if (Bit == 0) { 1256 Error(BraceLoc, "Element #" + utostr(i) + " (" + Vals[i]->getAsString()+ 1257 ") is not convertable to a bit"); 1258 return 0; 1259 } 1260 NewBits[Vals.size()-i-1] = Bit; 1261 } 1262 return BitsInit::get(NewBits); 1263 } 1264 case tgtok::l_square: { // Value ::= '[' ValueList ']' 1265 Lex.Lex(); // eat the '[' 1266 std::vector<Init*> Vals; 1267 1268 RecTy *DeducedEltTy = 0; 1269 ListRecTy *GivenListTy = 0; 1270 1271 if (ItemType != 0) { 1272 ListRecTy *ListType = dyn_cast<ListRecTy>(ItemType); 1273 if (ListType == 0) { 1274 std::stringstream s; 1275 s << "Type mismatch for list, expected list type, got " 1276 << ItemType->getAsString(); 1277 TokError(s.str()); 1278 return 0; 1279 } 1280 GivenListTy = ListType; 1281 } 1282 1283 if (Lex.getCode() != tgtok::r_square) { 1284 Vals = ParseValueList(CurRec, 0, 1285 GivenListTy ? GivenListTy->getElementType() : 0); 1286 if (Vals.empty()) return 0; 1287 } 1288 if (Lex.getCode() != tgtok::r_square) { 1289 TokError("expected ']' at end of list value"); 1290 return 0; 1291 } 1292 Lex.Lex(); // eat the ']' 1293 1294 RecTy *GivenEltTy = 0; 1295 if (Lex.getCode() == tgtok::less) { 1296 // Optional list element type 1297 Lex.Lex(); // eat the '<' 1298 1299 GivenEltTy = ParseType(); 1300 if (GivenEltTy == 0) { 1301 // Couldn't parse element type 1302 return 0; 1303 } 1304 1305 if (Lex.getCode() != tgtok::greater) { 1306 TokError("expected '>' at end of list element type"); 1307 return 0; 1308 } 1309 Lex.Lex(); // eat the '>' 1310 } 1311 1312 // Check elements 1313 RecTy *EltTy = 0; 1314 for (std::vector<Init *>::iterator i = Vals.begin(), ie = Vals.end(); 1315 i != ie; 1316 ++i) { 1317 TypedInit *TArg = dyn_cast<TypedInit>(*i); 1318 if (TArg == 0) { 1319 TokError("Untyped list element"); 1320 return 0; 1321 } 1322 if (EltTy != 0) { 1323 EltTy = resolveTypes(EltTy, TArg->getType()); 1324 if (EltTy == 0) { 1325 TokError("Incompatible types in list elements"); 1326 return 0; 1327 } 1328 } else { 1329 EltTy = TArg->getType(); 1330 } 1331 } 1332 1333 if (GivenEltTy != 0) { 1334 if (EltTy != 0) { 1335 // Verify consistency 1336 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) { 1337 TokError("Incompatible types in list elements"); 1338 return 0; 1339 } 1340 } 1341 EltTy = GivenEltTy; 1342 } 1343 1344 if (EltTy == 0) { 1345 if (ItemType == 0) { 1346 TokError("No type for list"); 1347 return 0; 1348 } 1349 DeducedEltTy = GivenListTy->getElementType(); 1350 } else { 1351 // Make sure the deduced type is compatible with the given type 1352 if (GivenListTy) { 1353 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) { 1354 TokError("Element type mismatch for list"); 1355 return 0; 1356 } 1357 } 1358 DeducedEltTy = EltTy; 1359 } 1360 1361 return ListInit::get(Vals, DeducedEltTy); 1362 } 1363 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')' 1364 Lex.Lex(); // eat the '(' 1365 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast) { 1366 TokError("expected identifier in dag init"); 1367 return 0; 1368 } 1369 1370 Init *Operator = ParseValue(CurRec); 1371 if (Operator == 0) return 0; 1372 1373 // If the operator name is present, parse it. 1374 std::string OperatorName; 1375 if (Lex.getCode() == tgtok::colon) { 1376 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 1377 TokError("expected variable name in dag operator"); 1378 return 0; 1379 } 1380 OperatorName = Lex.getCurStrVal(); 1381 Lex.Lex(); // eat the VarName. 1382 } 1383 1384 std::vector<std::pair<llvm::Init*, std::string> > DagArgs; 1385 if (Lex.getCode() != tgtok::r_paren) { 1386 DagArgs = ParseDagArgList(CurRec); 1387 if (DagArgs.empty()) return 0; 1388 } 1389 1390 if (Lex.getCode() != tgtok::r_paren) { 1391 TokError("expected ')' in dag init"); 1392 return 0; 1393 } 1394 Lex.Lex(); // eat the ')' 1395 1396 return DagInit::get(Operator, OperatorName, DagArgs); 1397 } 1398 1399 case tgtok::XHead: 1400 case tgtok::XTail: 1401 case tgtok::XEmpty: 1402 case tgtok::XCast: // Value ::= !unop '(' Value ')' 1403 case tgtok::XConcat: 1404 case tgtok::XADD: 1405 case tgtok::XSRA: 1406 case tgtok::XSRL: 1407 case tgtok::XSHL: 1408 case tgtok::XEq: 1409 case tgtok::XStrConcat: // Value ::= !binop '(' Value ',' Value ')' 1410 case tgtok::XIf: 1411 case tgtok::XForEach: 1412 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 1413 return ParseOperation(CurRec); 1414 } 1415 } 1416 1417 return R; 1418 } 1419 1420 /// ParseValue - Parse a tblgen value. This returns null on error. 1421 /// 1422 /// Value ::= SimpleValue ValueSuffix* 1423 /// ValueSuffix ::= '{' BitList '}' 1424 /// ValueSuffix ::= '[' BitList ']' 1425 /// ValueSuffix ::= '.' ID 1426 /// 1427 Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { 1428 Init *Result = ParseSimpleValue(CurRec, ItemType, Mode); 1429 if (Result == 0) return 0; 1430 1431 // Parse the suffixes now if present. 1432 while (1) { 1433 switch (Lex.getCode()) { 1434 default: return Result; 1435 case tgtok::l_brace: { 1436 if (Mode == ParseNameMode || Mode == ParseForeachMode) 1437 // This is the beginning of the object body. 1438 return Result; 1439 1440 SMLoc CurlyLoc = Lex.getLoc(); 1441 Lex.Lex(); // eat the '{' 1442 std::vector<unsigned> Ranges = ParseRangeList(); 1443 if (Ranges.empty()) return 0; 1444 1445 // Reverse the bitlist. 1446 std::reverse(Ranges.begin(), Ranges.end()); 1447 Result = Result->convertInitializerBitRange(Ranges); 1448 if (Result == 0) { 1449 Error(CurlyLoc, "Invalid bit range for value"); 1450 return 0; 1451 } 1452 1453 // Eat the '}'. 1454 if (Lex.getCode() != tgtok::r_brace) { 1455 TokError("expected '}' at end of bit range list"); 1456 return 0; 1457 } 1458 Lex.Lex(); 1459 break; 1460 } 1461 case tgtok::l_square: { 1462 SMLoc SquareLoc = Lex.getLoc(); 1463 Lex.Lex(); // eat the '[' 1464 std::vector<unsigned> Ranges = ParseRangeList(); 1465 if (Ranges.empty()) return 0; 1466 1467 Result = Result->convertInitListSlice(Ranges); 1468 if (Result == 0) { 1469 Error(SquareLoc, "Invalid range for list slice"); 1470 return 0; 1471 } 1472 1473 // Eat the ']'. 1474 if (Lex.getCode() != tgtok::r_square) { 1475 TokError("expected ']' at end of list slice"); 1476 return 0; 1477 } 1478 Lex.Lex(); 1479 break; 1480 } 1481 case tgtok::period: 1482 if (Lex.Lex() != tgtok::Id) { // eat the . 1483 TokError("expected field identifier after '.'"); 1484 return 0; 1485 } 1486 if (!Result->getFieldType(Lex.getCurStrVal())) { 1487 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" + 1488 Result->getAsString() + "'"); 1489 return 0; 1490 } 1491 Result = FieldInit::get(Result, Lex.getCurStrVal()); 1492 Lex.Lex(); // eat field name 1493 break; 1494 1495 case tgtok::paste: 1496 SMLoc PasteLoc = Lex.getLoc(); 1497 1498 // Create a !strconcat() operation, first casting each operand to 1499 // a string if necessary. 1500 1501 TypedInit *LHS = dyn_cast<TypedInit>(Result); 1502 if (!LHS) { 1503 Error(PasteLoc, "LHS of paste is not typed!"); 1504 return 0; 1505 } 1506 1507 if (LHS->getType() != StringRecTy::get()) { 1508 LHS = UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get()); 1509 } 1510 1511 TypedInit *RHS = 0; 1512 1513 Lex.Lex(); // Eat the '#'. 1514 switch (Lex.getCode()) { 1515 case tgtok::colon: 1516 case tgtok::semi: 1517 case tgtok::l_brace: 1518 // These are all of the tokens that can begin an object body. 1519 // Some of these can also begin values but we disallow those cases 1520 // because they are unlikely to be useful. 1521 1522 // Trailing paste, concat with an empty string. 1523 RHS = StringInit::get(""); 1524 break; 1525 1526 default: 1527 Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode); 1528 RHS = dyn_cast<TypedInit>(RHSResult); 1529 if (!RHS) { 1530 Error(PasteLoc, "RHS of paste is not typed!"); 1531 return 0; 1532 } 1533 1534 if (RHS->getType() != StringRecTy::get()) { 1535 RHS = UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get()); 1536 } 1537 1538 break; 1539 } 1540 1541 Result = BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS, 1542 StringRecTy::get())->Fold(CurRec, CurMultiClass); 1543 break; 1544 } 1545 } 1546 } 1547 1548 /// ParseDagArgList - Parse the argument list for a dag literal expression. 1549 /// 1550 /// DagArg ::= Value (':' VARNAME)? 1551 /// DagArg ::= VARNAME 1552 /// DagArgList ::= DagArg 1553 /// DagArgList ::= DagArgList ',' DagArg 1554 std::vector<std::pair<llvm::Init*, std::string> > 1555 TGParser::ParseDagArgList(Record *CurRec) { 1556 std::vector<std::pair<llvm::Init*, std::string> > Result; 1557 1558 while (1) { 1559 // DagArg ::= VARNAME 1560 if (Lex.getCode() == tgtok::VarName) { 1561 // A missing value is treated like '?'. 1562 Result.push_back(std::make_pair(UnsetInit::get(), Lex.getCurStrVal())); 1563 Lex.Lex(); 1564 } else { 1565 // DagArg ::= Value (':' VARNAME)? 1566 Init *Val = ParseValue(CurRec); 1567 if (Val == 0) 1568 return std::vector<std::pair<llvm::Init*, std::string> >(); 1569 1570 // If the variable name is present, add it. 1571 std::string VarName; 1572 if (Lex.getCode() == tgtok::colon) { 1573 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 1574 TokError("expected variable name in dag literal"); 1575 return std::vector<std::pair<llvm::Init*, std::string> >(); 1576 } 1577 VarName = Lex.getCurStrVal(); 1578 Lex.Lex(); // eat the VarName. 1579 } 1580 1581 Result.push_back(std::make_pair(Val, VarName)); 1582 } 1583 if (Lex.getCode() != tgtok::comma) break; 1584 Lex.Lex(); // eat the ',' 1585 } 1586 1587 return Result; 1588 } 1589 1590 1591 /// ParseValueList - Parse a comma separated list of values, returning them as a 1592 /// vector. Note that this always expects to be able to parse at least one 1593 /// value. It returns an empty list if this is not possible. 1594 /// 1595 /// ValueList ::= Value (',' Value) 1596 /// 1597 std::vector<Init*> TGParser::ParseValueList(Record *CurRec, Record *ArgsRec, 1598 RecTy *EltTy) { 1599 std::vector<Init*> Result; 1600 RecTy *ItemType = EltTy; 1601 unsigned int ArgN = 0; 1602 if (ArgsRec != 0 && EltTy == 0) { 1603 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs(); 1604 if (!TArgs.size()) { 1605 TokError("template argument provided to non-template class"); 1606 return std::vector<Init*>(); 1607 } 1608 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 1609 if (!RV) { 1610 errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN] 1611 << ")\n"; 1612 } 1613 assert(RV && "Template argument record not found??"); 1614 ItemType = RV->getType(); 1615 ++ArgN; 1616 } 1617 Result.push_back(ParseValue(CurRec, ItemType)); 1618 if (Result.back() == 0) return std::vector<Init*>(); 1619 1620 while (Lex.getCode() == tgtok::comma) { 1621 Lex.Lex(); // Eat the comma 1622 1623 if (ArgsRec != 0 && EltTy == 0) { 1624 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs(); 1625 if (ArgN >= TArgs.size()) { 1626 TokError("too many template arguments"); 1627 return std::vector<Init*>(); 1628 } 1629 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 1630 assert(RV && "Template argument record not found??"); 1631 ItemType = RV->getType(); 1632 ++ArgN; 1633 } 1634 Result.push_back(ParseValue(CurRec, ItemType)); 1635 if (Result.back() == 0) return std::vector<Init*>(); 1636 } 1637 1638 return Result; 1639 } 1640 1641 1642 /// ParseDeclaration - Read a declaration, returning the name of field ID, or an 1643 /// empty string on error. This can happen in a number of different context's, 1644 /// including within a def or in the template args for a def (which which case 1645 /// CurRec will be non-null) and within the template args for a multiclass (in 1646 /// which case CurRec will be null, but CurMultiClass will be set). This can 1647 /// also happen within a def that is within a multiclass, which will set both 1648 /// CurRec and CurMultiClass. 1649 /// 1650 /// Declaration ::= FIELD? Type ID ('=' Value)? 1651 /// 1652 Init *TGParser::ParseDeclaration(Record *CurRec, 1653 bool ParsingTemplateArgs) { 1654 // Read the field prefix if present. 1655 bool HasField = Lex.getCode() == tgtok::Field; 1656 if (HasField) Lex.Lex(); 1657 1658 RecTy *Type = ParseType(); 1659 if (Type == 0) return 0; 1660 1661 if (Lex.getCode() != tgtok::Id) { 1662 TokError("Expected identifier in declaration"); 1663 return 0; 1664 } 1665 1666 SMLoc IdLoc = Lex.getLoc(); 1667 Init *DeclName = StringInit::get(Lex.getCurStrVal()); 1668 Lex.Lex(); 1669 1670 if (ParsingTemplateArgs) { 1671 if (CurRec) { 1672 DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":"); 1673 } else { 1674 assert(CurMultiClass); 1675 } 1676 if (CurMultiClass) 1677 DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName, 1678 "::"); 1679 } 1680 1681 // Add the value. 1682 if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField))) 1683 return 0; 1684 1685 // If a value is present, parse it. 1686 if (Lex.getCode() == tgtok::equal) { 1687 Lex.Lex(); 1688 SMLoc ValLoc = Lex.getLoc(); 1689 Init *Val = ParseValue(CurRec, Type); 1690 if (Val == 0 || 1691 SetValue(CurRec, ValLoc, DeclName, std::vector<unsigned>(), Val)) 1692 return 0; 1693 } 1694 1695 return DeclName; 1696 } 1697 1698 /// ParseForeachDeclaration - Read a foreach declaration, returning 1699 /// the name of the declared object or a NULL Init on error. Return 1700 /// the name of the parsed initializer list through ForeachListName. 1701 /// 1702 /// ForeachDeclaration ::= ID '=' '[' ValueList ']' 1703 /// ForeachDeclaration ::= ID '=' '{' RangeList '}' 1704 /// ForeachDeclaration ::= ID '=' RangePiece 1705 /// 1706 VarInit *TGParser::ParseForeachDeclaration(ListInit *&ForeachListValue) { 1707 if (Lex.getCode() != tgtok::Id) { 1708 TokError("Expected identifier in foreach declaration"); 1709 return 0; 1710 } 1711 1712 Init *DeclName = StringInit::get(Lex.getCurStrVal()); 1713 Lex.Lex(); 1714 1715 // If a value is present, parse it. 1716 if (Lex.getCode() != tgtok::equal) { 1717 TokError("Expected '=' in foreach declaration"); 1718 return 0; 1719 } 1720 Lex.Lex(); // Eat the '=' 1721 1722 RecTy *IterType = 0; 1723 std::vector<unsigned> Ranges; 1724 1725 switch (Lex.getCode()) { 1726 default: TokError("Unknown token when expecting a range list"); return 0; 1727 case tgtok::l_square: { // '[' ValueList ']' 1728 Init *List = ParseSimpleValue(0, 0, ParseForeachMode); 1729 ForeachListValue = dyn_cast<ListInit>(List); 1730 if (ForeachListValue == 0) { 1731 TokError("Expected a Value list"); 1732 return 0; 1733 } 1734 RecTy *ValueType = ForeachListValue->getType(); 1735 ListRecTy *ListType = dyn_cast<ListRecTy>(ValueType); 1736 if (ListType == 0) { 1737 TokError("Value list is not of list type"); 1738 return 0; 1739 } 1740 IterType = ListType->getElementType(); 1741 break; 1742 } 1743 1744 case tgtok::IntVal: { // RangePiece. 1745 if (ParseRangePiece(Ranges)) 1746 return 0; 1747 break; 1748 } 1749 1750 case tgtok::l_brace: { // '{' RangeList '}' 1751 Lex.Lex(); // eat the '{' 1752 Ranges = ParseRangeList(); 1753 if (Lex.getCode() != tgtok::r_brace) { 1754 TokError("expected '}' at end of bit range list"); 1755 return 0; 1756 } 1757 Lex.Lex(); 1758 break; 1759 } 1760 } 1761 1762 if (!Ranges.empty()) { 1763 assert(!IterType && "Type already initialized?"); 1764 IterType = IntRecTy::get(); 1765 std::vector<Init*> Values; 1766 for (unsigned i = 0, e = Ranges.size(); i != e; ++i) 1767 Values.push_back(IntInit::get(Ranges[i])); 1768 ForeachListValue = ListInit::get(Values, IterType); 1769 } 1770 1771 if (!IterType) 1772 return 0; 1773 1774 return VarInit::get(DeclName, IterType); 1775 } 1776 1777 /// ParseTemplateArgList - Read a template argument list, which is a non-empty 1778 /// sequence of template-declarations in <>'s. If CurRec is non-null, these are 1779 /// template args for a def, which may or may not be in a multiclass. If null, 1780 /// these are the template args for a multiclass. 1781 /// 1782 /// TemplateArgList ::= '<' Declaration (',' Declaration)* '>' 1783 /// 1784 bool TGParser::ParseTemplateArgList(Record *CurRec) { 1785 assert(Lex.getCode() == tgtok::less && "Not a template arg list!"); 1786 Lex.Lex(); // eat the '<' 1787 1788 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec; 1789 1790 // Read the first declaration. 1791 Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 1792 if (TemplArg == 0) 1793 return true; 1794 1795 TheRecToAddTo->addTemplateArg(TemplArg); 1796 1797 while (Lex.getCode() == tgtok::comma) { 1798 Lex.Lex(); // eat the ',' 1799 1800 // Read the following declarations. 1801 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 1802 if (TemplArg == 0) 1803 return true; 1804 TheRecToAddTo->addTemplateArg(TemplArg); 1805 } 1806 1807 if (Lex.getCode() != tgtok::greater) 1808 return TokError("expected '>' at end of template argument list"); 1809 Lex.Lex(); // eat the '>'. 1810 return false; 1811 } 1812 1813 1814 /// ParseBodyItem - Parse a single item at within the body of a def or class. 1815 /// 1816 /// BodyItem ::= Declaration ';' 1817 /// BodyItem ::= LET ID OptionalBitList '=' Value ';' 1818 bool TGParser::ParseBodyItem(Record *CurRec) { 1819 if (Lex.getCode() != tgtok::Let) { 1820 if (ParseDeclaration(CurRec, false) == 0) 1821 return true; 1822 1823 if (Lex.getCode() != tgtok::semi) 1824 return TokError("expected ';' after declaration"); 1825 Lex.Lex(); 1826 return false; 1827 } 1828 1829 // LET ID OptionalRangeList '=' Value ';' 1830 if (Lex.Lex() != tgtok::Id) 1831 return TokError("expected field identifier after let"); 1832 1833 SMLoc IdLoc = Lex.getLoc(); 1834 std::string FieldName = Lex.getCurStrVal(); 1835 Lex.Lex(); // eat the field name. 1836 1837 std::vector<unsigned> BitList; 1838 if (ParseOptionalBitList(BitList)) 1839 return true; 1840 std::reverse(BitList.begin(), BitList.end()); 1841 1842 if (Lex.getCode() != tgtok::equal) 1843 return TokError("expected '=' in let expression"); 1844 Lex.Lex(); // eat the '='. 1845 1846 RecordVal *Field = CurRec->getValue(FieldName); 1847 if (Field == 0) 1848 return TokError("Value '" + FieldName + "' unknown!"); 1849 1850 RecTy *Type = Field->getType(); 1851 1852 Init *Val = ParseValue(CurRec, Type); 1853 if (Val == 0) return true; 1854 1855 if (Lex.getCode() != tgtok::semi) 1856 return TokError("expected ';' after let expression"); 1857 Lex.Lex(); 1858 1859 return SetValue(CurRec, IdLoc, FieldName, BitList, Val); 1860 } 1861 1862 /// ParseBody - Read the body of a class or def. Return true on error, false on 1863 /// success. 1864 /// 1865 /// Body ::= ';' 1866 /// Body ::= '{' BodyList '}' 1867 /// BodyList BodyItem* 1868 /// 1869 bool TGParser::ParseBody(Record *CurRec) { 1870 // If this is a null definition, just eat the semi and return. 1871 if (Lex.getCode() == tgtok::semi) { 1872 Lex.Lex(); 1873 return false; 1874 } 1875 1876 if (Lex.getCode() != tgtok::l_brace) 1877 return TokError("Expected ';' or '{' to start body"); 1878 // Eat the '{'. 1879 Lex.Lex(); 1880 1881 while (Lex.getCode() != tgtok::r_brace) 1882 if (ParseBodyItem(CurRec)) 1883 return true; 1884 1885 // Eat the '}'. 1886 Lex.Lex(); 1887 return false; 1888 } 1889 1890 /// \brief Apply the current let bindings to \a CurRec. 1891 /// \returns true on error, false otherwise. 1892 bool TGParser::ApplyLetStack(Record *CurRec) { 1893 for (unsigned i = 0, e = LetStack.size(); i != e; ++i) 1894 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j) 1895 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name, 1896 LetStack[i][j].Bits, LetStack[i][j].Value)) 1897 return true; 1898 return false; 1899 } 1900 1901 /// ParseObjectBody - Parse the body of a def or class. This consists of an 1902 /// optional ClassList followed by a Body. CurRec is the current def or class 1903 /// that is being parsed. 1904 /// 1905 /// ObjectBody ::= BaseClassList Body 1906 /// BaseClassList ::= /*empty*/ 1907 /// BaseClassList ::= ':' BaseClassListNE 1908 /// BaseClassListNE ::= SubClassRef (',' SubClassRef)* 1909 /// 1910 bool TGParser::ParseObjectBody(Record *CurRec) { 1911 // If there is a baseclass list, read it. 1912 if (Lex.getCode() == tgtok::colon) { 1913 Lex.Lex(); 1914 1915 // Read all of the subclasses. 1916 SubClassReference SubClass = ParseSubClassReference(CurRec, false); 1917 while (1) { 1918 // Check for error. 1919 if (SubClass.Rec == 0) return true; 1920 1921 // Add it. 1922 if (AddSubClass(CurRec, SubClass)) 1923 return true; 1924 1925 if (Lex.getCode() != tgtok::comma) break; 1926 Lex.Lex(); // eat ','. 1927 SubClass = ParseSubClassReference(CurRec, false); 1928 } 1929 } 1930 1931 if (ApplyLetStack(CurRec)) 1932 return true; 1933 1934 return ParseBody(CurRec); 1935 } 1936 1937 /// ParseDef - Parse and return a top level or multiclass def, return the record 1938 /// corresponding to it. This returns null on error. 1939 /// 1940 /// DefInst ::= DEF ObjectName ObjectBody 1941 /// 1942 bool TGParser::ParseDef(MultiClass *CurMultiClass) { 1943 SMLoc DefLoc = Lex.getLoc(); 1944 assert(Lex.getCode() == tgtok::Def && "Unknown tok"); 1945 Lex.Lex(); // Eat the 'def' token. 1946 1947 // Parse ObjectName and make a record for it. 1948 Record *CurRec; 1949 Init *Name = ParseObjectName(CurMultiClass); 1950 if (Name) 1951 CurRec = new Record(Name, DefLoc, Records); 1952 else 1953 CurRec = new Record(GetNewAnonymousName(), DefLoc, Records, 1954 /*IsAnonymous=*/true); 1955 1956 if (!CurMultiClass && Loops.empty()) { 1957 // Top-level def definition. 1958 1959 // Ensure redefinition doesn't happen. 1960 if (Records.getDef(CurRec->getNameInitAsString())) { 1961 Error(DefLoc, "def '" + CurRec->getNameInitAsString() 1962 + "' already defined"); 1963 return true; 1964 } 1965 Records.addDef(CurRec); 1966 } else if (CurMultiClass) { 1967 // Otherwise, a def inside a multiclass, add it to the multiclass. 1968 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i) 1969 if (CurMultiClass->DefPrototypes[i]->getNameInit() 1970 == CurRec->getNameInit()) { 1971 Error(DefLoc, "def '" + CurRec->getNameInitAsString() + 1972 "' already defined in this multiclass!"); 1973 return true; 1974 } 1975 CurMultiClass->DefPrototypes.push_back(CurRec); 1976 } 1977 1978 if (ParseObjectBody(CurRec)) 1979 return true; 1980 1981 if (CurMultiClass == 0) // Def's in multiclasses aren't really defs. 1982 // See Record::setName(). This resolve step will see any new name 1983 // for the def that might have been created when resolving 1984 // inheritance, values and arguments above. 1985 CurRec->resolveReferences(); 1986 1987 // If ObjectBody has template arguments, it's an error. 1988 assert(CurRec->getTemplateArgs().empty() && "How'd this get template args?"); 1989 1990 if (CurMultiClass) { 1991 // Copy the template arguments for the multiclass into the def. 1992 const std::vector<Init *> &TArgs = 1993 CurMultiClass->Rec.getTemplateArgs(); 1994 1995 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 1996 const RecordVal *RV = CurMultiClass->Rec.getValue(TArgs[i]); 1997 assert(RV && "Template arg doesn't exist?"); 1998 CurRec->addValue(*RV); 1999 } 2000 } 2001 2002 if (ProcessForeachDefs(CurRec, DefLoc)) { 2003 Error(DefLoc, 2004 "Could not process loops for def" + CurRec->getNameInitAsString()); 2005 return true; 2006 } 2007 2008 return false; 2009 } 2010 2011 /// ParseForeach - Parse a for statement. Return the record corresponding 2012 /// to it. This returns true on error. 2013 /// 2014 /// Foreach ::= FOREACH Declaration IN '{ ObjectList '}' 2015 /// Foreach ::= FOREACH Declaration IN Object 2016 /// 2017 bool TGParser::ParseForeach(MultiClass *CurMultiClass) { 2018 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok"); 2019 Lex.Lex(); // Eat the 'for' token. 2020 2021 // Make a temporary object to record items associated with the for 2022 // loop. 2023 ListInit *ListValue = 0; 2024 VarInit *IterName = ParseForeachDeclaration(ListValue); 2025 if (IterName == 0) 2026 return TokError("expected declaration in for"); 2027 2028 if (Lex.getCode() != tgtok::In) 2029 return TokError("Unknown tok"); 2030 Lex.Lex(); // Eat the in 2031 2032 // Create a loop object and remember it. 2033 Loops.push_back(ForeachLoop(IterName, ListValue)); 2034 2035 if (Lex.getCode() != tgtok::l_brace) { 2036 // FOREACH Declaration IN Object 2037 if (ParseObject(CurMultiClass)) 2038 return true; 2039 } 2040 else { 2041 SMLoc BraceLoc = Lex.getLoc(); 2042 // Otherwise, this is a group foreach. 2043 Lex.Lex(); // eat the '{'. 2044 2045 // Parse the object list. 2046 if (ParseObjectList(CurMultiClass)) 2047 return true; 2048 2049 if (Lex.getCode() != tgtok::r_brace) { 2050 TokError("expected '}' at end of foreach command"); 2051 return Error(BraceLoc, "to match this '{'"); 2052 } 2053 Lex.Lex(); // Eat the } 2054 } 2055 2056 // We've processed everything in this loop. 2057 Loops.pop_back(); 2058 2059 return false; 2060 } 2061 2062 /// ParseClass - Parse a tblgen class definition. 2063 /// 2064 /// ClassInst ::= CLASS ID TemplateArgList? ObjectBody 2065 /// 2066 bool TGParser::ParseClass() { 2067 assert(Lex.getCode() == tgtok::Class && "Unexpected token!"); 2068 Lex.Lex(); 2069 2070 if (Lex.getCode() != tgtok::Id) 2071 return TokError("expected class name after 'class' keyword"); 2072 2073 Record *CurRec = Records.getClass(Lex.getCurStrVal()); 2074 if (CurRec) { 2075 // If the body was previously defined, this is an error. 2076 if (CurRec->getValues().size() > 1 || // Account for NAME. 2077 !CurRec->getSuperClasses().empty() || 2078 !CurRec->getTemplateArgs().empty()) 2079 return TokError("Class '" + CurRec->getNameInitAsString() 2080 + "' already defined"); 2081 } else { 2082 // If this is the first reference to this class, create and add it. 2083 CurRec = new Record(Lex.getCurStrVal(), Lex.getLoc(), Records); 2084 Records.addClass(CurRec); 2085 } 2086 Lex.Lex(); // eat the name. 2087 2088 // If there are template args, parse them. 2089 if (Lex.getCode() == tgtok::less) 2090 if (ParseTemplateArgList(CurRec)) 2091 return true; 2092 2093 // Finally, parse the object body. 2094 return ParseObjectBody(CurRec); 2095 } 2096 2097 /// ParseLetList - Parse a non-empty list of assignment expressions into a list 2098 /// of LetRecords. 2099 /// 2100 /// LetList ::= LetItem (',' LetItem)* 2101 /// LetItem ::= ID OptionalRangeList '=' Value 2102 /// 2103 std::vector<LetRecord> TGParser::ParseLetList() { 2104 std::vector<LetRecord> Result; 2105 2106 while (1) { 2107 if (Lex.getCode() != tgtok::Id) { 2108 TokError("expected identifier in let definition"); 2109 return std::vector<LetRecord>(); 2110 } 2111 std::string Name = Lex.getCurStrVal(); 2112 SMLoc NameLoc = Lex.getLoc(); 2113 Lex.Lex(); // Eat the identifier. 2114 2115 // Check for an optional RangeList. 2116 std::vector<unsigned> Bits; 2117 if (ParseOptionalRangeList(Bits)) 2118 return std::vector<LetRecord>(); 2119 std::reverse(Bits.begin(), Bits.end()); 2120 2121 if (Lex.getCode() != tgtok::equal) { 2122 TokError("expected '=' in let expression"); 2123 return std::vector<LetRecord>(); 2124 } 2125 Lex.Lex(); // eat the '='. 2126 2127 Init *Val = ParseValue(0); 2128 if (Val == 0) return std::vector<LetRecord>(); 2129 2130 // Now that we have everything, add the record. 2131 Result.push_back(LetRecord(Name, Bits, Val, NameLoc)); 2132 2133 if (Lex.getCode() != tgtok::comma) 2134 return Result; 2135 Lex.Lex(); // eat the comma. 2136 } 2137 } 2138 2139 /// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of 2140 /// different related productions. This works inside multiclasses too. 2141 /// 2142 /// Object ::= LET LetList IN '{' ObjectList '}' 2143 /// Object ::= LET LetList IN Object 2144 /// 2145 bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) { 2146 assert(Lex.getCode() == tgtok::Let && "Unexpected token"); 2147 Lex.Lex(); 2148 2149 // Add this entry to the let stack. 2150 std::vector<LetRecord> LetInfo = ParseLetList(); 2151 if (LetInfo.empty()) return true; 2152 LetStack.push_back(LetInfo); 2153 2154 if (Lex.getCode() != tgtok::In) 2155 return TokError("expected 'in' at end of top-level 'let'"); 2156 Lex.Lex(); 2157 2158 // If this is a scalar let, just handle it now 2159 if (Lex.getCode() != tgtok::l_brace) { 2160 // LET LetList IN Object 2161 if (ParseObject(CurMultiClass)) 2162 return true; 2163 } else { // Object ::= LETCommand '{' ObjectList '}' 2164 SMLoc BraceLoc = Lex.getLoc(); 2165 // Otherwise, this is a group let. 2166 Lex.Lex(); // eat the '{'. 2167 2168 // Parse the object list. 2169 if (ParseObjectList(CurMultiClass)) 2170 return true; 2171 2172 if (Lex.getCode() != tgtok::r_brace) { 2173 TokError("expected '}' at end of top level let command"); 2174 return Error(BraceLoc, "to match this '{'"); 2175 } 2176 Lex.Lex(); 2177 } 2178 2179 // Outside this let scope, this let block is not active. 2180 LetStack.pop_back(); 2181 return false; 2182 } 2183 2184 /// ParseMultiClass - Parse a multiclass definition. 2185 /// 2186 /// MultiClassInst ::= MULTICLASS ID TemplateArgList? 2187 /// ':' BaseMultiClassList '{' MultiClassObject+ '}' 2188 /// MultiClassObject ::= DefInst 2189 /// MultiClassObject ::= MultiClassInst 2190 /// MultiClassObject ::= DefMInst 2191 /// MultiClassObject ::= LETCommand '{' ObjectList '}' 2192 /// MultiClassObject ::= LETCommand Object 2193 /// 2194 bool TGParser::ParseMultiClass() { 2195 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token"); 2196 Lex.Lex(); // Eat the multiclass token. 2197 2198 if (Lex.getCode() != tgtok::Id) 2199 return TokError("expected identifier after multiclass for name"); 2200 std::string Name = Lex.getCurStrVal(); 2201 2202 if (MultiClasses.count(Name)) 2203 return TokError("multiclass '" + Name + "' already defined"); 2204 2205 CurMultiClass = MultiClasses[Name] = new MultiClass(Name, 2206 Lex.getLoc(), Records); 2207 Lex.Lex(); // Eat the identifier. 2208 2209 // If there are template args, parse them. 2210 if (Lex.getCode() == tgtok::less) 2211 if (ParseTemplateArgList(0)) 2212 return true; 2213 2214 bool inherits = false; 2215 2216 // If there are submulticlasses, parse them. 2217 if (Lex.getCode() == tgtok::colon) { 2218 inherits = true; 2219 2220 Lex.Lex(); 2221 2222 // Read all of the submulticlasses. 2223 SubMultiClassReference SubMultiClass = 2224 ParseSubMultiClassReference(CurMultiClass); 2225 while (1) { 2226 // Check for error. 2227 if (SubMultiClass.MC == 0) return true; 2228 2229 // Add it. 2230 if (AddSubMultiClass(CurMultiClass, SubMultiClass)) 2231 return true; 2232 2233 if (Lex.getCode() != tgtok::comma) break; 2234 Lex.Lex(); // eat ','. 2235 SubMultiClass = ParseSubMultiClassReference(CurMultiClass); 2236 } 2237 } 2238 2239 if (Lex.getCode() != tgtok::l_brace) { 2240 if (!inherits) 2241 return TokError("expected '{' in multiclass definition"); 2242 else if (Lex.getCode() != tgtok::semi) 2243 return TokError("expected ';' in multiclass definition"); 2244 else 2245 Lex.Lex(); // eat the ';'. 2246 } else { 2247 if (Lex.Lex() == tgtok::r_brace) // eat the '{'. 2248 return TokError("multiclass must contain at least one def"); 2249 2250 while (Lex.getCode() != tgtok::r_brace) { 2251 switch (Lex.getCode()) { 2252 default: 2253 return TokError("expected 'let', 'def' or 'defm' in multiclass body"); 2254 case tgtok::Let: 2255 case tgtok::Def: 2256 case tgtok::Defm: 2257 case tgtok::Foreach: 2258 if (ParseObject(CurMultiClass)) 2259 return true; 2260 break; 2261 } 2262 } 2263 Lex.Lex(); // eat the '}'. 2264 } 2265 2266 CurMultiClass = 0; 2267 return false; 2268 } 2269 2270 Record *TGParser:: 2271 InstantiateMulticlassDef(MultiClass &MC, 2272 Record *DefProto, 2273 Init *DefmPrefix, 2274 SMRange DefmPrefixRange) { 2275 // We need to preserve DefProto so it can be reused for later 2276 // instantiations, so create a new Record to inherit from it. 2277 2278 // Add in the defm name. If the defm prefix is empty, give each 2279 // instantiated def a unique name. Otherwise, if "#NAME#" exists in the 2280 // name, substitute the prefix for #NAME#. Otherwise, use the defm name 2281 // as a prefix. 2282 2283 bool IsAnonymous = false; 2284 if (DefmPrefix == 0) { 2285 DefmPrefix = StringInit::get(GetNewAnonymousName()); 2286 IsAnonymous = true; 2287 } 2288 2289 Init *DefName = DefProto->getNameInit(); 2290 2291 StringInit *DefNameString = dyn_cast<StringInit>(DefName); 2292 2293 if (DefNameString != 0) { 2294 // We have a fully expanded string so there are no operators to 2295 // resolve. We should concatenate the given prefix and name. 2296 DefName = 2297 BinOpInit::get(BinOpInit::STRCONCAT, 2298 UnOpInit::get(UnOpInit::CAST, DefmPrefix, 2299 StringRecTy::get())->Fold(DefProto, &MC), 2300 DefName, StringRecTy::get())->Fold(DefProto, &MC); 2301 } 2302 2303 // Make a trail of SMLocs from the multiclass instantiations. 2304 SmallVector<SMLoc, 4> Locs(1, DefmPrefixRange.Start); 2305 Locs.append(DefProto->getLoc().begin(), DefProto->getLoc().end()); 2306 Record *CurRec = new Record(DefName, Locs, Records, IsAnonymous); 2307 2308 SubClassReference Ref; 2309 Ref.RefRange = DefmPrefixRange; 2310 Ref.Rec = DefProto; 2311 AddSubClass(CurRec, Ref); 2312 2313 // Set the value for NAME. We don't resolve references to it 'til later, 2314 // though, so that uses in nested multiclass names don't get 2315 // confused. 2316 if (SetValue(CurRec, Ref.RefRange.Start, "NAME", std::vector<unsigned>(), 2317 DefmPrefix)) { 2318 Error(DefmPrefixRange.Start, "Could not resolve " 2319 + CurRec->getNameInitAsString() + ":NAME to '" 2320 + DefmPrefix->getAsUnquotedString() + "'"); 2321 return 0; 2322 } 2323 2324 // If the DefNameString didn't resolve, we probably have a reference to 2325 // NAME and need to replace it. We need to do at least this much greedily, 2326 // otherwise nested multiclasses will end up with incorrect NAME expansions. 2327 if (DefNameString == 0) { 2328 RecordVal *DefNameRV = CurRec->getValue("NAME"); 2329 CurRec->resolveReferencesTo(DefNameRV); 2330 } 2331 2332 if (!CurMultiClass) { 2333 // Now that we're at the top level, resolve all NAME references 2334 // in the resultant defs that weren't in the def names themselves. 2335 RecordVal *DefNameRV = CurRec->getValue("NAME"); 2336 CurRec->resolveReferencesTo(DefNameRV); 2337 2338 // Now that NAME references are resolved and we're at the top level of 2339 // any multiclass expansions, add the record to the RecordKeeper. If we are 2340 // currently in a multiclass, it means this defm appears inside a 2341 // multiclass and its name won't be fully resolvable until we see 2342 // the top-level defm. Therefore, we don't add this to the 2343 // RecordKeeper at this point. If we did we could get duplicate 2344 // defs as more than one probably refers to NAME or some other 2345 // common internal placeholder. 2346 2347 // Ensure redefinition doesn't happen. 2348 if (Records.getDef(CurRec->getNameInitAsString())) { 2349 Error(DefmPrefixRange.Start, "def '" + CurRec->getNameInitAsString() + 2350 "' already defined, instantiating defm with subdef '" + 2351 DefProto->getNameInitAsString() + "'"); 2352 return 0; 2353 } 2354 2355 Records.addDef(CurRec); 2356 } 2357 2358 return CurRec; 2359 } 2360 2361 bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC, 2362 Record *CurRec, 2363 SMLoc DefmPrefixLoc, 2364 SMLoc SubClassLoc, 2365 const std::vector<Init *> &TArgs, 2366 std::vector<Init *> &TemplateVals, 2367 bool DeleteArgs) { 2368 // Loop over all of the template arguments, setting them to the specified 2369 // value or leaving them as the default if necessary. 2370 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 2371 // Check if a value is specified for this temp-arg. 2372 if (i < TemplateVals.size()) { 2373 // Set it now. 2374 if (SetValue(CurRec, DefmPrefixLoc, TArgs[i], std::vector<unsigned>(), 2375 TemplateVals[i])) 2376 return true; 2377 2378 // Resolve it next. 2379 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i])); 2380 2381 if (DeleteArgs) 2382 // Now remove it. 2383 CurRec->removeValue(TArgs[i]); 2384 2385 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { 2386 return Error(SubClassLoc, "value not specified for template argument #"+ 2387 utostr(i) + " (" + TArgs[i]->getAsUnquotedString() 2388 + ") of multiclassclass '" + MC.Rec.getNameInitAsString() 2389 + "'"); 2390 } 2391 } 2392 return false; 2393 } 2394 2395 bool TGParser::ResolveMulticlassDef(MultiClass &MC, 2396 Record *CurRec, 2397 Record *DefProto, 2398 SMLoc DefmPrefixLoc) { 2399 // If the mdef is inside a 'let' expression, add to each def. 2400 if (ApplyLetStack(CurRec)) 2401 return Error(DefmPrefixLoc, "when instantiating this defm"); 2402 2403 // Don't create a top level definition for defm inside multiclasses, 2404 // instead, only update the prototypes and bind the template args 2405 // with the new created definition. 2406 if (!CurMultiClass) 2407 return false; 2408 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); 2409 i != e; ++i) 2410 if (CurMultiClass->DefPrototypes[i]->getNameInit() 2411 == CurRec->getNameInit()) 2412 return Error(DefmPrefixLoc, "defm '" + CurRec->getNameInitAsString() + 2413 "' already defined in this multiclass!"); 2414 CurMultiClass->DefPrototypes.push_back(CurRec); 2415 2416 // Copy the template arguments for the multiclass into the new def. 2417 const std::vector<Init *> &TA = 2418 CurMultiClass->Rec.getTemplateArgs(); 2419 2420 for (unsigned i = 0, e = TA.size(); i != e; ++i) { 2421 const RecordVal *RV = CurMultiClass->Rec.getValue(TA[i]); 2422 assert(RV && "Template arg doesn't exist?"); 2423 CurRec->addValue(*RV); 2424 } 2425 2426 return false; 2427 } 2428 2429 /// ParseDefm - Parse the instantiation of a multiclass. 2430 /// 2431 /// DefMInst ::= DEFM ID ':' DefmSubClassRef ';' 2432 /// 2433 bool TGParser::ParseDefm(MultiClass *CurMultiClass) { 2434 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!"); 2435 SMLoc DefmLoc = Lex.getLoc(); 2436 Init *DefmPrefix = 0; 2437 2438 if (Lex.Lex() == tgtok::Id) { // eat the defm. 2439 DefmPrefix = ParseObjectName(CurMultiClass); 2440 } 2441 2442 SMLoc DefmPrefixEndLoc = Lex.getLoc(); 2443 if (Lex.getCode() != tgtok::colon) 2444 return TokError("expected ':' after defm identifier"); 2445 2446 // Keep track of the new generated record definitions. 2447 std::vector<Record*> NewRecDefs; 2448 2449 // This record also inherits from a regular class (non-multiclass)? 2450 bool InheritFromClass = false; 2451 2452 // eat the colon. 2453 Lex.Lex(); 2454 2455 SMLoc SubClassLoc = Lex.getLoc(); 2456 SubClassReference Ref = ParseSubClassReference(0, true); 2457 2458 while (1) { 2459 if (Ref.Rec == 0) return true; 2460 2461 // To instantiate a multiclass, we need to first get the multiclass, then 2462 // instantiate each def contained in the multiclass with the SubClassRef 2463 // template parameters. 2464 MultiClass *MC = MultiClasses[Ref.Rec->getName()]; 2465 assert(MC && "Didn't lookup multiclass correctly?"); 2466 std::vector<Init*> &TemplateVals = Ref.TemplateArgs; 2467 2468 // Verify that the correct number of template arguments were specified. 2469 const std::vector<Init *> &TArgs = MC->Rec.getTemplateArgs(); 2470 if (TArgs.size() < TemplateVals.size()) 2471 return Error(SubClassLoc, 2472 "more template args specified than multiclass expects"); 2473 2474 // Loop over all the def's in the multiclass, instantiating each one. 2475 for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) { 2476 Record *DefProto = MC->DefPrototypes[i]; 2477 2478 Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix, 2479 SMRange(DefmLoc, 2480 DefmPrefixEndLoc)); 2481 if (!CurRec) 2482 return true; 2483 2484 if (ResolveMulticlassDefArgs(*MC, CurRec, DefmLoc, SubClassLoc, 2485 TArgs, TemplateVals, true/*Delete args*/)) 2486 return Error(SubClassLoc, "could not instantiate def"); 2487 2488 if (ResolveMulticlassDef(*MC, CurRec, DefProto, DefmLoc)) 2489 return Error(SubClassLoc, "could not instantiate def"); 2490 2491 NewRecDefs.push_back(CurRec); 2492 } 2493 2494 2495 if (Lex.getCode() != tgtok::comma) break; 2496 Lex.Lex(); // eat ','. 2497 2498 SubClassLoc = Lex.getLoc(); 2499 2500 // A defm can inherit from regular classes (non-multiclass) as 2501 // long as they come in the end of the inheritance list. 2502 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != 0); 2503 2504 if (InheritFromClass) 2505 break; 2506 2507 Ref = ParseSubClassReference(0, true); 2508 } 2509 2510 if (InheritFromClass) { 2511 // Process all the classes to inherit as if they were part of a 2512 // regular 'def' and inherit all record values. 2513 SubClassReference SubClass = ParseSubClassReference(0, false); 2514 while (1) { 2515 // Check for error. 2516 if (SubClass.Rec == 0) return true; 2517 2518 // Get the expanded definition prototypes and teach them about 2519 // the record values the current class to inherit has 2520 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) { 2521 Record *CurRec = NewRecDefs[i]; 2522 2523 // Add it. 2524 if (AddSubClass(CurRec, SubClass)) 2525 return true; 2526 2527 if (ApplyLetStack(CurRec)) 2528 return true; 2529 } 2530 2531 if (Lex.getCode() != tgtok::comma) break; 2532 Lex.Lex(); // eat ','. 2533 SubClass = ParseSubClassReference(0, false); 2534 } 2535 } 2536 2537 if (!CurMultiClass) 2538 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) 2539 // See Record::setName(). This resolve step will see any new 2540 // name for the def that might have been created when resolving 2541 // inheritance, values and arguments above. 2542 NewRecDefs[i]->resolveReferences(); 2543 2544 if (Lex.getCode() != tgtok::semi) 2545 return TokError("expected ';' at end of defm"); 2546 Lex.Lex(); 2547 2548 return false; 2549 } 2550 2551 /// ParseObject 2552 /// Object ::= ClassInst 2553 /// Object ::= DefInst 2554 /// Object ::= MultiClassInst 2555 /// Object ::= DefMInst 2556 /// Object ::= LETCommand '{' ObjectList '}' 2557 /// Object ::= LETCommand Object 2558 bool TGParser::ParseObject(MultiClass *MC) { 2559 switch (Lex.getCode()) { 2560 default: 2561 return TokError("Expected class, def, defm, multiclass or let definition"); 2562 case tgtok::Let: return ParseTopLevelLet(MC); 2563 case tgtok::Def: return ParseDef(MC); 2564 case tgtok::Foreach: return ParseForeach(MC); 2565 case tgtok::Defm: return ParseDefm(MC); 2566 case tgtok::Class: return ParseClass(); 2567 case tgtok::MultiClass: return ParseMultiClass(); 2568 } 2569 } 2570 2571 /// ParseObjectList 2572 /// ObjectList :== Object* 2573 bool TGParser::ParseObjectList(MultiClass *MC) { 2574 while (isObjectStart(Lex.getCode())) { 2575 if (ParseObject(MC)) 2576 return true; 2577 } 2578 return false; 2579 } 2580 2581 bool TGParser::ParseFile() { 2582 Lex.Lex(); // Prime the lexer. 2583 if (ParseObjectList()) return true; 2584 2585 // If we have unread input at the end of the file, report it. 2586 if (Lex.getCode() == tgtok::Eof) 2587 return false; 2588 2589 return TokError("Unexpected input at top level"); 2590 } 2591 2592