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