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 // FIXME: The following two loops would not be duplicated 1319 // if the API was a little more orthogonal. 1320 1321 // bits<n> values are allowed to initialize n bits. 1322 if (BitsInit *BI = dyn_cast<BitsInit>(Vals[i])) { 1323 for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) 1324 NewBits.push_back(BI->getBit((e - i) - 1)); 1325 continue; 1326 } 1327 // bits<n> can also come from variable initializers. 1328 if (VarInit *VI = dyn_cast<VarInit>(Vals[i])) { 1329 if (BitsRecTy *BitsRec = dyn_cast<BitsRecTy>(VI->getType())) { 1330 for (unsigned i = 0, e = BitsRec->getNumBits(); i != e; ++i) 1331 NewBits.push_back(VI->getBit((e - i) - 1)); 1332 continue; 1333 } 1334 // Fallthrough to try convert this to a bit. 1335 } 1336 // All other values must be convertible to just a single bit. 1337 Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get()); 1338 if (!Bit) { 1339 Error(BraceLoc, "Element #" + utostr(i) + " (" + Vals[i]->getAsString()+ 1340 ") is not convertable to a bit"); 1341 return nullptr; 1342 } 1343 NewBits.push_back(Bit); 1344 } 1345 std::reverse(NewBits.begin(), NewBits.end()); 1346 return BitsInit::get(NewBits); 1347 } 1348 case tgtok::l_square: { // Value ::= '[' ValueList ']' 1349 Lex.Lex(); // eat the '[' 1350 std::vector<Init*> Vals; 1351 1352 RecTy *DeducedEltTy = nullptr; 1353 ListRecTy *GivenListTy = nullptr; 1354 1355 if (ItemType) { 1356 ListRecTy *ListType = dyn_cast<ListRecTy>(ItemType); 1357 if (!ListType) { 1358 std::string s; 1359 raw_string_ostream ss(s); 1360 ss << "Type mismatch for list, expected list type, got " 1361 << ItemType->getAsString(); 1362 TokError(ss.str()); 1363 return nullptr; 1364 } 1365 GivenListTy = ListType; 1366 } 1367 1368 if (Lex.getCode() != tgtok::r_square) { 1369 Vals = ParseValueList(CurRec, nullptr, 1370 GivenListTy ? GivenListTy->getElementType() : nullptr); 1371 if (Vals.empty()) return nullptr; 1372 } 1373 if (Lex.getCode() != tgtok::r_square) { 1374 TokError("expected ']' at end of list value"); 1375 return nullptr; 1376 } 1377 Lex.Lex(); // eat the ']' 1378 1379 RecTy *GivenEltTy = nullptr; 1380 if (Lex.getCode() == tgtok::less) { 1381 // Optional list element type 1382 Lex.Lex(); // eat the '<' 1383 1384 GivenEltTy = ParseType(); 1385 if (!GivenEltTy) { 1386 // Couldn't parse element type 1387 return nullptr; 1388 } 1389 1390 if (Lex.getCode() != tgtok::greater) { 1391 TokError("expected '>' at end of list element type"); 1392 return nullptr; 1393 } 1394 Lex.Lex(); // eat the '>' 1395 } 1396 1397 // Check elements 1398 RecTy *EltTy = nullptr; 1399 for (std::vector<Init *>::iterator i = Vals.begin(), ie = Vals.end(); 1400 i != ie; 1401 ++i) { 1402 TypedInit *TArg = dyn_cast<TypedInit>(*i); 1403 if (!TArg) { 1404 TokError("Untyped list element"); 1405 return nullptr; 1406 } 1407 if (EltTy) { 1408 EltTy = resolveTypes(EltTy, TArg->getType()); 1409 if (!EltTy) { 1410 TokError("Incompatible types in list elements"); 1411 return nullptr; 1412 } 1413 } else { 1414 EltTy = TArg->getType(); 1415 } 1416 } 1417 1418 if (GivenEltTy) { 1419 if (EltTy) { 1420 // Verify consistency 1421 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) { 1422 TokError("Incompatible types in list elements"); 1423 return nullptr; 1424 } 1425 } 1426 EltTy = GivenEltTy; 1427 } 1428 1429 if (!EltTy) { 1430 if (!ItemType) { 1431 TokError("No type for list"); 1432 return nullptr; 1433 } 1434 DeducedEltTy = GivenListTy->getElementType(); 1435 } else { 1436 // Make sure the deduced type is compatible with the given type 1437 if (GivenListTy) { 1438 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) { 1439 TokError("Element type mismatch for list"); 1440 return nullptr; 1441 } 1442 } 1443 DeducedEltTy = EltTy; 1444 } 1445 1446 return ListInit::get(Vals, DeducedEltTy); 1447 } 1448 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')' 1449 Lex.Lex(); // eat the '(' 1450 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast) { 1451 TokError("expected identifier in dag init"); 1452 return nullptr; 1453 } 1454 1455 Init *Operator = ParseValue(CurRec); 1456 if (!Operator) return nullptr; 1457 1458 // If the operator name is present, parse it. 1459 std::string OperatorName; 1460 if (Lex.getCode() == tgtok::colon) { 1461 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 1462 TokError("expected variable name in dag operator"); 1463 return nullptr; 1464 } 1465 OperatorName = Lex.getCurStrVal(); 1466 Lex.Lex(); // eat the VarName. 1467 } 1468 1469 std::vector<std::pair<llvm::Init*, std::string> > DagArgs; 1470 if (Lex.getCode() != tgtok::r_paren) { 1471 DagArgs = ParseDagArgList(CurRec); 1472 if (DagArgs.empty()) return nullptr; 1473 } 1474 1475 if (Lex.getCode() != tgtok::r_paren) { 1476 TokError("expected ')' in dag init"); 1477 return nullptr; 1478 } 1479 Lex.Lex(); // eat the ')' 1480 1481 return DagInit::get(Operator, OperatorName, DagArgs); 1482 } 1483 1484 case tgtok::XHead: 1485 case tgtok::XTail: 1486 case tgtok::XEmpty: 1487 case tgtok::XCast: // Value ::= !unop '(' Value ')' 1488 case tgtok::XConcat: 1489 case tgtok::XADD: 1490 case tgtok::XAND: 1491 case tgtok::XSRA: 1492 case tgtok::XSRL: 1493 case tgtok::XSHL: 1494 case tgtok::XEq: 1495 case tgtok::XListConcat: 1496 case tgtok::XStrConcat: // Value ::= !binop '(' Value ',' Value ')' 1497 case tgtok::XIf: 1498 case tgtok::XForEach: 1499 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 1500 return ParseOperation(CurRec, ItemType); 1501 } 1502 } 1503 1504 return R; 1505 } 1506 1507 /// ParseValue - Parse a tblgen value. This returns null on error. 1508 /// 1509 /// Value ::= SimpleValue ValueSuffix* 1510 /// ValueSuffix ::= '{' BitList '}' 1511 /// ValueSuffix ::= '[' BitList ']' 1512 /// ValueSuffix ::= '.' ID 1513 /// 1514 Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { 1515 Init *Result = ParseSimpleValue(CurRec, ItemType, Mode); 1516 if (!Result) return nullptr; 1517 1518 // Parse the suffixes now if present. 1519 while (1) { 1520 switch (Lex.getCode()) { 1521 default: return Result; 1522 case tgtok::l_brace: { 1523 if (Mode == ParseNameMode || Mode == ParseForeachMode) 1524 // This is the beginning of the object body. 1525 return Result; 1526 1527 SMLoc CurlyLoc = Lex.getLoc(); 1528 Lex.Lex(); // eat the '{' 1529 std::vector<unsigned> Ranges = ParseRangeList(); 1530 if (Ranges.empty()) return nullptr; 1531 1532 // Reverse the bitlist. 1533 std::reverse(Ranges.begin(), Ranges.end()); 1534 Result = Result->convertInitializerBitRange(Ranges); 1535 if (!Result) { 1536 Error(CurlyLoc, "Invalid bit range for value"); 1537 return nullptr; 1538 } 1539 1540 // Eat the '}'. 1541 if (Lex.getCode() != tgtok::r_brace) { 1542 TokError("expected '}' at end of bit range list"); 1543 return nullptr; 1544 } 1545 Lex.Lex(); 1546 break; 1547 } 1548 case tgtok::l_square: { 1549 SMLoc SquareLoc = Lex.getLoc(); 1550 Lex.Lex(); // eat the '[' 1551 std::vector<unsigned> Ranges = ParseRangeList(); 1552 if (Ranges.empty()) return nullptr; 1553 1554 Result = Result->convertInitListSlice(Ranges); 1555 if (!Result) { 1556 Error(SquareLoc, "Invalid range for list slice"); 1557 return nullptr; 1558 } 1559 1560 // Eat the ']'. 1561 if (Lex.getCode() != tgtok::r_square) { 1562 TokError("expected ']' at end of list slice"); 1563 return nullptr; 1564 } 1565 Lex.Lex(); 1566 break; 1567 } 1568 case tgtok::period: 1569 if (Lex.Lex() != tgtok::Id) { // eat the . 1570 TokError("expected field identifier after '.'"); 1571 return nullptr; 1572 } 1573 if (!Result->getFieldType(Lex.getCurStrVal())) { 1574 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" + 1575 Result->getAsString() + "'"); 1576 return nullptr; 1577 } 1578 Result = FieldInit::get(Result, Lex.getCurStrVal()); 1579 Lex.Lex(); // eat field name 1580 break; 1581 1582 case tgtok::paste: 1583 SMLoc PasteLoc = Lex.getLoc(); 1584 1585 // Create a !strconcat() operation, first casting each operand to 1586 // a string if necessary. 1587 1588 TypedInit *LHS = dyn_cast<TypedInit>(Result); 1589 if (!LHS) { 1590 Error(PasteLoc, "LHS of paste is not typed!"); 1591 return nullptr; 1592 } 1593 1594 if (LHS->getType() != StringRecTy::get()) { 1595 LHS = UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get()); 1596 } 1597 1598 TypedInit *RHS = nullptr; 1599 1600 Lex.Lex(); // Eat the '#'. 1601 switch (Lex.getCode()) { 1602 case tgtok::colon: 1603 case tgtok::semi: 1604 case tgtok::l_brace: 1605 // These are all of the tokens that can begin an object body. 1606 // Some of these can also begin values but we disallow those cases 1607 // because they are unlikely to be useful. 1608 1609 // Trailing paste, concat with an empty string. 1610 RHS = StringInit::get(""); 1611 break; 1612 1613 default: 1614 Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode); 1615 RHS = dyn_cast<TypedInit>(RHSResult); 1616 if (!RHS) { 1617 Error(PasteLoc, "RHS of paste is not typed!"); 1618 return nullptr; 1619 } 1620 1621 if (RHS->getType() != StringRecTy::get()) { 1622 RHS = UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get()); 1623 } 1624 1625 break; 1626 } 1627 1628 Result = BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS, 1629 StringRecTy::get())->Fold(CurRec, CurMultiClass); 1630 break; 1631 } 1632 } 1633 } 1634 1635 /// ParseDagArgList - Parse the argument list for a dag literal expression. 1636 /// 1637 /// DagArg ::= Value (':' VARNAME)? 1638 /// DagArg ::= VARNAME 1639 /// DagArgList ::= DagArg 1640 /// DagArgList ::= DagArgList ',' DagArg 1641 std::vector<std::pair<llvm::Init*, std::string> > 1642 TGParser::ParseDagArgList(Record *CurRec) { 1643 std::vector<std::pair<llvm::Init*, std::string> > Result; 1644 1645 while (1) { 1646 // DagArg ::= VARNAME 1647 if (Lex.getCode() == tgtok::VarName) { 1648 // A missing value is treated like '?'. 1649 Result.push_back(std::make_pair(UnsetInit::get(), Lex.getCurStrVal())); 1650 Lex.Lex(); 1651 } else { 1652 // DagArg ::= Value (':' VARNAME)? 1653 Init *Val = ParseValue(CurRec); 1654 if (!Val) 1655 return std::vector<std::pair<llvm::Init*, std::string> >(); 1656 1657 // If the variable name is present, add it. 1658 std::string VarName; 1659 if (Lex.getCode() == tgtok::colon) { 1660 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 1661 TokError("expected variable name in dag literal"); 1662 return std::vector<std::pair<llvm::Init*, std::string> >(); 1663 } 1664 VarName = Lex.getCurStrVal(); 1665 Lex.Lex(); // eat the VarName. 1666 } 1667 1668 Result.push_back(std::make_pair(Val, VarName)); 1669 } 1670 if (Lex.getCode() != tgtok::comma) break; 1671 Lex.Lex(); // eat the ',' 1672 } 1673 1674 return Result; 1675 } 1676 1677 1678 /// ParseValueList - Parse a comma separated list of values, returning them as a 1679 /// vector. Note that this always expects to be able to parse at least one 1680 /// value. It returns an empty list if this is not possible. 1681 /// 1682 /// ValueList ::= Value (',' Value) 1683 /// 1684 std::vector<Init*> TGParser::ParseValueList(Record *CurRec, Record *ArgsRec, 1685 RecTy *EltTy) { 1686 std::vector<Init*> Result; 1687 RecTy *ItemType = EltTy; 1688 unsigned int ArgN = 0; 1689 if (ArgsRec && !EltTy) { 1690 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs(); 1691 if (!TArgs.size()) { 1692 TokError("template argument provided to non-template class"); 1693 return std::vector<Init*>(); 1694 } 1695 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 1696 if (!RV) { 1697 errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN] 1698 << ")\n"; 1699 } 1700 assert(RV && "Template argument record not found??"); 1701 ItemType = RV->getType(); 1702 ++ArgN; 1703 } 1704 Result.push_back(ParseValue(CurRec, ItemType)); 1705 if (!Result.back()) return std::vector<Init*>(); 1706 1707 while (Lex.getCode() == tgtok::comma) { 1708 Lex.Lex(); // Eat the comma 1709 1710 if (ArgsRec && !EltTy) { 1711 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs(); 1712 if (ArgN >= TArgs.size()) { 1713 TokError("too many template arguments"); 1714 return std::vector<Init*>(); 1715 } 1716 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 1717 assert(RV && "Template argument record not found??"); 1718 ItemType = RV->getType(); 1719 ++ArgN; 1720 } 1721 Result.push_back(ParseValue(CurRec, ItemType)); 1722 if (!Result.back()) return std::vector<Init*>(); 1723 } 1724 1725 return Result; 1726 } 1727 1728 1729 /// ParseDeclaration - Read a declaration, returning the name of field ID, or an 1730 /// empty string on error. This can happen in a number of different context's, 1731 /// including within a def or in the template args for a def (which which case 1732 /// CurRec will be non-null) and within the template args for a multiclass (in 1733 /// which case CurRec will be null, but CurMultiClass will be set). This can 1734 /// also happen within a def that is within a multiclass, which will set both 1735 /// CurRec and CurMultiClass. 1736 /// 1737 /// Declaration ::= FIELD? Type ID ('=' Value)? 1738 /// 1739 Init *TGParser::ParseDeclaration(Record *CurRec, 1740 bool ParsingTemplateArgs) { 1741 // Read the field prefix if present. 1742 bool HasField = Lex.getCode() == tgtok::Field; 1743 if (HasField) Lex.Lex(); 1744 1745 RecTy *Type = ParseType(); 1746 if (!Type) return nullptr; 1747 1748 if (Lex.getCode() != tgtok::Id) { 1749 TokError("Expected identifier in declaration"); 1750 return nullptr; 1751 } 1752 1753 SMLoc IdLoc = Lex.getLoc(); 1754 Init *DeclName = StringInit::get(Lex.getCurStrVal()); 1755 Lex.Lex(); 1756 1757 if (ParsingTemplateArgs) { 1758 if (CurRec) { 1759 DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":"); 1760 } else { 1761 assert(CurMultiClass); 1762 } 1763 if (CurMultiClass) 1764 DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName, 1765 "::"); 1766 } 1767 1768 // Add the value. 1769 if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField))) 1770 return nullptr; 1771 1772 // If a value is present, parse it. 1773 if (Lex.getCode() == tgtok::equal) { 1774 Lex.Lex(); 1775 SMLoc ValLoc = Lex.getLoc(); 1776 Init *Val = ParseValue(CurRec, Type); 1777 if (!Val || 1778 SetValue(CurRec, ValLoc, DeclName, std::vector<unsigned>(), Val)) 1779 // Return the name, even if an error is thrown. This is so that we can 1780 // continue to make some progress, even without the value having been 1781 // initialized. 1782 return DeclName; 1783 } 1784 1785 return DeclName; 1786 } 1787 1788 /// ParseForeachDeclaration - Read a foreach declaration, returning 1789 /// the name of the declared object or a NULL Init on error. Return 1790 /// the name of the parsed initializer list through ForeachListName. 1791 /// 1792 /// ForeachDeclaration ::= ID '=' '[' ValueList ']' 1793 /// ForeachDeclaration ::= ID '=' '{' RangeList '}' 1794 /// ForeachDeclaration ::= ID '=' RangePiece 1795 /// 1796 VarInit *TGParser::ParseForeachDeclaration(ListInit *&ForeachListValue) { 1797 if (Lex.getCode() != tgtok::Id) { 1798 TokError("Expected identifier in foreach declaration"); 1799 return nullptr; 1800 } 1801 1802 Init *DeclName = StringInit::get(Lex.getCurStrVal()); 1803 Lex.Lex(); 1804 1805 // If a value is present, parse it. 1806 if (Lex.getCode() != tgtok::equal) { 1807 TokError("Expected '=' in foreach declaration"); 1808 return nullptr; 1809 } 1810 Lex.Lex(); // Eat the '=' 1811 1812 RecTy *IterType = nullptr; 1813 std::vector<unsigned> Ranges; 1814 1815 switch (Lex.getCode()) { 1816 default: TokError("Unknown token when expecting a range list"); return nullptr; 1817 case tgtok::l_square: { // '[' ValueList ']' 1818 Init *List = ParseSimpleValue(nullptr, nullptr, ParseForeachMode); 1819 ForeachListValue = dyn_cast<ListInit>(List); 1820 if (!ForeachListValue) { 1821 TokError("Expected a Value list"); 1822 return nullptr; 1823 } 1824 RecTy *ValueType = ForeachListValue->getType(); 1825 ListRecTy *ListType = dyn_cast<ListRecTy>(ValueType); 1826 if (!ListType) { 1827 TokError("Value list is not of list type"); 1828 return nullptr; 1829 } 1830 IterType = ListType->getElementType(); 1831 break; 1832 } 1833 1834 case tgtok::IntVal: { // RangePiece. 1835 if (ParseRangePiece(Ranges)) 1836 return nullptr; 1837 break; 1838 } 1839 1840 case tgtok::l_brace: { // '{' RangeList '}' 1841 Lex.Lex(); // eat the '{' 1842 Ranges = ParseRangeList(); 1843 if (Lex.getCode() != tgtok::r_brace) { 1844 TokError("expected '}' at end of bit range list"); 1845 return nullptr; 1846 } 1847 Lex.Lex(); 1848 break; 1849 } 1850 } 1851 1852 if (!Ranges.empty()) { 1853 assert(!IterType && "Type already initialized?"); 1854 IterType = IntRecTy::get(); 1855 std::vector<Init*> Values; 1856 for (unsigned i = 0, e = Ranges.size(); i != e; ++i) 1857 Values.push_back(IntInit::get(Ranges[i])); 1858 ForeachListValue = ListInit::get(Values, IterType); 1859 } 1860 1861 if (!IterType) 1862 return nullptr; 1863 1864 return VarInit::get(DeclName, IterType); 1865 } 1866 1867 /// ParseTemplateArgList - Read a template argument list, which is a non-empty 1868 /// sequence of template-declarations in <>'s. If CurRec is non-null, these are 1869 /// template args for a def, which may or may not be in a multiclass. If null, 1870 /// these are the template args for a multiclass. 1871 /// 1872 /// TemplateArgList ::= '<' Declaration (',' Declaration)* '>' 1873 /// 1874 bool TGParser::ParseTemplateArgList(Record *CurRec) { 1875 assert(Lex.getCode() == tgtok::less && "Not a template arg list!"); 1876 Lex.Lex(); // eat the '<' 1877 1878 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec; 1879 1880 // Read the first declaration. 1881 Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 1882 if (!TemplArg) 1883 return true; 1884 1885 TheRecToAddTo->addTemplateArg(TemplArg); 1886 1887 while (Lex.getCode() == tgtok::comma) { 1888 Lex.Lex(); // eat the ',' 1889 1890 // Read the following declarations. 1891 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 1892 if (!TemplArg) 1893 return true; 1894 TheRecToAddTo->addTemplateArg(TemplArg); 1895 } 1896 1897 if (Lex.getCode() != tgtok::greater) 1898 return TokError("expected '>' at end of template argument list"); 1899 Lex.Lex(); // eat the '>'. 1900 return false; 1901 } 1902 1903 1904 /// ParseBodyItem - Parse a single item at within the body of a def or class. 1905 /// 1906 /// BodyItem ::= Declaration ';' 1907 /// BodyItem ::= LET ID OptionalBitList '=' Value ';' 1908 bool TGParser::ParseBodyItem(Record *CurRec) { 1909 if (Lex.getCode() != tgtok::Let) { 1910 if (!ParseDeclaration(CurRec, false)) 1911 return true; 1912 1913 if (Lex.getCode() != tgtok::semi) 1914 return TokError("expected ';' after declaration"); 1915 Lex.Lex(); 1916 return false; 1917 } 1918 1919 // LET ID OptionalRangeList '=' Value ';' 1920 if (Lex.Lex() != tgtok::Id) 1921 return TokError("expected field identifier after let"); 1922 1923 SMLoc IdLoc = Lex.getLoc(); 1924 std::string FieldName = Lex.getCurStrVal(); 1925 Lex.Lex(); // eat the field name. 1926 1927 std::vector<unsigned> BitList; 1928 if (ParseOptionalBitList(BitList)) 1929 return true; 1930 std::reverse(BitList.begin(), BitList.end()); 1931 1932 if (Lex.getCode() != tgtok::equal) 1933 return TokError("expected '=' in let expression"); 1934 Lex.Lex(); // eat the '='. 1935 1936 RecordVal *Field = CurRec->getValue(FieldName); 1937 if (!Field) 1938 return TokError("Value '" + FieldName + "' unknown!"); 1939 1940 RecTy *Type = Field->getType(); 1941 1942 Init *Val = ParseValue(CurRec, Type); 1943 if (!Val) return true; 1944 1945 if (Lex.getCode() != tgtok::semi) 1946 return TokError("expected ';' after let expression"); 1947 Lex.Lex(); 1948 1949 return SetValue(CurRec, IdLoc, FieldName, BitList, Val); 1950 } 1951 1952 /// ParseBody - Read the body of a class or def. Return true on error, false on 1953 /// success. 1954 /// 1955 /// Body ::= ';' 1956 /// Body ::= '{' BodyList '}' 1957 /// BodyList BodyItem* 1958 /// 1959 bool TGParser::ParseBody(Record *CurRec) { 1960 // If this is a null definition, just eat the semi and return. 1961 if (Lex.getCode() == tgtok::semi) { 1962 Lex.Lex(); 1963 return false; 1964 } 1965 1966 if (Lex.getCode() != tgtok::l_brace) 1967 return TokError("Expected ';' or '{' to start body"); 1968 // Eat the '{'. 1969 Lex.Lex(); 1970 1971 while (Lex.getCode() != tgtok::r_brace) 1972 if (ParseBodyItem(CurRec)) 1973 return true; 1974 1975 // Eat the '}'. 1976 Lex.Lex(); 1977 return false; 1978 } 1979 1980 /// \brief Apply the current let bindings to \a CurRec. 1981 /// \returns true on error, false otherwise. 1982 bool TGParser::ApplyLetStack(Record *CurRec) { 1983 for (unsigned i = 0, e = LetStack.size(); i != e; ++i) 1984 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j) 1985 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name, 1986 LetStack[i][j].Bits, LetStack[i][j].Value)) 1987 return true; 1988 return false; 1989 } 1990 1991 /// ParseObjectBody - Parse the body of a def or class. This consists of an 1992 /// optional ClassList followed by a Body. CurRec is the current def or class 1993 /// that is being parsed. 1994 /// 1995 /// ObjectBody ::= BaseClassList Body 1996 /// BaseClassList ::= /*empty*/ 1997 /// BaseClassList ::= ':' BaseClassListNE 1998 /// BaseClassListNE ::= SubClassRef (',' SubClassRef)* 1999 /// 2000 bool TGParser::ParseObjectBody(Record *CurRec) { 2001 // If there is a baseclass list, read it. 2002 if (Lex.getCode() == tgtok::colon) { 2003 Lex.Lex(); 2004 2005 // Read all of the subclasses. 2006 SubClassReference SubClass = ParseSubClassReference(CurRec, false); 2007 while (1) { 2008 // Check for error. 2009 if (!SubClass.Rec) return true; 2010 2011 // Add it. 2012 if (AddSubClass(CurRec, SubClass)) 2013 return true; 2014 2015 if (Lex.getCode() != tgtok::comma) break; 2016 Lex.Lex(); // eat ','. 2017 SubClass = ParseSubClassReference(CurRec, false); 2018 } 2019 } 2020 2021 if (ApplyLetStack(CurRec)) 2022 return true; 2023 2024 return ParseBody(CurRec); 2025 } 2026 2027 /// ParseDef - Parse and return a top level or multiclass def, return the record 2028 /// corresponding to it. This returns null on error. 2029 /// 2030 /// DefInst ::= DEF ObjectName ObjectBody 2031 /// 2032 bool TGParser::ParseDef(MultiClass *CurMultiClass) { 2033 SMLoc DefLoc = Lex.getLoc(); 2034 assert(Lex.getCode() == tgtok::Def && "Unknown tok"); 2035 Lex.Lex(); // Eat the 'def' token. 2036 2037 // Parse ObjectName and make a record for it. 2038 Record *CurRec; 2039 bool CurRecOwnershipTransferred = false; 2040 Init *Name = ParseObjectName(CurMultiClass); 2041 if (Name) 2042 CurRec = new Record(Name, DefLoc, Records); 2043 else 2044 CurRec = new Record(GetNewAnonymousName(), DefLoc, Records, 2045 /*IsAnonymous=*/true); 2046 2047 if (!CurMultiClass && Loops.empty()) { 2048 // Top-level def definition. 2049 2050 // Ensure redefinition doesn't happen. 2051 if (Records.getDef(CurRec->getNameInitAsString())) { 2052 Error(DefLoc, "def '" + CurRec->getNameInitAsString() 2053 + "' already defined"); 2054 delete CurRec; 2055 return true; 2056 } 2057 Records.addDef(CurRec); 2058 CurRecOwnershipTransferred = true; 2059 2060 if (ParseObjectBody(CurRec)) 2061 return true; 2062 } else if (CurMultiClass) { 2063 // Parse the body before adding this prototype to the DefPrototypes vector. 2064 // That way implicit definitions will be added to the DefPrototypes vector 2065 // before this object, instantiated prior to defs derived from this object, 2066 // and this available for indirect name resolution when defs derived from 2067 // this object are instantiated. 2068 if (ParseObjectBody(CurRec)) { 2069 delete CurRec; 2070 return true; 2071 } 2072 2073 // Otherwise, a def inside a multiclass, add it to the multiclass. 2074 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i) 2075 if (CurMultiClass->DefPrototypes[i]->getNameInit() 2076 == CurRec->getNameInit()) { 2077 Error(DefLoc, "def '" + CurRec->getNameInitAsString() + 2078 "' already defined in this multiclass!"); 2079 delete CurRec; 2080 return true; 2081 } 2082 CurMultiClass->DefPrototypes.push_back(CurRec); 2083 CurRecOwnershipTransferred = true; 2084 } else if (ParseObjectBody(CurRec)) { 2085 delete CurRec; 2086 return true; 2087 } 2088 2089 if (!CurMultiClass) // Def's in multiclasses aren't really defs. 2090 // See Record::setName(). This resolve step will see any new name 2091 // for the def that might have been created when resolving 2092 // inheritance, values and arguments above. 2093 CurRec->resolveReferences(); 2094 2095 // If ObjectBody has template arguments, it's an error. 2096 assert(CurRec->getTemplateArgs().empty() && "How'd this get template args?"); 2097 2098 if (CurMultiClass) { 2099 // Copy the template arguments for the multiclass into the def. 2100 const std::vector<Init *> &TArgs = 2101 CurMultiClass->Rec.getTemplateArgs(); 2102 2103 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 2104 const RecordVal *RV = CurMultiClass->Rec.getValue(TArgs[i]); 2105 assert(RV && "Template arg doesn't exist?"); 2106 CurRec->addValue(*RV); 2107 } 2108 } 2109 2110 if (ProcessForeachDefs(CurRec, DefLoc)) { 2111 Error(DefLoc, 2112 "Could not process loops for def" + CurRec->getNameInitAsString()); 2113 if (!CurRecOwnershipTransferred) 2114 delete CurRec; 2115 return true; 2116 } 2117 2118 if (!CurRecOwnershipTransferred) 2119 delete CurRec; 2120 return false; 2121 } 2122 2123 /// ParseForeach - Parse a for statement. Return the record corresponding 2124 /// to it. This returns true on error. 2125 /// 2126 /// Foreach ::= FOREACH Declaration IN '{ ObjectList '}' 2127 /// Foreach ::= FOREACH Declaration IN Object 2128 /// 2129 bool TGParser::ParseForeach(MultiClass *CurMultiClass) { 2130 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok"); 2131 Lex.Lex(); // Eat the 'for' token. 2132 2133 // Make a temporary object to record items associated with the for 2134 // loop. 2135 ListInit *ListValue = nullptr; 2136 VarInit *IterName = ParseForeachDeclaration(ListValue); 2137 if (!IterName) 2138 return TokError("expected declaration in for"); 2139 2140 if (Lex.getCode() != tgtok::In) 2141 return TokError("Unknown tok"); 2142 Lex.Lex(); // Eat the in 2143 2144 // Create a loop object and remember it. 2145 Loops.push_back(ForeachLoop(IterName, ListValue)); 2146 2147 if (Lex.getCode() != tgtok::l_brace) { 2148 // FOREACH Declaration IN Object 2149 if (ParseObject(CurMultiClass)) 2150 return true; 2151 } 2152 else { 2153 SMLoc BraceLoc = Lex.getLoc(); 2154 // Otherwise, this is a group foreach. 2155 Lex.Lex(); // eat the '{'. 2156 2157 // Parse the object list. 2158 if (ParseObjectList(CurMultiClass)) 2159 return true; 2160 2161 if (Lex.getCode() != tgtok::r_brace) { 2162 TokError("expected '}' at end of foreach command"); 2163 return Error(BraceLoc, "to match this '{'"); 2164 } 2165 Lex.Lex(); // Eat the } 2166 } 2167 2168 // We've processed everything in this loop. 2169 Loops.pop_back(); 2170 2171 return false; 2172 } 2173 2174 /// ParseClass - Parse a tblgen class definition. 2175 /// 2176 /// ClassInst ::= CLASS ID TemplateArgList? ObjectBody 2177 /// 2178 bool TGParser::ParseClass() { 2179 assert(Lex.getCode() == tgtok::Class && "Unexpected token!"); 2180 Lex.Lex(); 2181 2182 if (Lex.getCode() != tgtok::Id) 2183 return TokError("expected class name after 'class' keyword"); 2184 2185 Record *CurRec = Records.getClass(Lex.getCurStrVal()); 2186 if (CurRec) { 2187 // If the body was previously defined, this is an error. 2188 if (CurRec->getValues().size() > 1 || // Account for NAME. 2189 !CurRec->getSuperClasses().empty() || 2190 !CurRec->getTemplateArgs().empty()) 2191 return TokError("Class '" + CurRec->getNameInitAsString() 2192 + "' already defined"); 2193 } else { 2194 // If this is the first reference to this class, create and add it. 2195 CurRec = new Record(Lex.getCurStrVal(), Lex.getLoc(), Records); 2196 Records.addClass(CurRec); 2197 } 2198 Lex.Lex(); // eat the name. 2199 2200 // If there are template args, parse them. 2201 if (Lex.getCode() == tgtok::less) 2202 if (ParseTemplateArgList(CurRec)) 2203 return true; 2204 2205 // Finally, parse the object body. 2206 return ParseObjectBody(CurRec); 2207 } 2208 2209 /// ParseLetList - Parse a non-empty list of assignment expressions into a list 2210 /// of LetRecords. 2211 /// 2212 /// LetList ::= LetItem (',' LetItem)* 2213 /// LetItem ::= ID OptionalRangeList '=' Value 2214 /// 2215 std::vector<LetRecord> TGParser::ParseLetList() { 2216 std::vector<LetRecord> Result; 2217 2218 while (1) { 2219 if (Lex.getCode() != tgtok::Id) { 2220 TokError("expected identifier in let definition"); 2221 return std::vector<LetRecord>(); 2222 } 2223 std::string Name = Lex.getCurStrVal(); 2224 SMLoc NameLoc = Lex.getLoc(); 2225 Lex.Lex(); // Eat the identifier. 2226 2227 // Check for an optional RangeList. 2228 std::vector<unsigned> Bits; 2229 if (ParseOptionalRangeList(Bits)) 2230 return std::vector<LetRecord>(); 2231 std::reverse(Bits.begin(), Bits.end()); 2232 2233 if (Lex.getCode() != tgtok::equal) { 2234 TokError("expected '=' in let expression"); 2235 return std::vector<LetRecord>(); 2236 } 2237 Lex.Lex(); // eat the '='. 2238 2239 Init *Val = ParseValue(nullptr); 2240 if (!Val) return std::vector<LetRecord>(); 2241 2242 // Now that we have everything, add the record. 2243 Result.push_back(LetRecord(Name, Bits, Val, NameLoc)); 2244 2245 if (Lex.getCode() != tgtok::comma) 2246 return Result; 2247 Lex.Lex(); // eat the comma. 2248 } 2249 } 2250 2251 /// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of 2252 /// different related productions. This works inside multiclasses too. 2253 /// 2254 /// Object ::= LET LetList IN '{' ObjectList '}' 2255 /// Object ::= LET LetList IN Object 2256 /// 2257 bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) { 2258 assert(Lex.getCode() == tgtok::Let && "Unexpected token"); 2259 Lex.Lex(); 2260 2261 // Add this entry to the let stack. 2262 std::vector<LetRecord> LetInfo = ParseLetList(); 2263 if (LetInfo.empty()) return true; 2264 LetStack.push_back(LetInfo); 2265 2266 if (Lex.getCode() != tgtok::In) 2267 return TokError("expected 'in' at end of top-level 'let'"); 2268 Lex.Lex(); 2269 2270 // If this is a scalar let, just handle it now 2271 if (Lex.getCode() != tgtok::l_brace) { 2272 // LET LetList IN Object 2273 if (ParseObject(CurMultiClass)) 2274 return true; 2275 } else { // Object ::= LETCommand '{' ObjectList '}' 2276 SMLoc BraceLoc = Lex.getLoc(); 2277 // Otherwise, this is a group let. 2278 Lex.Lex(); // eat the '{'. 2279 2280 // Parse the object list. 2281 if (ParseObjectList(CurMultiClass)) 2282 return true; 2283 2284 if (Lex.getCode() != tgtok::r_brace) { 2285 TokError("expected '}' at end of top level let command"); 2286 return Error(BraceLoc, "to match this '{'"); 2287 } 2288 Lex.Lex(); 2289 } 2290 2291 // Outside this let scope, this let block is not active. 2292 LetStack.pop_back(); 2293 return false; 2294 } 2295 2296 /// ParseMultiClass - Parse a multiclass definition. 2297 /// 2298 /// MultiClassInst ::= MULTICLASS ID TemplateArgList? 2299 /// ':' BaseMultiClassList '{' MultiClassObject+ '}' 2300 /// MultiClassObject ::= DefInst 2301 /// MultiClassObject ::= MultiClassInst 2302 /// MultiClassObject ::= DefMInst 2303 /// MultiClassObject ::= LETCommand '{' ObjectList '}' 2304 /// MultiClassObject ::= LETCommand Object 2305 /// 2306 bool TGParser::ParseMultiClass() { 2307 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token"); 2308 Lex.Lex(); // Eat the multiclass token. 2309 2310 if (Lex.getCode() != tgtok::Id) 2311 return TokError("expected identifier after multiclass for name"); 2312 std::string Name = Lex.getCurStrVal(); 2313 2314 if (MultiClasses.count(Name)) 2315 return TokError("multiclass '" + Name + "' already defined"); 2316 2317 CurMultiClass = MultiClasses[Name] = new MultiClass(Name, 2318 Lex.getLoc(), Records); 2319 Lex.Lex(); // Eat the identifier. 2320 2321 // If there are template args, parse them. 2322 if (Lex.getCode() == tgtok::less) 2323 if (ParseTemplateArgList(nullptr)) 2324 return true; 2325 2326 bool inherits = false; 2327 2328 // If there are submulticlasses, parse them. 2329 if (Lex.getCode() == tgtok::colon) { 2330 inherits = true; 2331 2332 Lex.Lex(); 2333 2334 // Read all of the submulticlasses. 2335 SubMultiClassReference SubMultiClass = 2336 ParseSubMultiClassReference(CurMultiClass); 2337 while (1) { 2338 // Check for error. 2339 if (!SubMultiClass.MC) return true; 2340 2341 // Add it. 2342 if (AddSubMultiClass(CurMultiClass, SubMultiClass)) 2343 return true; 2344 2345 if (Lex.getCode() != tgtok::comma) break; 2346 Lex.Lex(); // eat ','. 2347 SubMultiClass = ParseSubMultiClassReference(CurMultiClass); 2348 } 2349 } 2350 2351 if (Lex.getCode() != tgtok::l_brace) { 2352 if (!inherits) 2353 return TokError("expected '{' in multiclass definition"); 2354 else if (Lex.getCode() != tgtok::semi) 2355 return TokError("expected ';' in multiclass definition"); 2356 else 2357 Lex.Lex(); // eat the ';'. 2358 } else { 2359 if (Lex.Lex() == tgtok::r_brace) // eat the '{'. 2360 return TokError("multiclass must contain at least one def"); 2361 2362 while (Lex.getCode() != tgtok::r_brace) { 2363 switch (Lex.getCode()) { 2364 default: 2365 return TokError("expected 'let', 'def' or 'defm' in multiclass body"); 2366 case tgtok::Let: 2367 case tgtok::Def: 2368 case tgtok::Defm: 2369 case tgtok::Foreach: 2370 if (ParseObject(CurMultiClass)) 2371 return true; 2372 break; 2373 } 2374 } 2375 Lex.Lex(); // eat the '}'. 2376 } 2377 2378 CurMultiClass = nullptr; 2379 return false; 2380 } 2381 2382 Record *TGParser:: 2383 InstantiateMulticlassDef(MultiClass &MC, 2384 Record *DefProto, 2385 Init *&DefmPrefix, 2386 SMRange DefmPrefixRange) { 2387 // We need to preserve DefProto so it can be reused for later 2388 // instantiations, so create a new Record to inherit from it. 2389 2390 // Add in the defm name. If the defm prefix is empty, give each 2391 // instantiated def a unique name. Otherwise, if "#NAME#" exists in the 2392 // name, substitute the prefix for #NAME#. Otherwise, use the defm name 2393 // as a prefix. 2394 2395 bool IsAnonymous = false; 2396 if (!DefmPrefix) { 2397 DefmPrefix = StringInit::get(GetNewAnonymousName()); 2398 IsAnonymous = true; 2399 } 2400 2401 Init *DefName = DefProto->getNameInit(); 2402 2403 StringInit *DefNameString = dyn_cast<StringInit>(DefName); 2404 2405 if (DefNameString) { 2406 // We have a fully expanded string so there are no operators to 2407 // resolve. We should concatenate the given prefix and name. 2408 DefName = 2409 BinOpInit::get(BinOpInit::STRCONCAT, 2410 UnOpInit::get(UnOpInit::CAST, DefmPrefix, 2411 StringRecTy::get())->Fold(DefProto, &MC), 2412 DefName, StringRecTy::get())->Fold(DefProto, &MC); 2413 } 2414 2415 // Make a trail of SMLocs from the multiclass instantiations. 2416 SmallVector<SMLoc, 4> Locs(1, DefmPrefixRange.Start); 2417 Locs.append(DefProto->getLoc().begin(), DefProto->getLoc().end()); 2418 Record *CurRec = new Record(DefName, Locs, Records, IsAnonymous); 2419 2420 SubClassReference Ref; 2421 Ref.RefRange = DefmPrefixRange; 2422 Ref.Rec = DefProto; 2423 AddSubClass(CurRec, Ref); 2424 2425 // Set the value for NAME. We don't resolve references to it 'til later, 2426 // though, so that uses in nested multiclass names don't get 2427 // confused. 2428 if (SetValue(CurRec, Ref.RefRange.Start, "NAME", std::vector<unsigned>(), 2429 DefmPrefix)) { 2430 Error(DefmPrefixRange.Start, "Could not resolve " 2431 + CurRec->getNameInitAsString() + ":NAME to '" 2432 + DefmPrefix->getAsUnquotedString() + "'"); 2433 delete CurRec; 2434 return nullptr; 2435 } 2436 2437 // If the DefNameString didn't resolve, we probably have a reference to 2438 // NAME and need to replace it. We need to do at least this much greedily, 2439 // otherwise nested multiclasses will end up with incorrect NAME expansions. 2440 if (!DefNameString) { 2441 RecordVal *DefNameRV = CurRec->getValue("NAME"); 2442 CurRec->resolveReferencesTo(DefNameRV); 2443 } 2444 2445 if (!CurMultiClass) { 2446 // Now that we're at the top level, resolve all NAME references 2447 // in the resultant defs that weren't in the def names themselves. 2448 RecordVal *DefNameRV = CurRec->getValue("NAME"); 2449 CurRec->resolveReferencesTo(DefNameRV); 2450 2451 // Now that NAME references are resolved and we're at the top level of 2452 // any multiclass expansions, add the record to the RecordKeeper. If we are 2453 // currently in a multiclass, it means this defm appears inside a 2454 // multiclass and its name won't be fully resolvable until we see 2455 // the top-level defm. Therefore, we don't add this to the 2456 // RecordKeeper at this point. If we did we could get duplicate 2457 // defs as more than one probably refers to NAME or some other 2458 // common internal placeholder. 2459 2460 // Ensure redefinition doesn't happen. 2461 if (Records.getDef(CurRec->getNameInitAsString())) { 2462 Error(DefmPrefixRange.Start, "def '" + CurRec->getNameInitAsString() + 2463 "' already defined, instantiating defm with subdef '" + 2464 DefProto->getNameInitAsString() + "'"); 2465 delete CurRec; 2466 return nullptr; 2467 } 2468 2469 Records.addDef(CurRec); 2470 } 2471 2472 return CurRec; 2473 } 2474 2475 bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC, 2476 Record *CurRec, 2477 SMLoc DefmPrefixLoc, 2478 SMLoc SubClassLoc, 2479 const std::vector<Init *> &TArgs, 2480 std::vector<Init *> &TemplateVals, 2481 bool DeleteArgs) { 2482 // Loop over all of the template arguments, setting them to the specified 2483 // value or leaving them as the default if necessary. 2484 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 2485 // Check if a value is specified for this temp-arg. 2486 if (i < TemplateVals.size()) { 2487 // Set it now. 2488 if (SetValue(CurRec, DefmPrefixLoc, TArgs[i], std::vector<unsigned>(), 2489 TemplateVals[i])) 2490 return true; 2491 2492 // Resolve it next. 2493 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i])); 2494 2495 if (DeleteArgs) 2496 // Now remove it. 2497 CurRec->removeValue(TArgs[i]); 2498 2499 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { 2500 return Error(SubClassLoc, "value not specified for template argument #"+ 2501 utostr(i) + " (" + TArgs[i]->getAsUnquotedString() 2502 + ") of multiclassclass '" + MC.Rec.getNameInitAsString() 2503 + "'"); 2504 } 2505 } 2506 return false; 2507 } 2508 2509 bool TGParser::ResolveMulticlassDef(MultiClass &MC, 2510 Record *CurRec, 2511 Record *DefProto, 2512 SMLoc DefmPrefixLoc) { 2513 // If the mdef is inside a 'let' expression, add to each def. 2514 if (ApplyLetStack(CurRec)) 2515 return Error(DefmPrefixLoc, "when instantiating this defm"); 2516 2517 // Don't create a top level definition for defm inside multiclasses, 2518 // instead, only update the prototypes and bind the template args 2519 // with the new created definition. 2520 if (!CurMultiClass) 2521 return false; 2522 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); 2523 i != e; ++i) 2524 if (CurMultiClass->DefPrototypes[i]->getNameInit() 2525 == CurRec->getNameInit()) 2526 return Error(DefmPrefixLoc, "defm '" + CurRec->getNameInitAsString() + 2527 "' already defined in this multiclass!"); 2528 CurMultiClass->DefPrototypes.push_back(CurRec); 2529 2530 // Copy the template arguments for the multiclass into the new def. 2531 const std::vector<Init *> &TA = 2532 CurMultiClass->Rec.getTemplateArgs(); 2533 2534 for (unsigned i = 0, e = TA.size(); i != e; ++i) { 2535 const RecordVal *RV = CurMultiClass->Rec.getValue(TA[i]); 2536 assert(RV && "Template arg doesn't exist?"); 2537 CurRec->addValue(*RV); 2538 } 2539 2540 return false; 2541 } 2542 2543 /// ParseDefm - Parse the instantiation of a multiclass. 2544 /// 2545 /// DefMInst ::= DEFM ID ':' DefmSubClassRef ';' 2546 /// 2547 bool TGParser::ParseDefm(MultiClass *CurMultiClass) { 2548 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!"); 2549 SMLoc DefmLoc = Lex.getLoc(); 2550 Init *DefmPrefix = nullptr; 2551 2552 if (Lex.Lex() == tgtok::Id) { // eat the defm. 2553 DefmPrefix = ParseObjectName(CurMultiClass); 2554 } 2555 2556 SMLoc DefmPrefixEndLoc = Lex.getLoc(); 2557 if (Lex.getCode() != tgtok::colon) 2558 return TokError("expected ':' after defm identifier"); 2559 2560 // Keep track of the new generated record definitions. 2561 std::vector<Record*> NewRecDefs; 2562 2563 // This record also inherits from a regular class (non-multiclass)? 2564 bool InheritFromClass = false; 2565 2566 // eat the colon. 2567 Lex.Lex(); 2568 2569 SMLoc SubClassLoc = Lex.getLoc(); 2570 SubClassReference Ref = ParseSubClassReference(nullptr, true); 2571 2572 while (1) { 2573 if (!Ref.Rec) return true; 2574 2575 // To instantiate a multiclass, we need to first get the multiclass, then 2576 // instantiate each def contained in the multiclass with the SubClassRef 2577 // template parameters. 2578 MultiClass *MC = MultiClasses[Ref.Rec->getName()]; 2579 assert(MC && "Didn't lookup multiclass correctly?"); 2580 std::vector<Init*> &TemplateVals = Ref.TemplateArgs; 2581 2582 // Verify that the correct number of template arguments were specified. 2583 const std::vector<Init *> &TArgs = MC->Rec.getTemplateArgs(); 2584 if (TArgs.size() < TemplateVals.size()) 2585 return Error(SubClassLoc, 2586 "more template args specified than multiclass expects"); 2587 2588 // Loop over all the def's in the multiclass, instantiating each one. 2589 for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) { 2590 Record *DefProto = MC->DefPrototypes[i]; 2591 2592 Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix, 2593 SMRange(DefmLoc, 2594 DefmPrefixEndLoc)); 2595 if (!CurRec) 2596 return true; 2597 2598 if (ResolveMulticlassDefArgs(*MC, CurRec, DefmLoc, SubClassLoc, 2599 TArgs, TemplateVals, true/*Delete args*/)) 2600 return Error(SubClassLoc, "could not instantiate def"); 2601 2602 if (ResolveMulticlassDef(*MC, CurRec, DefProto, DefmLoc)) 2603 return Error(SubClassLoc, "could not instantiate def"); 2604 2605 NewRecDefs.push_back(CurRec); 2606 } 2607 2608 2609 if (Lex.getCode() != tgtok::comma) break; 2610 Lex.Lex(); // eat ','. 2611 2612 if (Lex.getCode() != tgtok::Id) 2613 return TokError("expected identifier"); 2614 2615 SubClassLoc = Lex.getLoc(); 2616 2617 // A defm can inherit from regular classes (non-multiclass) as 2618 // long as they come in the end of the inheritance list. 2619 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != nullptr); 2620 2621 if (InheritFromClass) 2622 break; 2623 2624 Ref = ParseSubClassReference(nullptr, true); 2625 } 2626 2627 if (InheritFromClass) { 2628 // Process all the classes to inherit as if they were part of a 2629 // regular 'def' and inherit all record values. 2630 SubClassReference SubClass = ParseSubClassReference(nullptr, false); 2631 while (1) { 2632 // Check for error. 2633 if (!SubClass.Rec) return true; 2634 2635 // Get the expanded definition prototypes and teach them about 2636 // the record values the current class to inherit has 2637 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) { 2638 Record *CurRec = NewRecDefs[i]; 2639 2640 // Add it. 2641 if (AddSubClass(CurRec, SubClass)) 2642 return true; 2643 2644 if (ApplyLetStack(CurRec)) 2645 return true; 2646 } 2647 2648 if (Lex.getCode() != tgtok::comma) break; 2649 Lex.Lex(); // eat ','. 2650 SubClass = ParseSubClassReference(nullptr, false); 2651 } 2652 } 2653 2654 if (!CurMultiClass) 2655 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) 2656 // See Record::setName(). This resolve step will see any new 2657 // name for the def that might have been created when resolving 2658 // inheritance, values and arguments above. 2659 NewRecDefs[i]->resolveReferences(); 2660 2661 if (Lex.getCode() != tgtok::semi) 2662 return TokError("expected ';' at end of defm"); 2663 Lex.Lex(); 2664 2665 return false; 2666 } 2667 2668 /// ParseObject 2669 /// Object ::= ClassInst 2670 /// Object ::= DefInst 2671 /// Object ::= MultiClassInst 2672 /// Object ::= DefMInst 2673 /// Object ::= LETCommand '{' ObjectList '}' 2674 /// Object ::= LETCommand Object 2675 bool TGParser::ParseObject(MultiClass *MC) { 2676 switch (Lex.getCode()) { 2677 default: 2678 return TokError("Expected class, def, defm, multiclass or let definition"); 2679 case tgtok::Let: return ParseTopLevelLet(MC); 2680 case tgtok::Def: return ParseDef(MC); 2681 case tgtok::Foreach: return ParseForeach(MC); 2682 case tgtok::Defm: return ParseDefm(MC); 2683 case tgtok::Class: return ParseClass(); 2684 case tgtok::MultiClass: return ParseMultiClass(); 2685 } 2686 } 2687 2688 /// ParseObjectList 2689 /// ObjectList :== Object* 2690 bool TGParser::ParseObjectList(MultiClass *MC) { 2691 while (isObjectStart(Lex.getCode())) { 2692 if (ParseObject(MC)) 2693 return true; 2694 } 2695 return false; 2696 } 2697 2698 bool TGParser::ParseFile() { 2699 Lex.Lex(); // Prime the lexer. 2700 if (ParseObjectList()) return true; 2701 2702 // If we have unread input at the end of the file, report it. 2703 if (Lex.getCode() == tgtok::Eof) 2704 return false; 2705 2706 return TokError("Unexpected input at top level"); 2707 } 2708 2709