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