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