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