1 //===- TGParser.cpp - Parser for TableGen Files ---------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Implement the Parser for TableGen. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "TGParser.h" 14 #include "llvm/ADT/None.h" 15 #include "llvm/ADT/STLExtras.h" 16 #include "llvm/ADT/SmallVector.h" 17 #include "llvm/ADT/StringExtras.h" 18 #include "llvm/Config/llvm-config.h" 19 #include "llvm/Support/Casting.h" 20 #include "llvm/Support/Compiler.h" 21 #include "llvm/Support/ErrorHandling.h" 22 #include "llvm/Support/raw_ostream.h" 23 #include "llvm/TableGen/Record.h" 24 #include <algorithm> 25 #include <cassert> 26 #include <cstdint> 27 28 using namespace llvm; 29 30 //===----------------------------------------------------------------------===// 31 // Support Code for the Semantic Actions. 32 //===----------------------------------------------------------------------===// 33 34 namespace llvm { 35 36 struct SubClassReference { 37 SMRange RefRange; 38 Record *Rec; 39 SmallVector<Init*, 4> TemplateArgs; 40 41 SubClassReference() : Rec(nullptr) {} 42 43 bool isInvalid() const { return Rec == nullptr; } 44 }; 45 46 struct SubMultiClassReference { 47 SMRange RefRange; 48 MultiClass *MC; 49 SmallVector<Init*, 4> TemplateArgs; 50 51 SubMultiClassReference() : MC(nullptr) {} 52 53 bool isInvalid() const { return MC == nullptr; } 54 void dump() const; 55 }; 56 57 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 58 LLVM_DUMP_METHOD void SubMultiClassReference::dump() const { 59 errs() << "Multiclass:\n"; 60 61 MC->dump(); 62 63 errs() << "Template args:\n"; 64 for (Init *TA : TemplateArgs) 65 TA->dump(); 66 } 67 #endif 68 69 } // end namespace llvm 70 71 static bool checkBitsConcrete(Record &R, const RecordVal &RV) { 72 BitsInit *BV = cast<BitsInit>(RV.getValue()); 73 for (unsigned i = 0, e = BV->getNumBits(); i != e; ++i) { 74 Init *Bit = BV->getBit(i); 75 bool IsReference = false; 76 if (auto VBI = dyn_cast<VarBitInit>(Bit)) { 77 if (auto VI = dyn_cast<VarInit>(VBI->getBitVar())) { 78 if (R.getValue(VI->getName())) 79 IsReference = true; 80 } 81 } else if (isa<VarInit>(Bit)) { 82 IsReference = true; 83 } 84 if (!(IsReference || Bit->isConcrete())) 85 return false; 86 } 87 return true; 88 } 89 90 static void checkConcrete(Record &R) { 91 for (const RecordVal &RV : R.getValues()) { 92 // HACK: Disable this check for variables declared with 'field'. This is 93 // done merely because existing targets have legitimate cases of 94 // non-concrete variables in helper defs. Ideally, we'd introduce a 95 // 'maybe' or 'optional' modifier instead of this. 96 if (RV.getPrefix()) 97 continue; 98 99 if (Init *V = RV.getValue()) { 100 bool Ok = isa<BitsInit>(V) ? checkBitsConcrete(R, RV) : V->isConcrete(); 101 if (!Ok) { 102 PrintError(R.getLoc(), 103 Twine("Initializer of '") + RV.getNameInitAsString() + 104 "' in '" + R.getNameInitAsString() + 105 "' could not be fully resolved: " + 106 RV.getValue()->getAsString()); 107 } 108 } 109 } 110 } 111 112 /// Return an Init with a qualifier prefix referring 113 /// to CurRec's name. 114 static Init *QualifyName(Record &CurRec, MultiClass *CurMultiClass, 115 Init *Name, StringRef Scoper) { 116 Init *NewName = 117 BinOpInit::getStrConcat(CurRec.getNameInit(), StringInit::get(Scoper)); 118 NewName = BinOpInit::getStrConcat(NewName, Name); 119 if (CurMultiClass && Scoper != "::") { 120 Init *Prefix = BinOpInit::getStrConcat(CurMultiClass->Rec.getNameInit(), 121 StringInit::get("::")); 122 NewName = BinOpInit::getStrConcat(Prefix, NewName); 123 } 124 125 if (BinOpInit *BinOp = dyn_cast<BinOpInit>(NewName)) 126 NewName = BinOp->Fold(&CurRec); 127 return NewName; 128 } 129 130 /// Return the qualified version of the implicit 'NAME' template argument. 131 static Init *QualifiedNameOfImplicitName(Record &Rec, 132 MultiClass *MC = nullptr) { 133 return QualifyName(Rec, MC, StringInit::get("NAME"), MC ? "::" : ":"); 134 } 135 136 static Init *QualifiedNameOfImplicitName(MultiClass *MC) { 137 return QualifiedNameOfImplicitName(MC->Rec, MC); 138 } 139 140 bool TGParser::AddValue(Record *CurRec, SMLoc Loc, const RecordVal &RV) { 141 if (!CurRec) 142 CurRec = &CurMultiClass->Rec; 143 144 if (RecordVal *ERV = CurRec->getValue(RV.getNameInit())) { 145 // The value already exists in the class, treat this as a set. 146 if (ERV->setValue(RV.getValue())) 147 return Error(Loc, "New definition of '" + RV.getName() + "' of type '" + 148 RV.getType()->getAsString() + "' is incompatible with " + 149 "previous definition of type '" + 150 ERV->getType()->getAsString() + "'"); 151 } else { 152 CurRec->addValue(RV); 153 } 154 return false; 155 } 156 157 /// SetValue - 158 /// Return true on error, false on success. 159 bool TGParser::SetValue(Record *CurRec, SMLoc Loc, Init *ValName, 160 ArrayRef<unsigned> BitList, Init *V, 161 bool AllowSelfAssignment) { 162 if (!V) return false; 163 164 if (!CurRec) CurRec = &CurMultiClass->Rec; 165 166 RecordVal *RV = CurRec->getValue(ValName); 167 if (!RV) 168 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + 169 "' unknown!"); 170 171 // Do not allow assignments like 'X = X'. This will just cause infinite loops 172 // in the resolution machinery. 173 if (BitList.empty()) 174 if (VarInit *VI = dyn_cast<VarInit>(V)) 175 if (VI->getNameInit() == ValName && !AllowSelfAssignment) 176 return Error(Loc, "Recursion / self-assignment forbidden"); 177 178 // If we are assigning to a subset of the bits in the value... then we must be 179 // assigning to a field of BitsRecTy, which must have a BitsInit 180 // initializer. 181 // 182 if (!BitList.empty()) { 183 BitsInit *CurVal = dyn_cast<BitsInit>(RV->getValue()); 184 if (!CurVal) 185 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + 186 "' is not a bits type"); 187 188 // Convert the incoming value to a bits type of the appropriate size... 189 Init *BI = V->getCastTo(BitsRecTy::get(BitList.size())); 190 if (!BI) 191 return Error(Loc, "Initializer is not compatible with bit range"); 192 193 SmallVector<Init *, 16> NewBits(CurVal->getNumBits()); 194 195 // Loop over bits, assigning values as appropriate. 196 for (unsigned i = 0, e = BitList.size(); i != e; ++i) { 197 unsigned Bit = BitList[i]; 198 if (NewBits[Bit]) 199 return Error(Loc, "Cannot set bit #" + Twine(Bit) + " of value '" + 200 ValName->getAsUnquotedString() + "' more than once"); 201 NewBits[Bit] = BI->getBit(i); 202 } 203 204 for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i) 205 if (!NewBits[i]) 206 NewBits[i] = CurVal->getBit(i); 207 208 V = BitsInit::get(NewBits); 209 } 210 211 if (RV->setValue(V)) { 212 std::string InitType; 213 if (BitsInit *BI = dyn_cast<BitsInit>(V)) 214 InitType = (Twine("' of type bit initializer with length ") + 215 Twine(BI->getNumBits())).str(); 216 else if (TypedInit *TI = dyn_cast<TypedInit>(V)) 217 InitType = (Twine("' of type '") + TI->getType()->getAsString()).str(); 218 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + 219 "' of type '" + RV->getType()->getAsString() + 220 "' is incompatible with initializer '" + 221 V->getAsString() + InitType + "'"); 222 } 223 return false; 224 } 225 226 /// AddSubClass - Add SubClass as a subclass to CurRec, resolving its template 227 /// args as SubClass's template arguments. 228 bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) { 229 Record *SC = SubClass.Rec; 230 // Add all of the values in the subclass into the current class. 231 for (const RecordVal &Val : SC->getValues()) 232 if (AddValue(CurRec, SubClass.RefRange.Start, Val)) 233 return true; 234 235 ArrayRef<Init *> TArgs = SC->getTemplateArgs(); 236 237 // Ensure that an appropriate number of template arguments are specified. 238 if (TArgs.size() < SubClass.TemplateArgs.size()) 239 return Error(SubClass.RefRange.Start, 240 "More template args specified than expected"); 241 242 // Loop over all of the template arguments, setting them to the specified 243 // value or leaving them as the default if necessary. 244 MapResolver R(CurRec); 245 246 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 247 if (i < SubClass.TemplateArgs.size()) { 248 // If a value is specified for this template arg, set it now. 249 if (SetValue(CurRec, SubClass.RefRange.Start, TArgs[i], 250 None, SubClass.TemplateArgs[i])) 251 return true; 252 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { 253 return Error(SubClass.RefRange.Start, 254 "Value not specified for template argument #" + 255 Twine(i) + " (" + TArgs[i]->getAsUnquotedString() + 256 ") of subclass '" + SC->getNameInitAsString() + "'!"); 257 } 258 259 R.set(TArgs[i], CurRec->getValue(TArgs[i])->getValue()); 260 261 CurRec->removeValue(TArgs[i]); 262 } 263 264 Init *Name; 265 if (CurRec->isClass()) 266 Name = 267 VarInit::get(QualifiedNameOfImplicitName(*CurRec), StringRecTy::get()); 268 else 269 Name = CurRec->getNameInit(); 270 R.set(QualifiedNameOfImplicitName(*SC), Name); 271 272 CurRec->resolveReferences(R); 273 274 // Since everything went well, we can now set the "superclass" list for the 275 // current record. 276 ArrayRef<std::pair<Record *, SMRange>> SCs = SC->getSuperClasses(); 277 for (const auto &SCPair : SCs) { 278 if (CurRec->isSubClassOf(SCPair.first)) 279 return Error(SubClass.RefRange.Start, 280 "Already subclass of '" + SCPair.first->getName() + "'!\n"); 281 CurRec->addSuperClass(SCPair.first, SCPair.second); 282 } 283 284 if (CurRec->isSubClassOf(SC)) 285 return Error(SubClass.RefRange.Start, 286 "Already subclass of '" + SC->getName() + "'!\n"); 287 CurRec->addSuperClass(SC, SubClass.RefRange); 288 return false; 289 } 290 291 bool TGParser::AddSubClass(RecordsEntry &Entry, SubClassReference &SubClass) { 292 if (Entry.Rec) 293 return AddSubClass(Entry.Rec.get(), SubClass); 294 295 for (auto &E : Entry.Loop->Entries) { 296 if (AddSubClass(E, SubClass)) 297 return true; 298 } 299 300 return false; 301 } 302 303 /// AddSubMultiClass - Add SubMultiClass as a subclass to 304 /// CurMC, resolving its template args as SubMultiClass's 305 /// template arguments. 306 bool TGParser::AddSubMultiClass(MultiClass *CurMC, 307 SubMultiClassReference &SubMultiClass) { 308 MultiClass *SMC = SubMultiClass.MC; 309 310 ArrayRef<Init *> SMCTArgs = SMC->Rec.getTemplateArgs(); 311 if (SMCTArgs.size() < SubMultiClass.TemplateArgs.size()) 312 return Error(SubMultiClass.RefRange.Start, 313 "More template args specified than expected"); 314 315 // Prepare the mapping of template argument name to value, filling in default 316 // values if necessary. 317 SubstStack TemplateArgs; 318 for (unsigned i = 0, e = SMCTArgs.size(); i != e; ++i) { 319 if (i < SubMultiClass.TemplateArgs.size()) { 320 TemplateArgs.emplace_back(SMCTArgs[i], SubMultiClass.TemplateArgs[i]); 321 } else { 322 Init *Default = SMC->Rec.getValue(SMCTArgs[i])->getValue(); 323 if (!Default->isComplete()) { 324 return Error(SubMultiClass.RefRange.Start, 325 "value not specified for template argument #" + Twine(i) + 326 " (" + SMCTArgs[i]->getAsUnquotedString() + 327 ") of multiclass '" + SMC->Rec.getNameInitAsString() + 328 "'"); 329 } 330 TemplateArgs.emplace_back(SMCTArgs[i], Default); 331 } 332 } 333 334 TemplateArgs.emplace_back( 335 QualifiedNameOfImplicitName(SMC), 336 VarInit::get(QualifiedNameOfImplicitName(CurMC), StringRecTy::get())); 337 338 // Add all of the defs in the subclass into the current multiclass. 339 return resolve(SMC->Entries, TemplateArgs, false, &CurMC->Entries); 340 } 341 342 /// Add a record or foreach loop to the current context (global record keeper, 343 /// current inner-most foreach loop, or multiclass). 344 bool TGParser::addEntry(RecordsEntry E) { 345 assert(!E.Rec || !E.Loop); 346 347 if (!Loops.empty()) { 348 Loops.back()->Entries.push_back(std::move(E)); 349 return false; 350 } 351 352 if (E.Loop) { 353 SubstStack Stack; 354 return resolve(*E.Loop, Stack, CurMultiClass == nullptr, 355 CurMultiClass ? &CurMultiClass->Entries : nullptr); 356 } 357 358 if (CurMultiClass) { 359 CurMultiClass->Entries.push_back(std::move(E)); 360 return false; 361 } 362 363 return addDefOne(std::move(E.Rec)); 364 } 365 366 /// Resolve the entries in \p Loop, going over inner loops recursively 367 /// and making the given subsitutions of (name, value) pairs. 368 /// 369 /// The resulting records are stored in \p Dest if non-null. Otherwise, they 370 /// are added to the global record keeper. 371 bool TGParser::resolve(const ForeachLoop &Loop, SubstStack &Substs, 372 bool Final, std::vector<RecordsEntry> *Dest, 373 SMLoc *Loc) { 374 MapResolver R; 375 for (const auto &S : Substs) 376 R.set(S.first, S.second); 377 Init *List = Loop.ListValue->resolveReferences(R); 378 auto LI = dyn_cast<ListInit>(List); 379 if (!LI) { 380 if (!Final) { 381 Dest->emplace_back(make_unique<ForeachLoop>(Loop.Loc, Loop.IterVar, 382 List)); 383 return resolve(Loop.Entries, Substs, Final, &Dest->back().Loop->Entries, 384 Loc); 385 } 386 387 PrintError(Loop.Loc, Twine("attempting to loop over '") + 388 List->getAsString() + "', expected a list"); 389 return true; 390 } 391 392 bool Error = false; 393 for (auto Elt : *LI) { 394 Substs.emplace_back(Loop.IterVar->getNameInit(), Elt); 395 Error = resolve(Loop.Entries, Substs, Final, Dest); 396 Substs.pop_back(); 397 if (Error) 398 break; 399 } 400 return Error; 401 } 402 403 /// Resolve the entries in \p Source, going over loops recursively and 404 /// making the given substitutions of (name, value) pairs. 405 /// 406 /// The resulting records are stored in \p Dest if non-null. Otherwise, they 407 /// are added to the global record keeper. 408 bool TGParser::resolve(const std::vector<RecordsEntry> &Source, 409 SubstStack &Substs, bool Final, 410 std::vector<RecordsEntry> *Dest, SMLoc *Loc) { 411 bool Error = false; 412 for (auto &E : Source) { 413 if (E.Loop) { 414 Error = resolve(*E.Loop, Substs, Final, Dest); 415 } else { 416 auto Rec = make_unique<Record>(*E.Rec); 417 if (Loc) 418 Rec->appendLoc(*Loc); 419 420 MapResolver R(Rec.get()); 421 for (const auto &S : Substs) 422 R.set(S.first, S.second); 423 Rec->resolveReferences(R); 424 425 if (Dest) 426 Dest->push_back(std::move(Rec)); 427 else 428 Error = addDefOne(std::move(Rec)); 429 } 430 if (Error) 431 break; 432 } 433 return Error; 434 } 435 436 /// Resolve the record fully and add it to the record keeper. 437 bool TGParser::addDefOne(std::unique_ptr<Record> Rec) { 438 if (Record *Prev = Records.getDef(Rec->getNameInitAsString())) { 439 if (!Rec->isAnonymous()) { 440 PrintError(Rec->getLoc(), 441 "def already exists: " + Rec->getNameInitAsString()); 442 PrintNote(Prev->getLoc(), "location of previous definition"); 443 return true; 444 } 445 Rec->setName(Records.getNewAnonymousName()); 446 } 447 448 Rec->resolveReferences(); 449 checkConcrete(*Rec); 450 451 if (!isa<StringInit>(Rec->getNameInit())) { 452 PrintError(Rec->getLoc(), Twine("record name '") + 453 Rec->getNameInit()->getAsString() + 454 "' could not be fully resolved"); 455 return true; 456 } 457 458 // If ObjectBody has template arguments, it's an error. 459 assert(Rec->getTemplateArgs().empty() && "How'd this get template args?"); 460 461 for (DefsetRecord *Defset : Defsets) { 462 DefInit *I = Rec->getDefInit(); 463 if (!I->getType()->typeIsA(Defset->EltTy)) { 464 PrintError(Rec->getLoc(), Twine("adding record of incompatible type '") + 465 I->getType()->getAsString() + 466 "' to defset"); 467 PrintNote(Defset->Loc, "location of defset declaration"); 468 return true; 469 } 470 Defset->Elements.push_back(I); 471 } 472 473 Records.addDef(std::move(Rec)); 474 return false; 475 } 476 477 //===----------------------------------------------------------------------===// 478 // Parser Code 479 //===----------------------------------------------------------------------===// 480 481 /// isObjectStart - Return true if this is a valid first token for an Object. 482 static bool isObjectStart(tgtok::TokKind K) { 483 return K == tgtok::Class || K == tgtok::Def || K == tgtok::Defm || 484 K == tgtok::Let || K == tgtok::MultiClass || K == tgtok::Foreach || 485 K == tgtok::Defset; 486 } 487 488 /// ParseObjectName - If a valid object name is specified, return it. If no 489 /// name is specified, return the unset initializer. Return nullptr on parse 490 /// error. 491 /// ObjectName ::= Value [ '#' Value ]* 492 /// ObjectName ::= /*empty*/ 493 /// 494 Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) { 495 switch (Lex.getCode()) { 496 case tgtok::colon: 497 case tgtok::semi: 498 case tgtok::l_brace: 499 // These are all of the tokens that can begin an object body. 500 // Some of these can also begin values but we disallow those cases 501 // because they are unlikely to be useful. 502 return UnsetInit::get(); 503 default: 504 break; 505 } 506 507 Record *CurRec = nullptr; 508 if (CurMultiClass) 509 CurRec = &CurMultiClass->Rec; 510 511 Init *Name = ParseValue(CurRec, StringRecTy::get(), ParseNameMode); 512 if (!Name) 513 return nullptr; 514 515 if (CurMultiClass) { 516 Init *NameStr = QualifiedNameOfImplicitName(CurMultiClass); 517 HasReferenceResolver R(NameStr); 518 Name->resolveReferences(R); 519 if (!R.found()) 520 Name = BinOpInit::getStrConcat(VarInit::get(NameStr, StringRecTy::get()), 521 Name); 522 } 523 524 return Name; 525 } 526 527 /// ParseClassID - Parse and resolve a reference to a class name. This returns 528 /// null on error. 529 /// 530 /// ClassID ::= ID 531 /// 532 Record *TGParser::ParseClassID() { 533 if (Lex.getCode() != tgtok::Id) { 534 TokError("expected name for ClassID"); 535 return nullptr; 536 } 537 538 Record *Result = Records.getClass(Lex.getCurStrVal()); 539 if (!Result) { 540 std::string Msg("Couldn't find class '" + Lex.getCurStrVal() + "'"); 541 if (MultiClasses[Lex.getCurStrVal()].get()) 542 TokError(Msg + ". Use 'defm' if you meant to use multiclass '" + 543 Lex.getCurStrVal() + "'"); 544 else 545 TokError(Msg); 546 } 547 548 Lex.Lex(); 549 return Result; 550 } 551 552 /// ParseMultiClassID - Parse and resolve a reference to a multiclass name. 553 /// This returns null on error. 554 /// 555 /// MultiClassID ::= ID 556 /// 557 MultiClass *TGParser::ParseMultiClassID() { 558 if (Lex.getCode() != tgtok::Id) { 559 TokError("expected name for MultiClassID"); 560 return nullptr; 561 } 562 563 MultiClass *Result = MultiClasses[Lex.getCurStrVal()].get(); 564 if (!Result) 565 TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'"); 566 567 Lex.Lex(); 568 return Result; 569 } 570 571 /// ParseSubClassReference - Parse a reference to a subclass or to a templated 572 /// subclass. This returns a SubClassRefTy with a null Record* on error. 573 /// 574 /// SubClassRef ::= ClassID 575 /// SubClassRef ::= ClassID '<' ValueList '>' 576 /// 577 SubClassReference TGParser:: 578 ParseSubClassReference(Record *CurRec, bool isDefm) { 579 SubClassReference Result; 580 Result.RefRange.Start = Lex.getLoc(); 581 582 if (isDefm) { 583 if (MultiClass *MC = ParseMultiClassID()) 584 Result.Rec = &MC->Rec; 585 } else { 586 Result.Rec = ParseClassID(); 587 } 588 if (!Result.Rec) return Result; 589 590 // If there is no template arg list, we're done. 591 if (Lex.getCode() != tgtok::less) { 592 Result.RefRange.End = Lex.getLoc(); 593 return Result; 594 } 595 Lex.Lex(); // Eat the '<' 596 597 if (Lex.getCode() == tgtok::greater) { 598 TokError("subclass reference requires a non-empty list of template values"); 599 Result.Rec = nullptr; 600 return Result; 601 } 602 603 ParseValueList(Result.TemplateArgs, CurRec, Result.Rec); 604 if (Result.TemplateArgs.empty()) { 605 Result.Rec = nullptr; // Error parsing value list. 606 return Result; 607 } 608 609 if (Lex.getCode() != tgtok::greater) { 610 TokError("expected '>' in template value list"); 611 Result.Rec = nullptr; 612 return Result; 613 } 614 Lex.Lex(); 615 Result.RefRange.End = Lex.getLoc(); 616 617 return Result; 618 } 619 620 /// ParseSubMultiClassReference - Parse a reference to a subclass or to a 621 /// templated submulticlass. This returns a SubMultiClassRefTy with a null 622 /// Record* on error. 623 /// 624 /// SubMultiClassRef ::= MultiClassID 625 /// SubMultiClassRef ::= MultiClassID '<' ValueList '>' 626 /// 627 SubMultiClassReference TGParser:: 628 ParseSubMultiClassReference(MultiClass *CurMC) { 629 SubMultiClassReference Result; 630 Result.RefRange.Start = Lex.getLoc(); 631 632 Result.MC = ParseMultiClassID(); 633 if (!Result.MC) return Result; 634 635 // If there is no template arg list, we're done. 636 if (Lex.getCode() != tgtok::less) { 637 Result.RefRange.End = Lex.getLoc(); 638 return Result; 639 } 640 Lex.Lex(); // Eat the '<' 641 642 if (Lex.getCode() == tgtok::greater) { 643 TokError("subclass reference requires a non-empty list of template values"); 644 Result.MC = nullptr; 645 return Result; 646 } 647 648 ParseValueList(Result.TemplateArgs, &CurMC->Rec, &Result.MC->Rec); 649 if (Result.TemplateArgs.empty()) { 650 Result.MC = nullptr; // Error parsing value list. 651 return Result; 652 } 653 654 if (Lex.getCode() != tgtok::greater) { 655 TokError("expected '>' in template value list"); 656 Result.MC = nullptr; 657 return Result; 658 } 659 Lex.Lex(); 660 Result.RefRange.End = Lex.getLoc(); 661 662 return Result; 663 } 664 665 /// ParseRangePiece - Parse a bit/value range. 666 /// RangePiece ::= INTVAL 667 /// RangePiece ::= INTVAL '-' INTVAL 668 /// RangePiece ::= INTVAL INTVAL 669 bool TGParser::ParseRangePiece(SmallVectorImpl<unsigned> &Ranges) { 670 if (Lex.getCode() != tgtok::IntVal) { 671 TokError("expected integer or bitrange"); 672 return true; 673 } 674 int64_t Start = Lex.getCurIntVal(); 675 int64_t End; 676 677 if (Start < 0) 678 return TokError("invalid range, cannot be negative"); 679 680 switch (Lex.Lex()) { // eat first character. 681 default: 682 Ranges.push_back(Start); 683 return false; 684 case tgtok::minus: 685 if (Lex.Lex() != tgtok::IntVal) { 686 TokError("expected integer value as end of range"); 687 return true; 688 } 689 End = Lex.getCurIntVal(); 690 break; 691 case tgtok::IntVal: 692 End = -Lex.getCurIntVal(); 693 break; 694 } 695 if (End < 0) 696 return TokError("invalid range, cannot be negative"); 697 Lex.Lex(); 698 699 // Add to the range. 700 if (Start < End) 701 for (; Start <= End; ++Start) 702 Ranges.push_back(Start); 703 else 704 for (; Start >= End; --Start) 705 Ranges.push_back(Start); 706 return false; 707 } 708 709 /// ParseRangeList - Parse a list of scalars and ranges into scalar values. 710 /// 711 /// RangeList ::= RangePiece (',' RangePiece)* 712 /// 713 void TGParser::ParseRangeList(SmallVectorImpl<unsigned> &Result) { 714 // Parse the first piece. 715 if (ParseRangePiece(Result)) { 716 Result.clear(); 717 return; 718 } 719 while (Lex.getCode() == tgtok::comma) { 720 Lex.Lex(); // Eat the comma. 721 722 // Parse the next range piece. 723 if (ParseRangePiece(Result)) { 724 Result.clear(); 725 return; 726 } 727 } 728 } 729 730 /// ParseOptionalRangeList - Parse either a range list in <>'s or nothing. 731 /// OptionalRangeList ::= '<' RangeList '>' 732 /// OptionalRangeList ::= /*empty*/ 733 bool TGParser::ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges) { 734 if (Lex.getCode() != tgtok::less) 735 return false; 736 737 SMLoc StartLoc = Lex.getLoc(); 738 Lex.Lex(); // eat the '<' 739 740 // Parse the range list. 741 ParseRangeList(Ranges); 742 if (Ranges.empty()) return true; 743 744 if (Lex.getCode() != tgtok::greater) { 745 TokError("expected '>' at end of range list"); 746 return Error(StartLoc, "to match this '<'"); 747 } 748 Lex.Lex(); // eat the '>'. 749 return false; 750 } 751 752 /// ParseOptionalBitList - Parse either a bit list in {}'s or nothing. 753 /// OptionalBitList ::= '{' RangeList '}' 754 /// OptionalBitList ::= /*empty*/ 755 bool TGParser::ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges) { 756 if (Lex.getCode() != tgtok::l_brace) 757 return false; 758 759 SMLoc StartLoc = Lex.getLoc(); 760 Lex.Lex(); // eat the '{' 761 762 // Parse the range list. 763 ParseRangeList(Ranges); 764 if (Ranges.empty()) return true; 765 766 if (Lex.getCode() != tgtok::r_brace) { 767 TokError("expected '}' at end of bit list"); 768 return Error(StartLoc, "to match this '{'"); 769 } 770 Lex.Lex(); // eat the '}'. 771 return false; 772 } 773 774 /// ParseType - Parse and return a tblgen type. This returns null on error. 775 /// 776 /// Type ::= STRING // string type 777 /// Type ::= CODE // code type 778 /// Type ::= BIT // bit type 779 /// Type ::= BITS '<' INTVAL '>' // bits<x> type 780 /// Type ::= INT // int type 781 /// Type ::= LIST '<' Type '>' // list<x> type 782 /// Type ::= DAG // dag type 783 /// Type ::= ClassID // Record Type 784 /// 785 RecTy *TGParser::ParseType() { 786 switch (Lex.getCode()) { 787 default: TokError("Unknown token when expecting a type"); return nullptr; 788 case tgtok::String: Lex.Lex(); return StringRecTy::get(); 789 case tgtok::Code: Lex.Lex(); return CodeRecTy::get(); 790 case tgtok::Bit: Lex.Lex(); return BitRecTy::get(); 791 case tgtok::Int: Lex.Lex(); return IntRecTy::get(); 792 case tgtok::Dag: Lex.Lex(); return DagRecTy::get(); 793 case tgtok::Id: 794 if (Record *R = ParseClassID()) return RecordRecTy::get(R); 795 TokError("unknown class name"); 796 return nullptr; 797 case tgtok::Bits: { 798 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 799 TokError("expected '<' after bits type"); 800 return nullptr; 801 } 802 if (Lex.Lex() != tgtok::IntVal) { // Eat '<' 803 TokError("expected integer in bits<n> type"); 804 return nullptr; 805 } 806 uint64_t Val = Lex.getCurIntVal(); 807 if (Lex.Lex() != tgtok::greater) { // Eat count. 808 TokError("expected '>' at end of bits<n> type"); 809 return nullptr; 810 } 811 Lex.Lex(); // Eat '>' 812 return BitsRecTy::get(Val); 813 } 814 case tgtok::List: { 815 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 816 TokError("expected '<' after list type"); 817 return nullptr; 818 } 819 Lex.Lex(); // Eat '<' 820 RecTy *SubType = ParseType(); 821 if (!SubType) return nullptr; 822 823 if (Lex.getCode() != tgtok::greater) { 824 TokError("expected '>' at end of list<ty> type"); 825 return nullptr; 826 } 827 Lex.Lex(); // Eat '>' 828 return ListRecTy::get(SubType); 829 } 830 } 831 } 832 833 /// ParseIDValue - This is just like ParseIDValue above, but it assumes the ID 834 /// has already been read. 835 Init *TGParser::ParseIDValue(Record *CurRec, StringInit *Name, SMLoc NameLoc, 836 IDParseMode Mode) { 837 if (CurRec) { 838 if (const RecordVal *RV = CurRec->getValue(Name)) 839 return VarInit::get(Name, RV->getType()); 840 } 841 842 if ((CurRec && CurRec->isClass()) || CurMultiClass) { 843 Init *TemplateArgName; 844 if (CurMultiClass) { 845 TemplateArgName = 846 QualifyName(CurMultiClass->Rec, CurMultiClass, Name, "::"); 847 } else 848 TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, ":"); 849 850 Record *TemplateRec = CurMultiClass ? &CurMultiClass->Rec : CurRec; 851 if (TemplateRec->isTemplateArg(TemplateArgName)) { 852 const RecordVal *RV = TemplateRec->getValue(TemplateArgName); 853 assert(RV && "Template arg doesn't exist??"); 854 return VarInit::get(TemplateArgName, RV->getType()); 855 } else if (Name->getValue() == "NAME") { 856 return VarInit::get(TemplateArgName, StringRecTy::get()); 857 } 858 } 859 860 // If this is in a foreach loop, make sure it's not a loop iterator 861 for (const auto &L : Loops) { 862 VarInit *IterVar = dyn_cast<VarInit>(L->IterVar); 863 if (IterVar && IterVar->getNameInit() == Name) 864 return IterVar; 865 } 866 867 if (Mode == ParseNameMode) 868 return Name; 869 870 if (Init *I = Records.getGlobal(Name->getValue())) 871 return I; 872 873 // Allow self-references of concrete defs, but delay the lookup so that we 874 // get the correct type. 875 if (CurRec && !CurRec->isClass() && !CurMultiClass && 876 CurRec->getNameInit() == Name) 877 return UnOpInit::get(UnOpInit::CAST, Name, CurRec->getType()); 878 879 Error(NameLoc, "Variable not defined: '" + Name->getValue() + "'"); 880 return nullptr; 881 } 882 883 /// ParseOperation - Parse an operator. This returns null on error. 884 /// 885 /// Operation ::= XOperator ['<' Type '>'] '(' Args ')' 886 /// 887 Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { 888 switch (Lex.getCode()) { 889 default: 890 TokError("unknown operation"); 891 return nullptr; 892 case tgtok::XHead: 893 case tgtok::XTail: 894 case tgtok::XSize: 895 case tgtok::XEmpty: 896 case tgtok::XCast: { // Value ::= !unop '(' Value ')' 897 UnOpInit::UnaryOp Code; 898 RecTy *Type = nullptr; 899 900 switch (Lex.getCode()) { 901 default: llvm_unreachable("Unhandled code!"); 902 case tgtok::XCast: 903 Lex.Lex(); // eat the operation 904 Code = UnOpInit::CAST; 905 906 Type = ParseOperatorType(); 907 908 if (!Type) { 909 TokError("did not get type for unary operator"); 910 return nullptr; 911 } 912 913 break; 914 case tgtok::XHead: 915 Lex.Lex(); // eat the operation 916 Code = UnOpInit::HEAD; 917 break; 918 case tgtok::XTail: 919 Lex.Lex(); // eat the operation 920 Code = UnOpInit::TAIL; 921 break; 922 case tgtok::XSize: 923 Lex.Lex(); 924 Code = UnOpInit::SIZE; 925 Type = IntRecTy::get(); 926 break; 927 case tgtok::XEmpty: 928 Lex.Lex(); // eat the operation 929 Code = UnOpInit::EMPTY; 930 Type = IntRecTy::get(); 931 break; 932 } 933 if (Lex.getCode() != tgtok::l_paren) { 934 TokError("expected '(' after unary operator"); 935 return nullptr; 936 } 937 Lex.Lex(); // eat the '(' 938 939 Init *LHS = ParseValue(CurRec); 940 if (!LHS) return nullptr; 941 942 if (Code == UnOpInit::HEAD || 943 Code == UnOpInit::TAIL || 944 Code == UnOpInit::EMPTY) { 945 ListInit *LHSl = dyn_cast<ListInit>(LHS); 946 StringInit *LHSs = dyn_cast<StringInit>(LHS); 947 TypedInit *LHSt = dyn_cast<TypedInit>(LHS); 948 if (!LHSl && !LHSs && !LHSt) { 949 TokError("expected list or string type argument in unary operator"); 950 return nullptr; 951 } 952 if (LHSt) { 953 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType()); 954 StringRecTy *SType = dyn_cast<StringRecTy>(LHSt->getType()); 955 if (!LType && !SType) { 956 TokError("expected list or string type argument in unary operator"); 957 return nullptr; 958 } 959 } 960 961 if (Code == UnOpInit::HEAD || Code == UnOpInit::TAIL || 962 Code == UnOpInit::SIZE) { 963 if (!LHSl && !LHSt) { 964 TokError("expected list type argument in unary operator"); 965 return nullptr; 966 } 967 } 968 969 if (Code == UnOpInit::HEAD || Code == UnOpInit::TAIL) { 970 if (LHSl && LHSl->empty()) { 971 TokError("empty list argument in unary operator"); 972 return nullptr; 973 } 974 if (LHSl) { 975 Init *Item = LHSl->getElement(0); 976 TypedInit *Itemt = dyn_cast<TypedInit>(Item); 977 if (!Itemt) { 978 TokError("untyped list element in unary operator"); 979 return nullptr; 980 } 981 Type = (Code == UnOpInit::HEAD) ? Itemt->getType() 982 : ListRecTy::get(Itemt->getType()); 983 } else { 984 assert(LHSt && "expected list type argument in unary operator"); 985 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType()); 986 if (!LType) { 987 TokError("expected list type argument in unary operator"); 988 return nullptr; 989 } 990 Type = (Code == UnOpInit::HEAD) ? LType->getElementType() : LType; 991 } 992 } 993 } 994 995 if (Lex.getCode() != tgtok::r_paren) { 996 TokError("expected ')' in unary operator"); 997 return nullptr; 998 } 999 Lex.Lex(); // eat the ')' 1000 return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec); 1001 } 1002 1003 case tgtok::XIsA: { 1004 // Value ::= !isa '<' Type '>' '(' Value ')' 1005 Lex.Lex(); // eat the operation 1006 1007 RecTy *Type = ParseOperatorType(); 1008 if (!Type) 1009 return nullptr; 1010 1011 if (Lex.getCode() != tgtok::l_paren) { 1012 TokError("expected '(' after type of !isa"); 1013 return nullptr; 1014 } 1015 Lex.Lex(); // eat the '(' 1016 1017 Init *LHS = ParseValue(CurRec); 1018 if (!LHS) 1019 return nullptr; 1020 1021 if (Lex.getCode() != tgtok::r_paren) { 1022 TokError("expected ')' in !isa"); 1023 return nullptr; 1024 } 1025 Lex.Lex(); // eat the ')' 1026 1027 return (IsAOpInit::get(Type, LHS))->Fold(); 1028 } 1029 1030 case tgtok::XConcat: 1031 case tgtok::XADD: 1032 case tgtok::XMUL: 1033 case tgtok::XAND: 1034 case tgtok::XOR: 1035 case tgtok::XSRA: 1036 case tgtok::XSRL: 1037 case tgtok::XSHL: 1038 case tgtok::XEq: 1039 case tgtok::XNe: 1040 case tgtok::XLe: 1041 case tgtok::XLt: 1042 case tgtok::XGe: 1043 case tgtok::XGt: 1044 case tgtok::XListConcat: 1045 case tgtok::XListSplat: 1046 case tgtok::XStrConcat: { // Value ::= !binop '(' Value ',' Value ')' 1047 tgtok::TokKind OpTok = Lex.getCode(); 1048 SMLoc OpLoc = Lex.getLoc(); 1049 Lex.Lex(); // eat the operation 1050 1051 BinOpInit::BinaryOp Code; 1052 switch (OpTok) { 1053 default: llvm_unreachable("Unhandled code!"); 1054 case tgtok::XConcat: Code = BinOpInit::CONCAT; break; 1055 case tgtok::XADD: Code = BinOpInit::ADD; break; 1056 case tgtok::XMUL: Code = BinOpInit::MUL; break; 1057 case tgtok::XAND: Code = BinOpInit::AND; break; 1058 case tgtok::XOR: Code = BinOpInit::OR; break; 1059 case tgtok::XSRA: Code = BinOpInit::SRA; break; 1060 case tgtok::XSRL: Code = BinOpInit::SRL; break; 1061 case tgtok::XSHL: Code = BinOpInit::SHL; break; 1062 case tgtok::XEq: Code = BinOpInit::EQ; break; 1063 case tgtok::XNe: Code = BinOpInit::NE; break; 1064 case tgtok::XLe: Code = BinOpInit::LE; break; 1065 case tgtok::XLt: Code = BinOpInit::LT; break; 1066 case tgtok::XGe: Code = BinOpInit::GE; break; 1067 case tgtok::XGt: Code = BinOpInit::GT; break; 1068 case tgtok::XListConcat: Code = BinOpInit::LISTCONCAT; break; 1069 case tgtok::XListSplat: Code = BinOpInit::LISTSPLAT; break; 1070 case tgtok::XStrConcat: Code = BinOpInit::STRCONCAT; break; 1071 } 1072 1073 RecTy *Type = nullptr; 1074 RecTy *ArgType = nullptr; 1075 switch (OpTok) { 1076 default: 1077 llvm_unreachable("Unhandled code!"); 1078 case tgtok::XConcat: 1079 Type = DagRecTy::get(); 1080 ArgType = DagRecTy::get(); 1081 break; 1082 case tgtok::XAND: 1083 case tgtok::XOR: 1084 case tgtok::XSRA: 1085 case tgtok::XSRL: 1086 case tgtok::XSHL: 1087 case tgtok::XADD: 1088 case tgtok::XMUL: 1089 Type = IntRecTy::get(); 1090 ArgType = IntRecTy::get(); 1091 break; 1092 case tgtok::XEq: 1093 case tgtok::XNe: 1094 Type = BitRecTy::get(); 1095 // ArgType for Eq / Ne is not known at this point 1096 break; 1097 case tgtok::XLe: 1098 case tgtok::XLt: 1099 case tgtok::XGe: 1100 case tgtok::XGt: 1101 Type = BitRecTy::get(); 1102 ArgType = IntRecTy::get(); 1103 break; 1104 case tgtok::XListConcat: 1105 // We don't know the list type until we parse the first argument 1106 ArgType = ItemType; 1107 break; 1108 case tgtok::XListSplat: 1109 // Can't do any typechecking until we parse the first argument. 1110 break; 1111 case tgtok::XStrConcat: 1112 Type = StringRecTy::get(); 1113 ArgType = StringRecTy::get(); 1114 break; 1115 } 1116 1117 if (Type && ItemType && !Type->typeIsConvertibleTo(ItemType)) { 1118 Error(OpLoc, Twine("expected value of type '") + 1119 ItemType->getAsString() + "', got '" + 1120 Type->getAsString() + "'"); 1121 return nullptr; 1122 } 1123 1124 if (Lex.getCode() != tgtok::l_paren) { 1125 TokError("expected '(' after binary operator"); 1126 return nullptr; 1127 } 1128 Lex.Lex(); // eat the '(' 1129 1130 SmallVector<Init*, 2> InitList; 1131 1132 for (;;) { 1133 SMLoc InitLoc = Lex.getLoc(); 1134 InitList.push_back(ParseValue(CurRec, ArgType)); 1135 if (!InitList.back()) return nullptr; 1136 1137 // All BinOps require their arguments to be of compatible types. 1138 TypedInit *TI = dyn_cast<TypedInit>(InitList.back()); 1139 if (!ArgType) { 1140 ArgType = TI->getType(); 1141 1142 switch (Code) { 1143 case BinOpInit::LISTCONCAT: 1144 if (!isa<ListRecTy>(ArgType)) { 1145 Error(InitLoc, Twine("expected a list, got value of type '") + 1146 ArgType->getAsString() + "'"); 1147 return nullptr; 1148 } 1149 break; 1150 case BinOpInit::LISTSPLAT: 1151 if (ItemType && InitList.size() == 1) { 1152 if (!isa<ListRecTy>(ItemType)) { 1153 Error(OpLoc, 1154 Twine("expected output type to be a list, got type '") + 1155 ItemType->getAsString() + "'"); 1156 return nullptr; 1157 } 1158 if (!ArgType->getListTy()->typeIsConvertibleTo(ItemType)) { 1159 Error(OpLoc, Twine("expected first arg type to be '") + 1160 ArgType->getAsString() + 1161 "', got value of type '" + 1162 cast<ListRecTy>(ItemType) 1163 ->getElementType() 1164 ->getAsString() + 1165 "'"); 1166 return nullptr; 1167 } 1168 } 1169 if (InitList.size() == 2 && !isa<IntRecTy>(ArgType)) { 1170 Error(InitLoc, Twine("expected second parameter to be an int, got " 1171 "value of type '") + 1172 ArgType->getAsString() + "'"); 1173 return nullptr; 1174 } 1175 ArgType = nullptr; // Broken invariant: types not identical. 1176 break; 1177 case BinOpInit::EQ: 1178 case BinOpInit::NE: 1179 if (!ArgType->typeIsConvertibleTo(IntRecTy::get()) && 1180 !ArgType->typeIsConvertibleTo(StringRecTy::get())) { 1181 Error(InitLoc, Twine("expected int, bits, or string; got value of " 1182 "type '") + ArgType->getAsString() + "'"); 1183 return nullptr; 1184 } 1185 break; 1186 default: llvm_unreachable("other ops have fixed argument types"); 1187 } 1188 } else { 1189 RecTy *Resolved = resolveTypes(ArgType, TI->getType()); 1190 if (!Resolved) { 1191 Error(InitLoc, Twine("expected value of type '") + 1192 ArgType->getAsString() + "', got '" + 1193 TI->getType()->getAsString() + "'"); 1194 return nullptr; 1195 } 1196 if (Code != BinOpInit::ADD && Code != BinOpInit::AND && 1197 Code != BinOpInit::OR && Code != BinOpInit::SRA && 1198 Code != BinOpInit::SRL && Code != BinOpInit::SHL && 1199 Code != BinOpInit::MUL) 1200 ArgType = Resolved; 1201 } 1202 1203 if (Lex.getCode() != tgtok::comma) 1204 break; 1205 Lex.Lex(); // eat the ',' 1206 } 1207 1208 if (Lex.getCode() != tgtok::r_paren) { 1209 TokError("expected ')' in operator"); 1210 return nullptr; 1211 } 1212 Lex.Lex(); // eat the ')' 1213 1214 // listconcat returns a list with type of the argument. 1215 if (Code == BinOpInit::LISTCONCAT) 1216 Type = ArgType; 1217 // listsplat returns a list of type of the *first* argument. 1218 if (Code == BinOpInit::LISTSPLAT) 1219 Type = cast<TypedInit>(InitList.front())->getType()->getListTy(); 1220 1221 // We allow multiple operands to associative operators like !strconcat as 1222 // shorthand for nesting them. 1223 if (Code == BinOpInit::STRCONCAT || Code == BinOpInit::LISTCONCAT || 1224 Code == BinOpInit::CONCAT || Code == BinOpInit::ADD || 1225 Code == BinOpInit::AND || Code == BinOpInit::OR || 1226 Code == BinOpInit::MUL) { 1227 while (InitList.size() > 2) { 1228 Init *RHS = InitList.pop_back_val(); 1229 RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type))->Fold(CurRec); 1230 InitList.back() = RHS; 1231 } 1232 } 1233 1234 if (InitList.size() == 2) 1235 return (BinOpInit::get(Code, InitList[0], InitList[1], Type)) 1236 ->Fold(CurRec); 1237 1238 Error(OpLoc, "expected two operands to operator"); 1239 return nullptr; 1240 } 1241 1242 case tgtok::XForEach: { // Value ::= !foreach '(' Id ',' Value ',' Value ')' 1243 SMLoc OpLoc = Lex.getLoc(); 1244 Lex.Lex(); // eat the operation 1245 if (Lex.getCode() != tgtok::l_paren) { 1246 TokError("expected '(' after !foreach"); 1247 return nullptr; 1248 } 1249 1250 if (Lex.Lex() != tgtok::Id) { // eat the '(' 1251 TokError("first argument of !foreach must be an identifier"); 1252 return nullptr; 1253 } 1254 1255 Init *LHS = StringInit::get(Lex.getCurStrVal()); 1256 1257 if (CurRec && CurRec->getValue(LHS)) { 1258 TokError((Twine("iteration variable '") + LHS->getAsString() + 1259 "' already defined") 1260 .str()); 1261 return nullptr; 1262 } 1263 1264 if (Lex.Lex() != tgtok::comma) { // eat the id 1265 TokError("expected ',' in ternary operator"); 1266 return nullptr; 1267 } 1268 Lex.Lex(); // eat the ',' 1269 1270 Init *MHS = ParseValue(CurRec); 1271 if (!MHS) 1272 return nullptr; 1273 1274 if (Lex.getCode() != tgtok::comma) { 1275 TokError("expected ',' in ternary operator"); 1276 return nullptr; 1277 } 1278 Lex.Lex(); // eat the ',' 1279 1280 TypedInit *MHSt = dyn_cast<TypedInit>(MHS); 1281 if (!MHSt) { 1282 TokError("could not get type of !foreach input"); 1283 return nullptr; 1284 } 1285 1286 RecTy *InEltType = nullptr; 1287 RecTy *OutEltType = nullptr; 1288 bool IsDAG = false; 1289 1290 if (ListRecTy *InListTy = dyn_cast<ListRecTy>(MHSt->getType())) { 1291 InEltType = InListTy->getElementType(); 1292 if (ItemType) { 1293 if (ListRecTy *OutListTy = dyn_cast<ListRecTy>(ItemType)) { 1294 OutEltType = OutListTy->getElementType(); 1295 } else { 1296 Error(OpLoc, 1297 "expected value of type '" + Twine(ItemType->getAsString()) + 1298 "', but got !foreach of list type"); 1299 return nullptr; 1300 } 1301 } 1302 } else if (DagRecTy *InDagTy = dyn_cast<DagRecTy>(MHSt->getType())) { 1303 InEltType = InDagTy; 1304 if (ItemType && !isa<DagRecTy>(ItemType)) { 1305 Error(OpLoc, 1306 "expected value of type '" + Twine(ItemType->getAsString()) + 1307 "', but got !foreach of dag type"); 1308 return nullptr; 1309 } 1310 IsDAG = true; 1311 } else { 1312 TokError("!foreach must have list or dag input"); 1313 return nullptr; 1314 } 1315 1316 // We need to create a temporary record to provide a scope for the iteration 1317 // variable while parsing top-level foreach's. 1318 std::unique_ptr<Record> ParseRecTmp; 1319 Record *ParseRec = CurRec; 1320 if (!ParseRec) { 1321 ParseRecTmp = make_unique<Record>(".parse", ArrayRef<SMLoc>{}, Records); 1322 ParseRec = ParseRecTmp.get(); 1323 } 1324 1325 ParseRec->addValue(RecordVal(LHS, InEltType, false)); 1326 Init *RHS = ParseValue(ParseRec, OutEltType); 1327 ParseRec->removeValue(LHS); 1328 if (!RHS) 1329 return nullptr; 1330 1331 if (Lex.getCode() != tgtok::r_paren) { 1332 TokError("expected ')' in binary operator"); 1333 return nullptr; 1334 } 1335 Lex.Lex(); // eat the ')' 1336 1337 RecTy *OutType; 1338 if (IsDAG) { 1339 OutType = InEltType; 1340 } else { 1341 TypedInit *RHSt = dyn_cast<TypedInit>(RHS); 1342 if (!RHSt) { 1343 TokError("could not get type of !foreach result"); 1344 return nullptr; 1345 } 1346 OutType = RHSt->getType()->getListTy(); 1347 } 1348 1349 return (TernOpInit::get(TernOpInit::FOREACH, LHS, MHS, RHS, OutType)) 1350 ->Fold(CurRec); 1351 } 1352 1353 case tgtok::XDag: 1354 case tgtok::XIf: 1355 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 1356 TernOpInit::TernaryOp Code; 1357 RecTy *Type = nullptr; 1358 1359 tgtok::TokKind LexCode = Lex.getCode(); 1360 Lex.Lex(); // eat the operation 1361 switch (LexCode) { 1362 default: llvm_unreachable("Unhandled code!"); 1363 case tgtok::XDag: 1364 Code = TernOpInit::DAG; 1365 Type = DagRecTy::get(); 1366 ItemType = nullptr; 1367 break; 1368 case tgtok::XIf: 1369 Code = TernOpInit::IF; 1370 break; 1371 case tgtok::XSubst: 1372 Code = TernOpInit::SUBST; 1373 break; 1374 } 1375 if (Lex.getCode() != tgtok::l_paren) { 1376 TokError("expected '(' after ternary operator"); 1377 return nullptr; 1378 } 1379 Lex.Lex(); // eat the '(' 1380 1381 Init *LHS = ParseValue(CurRec); 1382 if (!LHS) return nullptr; 1383 1384 if (Lex.getCode() != tgtok::comma) { 1385 TokError("expected ',' in ternary operator"); 1386 return nullptr; 1387 } 1388 Lex.Lex(); // eat the ',' 1389 1390 SMLoc MHSLoc = Lex.getLoc(); 1391 Init *MHS = ParseValue(CurRec, ItemType); 1392 if (!MHS) 1393 return nullptr; 1394 1395 if (Lex.getCode() != tgtok::comma) { 1396 TokError("expected ',' in ternary operator"); 1397 return nullptr; 1398 } 1399 Lex.Lex(); // eat the ',' 1400 1401 SMLoc RHSLoc = Lex.getLoc(); 1402 Init *RHS = ParseValue(CurRec, ItemType); 1403 if (!RHS) 1404 return nullptr; 1405 1406 if (Lex.getCode() != tgtok::r_paren) { 1407 TokError("expected ')' in binary operator"); 1408 return nullptr; 1409 } 1410 Lex.Lex(); // eat the ')' 1411 1412 switch (LexCode) { 1413 default: llvm_unreachable("Unhandled code!"); 1414 case tgtok::XDag: { 1415 TypedInit *MHSt = dyn_cast<TypedInit>(MHS); 1416 if (!MHSt && !isa<UnsetInit>(MHS)) { 1417 Error(MHSLoc, "could not determine type of the child list in !dag"); 1418 return nullptr; 1419 } 1420 if (MHSt && !isa<ListRecTy>(MHSt->getType())) { 1421 Error(MHSLoc, Twine("expected list of children, got type '") + 1422 MHSt->getType()->getAsString() + "'"); 1423 return nullptr; 1424 } 1425 1426 TypedInit *RHSt = dyn_cast<TypedInit>(RHS); 1427 if (!RHSt && !isa<UnsetInit>(RHS)) { 1428 Error(RHSLoc, "could not determine type of the name list in !dag"); 1429 return nullptr; 1430 } 1431 if (RHSt && StringRecTy::get()->getListTy() != RHSt->getType()) { 1432 Error(RHSLoc, Twine("expected list<string>, got type '") + 1433 RHSt->getType()->getAsString() + "'"); 1434 return nullptr; 1435 } 1436 1437 if (!MHSt && !RHSt) { 1438 Error(MHSLoc, 1439 "cannot have both unset children and unset names in !dag"); 1440 return nullptr; 1441 } 1442 break; 1443 } 1444 case tgtok::XIf: { 1445 RecTy *MHSTy = nullptr; 1446 RecTy *RHSTy = nullptr; 1447 1448 if (TypedInit *MHSt = dyn_cast<TypedInit>(MHS)) 1449 MHSTy = MHSt->getType(); 1450 if (BitsInit *MHSbits = dyn_cast<BitsInit>(MHS)) 1451 MHSTy = BitsRecTy::get(MHSbits->getNumBits()); 1452 if (isa<BitInit>(MHS)) 1453 MHSTy = BitRecTy::get(); 1454 1455 if (TypedInit *RHSt = dyn_cast<TypedInit>(RHS)) 1456 RHSTy = RHSt->getType(); 1457 if (BitsInit *RHSbits = dyn_cast<BitsInit>(RHS)) 1458 RHSTy = BitsRecTy::get(RHSbits->getNumBits()); 1459 if (isa<BitInit>(RHS)) 1460 RHSTy = BitRecTy::get(); 1461 1462 // For UnsetInit, it's typed from the other hand. 1463 if (isa<UnsetInit>(MHS)) 1464 MHSTy = RHSTy; 1465 if (isa<UnsetInit>(RHS)) 1466 RHSTy = MHSTy; 1467 1468 if (!MHSTy || !RHSTy) { 1469 TokError("could not get type for !if"); 1470 return nullptr; 1471 } 1472 1473 Type = resolveTypes(MHSTy, RHSTy); 1474 if (!Type) { 1475 TokError(Twine("inconsistent types '") + MHSTy->getAsString() + 1476 "' and '" + RHSTy->getAsString() + "' for !if"); 1477 return nullptr; 1478 } 1479 break; 1480 } 1481 case tgtok::XSubst: { 1482 TypedInit *RHSt = dyn_cast<TypedInit>(RHS); 1483 if (!RHSt) { 1484 TokError("could not get type for !subst"); 1485 return nullptr; 1486 } 1487 Type = RHSt->getType(); 1488 break; 1489 } 1490 } 1491 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); 1492 } 1493 1494 case tgtok::XCond: 1495 return ParseOperationCond(CurRec, ItemType); 1496 1497 case tgtok::XFoldl: { 1498 // Value ::= !foldl '(' Id ',' Id ',' Value ',' Value ',' Value ')' 1499 Lex.Lex(); // eat the operation 1500 if (Lex.getCode() != tgtok::l_paren) { 1501 TokError("expected '(' after !foldl"); 1502 return nullptr; 1503 } 1504 Lex.Lex(); // eat the '(' 1505 1506 Init *StartUntyped = ParseValue(CurRec); 1507 if (!StartUntyped) 1508 return nullptr; 1509 1510 TypedInit *Start = dyn_cast<TypedInit>(StartUntyped); 1511 if (!Start) { 1512 TokError(Twine("could not get type of !foldl start: '") + 1513 StartUntyped->getAsString() + "'"); 1514 return nullptr; 1515 } 1516 1517 if (Lex.getCode() != tgtok::comma) { 1518 TokError("expected ',' in !foldl"); 1519 return nullptr; 1520 } 1521 Lex.Lex(); // eat the ',' 1522 1523 Init *ListUntyped = ParseValue(CurRec); 1524 if (!ListUntyped) 1525 return nullptr; 1526 1527 TypedInit *List = dyn_cast<TypedInit>(ListUntyped); 1528 if (!List) { 1529 TokError(Twine("could not get type of !foldl list: '") + 1530 ListUntyped->getAsString() + "'"); 1531 return nullptr; 1532 } 1533 1534 ListRecTy *ListType = dyn_cast<ListRecTy>(List->getType()); 1535 if (!ListType) { 1536 TokError(Twine("!foldl list must be a list, but is of type '") + 1537 List->getType()->getAsString()); 1538 return nullptr; 1539 } 1540 1541 if (Lex.getCode() != tgtok::comma) { 1542 TokError("expected ',' in !foldl"); 1543 return nullptr; 1544 } 1545 1546 if (Lex.Lex() != tgtok::Id) { // eat the ',' 1547 TokError("third argument of !foldl must be an identifier"); 1548 return nullptr; 1549 } 1550 1551 Init *A = StringInit::get(Lex.getCurStrVal()); 1552 if (CurRec && CurRec->getValue(A)) { 1553 TokError((Twine("left !foldl variable '") + A->getAsString() + 1554 "' already defined") 1555 .str()); 1556 return nullptr; 1557 } 1558 1559 if (Lex.Lex() != tgtok::comma) { // eat the id 1560 TokError("expected ',' in !foldl"); 1561 return nullptr; 1562 } 1563 1564 if (Lex.Lex() != tgtok::Id) { // eat the ',' 1565 TokError("fourth argument of !foldl must be an identifier"); 1566 return nullptr; 1567 } 1568 1569 Init *B = StringInit::get(Lex.getCurStrVal()); 1570 if (CurRec && CurRec->getValue(B)) { 1571 TokError((Twine("right !foldl variable '") + B->getAsString() + 1572 "' already defined") 1573 .str()); 1574 return nullptr; 1575 } 1576 1577 if (Lex.Lex() != tgtok::comma) { // eat the id 1578 TokError("expected ',' in !foldl"); 1579 return nullptr; 1580 } 1581 Lex.Lex(); // eat the ',' 1582 1583 // We need to create a temporary record to provide a scope for the iteration 1584 // variable while parsing top-level foreach's. 1585 std::unique_ptr<Record> ParseRecTmp; 1586 Record *ParseRec = CurRec; 1587 if (!ParseRec) { 1588 ParseRecTmp = make_unique<Record>(".parse", ArrayRef<SMLoc>{}, Records); 1589 ParseRec = ParseRecTmp.get(); 1590 } 1591 1592 ParseRec->addValue(RecordVal(A, Start->getType(), false)); 1593 ParseRec->addValue(RecordVal(B, ListType->getElementType(), false)); 1594 Init *ExprUntyped = ParseValue(ParseRec); 1595 ParseRec->removeValue(A); 1596 ParseRec->removeValue(B); 1597 if (!ExprUntyped) 1598 return nullptr; 1599 1600 TypedInit *Expr = dyn_cast<TypedInit>(ExprUntyped); 1601 if (!Expr) { 1602 TokError("could not get type of !foldl expression"); 1603 return nullptr; 1604 } 1605 1606 if (Expr->getType() != Start->getType()) { 1607 TokError(Twine("!foldl expression must be of same type as start (") + 1608 Start->getType()->getAsString() + "), but is of type " + 1609 Expr->getType()->getAsString()); 1610 return nullptr; 1611 } 1612 1613 if (Lex.getCode() != tgtok::r_paren) { 1614 TokError("expected ')' in fold operator"); 1615 return nullptr; 1616 } 1617 Lex.Lex(); // eat the ')' 1618 1619 return FoldOpInit::get(Start, List, A, B, Expr, Start->getType()) 1620 ->Fold(CurRec); 1621 } 1622 } 1623 } 1624 1625 /// ParseOperatorType - Parse a type for an operator. This returns 1626 /// null on error. 1627 /// 1628 /// OperatorType ::= '<' Type '>' 1629 /// 1630 RecTy *TGParser::ParseOperatorType() { 1631 RecTy *Type = nullptr; 1632 1633 if (Lex.getCode() != tgtok::less) { 1634 TokError("expected type name for operator"); 1635 return nullptr; 1636 } 1637 Lex.Lex(); // eat the < 1638 1639 Type = ParseType(); 1640 1641 if (!Type) { 1642 TokError("expected type name for operator"); 1643 return nullptr; 1644 } 1645 1646 if (Lex.getCode() != tgtok::greater) { 1647 TokError("expected type name for operator"); 1648 return nullptr; 1649 } 1650 Lex.Lex(); // eat the > 1651 1652 return Type; 1653 } 1654 1655 Init *TGParser::ParseOperationCond(Record *CurRec, RecTy *ItemType) { 1656 Lex.Lex(); // eat the operation 'cond' 1657 1658 if (Lex.getCode() != tgtok::l_paren) { 1659 TokError("expected '(' after !cond operator"); 1660 return nullptr; 1661 } 1662 Lex.Lex(); // eat the '(' 1663 1664 // Parse through '[Case: Val,]+' 1665 SmallVector<Init *, 4> Case; 1666 SmallVector<Init *, 4> Val; 1667 while (true) { 1668 if (Lex.getCode() == tgtok::r_paren) { 1669 Lex.Lex(); // eat the ')' 1670 break; 1671 } 1672 1673 Init *V = ParseValue(CurRec); 1674 if (!V) 1675 return nullptr; 1676 Case.push_back(V); 1677 1678 if (Lex.getCode() != tgtok::colon) { 1679 TokError("expected ':' following a condition in !cond operator"); 1680 return nullptr; 1681 } 1682 Lex.Lex(); // eat the ':' 1683 1684 V = ParseValue(CurRec, ItemType); 1685 if (!V) 1686 return nullptr; 1687 Val.push_back(V); 1688 1689 if (Lex.getCode() == tgtok::r_paren) { 1690 Lex.Lex(); // eat the ')' 1691 break; 1692 } 1693 1694 if (Lex.getCode() != tgtok::comma) { 1695 TokError("expected ',' or ')' following a value in !cond operator"); 1696 return nullptr; 1697 } 1698 Lex.Lex(); // eat the ',' 1699 } 1700 1701 if (Case.size() < 1) { 1702 TokError("there should be at least 1 'condition : value' in the !cond operator"); 1703 return nullptr; 1704 } 1705 1706 // resolve type 1707 RecTy *Type = nullptr; 1708 for (Init *V : Val) { 1709 RecTy *VTy = nullptr; 1710 if (TypedInit *Vt = dyn_cast<TypedInit>(V)) 1711 VTy = Vt->getType(); 1712 if (BitsInit *Vbits = dyn_cast<BitsInit>(V)) 1713 VTy = BitsRecTy::get(Vbits->getNumBits()); 1714 if (isa<BitInit>(V)) 1715 VTy = BitRecTy::get(); 1716 1717 if (Type == nullptr) { 1718 if (!isa<UnsetInit>(V)) 1719 Type = VTy; 1720 } else { 1721 if (!isa<UnsetInit>(V)) { 1722 RecTy *RType = resolveTypes(Type, VTy); 1723 if (!RType) { 1724 TokError(Twine("inconsistent types '") + Type->getAsString() + 1725 "' and '" + VTy->getAsString() + "' for !cond"); 1726 return nullptr; 1727 } 1728 Type = RType; 1729 } 1730 } 1731 } 1732 1733 if (!Type) { 1734 TokError("could not determine type for !cond from its arguments"); 1735 return nullptr; 1736 } 1737 return CondOpInit::get(Case, Val, Type)->Fold(CurRec); 1738 } 1739 1740 /// ParseSimpleValue - Parse a tblgen value. This returns null on error. 1741 /// 1742 /// SimpleValue ::= IDValue 1743 /// SimpleValue ::= INTVAL 1744 /// SimpleValue ::= STRVAL+ 1745 /// SimpleValue ::= CODEFRAGMENT 1746 /// SimpleValue ::= '?' 1747 /// SimpleValue ::= '{' ValueList '}' 1748 /// SimpleValue ::= ID '<' ValueListNE '>' 1749 /// SimpleValue ::= '[' ValueList ']' 1750 /// SimpleValue ::= '(' IDValue DagArgList ')' 1751 /// SimpleValue ::= CONCATTOK '(' Value ',' Value ')' 1752 /// SimpleValue ::= ADDTOK '(' Value ',' Value ')' 1753 /// SimpleValue ::= SHLTOK '(' Value ',' Value ')' 1754 /// SimpleValue ::= SRATOK '(' Value ',' Value ')' 1755 /// SimpleValue ::= SRLTOK '(' Value ',' Value ')' 1756 /// SimpleValue ::= LISTCONCATTOK '(' Value ',' Value ')' 1757 /// SimpleValue ::= LISTSPLATTOK '(' Value ',' Value ')' 1758 /// SimpleValue ::= STRCONCATTOK '(' Value ',' Value ')' 1759 /// SimpleValue ::= COND '(' [Value ':' Value,]+ ')' 1760 /// 1761 Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, 1762 IDParseMode Mode) { 1763 Init *R = nullptr; 1764 switch (Lex.getCode()) { 1765 default: TokError("Unknown token when parsing a value"); break; 1766 case tgtok::paste: 1767 // This is a leading paste operation. This is deprecated but 1768 // still exists in some .td files. Ignore it. 1769 Lex.Lex(); // Skip '#'. 1770 return ParseSimpleValue(CurRec, ItemType, Mode); 1771 case tgtok::IntVal: R = IntInit::get(Lex.getCurIntVal()); Lex.Lex(); break; 1772 case tgtok::BinaryIntVal: { 1773 auto BinaryVal = Lex.getCurBinaryIntVal(); 1774 SmallVector<Init*, 16> Bits(BinaryVal.second); 1775 for (unsigned i = 0, e = BinaryVal.second; i != e; ++i) 1776 Bits[i] = BitInit::get(BinaryVal.first & (1LL << i)); 1777 R = BitsInit::get(Bits); 1778 Lex.Lex(); 1779 break; 1780 } 1781 case tgtok::StrVal: { 1782 std::string Val = Lex.getCurStrVal(); 1783 Lex.Lex(); 1784 1785 // Handle multiple consecutive concatenated strings. 1786 while (Lex.getCode() == tgtok::StrVal) { 1787 Val += Lex.getCurStrVal(); 1788 Lex.Lex(); 1789 } 1790 1791 R = StringInit::get(Val); 1792 break; 1793 } 1794 case tgtok::CodeFragment: 1795 R = CodeInit::get(Lex.getCurStrVal(), Lex.getLoc()); 1796 Lex.Lex(); 1797 break; 1798 case tgtok::question: 1799 R = UnsetInit::get(); 1800 Lex.Lex(); 1801 break; 1802 case tgtok::Id: { 1803 SMLoc NameLoc = Lex.getLoc(); 1804 StringInit *Name = StringInit::get(Lex.getCurStrVal()); 1805 if (Lex.Lex() != tgtok::less) // consume the Id. 1806 return ParseIDValue(CurRec, Name, NameLoc, Mode); // Value ::= IDValue 1807 1808 // Value ::= ID '<' ValueListNE '>' 1809 if (Lex.Lex() == tgtok::greater) { 1810 TokError("expected non-empty value list"); 1811 return nullptr; 1812 } 1813 1814 // This is a CLASS<initvalslist> expression. This is supposed to synthesize 1815 // a new anonymous definition, deriving from CLASS<initvalslist> with no 1816 // body. 1817 Record *Class = Records.getClass(Name->getValue()); 1818 if (!Class) { 1819 Error(NameLoc, "Expected a class name, got '" + Name->getValue() + "'"); 1820 return nullptr; 1821 } 1822 1823 SmallVector<Init *, 8> Args; 1824 ParseValueList(Args, CurRec, Class); 1825 if (Args.empty()) return nullptr; 1826 1827 if (Lex.getCode() != tgtok::greater) { 1828 TokError("expected '>' at end of value list"); 1829 return nullptr; 1830 } 1831 Lex.Lex(); // eat the '>' 1832 1833 // Typecheck the template arguments list 1834 ArrayRef<Init *> ExpectedArgs = Class->getTemplateArgs(); 1835 if (ExpectedArgs.size() < Args.size()) { 1836 Error(NameLoc, 1837 "More template args specified than expected"); 1838 return nullptr; 1839 } 1840 1841 for (unsigned i = 0, e = ExpectedArgs.size(); i != e; ++i) { 1842 RecordVal *ExpectedArg = Class->getValue(ExpectedArgs[i]); 1843 if (i < Args.size()) { 1844 if (TypedInit *TI = dyn_cast<TypedInit>(Args[i])) { 1845 RecTy *ExpectedType = ExpectedArg->getType(); 1846 if (!TI->getType()->typeIsConvertibleTo(ExpectedType)) { 1847 Error(NameLoc, 1848 "Value specified for template argument #" + Twine(i) + " (" + 1849 ExpectedArg->getNameInitAsString() + ") is of type '" + 1850 TI->getType()->getAsString() + "', expected '" + 1851 ExpectedType->getAsString() + "': " + TI->getAsString()); 1852 return nullptr; 1853 } 1854 continue; 1855 } 1856 } else if (ExpectedArg->getValue()->isComplete()) 1857 continue; 1858 1859 Error(NameLoc, 1860 "Value not specified for template argument #" + Twine(i) + " (" + 1861 ExpectedArgs[i]->getAsUnquotedString() + ")"); 1862 return nullptr; 1863 } 1864 1865 return VarDefInit::get(Class, Args)->Fold(); 1866 } 1867 case tgtok::l_brace: { // Value ::= '{' ValueList '}' 1868 SMLoc BraceLoc = Lex.getLoc(); 1869 Lex.Lex(); // eat the '{' 1870 SmallVector<Init*, 16> Vals; 1871 1872 if (Lex.getCode() != tgtok::r_brace) { 1873 ParseValueList(Vals, CurRec); 1874 if (Vals.empty()) return nullptr; 1875 } 1876 if (Lex.getCode() != tgtok::r_brace) { 1877 TokError("expected '}' at end of bit list value"); 1878 return nullptr; 1879 } 1880 Lex.Lex(); // eat the '}' 1881 1882 SmallVector<Init *, 16> NewBits; 1883 1884 // As we parse { a, b, ... }, 'a' is the highest bit, but we parse it 1885 // first. We'll first read everything in to a vector, then we can reverse 1886 // it to get the bits in the correct order for the BitsInit value. 1887 for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 1888 // FIXME: The following two loops would not be duplicated 1889 // if the API was a little more orthogonal. 1890 1891 // bits<n> values are allowed to initialize n bits. 1892 if (BitsInit *BI = dyn_cast<BitsInit>(Vals[i])) { 1893 for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) 1894 NewBits.push_back(BI->getBit((e - i) - 1)); 1895 continue; 1896 } 1897 // bits<n> can also come from variable initializers. 1898 if (VarInit *VI = dyn_cast<VarInit>(Vals[i])) { 1899 if (BitsRecTy *BitsRec = dyn_cast<BitsRecTy>(VI->getType())) { 1900 for (unsigned i = 0, e = BitsRec->getNumBits(); i != e; ++i) 1901 NewBits.push_back(VI->getBit((e - i) - 1)); 1902 continue; 1903 } 1904 // Fallthrough to try convert this to a bit. 1905 } 1906 // All other values must be convertible to just a single bit. 1907 Init *Bit = Vals[i]->getCastTo(BitRecTy::get()); 1908 if (!Bit) { 1909 Error(BraceLoc, "Element #" + Twine(i) + " (" + Vals[i]->getAsString() + 1910 ") is not convertable to a bit"); 1911 return nullptr; 1912 } 1913 NewBits.push_back(Bit); 1914 } 1915 std::reverse(NewBits.begin(), NewBits.end()); 1916 return BitsInit::get(NewBits); 1917 } 1918 case tgtok::l_square: { // Value ::= '[' ValueList ']' 1919 Lex.Lex(); // eat the '[' 1920 SmallVector<Init*, 16> Vals; 1921 1922 RecTy *DeducedEltTy = nullptr; 1923 ListRecTy *GivenListTy = nullptr; 1924 1925 if (ItemType) { 1926 ListRecTy *ListType = dyn_cast<ListRecTy>(ItemType); 1927 if (!ListType) { 1928 TokError(Twine("Type mismatch for list, expected list type, got ") + 1929 ItemType->getAsString()); 1930 return nullptr; 1931 } 1932 GivenListTy = ListType; 1933 } 1934 1935 if (Lex.getCode() != tgtok::r_square) { 1936 ParseValueList(Vals, CurRec, nullptr, 1937 GivenListTy ? GivenListTy->getElementType() : nullptr); 1938 if (Vals.empty()) return nullptr; 1939 } 1940 if (Lex.getCode() != tgtok::r_square) { 1941 TokError("expected ']' at end of list value"); 1942 return nullptr; 1943 } 1944 Lex.Lex(); // eat the ']' 1945 1946 RecTy *GivenEltTy = nullptr; 1947 if (Lex.getCode() == tgtok::less) { 1948 // Optional list element type 1949 Lex.Lex(); // eat the '<' 1950 1951 GivenEltTy = ParseType(); 1952 if (!GivenEltTy) { 1953 // Couldn't parse element type 1954 return nullptr; 1955 } 1956 1957 if (Lex.getCode() != tgtok::greater) { 1958 TokError("expected '>' at end of list element type"); 1959 return nullptr; 1960 } 1961 Lex.Lex(); // eat the '>' 1962 } 1963 1964 // Check elements 1965 RecTy *EltTy = nullptr; 1966 for (Init *V : Vals) { 1967 TypedInit *TArg = dyn_cast<TypedInit>(V); 1968 if (TArg) { 1969 if (EltTy) { 1970 EltTy = resolveTypes(EltTy, TArg->getType()); 1971 if (!EltTy) { 1972 TokError("Incompatible types in list elements"); 1973 return nullptr; 1974 } 1975 } else { 1976 EltTy = TArg->getType(); 1977 } 1978 } 1979 } 1980 1981 if (GivenEltTy) { 1982 if (EltTy) { 1983 // Verify consistency 1984 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) { 1985 TokError("Incompatible types in list elements"); 1986 return nullptr; 1987 } 1988 } 1989 EltTy = GivenEltTy; 1990 } 1991 1992 if (!EltTy) { 1993 if (!ItemType) { 1994 TokError("No type for list"); 1995 return nullptr; 1996 } 1997 DeducedEltTy = GivenListTy->getElementType(); 1998 } else { 1999 // Make sure the deduced type is compatible with the given type 2000 if (GivenListTy) { 2001 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) { 2002 TokError(Twine("Element type mismatch for list: element type '") + 2003 EltTy->getAsString() + "' not convertible to '" + 2004 GivenListTy->getElementType()->getAsString()); 2005 return nullptr; 2006 } 2007 } 2008 DeducedEltTy = EltTy; 2009 } 2010 2011 return ListInit::get(Vals, DeducedEltTy); 2012 } 2013 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')' 2014 Lex.Lex(); // eat the '(' 2015 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast) { 2016 TokError("expected identifier in dag init"); 2017 return nullptr; 2018 } 2019 2020 Init *Operator = ParseValue(CurRec); 2021 if (!Operator) return nullptr; 2022 2023 // If the operator name is present, parse it. 2024 StringInit *OperatorName = nullptr; 2025 if (Lex.getCode() == tgtok::colon) { 2026 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 2027 TokError("expected variable name in dag operator"); 2028 return nullptr; 2029 } 2030 OperatorName = StringInit::get(Lex.getCurStrVal()); 2031 Lex.Lex(); // eat the VarName. 2032 } 2033 2034 SmallVector<std::pair<llvm::Init*, StringInit*>, 8> DagArgs; 2035 if (Lex.getCode() != tgtok::r_paren) { 2036 ParseDagArgList(DagArgs, CurRec); 2037 if (DagArgs.empty()) return nullptr; 2038 } 2039 2040 if (Lex.getCode() != tgtok::r_paren) { 2041 TokError("expected ')' in dag init"); 2042 return nullptr; 2043 } 2044 Lex.Lex(); // eat the ')' 2045 2046 return DagInit::get(Operator, OperatorName, DagArgs); 2047 } 2048 2049 case tgtok::XHead: 2050 case tgtok::XTail: 2051 case tgtok::XSize: 2052 case tgtok::XEmpty: 2053 case tgtok::XCast: // Value ::= !unop '(' Value ')' 2054 case tgtok::XIsA: 2055 case tgtok::XConcat: 2056 case tgtok::XDag: 2057 case tgtok::XADD: 2058 case tgtok::XMUL: 2059 case tgtok::XAND: 2060 case tgtok::XOR: 2061 case tgtok::XSRA: 2062 case tgtok::XSRL: 2063 case tgtok::XSHL: 2064 case tgtok::XEq: 2065 case tgtok::XNe: 2066 case tgtok::XLe: 2067 case tgtok::XLt: 2068 case tgtok::XGe: 2069 case tgtok::XGt: 2070 case tgtok::XListConcat: 2071 case tgtok::XListSplat: 2072 case tgtok::XStrConcat: // Value ::= !binop '(' Value ',' Value ')' 2073 case tgtok::XIf: 2074 case tgtok::XCond: 2075 case tgtok::XFoldl: 2076 case tgtok::XForEach: 2077 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 2078 return ParseOperation(CurRec, ItemType); 2079 } 2080 } 2081 2082 return R; 2083 } 2084 2085 /// ParseValue - Parse a tblgen value. This returns null on error. 2086 /// 2087 /// Value ::= SimpleValue ValueSuffix* 2088 /// ValueSuffix ::= '{' BitList '}' 2089 /// ValueSuffix ::= '[' BitList ']' 2090 /// ValueSuffix ::= '.' ID 2091 /// 2092 Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { 2093 Init *Result = ParseSimpleValue(CurRec, ItemType, Mode); 2094 if (!Result) return nullptr; 2095 2096 // Parse the suffixes now if present. 2097 while (true) { 2098 switch (Lex.getCode()) { 2099 default: return Result; 2100 case tgtok::l_brace: { 2101 if (Mode == ParseNameMode) 2102 // This is the beginning of the object body. 2103 return Result; 2104 2105 SMLoc CurlyLoc = Lex.getLoc(); 2106 Lex.Lex(); // eat the '{' 2107 SmallVector<unsigned, 16> Ranges; 2108 ParseRangeList(Ranges); 2109 if (Ranges.empty()) return nullptr; 2110 2111 // Reverse the bitlist. 2112 std::reverse(Ranges.begin(), Ranges.end()); 2113 Result = Result->convertInitializerBitRange(Ranges); 2114 if (!Result) { 2115 Error(CurlyLoc, "Invalid bit range for value"); 2116 return nullptr; 2117 } 2118 2119 // Eat the '}'. 2120 if (Lex.getCode() != tgtok::r_brace) { 2121 TokError("expected '}' at end of bit range list"); 2122 return nullptr; 2123 } 2124 Lex.Lex(); 2125 break; 2126 } 2127 case tgtok::l_square: { 2128 SMLoc SquareLoc = Lex.getLoc(); 2129 Lex.Lex(); // eat the '[' 2130 SmallVector<unsigned, 16> Ranges; 2131 ParseRangeList(Ranges); 2132 if (Ranges.empty()) return nullptr; 2133 2134 Result = Result->convertInitListSlice(Ranges); 2135 if (!Result) { 2136 Error(SquareLoc, "Invalid range for list slice"); 2137 return nullptr; 2138 } 2139 2140 // Eat the ']'. 2141 if (Lex.getCode() != tgtok::r_square) { 2142 TokError("expected ']' at end of list slice"); 2143 return nullptr; 2144 } 2145 Lex.Lex(); 2146 break; 2147 } 2148 case tgtok::period: { 2149 if (Lex.Lex() != tgtok::Id) { // eat the . 2150 TokError("expected field identifier after '.'"); 2151 return nullptr; 2152 } 2153 StringInit *FieldName = StringInit::get(Lex.getCurStrVal()); 2154 if (!Result->getFieldType(FieldName)) { 2155 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" + 2156 Result->getAsString() + "'"); 2157 return nullptr; 2158 } 2159 Result = FieldInit::get(Result, FieldName)->Fold(CurRec); 2160 Lex.Lex(); // eat field name 2161 break; 2162 } 2163 2164 case tgtok::paste: 2165 SMLoc PasteLoc = Lex.getLoc(); 2166 TypedInit *LHS = dyn_cast<TypedInit>(Result); 2167 if (!LHS) { 2168 Error(PasteLoc, "LHS of paste is not typed!"); 2169 return nullptr; 2170 } 2171 2172 // Check if it's a 'listA # listB' 2173 if (isa<ListRecTy>(LHS->getType())) { 2174 Lex.Lex(); // Eat the '#'. 2175 2176 switch (Lex.getCode()) { 2177 case tgtok::colon: 2178 case tgtok::semi: 2179 case tgtok::l_brace: 2180 Result = LHS; // trailing paste, ignore. 2181 break; 2182 default: 2183 Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode); 2184 Result = BinOpInit::getListConcat(LHS, RHSResult); 2185 } 2186 break; 2187 } 2188 2189 // Create a !strconcat() operation, first casting each operand to 2190 // a string if necessary. 2191 if (LHS->getType() != StringRecTy::get()) { 2192 LHS = dyn_cast<TypedInit>( 2193 UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get()) 2194 ->Fold(CurRec)); 2195 if (!LHS) { 2196 Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() + 2197 "' to string"); 2198 return nullptr; 2199 } 2200 } 2201 2202 TypedInit *RHS = nullptr; 2203 2204 Lex.Lex(); // Eat the '#'. 2205 switch (Lex.getCode()) { 2206 case tgtok::colon: 2207 case tgtok::semi: 2208 case tgtok::l_brace: 2209 // These are all of the tokens that can begin an object body. 2210 // Some of these can also begin values but we disallow those cases 2211 // because they are unlikely to be useful. 2212 2213 // Trailing paste, concat with an empty string. 2214 RHS = StringInit::get(""); 2215 break; 2216 2217 default: 2218 Init *RHSResult = ParseValue(CurRec, nullptr, ParseNameMode); 2219 RHS = dyn_cast<TypedInit>(RHSResult); 2220 if (!RHS) { 2221 Error(PasteLoc, "RHS of paste is not typed!"); 2222 return nullptr; 2223 } 2224 2225 if (RHS->getType() != StringRecTy::get()) { 2226 RHS = dyn_cast<TypedInit>( 2227 UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get()) 2228 ->Fold(CurRec)); 2229 if (!RHS) { 2230 Error(PasteLoc, Twine("can't cast '") + RHS->getAsString() + 2231 "' to string"); 2232 return nullptr; 2233 } 2234 } 2235 2236 break; 2237 } 2238 2239 Result = BinOpInit::getStrConcat(LHS, RHS); 2240 break; 2241 } 2242 } 2243 } 2244 2245 /// ParseDagArgList - Parse the argument list for a dag literal expression. 2246 /// 2247 /// DagArg ::= Value (':' VARNAME)? 2248 /// DagArg ::= VARNAME 2249 /// DagArgList ::= DagArg 2250 /// DagArgList ::= DagArgList ',' DagArg 2251 void TGParser::ParseDagArgList( 2252 SmallVectorImpl<std::pair<llvm::Init*, StringInit*>> &Result, 2253 Record *CurRec) { 2254 2255 while (true) { 2256 // DagArg ::= VARNAME 2257 if (Lex.getCode() == tgtok::VarName) { 2258 // A missing value is treated like '?'. 2259 StringInit *VarName = StringInit::get(Lex.getCurStrVal()); 2260 Result.emplace_back(UnsetInit::get(), VarName); 2261 Lex.Lex(); 2262 } else { 2263 // DagArg ::= Value (':' VARNAME)? 2264 Init *Val = ParseValue(CurRec); 2265 if (!Val) { 2266 Result.clear(); 2267 return; 2268 } 2269 2270 // If the variable name is present, add it. 2271 StringInit *VarName = nullptr; 2272 if (Lex.getCode() == tgtok::colon) { 2273 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 2274 TokError("expected variable name in dag literal"); 2275 Result.clear(); 2276 return; 2277 } 2278 VarName = StringInit::get(Lex.getCurStrVal()); 2279 Lex.Lex(); // eat the VarName. 2280 } 2281 2282 Result.push_back(std::make_pair(Val, VarName)); 2283 } 2284 if (Lex.getCode() != tgtok::comma) break; 2285 Lex.Lex(); // eat the ',' 2286 } 2287 } 2288 2289 /// ParseValueList - Parse a comma separated list of values, returning them as a 2290 /// vector. Note that this always expects to be able to parse at least one 2291 /// value. It returns an empty list if this is not possible. 2292 /// 2293 /// ValueList ::= Value (',' Value) 2294 /// 2295 void TGParser::ParseValueList(SmallVectorImpl<Init*> &Result, Record *CurRec, 2296 Record *ArgsRec, RecTy *EltTy) { 2297 RecTy *ItemType = EltTy; 2298 unsigned int ArgN = 0; 2299 if (ArgsRec && !EltTy) { 2300 ArrayRef<Init *> TArgs = ArgsRec->getTemplateArgs(); 2301 if (TArgs.empty()) { 2302 TokError("template argument provided to non-template class"); 2303 Result.clear(); 2304 return; 2305 } 2306 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 2307 if (!RV) { 2308 errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN] 2309 << ")\n"; 2310 } 2311 assert(RV && "Template argument record not found??"); 2312 ItemType = RV->getType(); 2313 ++ArgN; 2314 } 2315 Result.push_back(ParseValue(CurRec, ItemType)); 2316 if (!Result.back()) { 2317 Result.clear(); 2318 return; 2319 } 2320 2321 while (Lex.getCode() == tgtok::comma) { 2322 Lex.Lex(); // Eat the comma 2323 2324 // ignore trailing comma for lists 2325 if (Lex.getCode() == tgtok::r_square) 2326 return; 2327 2328 if (ArgsRec && !EltTy) { 2329 ArrayRef<Init *> TArgs = ArgsRec->getTemplateArgs(); 2330 if (ArgN >= TArgs.size()) { 2331 TokError("too many template arguments"); 2332 Result.clear(); 2333 return; 2334 } 2335 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); 2336 assert(RV && "Template argument record not found??"); 2337 ItemType = RV->getType(); 2338 ++ArgN; 2339 } 2340 Result.push_back(ParseValue(CurRec, ItemType)); 2341 if (!Result.back()) { 2342 Result.clear(); 2343 return; 2344 } 2345 } 2346 } 2347 2348 /// ParseDeclaration - Read a declaration, returning the name of field ID, or an 2349 /// empty string on error. This can happen in a number of different context's, 2350 /// including within a def or in the template args for a def (which which case 2351 /// CurRec will be non-null) and within the template args for a multiclass (in 2352 /// which case CurRec will be null, but CurMultiClass will be set). This can 2353 /// also happen within a def that is within a multiclass, which will set both 2354 /// CurRec and CurMultiClass. 2355 /// 2356 /// Declaration ::= FIELD? Type ID ('=' Value)? 2357 /// 2358 Init *TGParser::ParseDeclaration(Record *CurRec, 2359 bool ParsingTemplateArgs) { 2360 // Read the field prefix if present. 2361 bool HasField = Lex.getCode() == tgtok::Field; 2362 if (HasField) Lex.Lex(); 2363 2364 RecTy *Type = ParseType(); 2365 if (!Type) return nullptr; 2366 2367 if (Lex.getCode() != tgtok::Id) { 2368 TokError("Expected identifier in declaration"); 2369 return nullptr; 2370 } 2371 2372 std::string Str = Lex.getCurStrVal(); 2373 if (Str == "NAME") { 2374 TokError("'" + Str + "' is a reserved variable name"); 2375 return nullptr; 2376 } 2377 2378 SMLoc IdLoc = Lex.getLoc(); 2379 Init *DeclName = StringInit::get(Str); 2380 Lex.Lex(); 2381 2382 if (ParsingTemplateArgs) { 2383 if (CurRec) 2384 DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":"); 2385 else 2386 assert(CurMultiClass); 2387 if (CurMultiClass) 2388 DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName, 2389 "::"); 2390 } 2391 2392 // Add the value. 2393 if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField))) 2394 return nullptr; 2395 2396 // If a value is present, parse it. 2397 if (Lex.getCode() == tgtok::equal) { 2398 Lex.Lex(); 2399 SMLoc ValLoc = Lex.getLoc(); 2400 Init *Val = ParseValue(CurRec, Type); 2401 if (!Val || 2402 SetValue(CurRec, ValLoc, DeclName, None, Val)) 2403 // Return the name, even if an error is thrown. This is so that we can 2404 // continue to make some progress, even without the value having been 2405 // initialized. 2406 return DeclName; 2407 } 2408 2409 return DeclName; 2410 } 2411 2412 /// ParseForeachDeclaration - Read a foreach declaration, returning 2413 /// the name of the declared object or a NULL Init on error. Return 2414 /// the name of the parsed initializer list through ForeachListName. 2415 /// 2416 /// ForeachDeclaration ::= ID '=' '{' RangeList '}' 2417 /// ForeachDeclaration ::= ID '=' RangePiece 2418 /// ForeachDeclaration ::= ID '=' Value 2419 /// 2420 VarInit *TGParser::ParseForeachDeclaration(Init *&ForeachListValue) { 2421 if (Lex.getCode() != tgtok::Id) { 2422 TokError("Expected identifier in foreach declaration"); 2423 return nullptr; 2424 } 2425 2426 Init *DeclName = StringInit::get(Lex.getCurStrVal()); 2427 Lex.Lex(); 2428 2429 // If a value is present, parse it. 2430 if (Lex.getCode() != tgtok::equal) { 2431 TokError("Expected '=' in foreach declaration"); 2432 return nullptr; 2433 } 2434 Lex.Lex(); // Eat the '=' 2435 2436 RecTy *IterType = nullptr; 2437 SmallVector<unsigned, 16> Ranges; 2438 2439 switch (Lex.getCode()) { 2440 case tgtok::IntVal: { // RangePiece. 2441 if (ParseRangePiece(Ranges)) 2442 return nullptr; 2443 break; 2444 } 2445 2446 case tgtok::l_brace: { // '{' RangeList '}' 2447 Lex.Lex(); // eat the '{' 2448 ParseRangeList(Ranges); 2449 if (Lex.getCode() != tgtok::r_brace) { 2450 TokError("expected '}' at end of bit range list"); 2451 return nullptr; 2452 } 2453 Lex.Lex(); 2454 break; 2455 } 2456 2457 default: { 2458 SMLoc ValueLoc = Lex.getLoc(); 2459 Init *I = ParseValue(nullptr); 2460 TypedInit *TI = dyn_cast<TypedInit>(I); 2461 if (!TI || !isa<ListRecTy>(TI->getType())) { 2462 std::string Type; 2463 if (TI) 2464 Type = (Twine("' of type '") + TI->getType()->getAsString()).str(); 2465 Error(ValueLoc, "expected a list, got '" + I->getAsString() + Type + "'"); 2466 if (CurMultiClass) 2467 PrintNote({}, "references to multiclass template arguments cannot be " 2468 "resolved at this time"); 2469 return nullptr; 2470 } 2471 ForeachListValue = I; 2472 IterType = cast<ListRecTy>(TI->getType())->getElementType(); 2473 break; 2474 } 2475 } 2476 2477 if (!Ranges.empty()) { 2478 assert(!IterType && "Type already initialized?"); 2479 IterType = IntRecTy::get(); 2480 std::vector<Init*> Values; 2481 for (unsigned R : Ranges) 2482 Values.push_back(IntInit::get(R)); 2483 ForeachListValue = ListInit::get(Values, IterType); 2484 } 2485 2486 if (!IterType) 2487 return nullptr; 2488 2489 return VarInit::get(DeclName, IterType); 2490 } 2491 2492 /// ParseTemplateArgList - Read a template argument list, which is a non-empty 2493 /// sequence of template-declarations in <>'s. If CurRec is non-null, these are 2494 /// template args for a def, which may or may not be in a multiclass. If null, 2495 /// these are the template args for a multiclass. 2496 /// 2497 /// TemplateArgList ::= '<' Declaration (',' Declaration)* '>' 2498 /// 2499 bool TGParser::ParseTemplateArgList(Record *CurRec) { 2500 assert(Lex.getCode() == tgtok::less && "Not a template arg list!"); 2501 Lex.Lex(); // eat the '<' 2502 2503 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec; 2504 2505 // Read the first declaration. 2506 Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 2507 if (!TemplArg) 2508 return true; 2509 2510 TheRecToAddTo->addTemplateArg(TemplArg); 2511 2512 while (Lex.getCode() == tgtok::comma) { 2513 Lex.Lex(); // eat the ',' 2514 2515 // Read the following declarations. 2516 SMLoc Loc = Lex.getLoc(); 2517 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 2518 if (!TemplArg) 2519 return true; 2520 2521 if (TheRecToAddTo->isTemplateArg(TemplArg)) 2522 return Error(Loc, "template argument with the same name has already been " 2523 "defined"); 2524 2525 TheRecToAddTo->addTemplateArg(TemplArg); 2526 } 2527 2528 if (Lex.getCode() != tgtok::greater) 2529 return TokError("expected '>' at end of template argument list"); 2530 Lex.Lex(); // eat the '>'. 2531 return false; 2532 } 2533 2534 /// ParseBodyItem - Parse a single item at within the body of a def or class. 2535 /// 2536 /// BodyItem ::= Declaration ';' 2537 /// BodyItem ::= LET ID OptionalBitList '=' Value ';' 2538 bool TGParser::ParseBodyItem(Record *CurRec) { 2539 if (Lex.getCode() != tgtok::Let) { 2540 if (!ParseDeclaration(CurRec, false)) 2541 return true; 2542 2543 if (Lex.getCode() != tgtok::semi) 2544 return TokError("expected ';' after declaration"); 2545 Lex.Lex(); 2546 return false; 2547 } 2548 2549 // LET ID OptionalRangeList '=' Value ';' 2550 if (Lex.Lex() != tgtok::Id) 2551 return TokError("expected field identifier after let"); 2552 2553 SMLoc IdLoc = Lex.getLoc(); 2554 StringInit *FieldName = StringInit::get(Lex.getCurStrVal()); 2555 Lex.Lex(); // eat the field name. 2556 2557 SmallVector<unsigned, 16> BitList; 2558 if (ParseOptionalBitList(BitList)) 2559 return true; 2560 std::reverse(BitList.begin(), BitList.end()); 2561 2562 if (Lex.getCode() != tgtok::equal) 2563 return TokError("expected '=' in let expression"); 2564 Lex.Lex(); // eat the '='. 2565 2566 RecordVal *Field = CurRec->getValue(FieldName); 2567 if (!Field) 2568 return TokError("Value '" + FieldName->getValue() + "' unknown!"); 2569 2570 RecTy *Type = Field->getType(); 2571 2572 Init *Val = ParseValue(CurRec, Type); 2573 if (!Val) return true; 2574 2575 if (Lex.getCode() != tgtok::semi) 2576 return TokError("expected ';' after let expression"); 2577 Lex.Lex(); 2578 2579 return SetValue(CurRec, IdLoc, FieldName, BitList, Val); 2580 } 2581 2582 /// ParseBody - Read the body of a class or def. Return true on error, false on 2583 /// success. 2584 /// 2585 /// Body ::= ';' 2586 /// Body ::= '{' BodyList '}' 2587 /// BodyList BodyItem* 2588 /// 2589 bool TGParser::ParseBody(Record *CurRec) { 2590 // If this is a null definition, just eat the semi and return. 2591 if (Lex.getCode() == tgtok::semi) { 2592 Lex.Lex(); 2593 return false; 2594 } 2595 2596 if (Lex.getCode() != tgtok::l_brace) 2597 return TokError("Expected ';' or '{' to start body"); 2598 // Eat the '{'. 2599 Lex.Lex(); 2600 2601 while (Lex.getCode() != tgtok::r_brace) 2602 if (ParseBodyItem(CurRec)) 2603 return true; 2604 2605 // Eat the '}'. 2606 Lex.Lex(); 2607 return false; 2608 } 2609 2610 /// Apply the current let bindings to \a CurRec. 2611 /// \returns true on error, false otherwise. 2612 bool TGParser::ApplyLetStack(Record *CurRec) { 2613 for (SmallVectorImpl<LetRecord> &LetInfo : LetStack) 2614 for (LetRecord &LR : LetInfo) 2615 if (SetValue(CurRec, LR.Loc, LR.Name, LR.Bits, LR.Value)) 2616 return true; 2617 return false; 2618 } 2619 2620 bool TGParser::ApplyLetStack(RecordsEntry &Entry) { 2621 if (Entry.Rec) 2622 return ApplyLetStack(Entry.Rec.get()); 2623 2624 for (auto &E : Entry.Loop->Entries) { 2625 if (ApplyLetStack(E)) 2626 return true; 2627 } 2628 2629 return false; 2630 } 2631 2632 /// ParseObjectBody - Parse the body of a def or class. This consists of an 2633 /// optional ClassList followed by a Body. CurRec is the current def or class 2634 /// that is being parsed. 2635 /// 2636 /// ObjectBody ::= BaseClassList Body 2637 /// BaseClassList ::= /*empty*/ 2638 /// BaseClassList ::= ':' BaseClassListNE 2639 /// BaseClassListNE ::= SubClassRef (',' SubClassRef)* 2640 /// 2641 bool TGParser::ParseObjectBody(Record *CurRec) { 2642 // If there is a baseclass list, read it. 2643 if (Lex.getCode() == tgtok::colon) { 2644 Lex.Lex(); 2645 2646 // Read all of the subclasses. 2647 SubClassReference SubClass = ParseSubClassReference(CurRec, false); 2648 while (true) { 2649 // Check for error. 2650 if (!SubClass.Rec) return true; 2651 2652 // Add it. 2653 if (AddSubClass(CurRec, SubClass)) 2654 return true; 2655 2656 if (Lex.getCode() != tgtok::comma) break; 2657 Lex.Lex(); // eat ','. 2658 SubClass = ParseSubClassReference(CurRec, false); 2659 } 2660 } 2661 2662 if (ApplyLetStack(CurRec)) 2663 return true; 2664 2665 return ParseBody(CurRec); 2666 } 2667 2668 /// ParseDef - Parse and return a top level or multiclass def, return the record 2669 /// corresponding to it. This returns null on error. 2670 /// 2671 /// DefInst ::= DEF ObjectName ObjectBody 2672 /// 2673 bool TGParser::ParseDef(MultiClass *CurMultiClass) { 2674 SMLoc DefLoc = Lex.getLoc(); 2675 assert(Lex.getCode() == tgtok::Def && "Unknown tok"); 2676 Lex.Lex(); // Eat the 'def' token. 2677 2678 // Parse ObjectName and make a record for it. 2679 std::unique_ptr<Record> CurRec; 2680 Init *Name = ParseObjectName(CurMultiClass); 2681 if (!Name) 2682 return true; 2683 2684 if (isa<UnsetInit>(Name)) 2685 CurRec = make_unique<Record>(Records.getNewAnonymousName(), DefLoc, Records, 2686 /*Anonymous=*/true); 2687 else 2688 CurRec = make_unique<Record>(Name, DefLoc, Records); 2689 2690 if (ParseObjectBody(CurRec.get())) 2691 return true; 2692 2693 return addEntry(std::move(CurRec)); 2694 } 2695 2696 /// ParseDefset - Parse a defset statement. 2697 /// 2698 /// Defset ::= DEFSET Type Id '=' '{' ObjectList '}' 2699 /// 2700 bool TGParser::ParseDefset() { 2701 assert(Lex.getCode() == tgtok::Defset); 2702 Lex.Lex(); // Eat the 'defset' token 2703 2704 DefsetRecord Defset; 2705 Defset.Loc = Lex.getLoc(); 2706 RecTy *Type = ParseType(); 2707 if (!Type) 2708 return true; 2709 if (!isa<ListRecTy>(Type)) 2710 return Error(Defset.Loc, "expected list type"); 2711 Defset.EltTy = cast<ListRecTy>(Type)->getElementType(); 2712 2713 if (Lex.getCode() != tgtok::Id) 2714 return TokError("expected identifier"); 2715 StringInit *DeclName = StringInit::get(Lex.getCurStrVal()); 2716 if (Records.getGlobal(DeclName->getValue())) 2717 return TokError("def or global variable of this name already exists"); 2718 2719 if (Lex.Lex() != tgtok::equal) // Eat the identifier 2720 return TokError("expected '='"); 2721 if (Lex.Lex() != tgtok::l_brace) // Eat the '=' 2722 return TokError("expected '{'"); 2723 SMLoc BraceLoc = Lex.getLoc(); 2724 Lex.Lex(); // Eat the '{' 2725 2726 Defsets.push_back(&Defset); 2727 bool Err = ParseObjectList(nullptr); 2728 Defsets.pop_back(); 2729 if (Err) 2730 return true; 2731 2732 if (Lex.getCode() != tgtok::r_brace) { 2733 TokError("expected '}' at end of defset"); 2734 return Error(BraceLoc, "to match this '{'"); 2735 } 2736 Lex.Lex(); // Eat the '}' 2737 2738 Records.addExtraGlobal(DeclName->getValue(), 2739 ListInit::get(Defset.Elements, Defset.EltTy)); 2740 return false; 2741 } 2742 2743 /// ParseForeach - Parse a for statement. Return the record corresponding 2744 /// to it. This returns true on error. 2745 /// 2746 /// Foreach ::= FOREACH Declaration IN '{ ObjectList '}' 2747 /// Foreach ::= FOREACH Declaration IN Object 2748 /// 2749 bool TGParser::ParseForeach(MultiClass *CurMultiClass) { 2750 SMLoc Loc = Lex.getLoc(); 2751 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok"); 2752 Lex.Lex(); // Eat the 'for' token. 2753 2754 // Make a temporary object to record items associated with the for 2755 // loop. 2756 Init *ListValue = nullptr; 2757 VarInit *IterName = ParseForeachDeclaration(ListValue); 2758 if (!IterName) 2759 return TokError("expected declaration in for"); 2760 2761 if (Lex.getCode() != tgtok::In) 2762 return TokError("Unknown tok"); 2763 Lex.Lex(); // Eat the in 2764 2765 // Create a loop object and remember it. 2766 Loops.push_back(llvm::make_unique<ForeachLoop>(Loc, IterName, ListValue)); 2767 2768 if (Lex.getCode() != tgtok::l_brace) { 2769 // FOREACH Declaration IN Object 2770 if (ParseObject(CurMultiClass)) 2771 return true; 2772 } else { 2773 SMLoc BraceLoc = Lex.getLoc(); 2774 // Otherwise, this is a group foreach. 2775 Lex.Lex(); // eat the '{'. 2776 2777 // Parse the object list. 2778 if (ParseObjectList(CurMultiClass)) 2779 return true; 2780 2781 if (Lex.getCode() != tgtok::r_brace) { 2782 TokError("expected '}' at end of foreach command"); 2783 return Error(BraceLoc, "to match this '{'"); 2784 } 2785 Lex.Lex(); // Eat the } 2786 } 2787 2788 // Resolve the loop or store it for later resolution. 2789 std::unique_ptr<ForeachLoop> Loop = std::move(Loops.back()); 2790 Loops.pop_back(); 2791 2792 return addEntry(std::move(Loop)); 2793 } 2794 2795 /// ParseClass - Parse a tblgen class definition. 2796 /// 2797 /// ClassInst ::= CLASS ID TemplateArgList? ObjectBody 2798 /// 2799 bool TGParser::ParseClass() { 2800 assert(Lex.getCode() == tgtok::Class && "Unexpected token!"); 2801 Lex.Lex(); 2802 2803 if (Lex.getCode() != tgtok::Id) 2804 return TokError("expected class name after 'class' keyword"); 2805 2806 Record *CurRec = Records.getClass(Lex.getCurStrVal()); 2807 if (CurRec) { 2808 // If the body was previously defined, this is an error. 2809 if (!CurRec->getValues().empty() || 2810 !CurRec->getSuperClasses().empty() || 2811 !CurRec->getTemplateArgs().empty()) 2812 return TokError("Class '" + CurRec->getNameInitAsString() + 2813 "' already defined"); 2814 } else { 2815 // If this is the first reference to this class, create and add it. 2816 auto NewRec = 2817 llvm::make_unique<Record>(Lex.getCurStrVal(), Lex.getLoc(), Records, 2818 /*Class=*/true); 2819 CurRec = NewRec.get(); 2820 Records.addClass(std::move(NewRec)); 2821 } 2822 Lex.Lex(); // eat the name. 2823 2824 // If there are template args, parse them. 2825 if (Lex.getCode() == tgtok::less) 2826 if (ParseTemplateArgList(CurRec)) 2827 return true; 2828 2829 return ParseObjectBody(CurRec); 2830 } 2831 2832 /// ParseLetList - Parse a non-empty list of assignment expressions into a list 2833 /// of LetRecords. 2834 /// 2835 /// LetList ::= LetItem (',' LetItem)* 2836 /// LetItem ::= ID OptionalRangeList '=' Value 2837 /// 2838 void TGParser::ParseLetList(SmallVectorImpl<LetRecord> &Result) { 2839 while (true) { 2840 if (Lex.getCode() != tgtok::Id) { 2841 TokError("expected identifier in let definition"); 2842 Result.clear(); 2843 return; 2844 } 2845 2846 StringInit *Name = StringInit::get(Lex.getCurStrVal()); 2847 SMLoc NameLoc = Lex.getLoc(); 2848 Lex.Lex(); // Eat the identifier. 2849 2850 // Check for an optional RangeList. 2851 SmallVector<unsigned, 16> Bits; 2852 if (ParseOptionalRangeList(Bits)) { 2853 Result.clear(); 2854 return; 2855 } 2856 std::reverse(Bits.begin(), Bits.end()); 2857 2858 if (Lex.getCode() != tgtok::equal) { 2859 TokError("expected '=' in let expression"); 2860 Result.clear(); 2861 return; 2862 } 2863 Lex.Lex(); // eat the '='. 2864 2865 Init *Val = ParseValue(nullptr); 2866 if (!Val) { 2867 Result.clear(); 2868 return; 2869 } 2870 2871 // Now that we have everything, add the record. 2872 Result.emplace_back(Name, Bits, Val, NameLoc); 2873 2874 if (Lex.getCode() != tgtok::comma) 2875 return; 2876 Lex.Lex(); // eat the comma. 2877 } 2878 } 2879 2880 /// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of 2881 /// different related productions. This works inside multiclasses too. 2882 /// 2883 /// Object ::= LET LetList IN '{' ObjectList '}' 2884 /// Object ::= LET LetList IN Object 2885 /// 2886 bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) { 2887 assert(Lex.getCode() == tgtok::Let && "Unexpected token"); 2888 Lex.Lex(); 2889 2890 // Add this entry to the let stack. 2891 SmallVector<LetRecord, 8> LetInfo; 2892 ParseLetList(LetInfo); 2893 if (LetInfo.empty()) return true; 2894 LetStack.push_back(std::move(LetInfo)); 2895 2896 if (Lex.getCode() != tgtok::In) 2897 return TokError("expected 'in' at end of top-level 'let'"); 2898 Lex.Lex(); 2899 2900 // If this is a scalar let, just handle it now 2901 if (Lex.getCode() != tgtok::l_brace) { 2902 // LET LetList IN Object 2903 if (ParseObject(CurMultiClass)) 2904 return true; 2905 } else { // Object ::= LETCommand '{' ObjectList '}' 2906 SMLoc BraceLoc = Lex.getLoc(); 2907 // Otherwise, this is a group let. 2908 Lex.Lex(); // eat the '{'. 2909 2910 // Parse the object list. 2911 if (ParseObjectList(CurMultiClass)) 2912 return true; 2913 2914 if (Lex.getCode() != tgtok::r_brace) { 2915 TokError("expected '}' at end of top level let command"); 2916 return Error(BraceLoc, "to match this '{'"); 2917 } 2918 Lex.Lex(); 2919 } 2920 2921 // Outside this let scope, this let block is not active. 2922 LetStack.pop_back(); 2923 return false; 2924 } 2925 2926 /// ParseMultiClass - Parse a multiclass definition. 2927 /// 2928 /// MultiClassInst ::= MULTICLASS ID TemplateArgList? 2929 /// ':' BaseMultiClassList '{' MultiClassObject+ '}' 2930 /// MultiClassObject ::= DefInst 2931 /// MultiClassObject ::= MultiClassInst 2932 /// MultiClassObject ::= DefMInst 2933 /// MultiClassObject ::= LETCommand '{' ObjectList '}' 2934 /// MultiClassObject ::= LETCommand Object 2935 /// 2936 bool TGParser::ParseMultiClass() { 2937 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token"); 2938 Lex.Lex(); // Eat the multiclass token. 2939 2940 if (Lex.getCode() != tgtok::Id) 2941 return TokError("expected identifier after multiclass for name"); 2942 std::string Name = Lex.getCurStrVal(); 2943 2944 auto Result = 2945 MultiClasses.insert(std::make_pair(Name, 2946 llvm::make_unique<MultiClass>(Name, Lex.getLoc(),Records))); 2947 2948 if (!Result.second) 2949 return TokError("multiclass '" + Name + "' already defined"); 2950 2951 CurMultiClass = Result.first->second.get(); 2952 Lex.Lex(); // Eat the identifier. 2953 2954 // If there are template args, parse them. 2955 if (Lex.getCode() == tgtok::less) 2956 if (ParseTemplateArgList(nullptr)) 2957 return true; 2958 2959 bool inherits = false; 2960 2961 // If there are submulticlasses, parse them. 2962 if (Lex.getCode() == tgtok::colon) { 2963 inherits = true; 2964 2965 Lex.Lex(); 2966 2967 // Read all of the submulticlasses. 2968 SubMultiClassReference SubMultiClass = 2969 ParseSubMultiClassReference(CurMultiClass); 2970 while (true) { 2971 // Check for error. 2972 if (!SubMultiClass.MC) return true; 2973 2974 // Add it. 2975 if (AddSubMultiClass(CurMultiClass, SubMultiClass)) 2976 return true; 2977 2978 if (Lex.getCode() != tgtok::comma) break; 2979 Lex.Lex(); // eat ','. 2980 SubMultiClass = ParseSubMultiClassReference(CurMultiClass); 2981 } 2982 } 2983 2984 if (Lex.getCode() != tgtok::l_brace) { 2985 if (!inherits) 2986 return TokError("expected '{' in multiclass definition"); 2987 if (Lex.getCode() != tgtok::semi) 2988 return TokError("expected ';' in multiclass definition"); 2989 Lex.Lex(); // eat the ';'. 2990 } else { 2991 if (Lex.Lex() == tgtok::r_brace) // eat the '{'. 2992 return TokError("multiclass must contain at least one def"); 2993 2994 while (Lex.getCode() != tgtok::r_brace) { 2995 switch (Lex.getCode()) { 2996 default: 2997 return TokError("expected 'let', 'def', 'defm' or 'foreach' in " 2998 "multiclass body"); 2999 case tgtok::Let: 3000 case tgtok::Def: 3001 case tgtok::Defm: 3002 case tgtok::Foreach: 3003 if (ParseObject(CurMultiClass)) 3004 return true; 3005 break; 3006 } 3007 } 3008 Lex.Lex(); // eat the '}'. 3009 } 3010 3011 CurMultiClass = nullptr; 3012 return false; 3013 } 3014 3015 /// ParseDefm - Parse the instantiation of a multiclass. 3016 /// 3017 /// DefMInst ::= DEFM ID ':' DefmSubClassRef ';' 3018 /// 3019 bool TGParser::ParseDefm(MultiClass *CurMultiClass) { 3020 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!"); 3021 Lex.Lex(); // eat the defm 3022 3023 Init *DefmName = ParseObjectName(CurMultiClass); 3024 if (!DefmName) 3025 return true; 3026 if (isa<UnsetInit>(DefmName)) { 3027 DefmName = Records.getNewAnonymousName(); 3028 if (CurMultiClass) 3029 DefmName = BinOpInit::getStrConcat( 3030 VarInit::get(QualifiedNameOfImplicitName(CurMultiClass), 3031 StringRecTy::get()), 3032 DefmName); 3033 } 3034 3035 if (Lex.getCode() != tgtok::colon) 3036 return TokError("expected ':' after defm identifier"); 3037 3038 // Keep track of the new generated record definitions. 3039 std::vector<RecordsEntry> NewEntries; 3040 3041 // This record also inherits from a regular class (non-multiclass)? 3042 bool InheritFromClass = false; 3043 3044 // eat the colon. 3045 Lex.Lex(); 3046 3047 SMLoc SubClassLoc = Lex.getLoc(); 3048 SubClassReference Ref = ParseSubClassReference(nullptr, true); 3049 3050 while (true) { 3051 if (!Ref.Rec) return true; 3052 3053 // To instantiate a multiclass, we need to first get the multiclass, then 3054 // instantiate each def contained in the multiclass with the SubClassRef 3055 // template parameters. 3056 MultiClass *MC = MultiClasses[Ref.Rec->getName()].get(); 3057 assert(MC && "Didn't lookup multiclass correctly?"); 3058 ArrayRef<Init*> TemplateVals = Ref.TemplateArgs; 3059 3060 // Verify that the correct number of template arguments were specified. 3061 ArrayRef<Init *> TArgs = MC->Rec.getTemplateArgs(); 3062 if (TArgs.size() < TemplateVals.size()) 3063 return Error(SubClassLoc, 3064 "more template args specified than multiclass expects"); 3065 3066 SubstStack Substs; 3067 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { 3068 if (i < TemplateVals.size()) { 3069 Substs.emplace_back(TArgs[i], TemplateVals[i]); 3070 } else { 3071 Init *Default = MC->Rec.getValue(TArgs[i])->getValue(); 3072 if (!Default->isComplete()) { 3073 return Error(SubClassLoc, 3074 "value not specified for template argument #" + 3075 Twine(i) + " (" + TArgs[i]->getAsUnquotedString() + 3076 ") of multiclass '" + MC->Rec.getNameInitAsString() + 3077 "'"); 3078 } 3079 Substs.emplace_back(TArgs[i], Default); 3080 } 3081 } 3082 3083 Substs.emplace_back(QualifiedNameOfImplicitName(MC), DefmName); 3084 3085 if (resolve(MC->Entries, Substs, CurMultiClass == nullptr, &NewEntries, 3086 &SubClassLoc)) 3087 return true; 3088 3089 if (Lex.getCode() != tgtok::comma) break; 3090 Lex.Lex(); // eat ','. 3091 3092 if (Lex.getCode() != tgtok::Id) 3093 return TokError("expected identifier"); 3094 3095 SubClassLoc = Lex.getLoc(); 3096 3097 // A defm can inherit from regular classes (non-multiclass) as 3098 // long as they come in the end of the inheritance list. 3099 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != nullptr); 3100 3101 if (InheritFromClass) 3102 break; 3103 3104 Ref = ParseSubClassReference(nullptr, true); 3105 } 3106 3107 if (InheritFromClass) { 3108 // Process all the classes to inherit as if they were part of a 3109 // regular 'def' and inherit all record values. 3110 SubClassReference SubClass = ParseSubClassReference(nullptr, false); 3111 while (true) { 3112 // Check for error. 3113 if (!SubClass.Rec) return true; 3114 3115 // Get the expanded definition prototypes and teach them about 3116 // the record values the current class to inherit has 3117 for (auto &E : NewEntries) { 3118 // Add it. 3119 if (AddSubClass(E, SubClass)) 3120 return true; 3121 } 3122 3123 if (Lex.getCode() != tgtok::comma) break; 3124 Lex.Lex(); // eat ','. 3125 SubClass = ParseSubClassReference(nullptr, false); 3126 } 3127 } 3128 3129 for (auto &E : NewEntries) { 3130 if (ApplyLetStack(E)) 3131 return true; 3132 3133 addEntry(std::move(E)); 3134 } 3135 3136 if (Lex.getCode() != tgtok::semi) 3137 return TokError("expected ';' at end of defm"); 3138 Lex.Lex(); 3139 3140 return false; 3141 } 3142 3143 /// ParseObject 3144 /// Object ::= ClassInst 3145 /// Object ::= DefInst 3146 /// Object ::= MultiClassInst 3147 /// Object ::= DefMInst 3148 /// Object ::= LETCommand '{' ObjectList '}' 3149 /// Object ::= LETCommand Object 3150 bool TGParser::ParseObject(MultiClass *MC) { 3151 switch (Lex.getCode()) { 3152 default: 3153 return TokError("Expected class, def, defm, defset, multiclass, let or " 3154 "foreach"); 3155 case tgtok::Let: return ParseTopLevelLet(MC); 3156 case tgtok::Def: return ParseDef(MC); 3157 case tgtok::Foreach: return ParseForeach(MC); 3158 case tgtok::Defm: return ParseDefm(MC); 3159 case tgtok::Defset: 3160 if (MC) 3161 return TokError("defset is not allowed inside multiclass"); 3162 return ParseDefset(); 3163 case tgtok::Class: 3164 if (MC) 3165 return TokError("class is not allowed inside multiclass"); 3166 if (!Loops.empty()) 3167 return TokError("class is not allowed inside foreach loop"); 3168 return ParseClass(); 3169 case tgtok::MultiClass: 3170 if (!Loops.empty()) 3171 return TokError("multiclass is not allowed inside foreach loop"); 3172 return ParseMultiClass(); 3173 } 3174 } 3175 3176 /// ParseObjectList 3177 /// ObjectList :== Object* 3178 bool TGParser::ParseObjectList(MultiClass *MC) { 3179 while (isObjectStart(Lex.getCode())) { 3180 if (ParseObject(MC)) 3181 return true; 3182 } 3183 return false; 3184 } 3185 3186 bool TGParser::ParseFile() { 3187 Lex.Lex(); // Prime the lexer. 3188 if (ParseObjectList()) return true; 3189 3190 // If we have unread input at the end of the file, report it. 3191 if (Lex.getCode() == tgtok::Eof) 3192 return false; 3193 3194 return TokError("Unexpected input at top level"); 3195 } 3196 3197 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 3198 LLVM_DUMP_METHOD void RecordsEntry::dump() const { 3199 if (Loop) 3200 Loop->dump(); 3201 if (Rec) 3202 Rec->dump(); 3203 } 3204 3205 LLVM_DUMP_METHOD void ForeachLoop::dump() const { 3206 errs() << "foreach " << IterVar->getAsString() << " = " 3207 << ListValue->getAsString() << " in {\n"; 3208 3209 for (const auto &E : Entries) 3210 E.dump(); 3211 3212 errs() << "}\n"; 3213 } 3214 3215 LLVM_DUMP_METHOD void MultiClass::dump() const { 3216 errs() << "Record:\n"; 3217 Rec.dump(); 3218 3219 errs() << "Defs:\n"; 3220 for (const auto &E : Entries) 3221 E.dump(); 3222 } 3223 #endif 3224