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/SmallVector.h" 15 #include "llvm/ADT/StringExtras.h" 16 #include "llvm/ADT/Twine.h" 17 #include "llvm/Config/llvm-config.h" 18 #include "llvm/Support/Casting.h" 19 #include "llvm/Support/Compiler.h" 20 #include "llvm/Support/ErrorHandling.h" 21 #include "llvm/Support/raw_ostream.h" 22 #include <algorithm> 23 #include <cassert> 24 #include <cstdint> 25 #include <limits> 26 27 using namespace llvm; 28 29 //===----------------------------------------------------------------------===// 30 // Support Code for the Semantic Actions. 31 //===----------------------------------------------------------------------===// 32 33 namespace llvm { 34 35 struct SubClassReference { 36 SMRange RefRange; 37 const Record *Rec = nullptr; 38 SmallVector<const ArgumentInit *, 4> TemplateArgs; 39 40 SubClassReference() = default; 41 42 bool isInvalid() const { return Rec == nullptr; } 43 }; 44 45 struct SubMultiClassReference { 46 SMRange RefRange; 47 MultiClass *MC = nullptr; 48 SmallVector<const ArgumentInit *, 4> TemplateArgs; 49 50 SubMultiClassReference() = default; 51 52 bool isInvalid() const { return MC == nullptr; } 53 void dump() const; 54 }; 55 56 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 57 LLVM_DUMP_METHOD void SubMultiClassReference::dump() const { 58 errs() << "Multiclass:\n"; 59 60 MC->dump(); 61 62 errs() << "Template args:\n"; 63 for (const Init *TA : TemplateArgs) 64 TA->dump(); 65 } 66 #endif 67 68 } // end namespace llvm 69 70 static bool checkBitsConcrete(Record &R, const RecordVal &RV) { 71 const auto *BV = cast<BitsInit>(RV.getValue()); 72 for (unsigned i = 0, e = BV->getNumBits(); i != e; ++i) { 73 const Init *Bit = BV->getBit(i); 74 bool IsReference = false; 75 if (const auto *VBI = dyn_cast<VarBitInit>(Bit)) { 76 if (const auto *VI = dyn_cast<VarInit>(VBI->getBitVar())) { 77 if (R.getValue(VI->getName())) 78 IsReference = true; 79 } 80 } else if (isa<VarInit>(Bit)) { 81 IsReference = true; 82 } 83 if (!(IsReference || Bit->isConcrete())) 84 return false; 85 } 86 return true; 87 } 88 89 static void checkConcrete(Record &R) { 90 for (const RecordVal &RV : R.getValues()) { 91 // HACK: Disable this check for variables declared with 'field'. This is 92 // done merely because existing targets have legitimate cases of 93 // non-concrete variables in helper defs. Ideally, we'd introduce a 94 // 'maybe' or 'optional' modifier instead of this. 95 if (RV.isNonconcreteOK()) 96 continue; 97 98 if (const Init *V = RV.getValue()) { 99 bool Ok = isa<BitsInit>(V) ? checkBitsConcrete(R, RV) : V->isConcrete(); 100 if (!Ok) { 101 PrintError(R.getLoc(), 102 Twine("Initializer of '") + RV.getNameInitAsString() + 103 "' in '" + R.getNameInitAsString() + 104 "' could not be fully resolved: " + 105 RV.getValue()->getAsString()); 106 } 107 } 108 } 109 } 110 111 /// Return an Init with a qualifier prefix referring 112 /// to CurRec's name. 113 static const Init *QualifyName(const Record &CurRec, const Init *Name) { 114 RecordKeeper &RK = CurRec.getRecords(); 115 const Init *NewName = BinOpInit::getStrConcat( 116 CurRec.getNameInit(), 117 StringInit::get(RK, CurRec.isMultiClass() ? "::" : ":")); 118 NewName = BinOpInit::getStrConcat(NewName, Name); 119 120 if (const auto *BinOp = dyn_cast<BinOpInit>(NewName)) 121 NewName = BinOp->Fold(&CurRec); 122 return NewName; 123 } 124 125 static const Init *QualifyName(MultiClass *MC, const Init *Name) { 126 return QualifyName(MC->Rec, Name); 127 } 128 129 /// Return the qualified version of the implicit 'NAME' template argument. 130 static const Init *QualifiedNameOfImplicitName(const Record &Rec) { 131 return QualifyName(Rec, StringInit::get(Rec.getRecords(), "NAME")); 132 } 133 134 static const Init *QualifiedNameOfImplicitName(MultiClass *MC) { 135 return QualifiedNameOfImplicitName(MC->Rec); 136 } 137 138 const Init *TGVarScope::getVar(RecordKeeper &Records, 139 MultiClass *ParsingMultiClass, 140 const StringInit *Name, SMRange NameLoc, 141 bool TrackReferenceLocs) const { 142 // First, we search in local variables. 143 auto It = Vars.find(Name->getValue()); 144 if (It != Vars.end()) 145 return It->second; 146 147 auto FindValueInArgs = [&](Record *Rec, 148 const StringInit *Name) -> const Init * { 149 if (!Rec) 150 return nullptr; 151 const Init *ArgName = QualifyName(*Rec, Name); 152 if (Rec->isTemplateArg(ArgName)) { 153 RecordVal *RV = Rec->getValue(ArgName); 154 assert(RV && "Template arg doesn't exist??"); 155 RV->setUsed(true); 156 if (TrackReferenceLocs) 157 RV->addReferenceLoc(NameLoc); 158 return VarInit::get(ArgName, RV->getType()); 159 } 160 return Name->getValue() == "NAME" 161 ? VarInit::get(ArgName, StringRecTy::get(Records)) 162 : nullptr; 163 }; 164 165 // If not found, we try to find the variable in additional variables like 166 // arguments, loop iterator, etc. 167 switch (Kind) { 168 case SK_Local: 169 break; /* do nothing. */ 170 case SK_Record: { 171 if (CurRec) { 172 // The variable is a record field? 173 if (RecordVal *RV = CurRec->getValue(Name)) { 174 if (TrackReferenceLocs) 175 RV->addReferenceLoc(NameLoc); 176 return VarInit::get(Name, RV->getType()); 177 } 178 179 // The variable is a class template argument? 180 if (CurRec->isClass()) 181 if (auto *V = FindValueInArgs(CurRec, Name)) 182 return V; 183 } 184 break; 185 } 186 case SK_ForeachLoop: { 187 // The variable is a loop iterator? 188 if (CurLoop->IterVar) { 189 const auto *IterVar = dyn_cast<VarInit>(CurLoop->IterVar); 190 if (IterVar && IterVar->getNameInit() == Name) 191 return IterVar; 192 } 193 break; 194 } 195 case SK_MultiClass: { 196 // The variable is a multiclass template argument? 197 if (CurMultiClass) 198 if (auto *V = FindValueInArgs(&CurMultiClass->Rec, Name)) 199 return V; 200 break; 201 } 202 } 203 204 // Then, we try to find the name in parent scope. 205 if (Parent) 206 return Parent->getVar(Records, ParsingMultiClass, Name, NameLoc, 207 TrackReferenceLocs); 208 209 return nullptr; 210 } 211 212 bool TGParser::AddValue(Record *CurRec, SMLoc Loc, const RecordVal &RV) { 213 if (!CurRec) 214 CurRec = &CurMultiClass->Rec; 215 216 if (RecordVal *ERV = CurRec->getValue(RV.getNameInit())) { 217 // The value already exists in the class, treat this as a set. 218 if (ERV->setValue(RV.getValue())) 219 return Error(Loc, "New definition of '" + RV.getName() + "' of type '" + 220 RV.getType()->getAsString() + "' is incompatible with " + 221 "previous definition of type '" + 222 ERV->getType()->getAsString() + "'"); 223 } else { 224 CurRec->addValue(RV); 225 } 226 return false; 227 } 228 229 /// SetValue - 230 /// Return true on error, false on success. 231 bool TGParser::SetValue(Record *CurRec, SMLoc Loc, const Init *ValName, 232 ArrayRef<unsigned> BitList, const Init *V, 233 bool AllowSelfAssignment, bool OverrideDefLoc) { 234 if (!V) return false; 235 236 if (!CurRec) CurRec = &CurMultiClass->Rec; 237 238 RecordVal *RV = CurRec->getValue(ValName); 239 if (!RV) 240 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + 241 "' unknown!"); 242 243 // Do not allow assignments like 'X = X'. This will just cause infinite loops 244 // in the resolution machinery. 245 if (BitList.empty()) 246 if (const auto *VI = dyn_cast<VarInit>(V)) 247 if (VI->getNameInit() == ValName && !AllowSelfAssignment) 248 return Error(Loc, "Recursion / self-assignment forbidden"); 249 250 // If we are assigning to a subset of the bits in the value... then we must be 251 // assigning to a field of BitsRecTy, which must have a BitsInit 252 // initializer. 253 // 254 if (!BitList.empty()) { 255 const auto *CurVal = dyn_cast<BitsInit>(RV->getValue()); 256 if (!CurVal) 257 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + 258 "' is not a bits type"); 259 260 // Convert the incoming value to a bits type of the appropriate size... 261 const Init *BI = V->getCastTo(BitsRecTy::get(Records, BitList.size())); 262 if (!BI) 263 return Error(Loc, "Initializer is not compatible with bit range"); 264 265 SmallVector<const Init *, 16> NewBits(CurVal->getNumBits()); 266 267 // Loop over bits, assigning values as appropriate. 268 for (unsigned i = 0, e = BitList.size(); i != e; ++i) { 269 unsigned Bit = BitList[i]; 270 if (NewBits[Bit]) 271 return Error(Loc, "Cannot set bit #" + Twine(Bit) + " of value '" + 272 ValName->getAsUnquotedString() + "' more than once"); 273 NewBits[Bit] = BI->getBit(i); 274 } 275 276 for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i) 277 if (!NewBits[i]) 278 NewBits[i] = CurVal->getBit(i); 279 280 V = BitsInit::get(Records, NewBits); 281 } 282 283 if (OverrideDefLoc ? RV->setValue(V, Loc) : RV->setValue(V)) { 284 std::string InitType; 285 if (const auto *BI = dyn_cast<BitsInit>(V)) 286 InitType = (Twine("' of type bit initializer with length ") + 287 Twine(BI->getNumBits())).str(); 288 else if (const auto *TI = dyn_cast<TypedInit>(V)) 289 InitType = 290 (Twine("' of type '") + TI->getType()->getAsString() + "'").str(); 291 292 return Error(Loc, "Field '" + ValName->getAsUnquotedString() + 293 "' of type '" + RV->getType()->getAsString() + 294 "' is incompatible with value '" + V->getAsString() + 295 InitType); 296 } 297 return false; 298 } 299 300 /// AddSubClass - Add SubClass as a subclass to CurRec, resolving its template 301 /// args as SubClass's template arguments. 302 bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) { 303 const Record *SC = SubClass.Rec; 304 MapResolver R(CurRec); 305 306 // Loop over all the subclass record's fields. Add regular fields to the new 307 // record. 308 for (const RecordVal &Field : SC->getValues()) 309 if (!Field.isTemplateArg()) 310 if (AddValue(CurRec, SubClass.RefRange.Start, Field)) 311 return true; 312 313 if (resolveArgumentsOfClass(R, SC, SubClass.TemplateArgs, 314 SubClass.RefRange.Start)) 315 return true; 316 317 // Copy the subclass record's assertions to the new record. 318 CurRec->appendAssertions(SC); 319 320 // Copy the subclass record's dumps to the new record. 321 CurRec->appendDumps(SC); 322 323 const Init *Name; 324 if (CurRec->isClass()) 325 Name = VarInit::get(QualifiedNameOfImplicitName(*CurRec), 326 StringRecTy::get(Records)); 327 else 328 Name = CurRec->getNameInit(); 329 R.set(QualifiedNameOfImplicitName(*SC), Name); 330 331 CurRec->resolveReferences(R); 332 333 // Since everything went well, we can now set the "superclass" list for the 334 // current record. 335 for (const auto &[SC, Loc] : SC->getSuperClasses()) { 336 if (CurRec->isSubClassOf(SC)) 337 return Error(SubClass.RefRange.Start, 338 "Already subclass of '" + SC->getName() + "'!\n"); 339 CurRec->addSuperClass(SC, Loc); 340 } 341 342 if (CurRec->isSubClassOf(SC)) 343 return Error(SubClass.RefRange.Start, 344 "Already subclass of '" + SC->getName() + "'!\n"); 345 CurRec->addSuperClass(SC, SubClass.RefRange); 346 return false; 347 } 348 349 bool TGParser::AddSubClass(RecordsEntry &Entry, SubClassReference &SubClass) { 350 if (Entry.Rec) 351 return AddSubClass(Entry.Rec.get(), SubClass); 352 353 if (Entry.Assertion) 354 return false; 355 356 for (auto &E : Entry.Loop->Entries) { 357 if (AddSubClass(E, SubClass)) 358 return true; 359 } 360 361 return false; 362 } 363 364 /// AddSubMultiClass - Add SubMultiClass as a subclass to 365 /// CurMC, resolving its template args as SubMultiClass's 366 /// template arguments. 367 bool TGParser::AddSubMultiClass(MultiClass *CurMC, 368 SubMultiClassReference &SubMultiClass) { 369 MultiClass *SMC = SubMultiClass.MC; 370 371 SubstStack Substs; 372 if (resolveArgumentsOfMultiClass( 373 Substs, SMC, SubMultiClass.TemplateArgs, 374 VarInit::get(QualifiedNameOfImplicitName(CurMC), 375 StringRecTy::get(Records)), 376 SubMultiClass.RefRange.Start)) 377 return true; 378 379 // Add all of the defs in the subclass into the current multiclass. 380 return resolve(SMC->Entries, Substs, false, &CurMC->Entries); 381 } 382 383 /// Add a record, foreach loop, or assertion to the current context. 384 bool TGParser::addEntry(RecordsEntry E) { 385 assert((!!E.Rec + !!E.Loop + !!E.Assertion + !!E.Dump) == 1 && 386 "RecordsEntry has invalid number of items"); 387 388 // If we are parsing a loop, add it to the loop's entries. 389 if (!Loops.empty()) { 390 Loops.back()->Entries.push_back(std::move(E)); 391 return false; 392 } 393 394 // If it is a loop, then resolve and perform the loop. 395 if (E.Loop) { 396 SubstStack Stack; 397 return resolve(*E.Loop, Stack, CurMultiClass == nullptr, 398 CurMultiClass ? &CurMultiClass->Entries : nullptr); 399 } 400 401 // If we are parsing a multiclass, add it to the multiclass's entries. 402 if (CurMultiClass) { 403 CurMultiClass->Entries.push_back(std::move(E)); 404 return false; 405 } 406 407 // If it is an assertion, then it's a top-level one, so check it. 408 if (E.Assertion) { 409 CheckAssert(E.Assertion->Loc, E.Assertion->Condition, E.Assertion->Message); 410 return false; 411 } 412 413 if (E.Dump) { 414 dumpMessage(E.Dump->Loc, E.Dump->Message); 415 return false; 416 } 417 418 // It must be a record, so finish it off. 419 return addDefOne(std::move(E.Rec)); 420 } 421 422 /// Resolve the entries in \p Loop, going over inner loops recursively 423 /// and making the given subsitutions of (name, value) pairs. 424 /// 425 /// The resulting records are stored in \p Dest if non-null. Otherwise, they 426 /// are added to the global record keeper. 427 bool TGParser::resolve(const ForeachLoop &Loop, SubstStack &Substs, 428 bool Final, std::vector<RecordsEntry> *Dest, 429 SMLoc *Loc) { 430 431 MapResolver R; 432 for (const auto &S : Substs) 433 R.set(S.first, S.second); 434 const Init *List = Loop.ListValue->resolveReferences(R); 435 436 // For if-then-else blocks, we lower to a foreach loop whose list is a 437 // ternary selection between lists of different length. Since we don't 438 // have a means to track variable length record lists, we *must* resolve 439 // the condition here. We want to defer final resolution of the arms 440 // until the resulting records are finalized. 441 // e.g. !if(!exists<SchedWrite>("__does_not_exist__"), [1], []) 442 if (const auto *TI = dyn_cast<TernOpInit>(List); 443 TI && TI->getOpcode() == TernOpInit::IF && Final) { 444 const Init *OldLHS = TI->getLHS(); 445 R.setFinal(true); 446 const Init *LHS = OldLHS->resolveReferences(R); 447 if (LHS == OldLHS) { 448 PrintError(Loop.Loc, 449 Twine("unable to resolve if condition '") + 450 LHS->getAsString() + "' at end of containing scope"); 451 return true; 452 } 453 const Init *MHS = TI->getMHS(); 454 const Init *RHS = TI->getRHS(); 455 List = TernOpInit::get(TernOpInit::IF, LHS, MHS, RHS, TI->getType()) 456 ->Fold(nullptr); 457 } 458 459 const auto *LI = dyn_cast<ListInit>(List); 460 if (!LI) { 461 if (!Final) { 462 Dest->emplace_back(std::make_unique<ForeachLoop>(Loop.Loc, Loop.IterVar, 463 List)); 464 return resolve(Loop.Entries, Substs, Final, &Dest->back().Loop->Entries, 465 Loc); 466 } 467 468 PrintError(Loop.Loc, Twine("attempting to loop over '") + 469 List->getAsString() + "', expected a list"); 470 return true; 471 } 472 473 bool Error = false; 474 for (auto *Elt : *LI) { 475 if (Loop.IterVar) 476 Substs.emplace_back(Loop.IterVar->getNameInit(), Elt); 477 Error = resolve(Loop.Entries, Substs, Final, Dest); 478 if (Loop.IterVar) 479 Substs.pop_back(); 480 if (Error) 481 break; 482 } 483 return Error; 484 } 485 486 /// Resolve the entries in \p Source, going over loops recursively and 487 /// making the given substitutions of (name, value) pairs. 488 /// 489 /// The resulting records are stored in \p Dest if non-null. Otherwise, they 490 /// are added to the global record keeper. 491 bool TGParser::resolve(const std::vector<RecordsEntry> &Source, 492 SubstStack &Substs, bool Final, 493 std::vector<RecordsEntry> *Dest, SMLoc *Loc) { 494 bool Error = false; 495 for (auto &E : Source) { 496 if (E.Loop) { 497 Error = resolve(*E.Loop, Substs, Final, Dest); 498 499 } else if (E.Assertion) { 500 MapResolver R; 501 for (const auto &S : Substs) 502 R.set(S.first, S.second); 503 const Init *Condition = E.Assertion->Condition->resolveReferences(R); 504 const Init *Message = E.Assertion->Message->resolveReferences(R); 505 506 if (Dest) 507 Dest->push_back(std::make_unique<Record::AssertionInfo>( 508 E.Assertion->Loc, Condition, Message)); 509 else 510 CheckAssert(E.Assertion->Loc, Condition, Message); 511 512 } else if (E.Dump) { 513 MapResolver R; 514 for (const auto &S : Substs) 515 R.set(S.first, S.second); 516 const Init *Message = E.Dump->Message->resolveReferences(R); 517 518 if (Dest) 519 Dest->push_back( 520 std::make_unique<Record::DumpInfo>(E.Dump->Loc, Message)); 521 else 522 dumpMessage(E.Dump->Loc, Message); 523 524 } else { 525 auto Rec = std::make_unique<Record>(*E.Rec); 526 if (Loc) 527 Rec->appendLoc(*Loc); 528 529 MapResolver R(Rec.get()); 530 for (const auto &S : Substs) 531 R.set(S.first, S.second); 532 Rec->resolveReferences(R); 533 534 if (Dest) 535 Dest->push_back(std::move(Rec)); 536 else 537 Error = addDefOne(std::move(Rec)); 538 } 539 if (Error) 540 break; 541 } 542 return Error; 543 } 544 545 /// Resolve the record fully and add it to the record keeper. 546 bool TGParser::addDefOne(std::unique_ptr<Record> Rec) { 547 const Init *NewName = nullptr; 548 if (const Record *Prev = Records.getDef(Rec->getNameInitAsString())) { 549 if (!Rec->isAnonymous()) { 550 PrintError(Rec->getLoc(), 551 "def already exists: " + Rec->getNameInitAsString()); 552 PrintNote(Prev->getLoc(), "location of previous definition"); 553 return true; 554 } 555 NewName = Records.getNewAnonymousName(); 556 } 557 558 Rec->resolveReferences(NewName); 559 checkConcrete(*Rec); 560 561 if (!isa<StringInit>(Rec->getNameInit())) { 562 PrintError(Rec->getLoc(), Twine("record name '") + 563 Rec->getNameInit()->getAsString() + 564 "' could not be fully resolved"); 565 return true; 566 } 567 568 // Check the assertions. 569 Rec->checkRecordAssertions(); 570 571 // Run the dumps. 572 Rec->emitRecordDumps(); 573 574 // If ObjectBody has template arguments, it's an error. 575 assert(Rec->getTemplateArgs().empty() && "How'd this get template args?"); 576 577 for (DefsetRecord *Defset : Defsets) { 578 DefInit *I = Rec->getDefInit(); 579 if (!I->getType()->typeIsA(Defset->EltTy)) { 580 PrintError(Rec->getLoc(), Twine("adding record of incompatible type '") + 581 I->getType()->getAsString() + 582 "' to defset"); 583 PrintNote(Defset->Loc, "location of defset declaration"); 584 return true; 585 } 586 Defset->Elements.push_back(I); 587 } 588 589 Records.addDef(std::move(Rec)); 590 return false; 591 } 592 593 bool TGParser::resolveArguments(const Record *Rec, 594 ArrayRef<const ArgumentInit *> ArgValues, 595 SMLoc Loc, ArgValueHandler ArgValueHandler) { 596 ArrayRef<const Init *> ArgNames = Rec->getTemplateArgs(); 597 assert(ArgValues.size() <= ArgNames.size() && 598 "Too many template arguments allowed"); 599 600 // Loop over the template arguments and handle the (name, value) pair. 601 SmallVector<const Init *, 2> UnsolvedArgNames(ArgNames); 602 for (auto *Arg : ArgValues) { 603 const Init *ArgName = nullptr; 604 const Init *ArgValue = Arg->getValue(); 605 if (Arg->isPositional()) 606 ArgName = ArgNames[Arg->getIndex()]; 607 if (Arg->isNamed()) 608 ArgName = Arg->getName(); 609 610 // We can only specify the template argument once. 611 if (!is_contained(UnsolvedArgNames, ArgName)) 612 return Error(Loc, "We can only specify the template argument '" + 613 ArgName->getAsUnquotedString() + "' once"); 614 615 ArgValueHandler(ArgName, ArgValue); 616 llvm::erase(UnsolvedArgNames, ArgName); 617 } 618 619 // For unsolved arguments, if there is no default value, complain. 620 for (auto *UnsolvedArgName : UnsolvedArgNames) { 621 const Init *Default = Rec->getValue(UnsolvedArgName)->getValue(); 622 if (!Default->isComplete()) { 623 std::string Name = UnsolvedArgName->getAsUnquotedString(); 624 Error(Loc, "value not specified for template argument '" + Name + "'"); 625 PrintNote(Rec->getFieldLoc(Name), 626 "declared in '" + Rec->getNameInitAsString() + "'"); 627 return true; 628 } 629 ArgValueHandler(UnsolvedArgName, Default); 630 } 631 632 return false; 633 } 634 635 /// Resolve the arguments of class and set them to MapResolver. 636 /// Returns true if failed. 637 bool TGParser::resolveArgumentsOfClass(MapResolver &R, const Record *Rec, 638 ArrayRef<const ArgumentInit *> ArgValues, 639 SMLoc Loc) { 640 return resolveArguments( 641 Rec, ArgValues, Loc, 642 [&](const Init *Name, const Init *Value) { R.set(Name, Value); }); 643 } 644 645 /// Resolve the arguments of multiclass and store them into SubstStack. 646 /// Returns true if failed. 647 bool TGParser::resolveArgumentsOfMultiClass( 648 SubstStack &Substs, MultiClass *MC, 649 ArrayRef<const ArgumentInit *> ArgValues, const Init *DefmName, SMLoc Loc) { 650 // Add an implicit argument NAME. 651 Substs.emplace_back(QualifiedNameOfImplicitName(MC), DefmName); 652 return resolveArguments(&MC->Rec, ArgValues, Loc, 653 [&](const Init *Name, const Init *Value) { 654 Substs.emplace_back(Name, Value); 655 }); 656 } 657 658 //===----------------------------------------------------------------------===// 659 // Parser Code 660 //===----------------------------------------------------------------------===// 661 662 bool TGParser::consume(tgtok::TokKind K) { 663 if (Lex.getCode() == K) { 664 Lex.Lex(); 665 return true; 666 } 667 return false; 668 } 669 670 /// ParseObjectName - If a valid object name is specified, return it. If no 671 /// name is specified, return the unset initializer. Return nullptr on parse 672 /// error. 673 /// ObjectName ::= Value [ '#' Value ]* 674 /// ObjectName ::= /*empty*/ 675 /// 676 const Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) { 677 switch (Lex.getCode()) { 678 case tgtok::colon: 679 case tgtok::semi: 680 case tgtok::l_brace: 681 // These are all of the tokens that can begin an object body. 682 // Some of these can also begin values but we disallow those cases 683 // because they are unlikely to be useful. 684 return UnsetInit::get(Records); 685 default: 686 break; 687 } 688 689 Record *CurRec = nullptr; 690 if (CurMultiClass) 691 CurRec = &CurMultiClass->Rec; 692 693 const Init *Name = 694 ParseValue(CurRec, StringRecTy::get(Records), ParseNameMode); 695 if (!Name) 696 return nullptr; 697 698 if (CurMultiClass) { 699 const Init *NameStr = QualifiedNameOfImplicitName(CurMultiClass); 700 HasReferenceResolver R(NameStr); 701 Name->resolveReferences(R); 702 if (!R.found()) 703 Name = BinOpInit::getStrConcat( 704 VarInit::get(NameStr, StringRecTy::get(Records)), Name); 705 } 706 707 return Name; 708 } 709 710 /// ParseClassID - Parse and resolve a reference to a class name. This returns 711 /// null on error. 712 /// 713 /// ClassID ::= ID 714 /// 715 const Record *TGParser::ParseClassID() { 716 if (Lex.getCode() != tgtok::Id) { 717 TokError("expected name for ClassID"); 718 return nullptr; 719 } 720 721 const Record *Result = Records.getClass(Lex.getCurStrVal()); 722 if (!Result) { 723 std::string Msg("Couldn't find class '" + Lex.getCurStrVal() + "'"); 724 if (MultiClasses[Lex.getCurStrVal()].get()) 725 TokError(Msg + ". Use 'defm' if you meant to use multiclass '" + 726 Lex.getCurStrVal() + "'"); 727 else 728 TokError(Msg); 729 } else if (TrackReferenceLocs) { 730 Result->appendReferenceLoc(Lex.getLocRange()); 731 } 732 733 Lex.Lex(); 734 return Result; 735 } 736 737 /// ParseMultiClassID - Parse and resolve a reference to a multiclass name. 738 /// This returns null on error. 739 /// 740 /// MultiClassID ::= ID 741 /// 742 MultiClass *TGParser::ParseMultiClassID() { 743 if (Lex.getCode() != tgtok::Id) { 744 TokError("expected name for MultiClassID"); 745 return nullptr; 746 } 747 748 MultiClass *Result = MultiClasses[Lex.getCurStrVal()].get(); 749 if (!Result) 750 TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'"); 751 752 Lex.Lex(); 753 return Result; 754 } 755 756 /// ParseSubClassReference - Parse a reference to a subclass or a 757 /// multiclass. This returns a SubClassRefTy with a null Record* on error. 758 /// 759 /// SubClassRef ::= ClassID 760 /// SubClassRef ::= ClassID '<' ArgValueList '>' 761 /// 762 SubClassReference TGParser:: 763 ParseSubClassReference(Record *CurRec, bool isDefm) { 764 SubClassReference Result; 765 Result.RefRange.Start = Lex.getLoc(); 766 767 if (isDefm) { 768 if (MultiClass *MC = ParseMultiClassID()) 769 Result.Rec = &MC->Rec; 770 } else { 771 Result.Rec = ParseClassID(); 772 } 773 if (!Result.Rec) return Result; 774 775 // If there is no template arg list, we're done. 776 if (!consume(tgtok::less)) { 777 Result.RefRange.End = Lex.getLoc(); 778 return Result; 779 } 780 781 SmallVector<SMLoc> ArgLocs; 782 if (ParseTemplateArgValueList(Result.TemplateArgs, ArgLocs, CurRec, 783 Result.Rec)) { 784 Result.Rec = nullptr; // Error parsing value list. 785 return Result; 786 } 787 788 if (CheckTemplateArgValues(Result.TemplateArgs, ArgLocs, Result.Rec)) { 789 Result.Rec = nullptr; // Error checking value list. 790 return Result; 791 } 792 793 Result.RefRange.End = Lex.getLoc(); 794 return Result; 795 } 796 797 /// ParseSubMultiClassReference - Parse a reference to a subclass or to a 798 /// templated submulticlass. This returns a SubMultiClassRefTy with a null 799 /// Record* on error. 800 /// 801 /// SubMultiClassRef ::= MultiClassID 802 /// SubMultiClassRef ::= MultiClassID '<' ArgValueList '>' 803 /// 804 SubMultiClassReference TGParser:: 805 ParseSubMultiClassReference(MultiClass *CurMC) { 806 SubMultiClassReference Result; 807 Result.RefRange.Start = Lex.getLoc(); 808 809 Result.MC = ParseMultiClassID(); 810 if (!Result.MC) return Result; 811 812 // If there is no template arg list, we're done. 813 if (!consume(tgtok::less)) { 814 Result.RefRange.End = Lex.getLoc(); 815 return Result; 816 } 817 818 SmallVector<SMLoc> ArgLocs; 819 if (ParseTemplateArgValueList(Result.TemplateArgs, ArgLocs, &CurMC->Rec, 820 &Result.MC->Rec)) { 821 Result.MC = nullptr; // Error parsing value list. 822 return Result; 823 } 824 825 Result.RefRange.End = Lex.getLoc(); 826 827 return Result; 828 } 829 830 /// ParseSliceElement - Parse subscript or range 831 /// 832 /// SliceElement ::= Value<list<int>> 833 /// SliceElement ::= Value<int> 834 /// SliceElement ::= Value<int> '...' Value<int> 835 /// SliceElement ::= Value<int> '-' Value<int> (deprecated) 836 /// SliceElement ::= Value<int> INTVAL(Negative; deprecated) 837 /// 838 /// SliceElement is either IntRecTy, ListRecTy, or nullptr 839 /// 840 const TypedInit *TGParser::ParseSliceElement(Record *CurRec) { 841 auto LHSLoc = Lex.getLoc(); 842 auto *CurVal = ParseValue(CurRec); 843 if (!CurVal) 844 return nullptr; 845 const auto *LHS = cast<TypedInit>(CurVal); 846 847 const TypedInit *RHS = nullptr; 848 switch (Lex.getCode()) { 849 case tgtok::dotdotdot: 850 case tgtok::minus: { // Deprecated 851 Lex.Lex(); // eat 852 auto RHSLoc = Lex.getLoc(); 853 CurVal = ParseValue(CurRec); 854 if (!CurVal) 855 return nullptr; 856 RHS = cast<TypedInit>(CurVal); 857 if (!isa<IntRecTy>(RHS->getType())) { 858 Error(RHSLoc, 859 "expected int...int, got " + Twine(RHS->getType()->getAsString())); 860 return nullptr; 861 } 862 break; 863 } 864 case tgtok::IntVal: { // Deprecated "-num" 865 auto i = -Lex.getCurIntVal(); 866 if (i < 0) { 867 TokError("invalid range, cannot be negative"); 868 return nullptr; 869 } 870 RHS = IntInit::get(Records, i); 871 Lex.Lex(); // eat IntVal 872 break; 873 } 874 default: // Single value (IntRecTy or ListRecTy) 875 return LHS; 876 } 877 878 assert(RHS); 879 assert(isa<IntRecTy>(RHS->getType())); 880 881 // Closed-interval range <LHS:IntRecTy>...<RHS:IntRecTy> 882 if (!isa<IntRecTy>(LHS->getType())) { 883 Error(LHSLoc, 884 "expected int...int, got " + Twine(LHS->getType()->getAsString())); 885 return nullptr; 886 } 887 888 return cast<TypedInit>(BinOpInit::get(BinOpInit::RANGEC, LHS, RHS, 889 IntRecTy::get(Records)->getListTy()) 890 ->Fold(CurRec)); 891 } 892 893 /// ParseSliceElements - Parse subscripts in square brackets. 894 /// 895 /// SliceElements ::= ( SliceElement ',' )* SliceElement ','? 896 /// 897 /// SliceElement is either IntRecTy, ListRecTy, or nullptr 898 /// 899 /// Returns ListRecTy by defaut. 900 /// Returns IntRecTy if; 901 /// - Single=true 902 /// - SliceElements is Value<int> w/o trailing comma 903 /// 904 const TypedInit *TGParser::ParseSliceElements(Record *CurRec, bool Single) { 905 const TypedInit *CurVal; 906 SmallVector<const Init *, 2> Elems; // int 907 SmallVector<const TypedInit *, 2> Slices; // list<int> 908 909 auto FlushElems = [&] { 910 if (!Elems.empty()) { 911 Slices.push_back(ListInit::get(Elems, IntRecTy::get(Records))); 912 Elems.clear(); 913 } 914 }; 915 916 do { 917 auto LHSLoc = Lex.getLoc(); 918 CurVal = ParseSliceElement(CurRec); 919 if (!CurVal) 920 return nullptr; 921 auto *CurValTy = CurVal->getType(); 922 923 if (const auto *ListValTy = dyn_cast<ListRecTy>(CurValTy)) { 924 if (!isa<IntRecTy>(ListValTy->getElementType())) { 925 Error(LHSLoc, 926 "expected list<int>, got " + Twine(ListValTy->getAsString())); 927 return nullptr; 928 } 929 930 FlushElems(); 931 Slices.push_back(CurVal); 932 Single = false; 933 CurVal = nullptr; 934 } else if (!isa<IntRecTy>(CurValTy)) { 935 Error(LHSLoc, 936 "unhandled type " + Twine(CurValTy->getAsString()) + " in range"); 937 return nullptr; 938 } 939 940 if (Lex.getCode() != tgtok::comma) 941 break; 942 943 Lex.Lex(); // eat comma 944 945 // `[i,]` is not LISTELEM but LISTSLICE 946 Single = false; 947 if (CurVal) 948 Elems.push_back(CurVal); 949 CurVal = nullptr; 950 } while (Lex.getCode() != tgtok::r_square); 951 952 if (CurVal) { 953 // LISTELEM 954 if (Single) 955 return CurVal; 956 957 Elems.push_back(CurVal); 958 } 959 960 FlushElems(); 961 962 // Concatenate lists in Slices 963 const TypedInit *Result = nullptr; 964 for (auto *Slice : Slices) { 965 Result = (Result ? cast<TypedInit>(BinOpInit::getListConcat(Result, Slice)) 966 : Slice); 967 } 968 969 return Result; 970 } 971 972 /// ParseRangePiece - Parse a bit/value range. 973 /// RangePiece ::= INTVAL 974 /// RangePiece ::= INTVAL '...' INTVAL 975 /// RangePiece ::= INTVAL '-' INTVAL 976 /// RangePiece ::= INTVAL INTVAL 977 // The last two forms are deprecated. 978 bool TGParser::ParseRangePiece(SmallVectorImpl<unsigned> &Ranges, 979 const TypedInit *FirstItem) { 980 const Init *CurVal = FirstItem; 981 if (!CurVal) 982 CurVal = ParseValue(nullptr); 983 984 const auto *II = dyn_cast_or_null<IntInit>(CurVal); 985 if (!II) 986 return TokError("expected integer or bitrange"); 987 988 int64_t Start = II->getValue(); 989 int64_t End; 990 991 if (Start < 0) 992 return TokError("invalid range, cannot be negative"); 993 994 switch (Lex.getCode()) { 995 default: 996 Ranges.push_back(Start); 997 return false; 998 999 case tgtok::dotdotdot: 1000 case tgtok::minus: { 1001 Lex.Lex(); // eat 1002 1003 const Init *I_End = ParseValue(nullptr); 1004 const auto *II_End = dyn_cast_or_null<IntInit>(I_End); 1005 if (!II_End) { 1006 TokError("expected integer value as end of range"); 1007 return true; 1008 } 1009 1010 End = II_End->getValue(); 1011 break; 1012 } 1013 case tgtok::IntVal: { 1014 End = -Lex.getCurIntVal(); 1015 Lex.Lex(); 1016 break; 1017 } 1018 } 1019 if (End < 0) 1020 return TokError("invalid range, cannot be negative"); 1021 1022 // Add to the range. 1023 if (Start < End) 1024 for (; Start <= End; ++Start) 1025 Ranges.push_back(Start); 1026 else 1027 for (; Start >= End; --Start) 1028 Ranges.push_back(Start); 1029 return false; 1030 } 1031 1032 /// ParseRangeList - Parse a list of scalars and ranges into scalar values. 1033 /// 1034 /// RangeList ::= RangePiece (',' RangePiece)* 1035 /// 1036 void TGParser::ParseRangeList(SmallVectorImpl<unsigned> &Result) { 1037 // Parse the first piece. 1038 if (ParseRangePiece(Result)) { 1039 Result.clear(); 1040 return; 1041 } 1042 while (consume(tgtok::comma)) 1043 // Parse the next range piece. 1044 if (ParseRangePiece(Result)) { 1045 Result.clear(); 1046 return; 1047 } 1048 } 1049 1050 /// ParseOptionalRangeList - Parse either a range list in <>'s or nothing. 1051 /// OptionalRangeList ::= '<' RangeList '>' 1052 /// OptionalRangeList ::= /*empty*/ 1053 bool TGParser::ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges) { 1054 SMLoc StartLoc = Lex.getLoc(); 1055 if (!consume(tgtok::less)) 1056 return false; 1057 1058 // Parse the range list. 1059 ParseRangeList(Ranges); 1060 if (Ranges.empty()) return true; 1061 1062 if (!consume(tgtok::greater)) { 1063 TokError("expected '>' at end of range list"); 1064 return Error(StartLoc, "to match this '<'"); 1065 } 1066 return false; 1067 } 1068 1069 /// ParseOptionalBitList - Parse either a bit list in {}'s or nothing. 1070 /// OptionalBitList ::= '{' RangeList '}' 1071 /// OptionalBitList ::= /*empty*/ 1072 bool TGParser::ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges) { 1073 SMLoc StartLoc = Lex.getLoc(); 1074 if (!consume(tgtok::l_brace)) 1075 return false; 1076 1077 // Parse the range list. 1078 ParseRangeList(Ranges); 1079 if (Ranges.empty()) return true; 1080 1081 if (!consume(tgtok::r_brace)) { 1082 TokError("expected '}' at end of bit list"); 1083 return Error(StartLoc, "to match this '{'"); 1084 } 1085 return false; 1086 } 1087 1088 /// ParseType - Parse and return a tblgen type. This returns null on error. 1089 /// 1090 /// Type ::= STRING // string type 1091 /// Type ::= CODE // code type 1092 /// Type ::= BIT // bit type 1093 /// Type ::= BITS '<' INTVAL '>' // bits<x> type 1094 /// Type ::= INT // int type 1095 /// Type ::= LIST '<' Type '>' // list<x> type 1096 /// Type ::= DAG // dag type 1097 /// Type ::= ClassID // Record Type 1098 /// 1099 const RecTy *TGParser::ParseType() { 1100 switch (Lex.getCode()) { 1101 default: TokError("Unknown token when expecting a type"); return nullptr; 1102 case tgtok::String: 1103 case tgtok::Code: 1104 Lex.Lex(); 1105 return StringRecTy::get(Records); 1106 case tgtok::Bit: 1107 Lex.Lex(); 1108 return BitRecTy::get(Records); 1109 case tgtok::Int: 1110 Lex.Lex(); 1111 return IntRecTy::get(Records); 1112 case tgtok::Dag: 1113 Lex.Lex(); 1114 return DagRecTy::get(Records); 1115 case tgtok::Id: { 1116 auto I = TypeAliases.find(Lex.getCurStrVal()); 1117 if (I != TypeAliases.end()) { 1118 Lex.Lex(); 1119 return I->second; 1120 } 1121 if (const Record *R = ParseClassID()) 1122 return RecordRecTy::get(R); 1123 TokError("unknown class name"); 1124 return nullptr; 1125 } 1126 case tgtok::Bits: { 1127 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 1128 TokError("expected '<' after bits type"); 1129 return nullptr; 1130 } 1131 if (Lex.Lex() != tgtok::IntVal) { // Eat '<' 1132 TokError("expected integer in bits<n> type"); 1133 return nullptr; 1134 } 1135 uint64_t Val = Lex.getCurIntVal(); 1136 if (Lex.Lex() != tgtok::greater) { // Eat count. 1137 TokError("expected '>' at end of bits<n> type"); 1138 return nullptr; 1139 } 1140 Lex.Lex(); // Eat '>' 1141 return BitsRecTy::get(Records, Val); 1142 } 1143 case tgtok::List: { 1144 if (Lex.Lex() != tgtok::less) { // Eat 'bits' 1145 TokError("expected '<' after list type"); 1146 return nullptr; 1147 } 1148 Lex.Lex(); // Eat '<' 1149 const RecTy *SubType = ParseType(); 1150 if (!SubType) return nullptr; 1151 1152 if (!consume(tgtok::greater)) { 1153 TokError("expected '>' at end of list<ty> type"); 1154 return nullptr; 1155 } 1156 return ListRecTy::get(SubType); 1157 } 1158 } 1159 } 1160 1161 /// ParseIDValue 1162 const Init *TGParser::ParseIDValue(Record *CurRec, const StringInit *Name, 1163 SMRange NameLoc, IDParseMode Mode) { 1164 if (const Init *I = CurScope->getVar(Records, CurMultiClass, Name, NameLoc, 1165 TrackReferenceLocs)) 1166 return I; 1167 1168 if (Mode == ParseNameMode) 1169 return Name; 1170 1171 if (const Init *I = Records.getGlobal(Name->getValue())) { 1172 // Add a reference to the global if it's a record. 1173 if (TrackReferenceLocs) { 1174 if (const auto *Def = dyn_cast<DefInit>(I)) 1175 Def->getDef()->appendReferenceLoc(NameLoc); 1176 } 1177 return I; 1178 } 1179 1180 // Allow self-references of concrete defs, but delay the lookup so that we 1181 // get the correct type. 1182 if (CurRec && !CurRec->isClass() && !CurMultiClass && 1183 CurRec->getNameInit() == Name) 1184 return UnOpInit::get(UnOpInit::CAST, Name, CurRec->getType()); 1185 1186 Error(NameLoc.Start, "Variable not defined: '" + Name->getValue() + "'"); 1187 return nullptr; 1188 } 1189 1190 /// ParseOperation - Parse an operator. This returns null on error. 1191 /// 1192 /// Operation ::= XOperator ['<' Type '>'] '(' Args ')' 1193 /// 1194 const Init *TGParser::ParseOperation(Record *CurRec, const RecTy *ItemType) { 1195 switch (Lex.getCode()) { 1196 default: 1197 TokError("unknown bang operator"); 1198 return nullptr; 1199 case tgtok::XNOT: 1200 case tgtok::XToLower: 1201 case tgtok::XToUpper: 1202 case tgtok::XListFlatten: 1203 case tgtok::XLOG2: 1204 case tgtok::XHead: 1205 case tgtok::XTail: 1206 case tgtok::XSize: 1207 case tgtok::XEmpty: 1208 case tgtok::XCast: 1209 case tgtok::XRepr: 1210 case tgtok::XGetDagOp: 1211 case tgtok::XInitialized: { // Value ::= !unop '(' Value ')' 1212 UnOpInit::UnaryOp Code; 1213 const RecTy *Type = nullptr; 1214 1215 switch (Lex.getCode()) { 1216 default: llvm_unreachable("Unhandled code!"); 1217 case tgtok::XCast: 1218 Lex.Lex(); // eat the operation 1219 Code = UnOpInit::CAST; 1220 1221 Type = ParseOperatorType(); 1222 1223 if (!Type) { 1224 TokError("did not get type for unary operator"); 1225 return nullptr; 1226 } 1227 1228 break; 1229 case tgtok::XRepr: 1230 Lex.Lex(); // eat the operation 1231 Code = UnOpInit::REPR; 1232 Type = StringRecTy::get(Records); 1233 break; 1234 case tgtok::XToLower: 1235 Lex.Lex(); // eat the operation 1236 Code = UnOpInit::TOLOWER; 1237 Type = StringRecTy::get(Records); 1238 break; 1239 case tgtok::XToUpper: 1240 Lex.Lex(); // eat the operation 1241 Code = UnOpInit::TOUPPER; 1242 Type = StringRecTy::get(Records); 1243 break; 1244 case tgtok::XNOT: 1245 Lex.Lex(); // eat the operation 1246 Code = UnOpInit::NOT; 1247 Type = IntRecTy::get(Records); 1248 break; 1249 case tgtok::XListFlatten: 1250 Lex.Lex(); // eat the operation. 1251 Code = UnOpInit::LISTFLATTEN; 1252 Type = IntRecTy::get(Records); // Bogus type used here. 1253 break; 1254 case tgtok::XLOG2: 1255 Lex.Lex(); // eat the operation 1256 Code = UnOpInit::LOG2; 1257 Type = IntRecTy::get(Records); 1258 break; 1259 case tgtok::XHead: 1260 Lex.Lex(); // eat the operation 1261 Code = UnOpInit::HEAD; 1262 break; 1263 case tgtok::XTail: 1264 Lex.Lex(); // eat the operation 1265 Code = UnOpInit::TAIL; 1266 break; 1267 case tgtok::XSize: 1268 Lex.Lex(); 1269 Code = UnOpInit::SIZE; 1270 Type = IntRecTy::get(Records); 1271 break; 1272 case tgtok::XEmpty: 1273 Lex.Lex(); // eat the operation 1274 Code = UnOpInit::EMPTY; 1275 Type = IntRecTy::get(Records); 1276 break; 1277 case tgtok::XGetDagOp: 1278 Lex.Lex(); // eat the operation 1279 if (Lex.getCode() == tgtok::less) { 1280 // Parse an optional type suffix, so that you can say 1281 // !getdagop<BaseClass>(someDag) as a shorthand for 1282 // !cast<BaseClass>(!getdagop(someDag)). 1283 Type = ParseOperatorType(); 1284 1285 if (!Type) { 1286 TokError("did not get type for unary operator"); 1287 return nullptr; 1288 } 1289 1290 if (!isa<RecordRecTy>(Type)) { 1291 TokError("type for !getdagop must be a record type"); 1292 // but keep parsing, to consume the operand 1293 } 1294 } else { 1295 Type = RecordRecTy::get(Records, {}); 1296 } 1297 Code = UnOpInit::GETDAGOP; 1298 break; 1299 case tgtok::XInitialized: 1300 Lex.Lex(); // eat the operation 1301 Code = UnOpInit::INITIALIZED; 1302 Type = IntRecTy::get(Records); 1303 break; 1304 } 1305 if (!consume(tgtok::l_paren)) { 1306 TokError("expected '(' after unary operator"); 1307 return nullptr; 1308 } 1309 1310 const Init *LHS = ParseValue(CurRec); 1311 if (!LHS) return nullptr; 1312 1313 if (Code == UnOpInit::EMPTY || Code == UnOpInit::SIZE) { 1314 const auto *LHSl = dyn_cast<ListInit>(LHS); 1315 const auto *LHSs = dyn_cast<StringInit>(LHS); 1316 const auto *LHSd = dyn_cast<DagInit>(LHS); 1317 const auto *LHSt = dyn_cast<TypedInit>(LHS); 1318 if (!LHSl && !LHSs && !LHSd && !LHSt) { 1319 TokError("expected string, list, or dag type argument in unary operator"); 1320 return nullptr; 1321 } 1322 if (LHSt) { 1323 if (!isa<ListRecTy, StringRecTy, DagRecTy>(LHSt->getType())) { 1324 TokError("expected string, list, or dag type argument in unary operator"); 1325 return nullptr; 1326 } 1327 } 1328 } 1329 1330 if (Code == UnOpInit::HEAD || Code == UnOpInit::TAIL || 1331 Code == UnOpInit::LISTFLATTEN) { 1332 const auto *LHSl = dyn_cast<ListInit>(LHS); 1333 const auto *LHSt = dyn_cast<TypedInit>(LHS); 1334 if (!LHSl && !LHSt) { 1335 TokError("expected list type argument in unary operator"); 1336 return nullptr; 1337 } 1338 if (LHSt) { 1339 if (!isa<ListRecTy>(LHSt->getType())) { 1340 TokError("expected list type argument in unary operator"); 1341 return nullptr; 1342 } 1343 } 1344 1345 if (LHSl && LHSl->empty()) { 1346 TokError("empty list argument in unary operator"); 1347 return nullptr; 1348 } 1349 bool UseElementType = 1350 Code == UnOpInit::HEAD || Code == UnOpInit::LISTFLATTEN; 1351 if (LHSl) { 1352 const Init *Item = LHSl->getElement(0); 1353 const auto *Itemt = dyn_cast<TypedInit>(Item); 1354 if (!Itemt) { 1355 TokError("untyped list element in unary operator"); 1356 return nullptr; 1357 } 1358 Type = UseElementType ? Itemt->getType() 1359 : ListRecTy::get(Itemt->getType()); 1360 } else { 1361 assert(LHSt && "expected list type argument in unary operator"); 1362 const auto *LType = dyn_cast<ListRecTy>(LHSt->getType()); 1363 Type = UseElementType ? LType->getElementType() : LType; 1364 } 1365 1366 // for !listflatten, we expect a list of lists, but also support a list of 1367 // non-lists, where !listflatten will be a NOP. 1368 if (Code == UnOpInit::LISTFLATTEN) { 1369 const auto *InnerListTy = dyn_cast<ListRecTy>(Type); 1370 if (InnerListTy) { 1371 // listflatten will convert list<list<X>> to list<X>. 1372 Type = ListRecTy::get(InnerListTy->getElementType()); 1373 } else { 1374 // If its a list of non-lists, !listflatten will be a NOP. 1375 Type = ListRecTy::get(Type); 1376 } 1377 } 1378 } 1379 1380 if (!consume(tgtok::r_paren)) { 1381 TokError("expected ')' in unary operator"); 1382 return nullptr; 1383 } 1384 return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec); 1385 } 1386 1387 case tgtok::XIsA: { 1388 // Value ::= !isa '<' Type '>' '(' Value ')' 1389 Lex.Lex(); // eat the operation 1390 1391 const RecTy *Type = ParseOperatorType(); 1392 if (!Type) 1393 return nullptr; 1394 1395 if (!consume(tgtok::l_paren)) { 1396 TokError("expected '(' after type of !isa"); 1397 return nullptr; 1398 } 1399 1400 const Init *LHS = ParseValue(CurRec); 1401 if (!LHS) 1402 return nullptr; 1403 1404 if (!consume(tgtok::r_paren)) { 1405 TokError("expected ')' in !isa"); 1406 return nullptr; 1407 } 1408 1409 return IsAOpInit::get(Type, LHS)->Fold(); 1410 } 1411 1412 case tgtok::XExists: { 1413 // Value ::= !exists '<' Type '>' '(' Value ')' 1414 Lex.Lex(); // eat the operation. 1415 1416 const RecTy *Type = ParseOperatorType(); 1417 if (!Type) 1418 return nullptr; 1419 1420 if (!consume(tgtok::l_paren)) { 1421 TokError("expected '(' after type of !exists"); 1422 return nullptr; 1423 } 1424 1425 SMLoc ExprLoc = Lex.getLoc(); 1426 const Init *Expr = ParseValue(CurRec); 1427 if (!Expr) 1428 return nullptr; 1429 1430 const auto *ExprType = dyn_cast<TypedInit>(Expr); 1431 if (!ExprType) { 1432 Error(ExprLoc, "expected string type argument in !exists operator"); 1433 return nullptr; 1434 } 1435 1436 const auto *RecType = dyn_cast<RecordRecTy>(ExprType->getType()); 1437 if (RecType) { 1438 Error(ExprLoc, 1439 "expected string type argument in !exists operator, please " 1440 "use !isa instead"); 1441 return nullptr; 1442 } 1443 1444 const auto *SType = dyn_cast<StringRecTy>(ExprType->getType()); 1445 if (!SType) { 1446 Error(ExprLoc, "expected string type argument in !exists operator"); 1447 return nullptr; 1448 } 1449 1450 if (!consume(tgtok::r_paren)) { 1451 TokError("expected ')' in !exists"); 1452 return nullptr; 1453 } 1454 1455 return (ExistsOpInit::get(Type, Expr))->Fold(CurRec); 1456 } 1457 1458 case tgtok::XConcat: 1459 case tgtok::XADD: 1460 case tgtok::XSUB: 1461 case tgtok::XMUL: 1462 case tgtok::XDIV: 1463 case tgtok::XAND: 1464 case tgtok::XOR: 1465 case tgtok::XXOR: 1466 case tgtok::XSRA: 1467 case tgtok::XSRL: 1468 case tgtok::XSHL: 1469 case tgtok::XEq: 1470 case tgtok::XNe: 1471 case tgtok::XLe: 1472 case tgtok::XLt: 1473 case tgtok::XGe: 1474 case tgtok::XGt: 1475 case tgtok::XListConcat: 1476 case tgtok::XListSplat: 1477 case tgtok::XListRemove: 1478 case tgtok::XStrConcat: 1479 case tgtok::XInterleave: 1480 case tgtok::XGetDagArg: 1481 case tgtok::XGetDagName: 1482 case tgtok::XSetDagOp: { // Value ::= !binop '(' Value ',' Value ')' 1483 tgtok::TokKind OpTok = Lex.getCode(); 1484 SMLoc OpLoc = Lex.getLoc(); 1485 Lex.Lex(); // eat the operation 1486 1487 BinOpInit::BinaryOp Code; 1488 switch (OpTok) { 1489 default: llvm_unreachable("Unhandled code!"); 1490 case tgtok::XConcat: Code = BinOpInit::CONCAT; break; 1491 case tgtok::XADD: Code = BinOpInit::ADD; break; 1492 case tgtok::XSUB: Code = BinOpInit::SUB; break; 1493 case tgtok::XMUL: Code = BinOpInit::MUL; break; 1494 case tgtok::XDIV: Code = BinOpInit::DIV; break; 1495 case tgtok::XAND: Code = BinOpInit::AND; break; 1496 case tgtok::XOR: Code = BinOpInit::OR; break; 1497 case tgtok::XXOR: Code = BinOpInit::XOR; break; 1498 case tgtok::XSRA: Code = BinOpInit::SRA; break; 1499 case tgtok::XSRL: Code = BinOpInit::SRL; break; 1500 case tgtok::XSHL: Code = BinOpInit::SHL; break; 1501 case tgtok::XEq: Code = BinOpInit::EQ; break; 1502 case tgtok::XNe: Code = BinOpInit::NE; break; 1503 case tgtok::XLe: Code = BinOpInit::LE; break; 1504 case tgtok::XLt: Code = BinOpInit::LT; break; 1505 case tgtok::XGe: Code = BinOpInit::GE; break; 1506 case tgtok::XGt: Code = BinOpInit::GT; break; 1507 case tgtok::XListConcat: Code = BinOpInit::LISTCONCAT; break; 1508 case tgtok::XListSplat: Code = BinOpInit::LISTSPLAT; break; 1509 case tgtok::XListRemove: 1510 Code = BinOpInit::LISTREMOVE; 1511 break; 1512 case tgtok::XStrConcat: Code = BinOpInit::STRCONCAT; break; 1513 case tgtok::XInterleave: Code = BinOpInit::INTERLEAVE; break; 1514 case tgtok::XSetDagOp: Code = BinOpInit::SETDAGOP; break; 1515 case tgtok::XGetDagArg: 1516 Code = BinOpInit::GETDAGARG; 1517 break; 1518 case tgtok::XGetDagName: 1519 Code = BinOpInit::GETDAGNAME; 1520 break; 1521 } 1522 1523 const RecTy *Type = nullptr; 1524 const RecTy *ArgType = nullptr; 1525 switch (OpTok) { 1526 default: 1527 llvm_unreachable("Unhandled code!"); 1528 case tgtok::XConcat: 1529 case tgtok::XSetDagOp: 1530 Type = DagRecTy::get(Records); 1531 ArgType = DagRecTy::get(Records); 1532 break; 1533 case tgtok::XGetDagArg: 1534 Type = ParseOperatorType(); 1535 if (!Type) { 1536 TokError("did not get type for !getdagarg operator"); 1537 return nullptr; 1538 } 1539 ArgType = DagRecTy::get(Records); 1540 break; 1541 case tgtok::XGetDagName: 1542 Type = StringRecTy::get(Records); 1543 ArgType = DagRecTy::get(Records); 1544 break; 1545 case tgtok::XAND: 1546 case tgtok::XOR: 1547 case tgtok::XXOR: 1548 case tgtok::XSRA: 1549 case tgtok::XSRL: 1550 case tgtok::XSHL: 1551 case tgtok::XADD: 1552 case tgtok::XSUB: 1553 case tgtok::XMUL: 1554 case tgtok::XDIV: 1555 Type = IntRecTy::get(Records); 1556 ArgType = IntRecTy::get(Records); 1557 break; 1558 case tgtok::XEq: 1559 case tgtok::XNe: 1560 case tgtok::XLe: 1561 case tgtok::XLt: 1562 case tgtok::XGe: 1563 case tgtok::XGt: 1564 Type = BitRecTy::get(Records); 1565 // ArgType for the comparison operators is not yet known. 1566 break; 1567 case tgtok::XListConcat: 1568 // We don't know the list type until we parse the first argument. 1569 ArgType = ItemType; 1570 break; 1571 case tgtok::XListSplat: 1572 // Can't do any typechecking until we parse the first argument. 1573 break; 1574 case tgtok::XListRemove: 1575 // We don't know the list type until we parse the first argument. 1576 ArgType = ItemType; 1577 break; 1578 case tgtok::XStrConcat: 1579 Type = StringRecTy::get(Records); 1580 ArgType = StringRecTy::get(Records); 1581 break; 1582 case tgtok::XInterleave: 1583 Type = StringRecTy::get(Records); 1584 // The first argument type is not yet known. 1585 } 1586 1587 if (Type && ItemType && !Type->typeIsConvertibleTo(ItemType)) { 1588 Error(OpLoc, Twine("expected value of type '") + 1589 ItemType->getAsString() + "', got '" + 1590 Type->getAsString() + "'"); 1591 return nullptr; 1592 } 1593 1594 if (!consume(tgtok::l_paren)) { 1595 TokError("expected '(' after binary operator"); 1596 return nullptr; 1597 } 1598 1599 SmallVector<const Init *, 2> InitList; 1600 1601 // Note that this loop consumes an arbitrary number of arguments. 1602 // The actual count is checked later. 1603 for (;;) { 1604 SMLoc InitLoc = Lex.getLoc(); 1605 InitList.push_back(ParseValue(CurRec, ArgType)); 1606 if (!InitList.back()) return nullptr; 1607 1608 const auto *InitListBack = dyn_cast<TypedInit>(InitList.back()); 1609 if (!InitListBack) { 1610 Error(OpLoc, Twine("expected value to be a typed value, got '" + 1611 InitList.back()->getAsString() + "'")); 1612 return nullptr; 1613 } 1614 const RecTy *ListType = InitListBack->getType(); 1615 1616 if (!ArgType) { 1617 // Argument type must be determined from the argument itself. 1618 ArgType = ListType; 1619 1620 switch (Code) { 1621 case BinOpInit::LISTCONCAT: 1622 if (!isa<ListRecTy>(ArgType)) { 1623 Error(InitLoc, Twine("expected a list, got value of type '") + 1624 ArgType->getAsString() + "'"); 1625 return nullptr; 1626 } 1627 break; 1628 case BinOpInit::LISTSPLAT: 1629 if (ItemType && InitList.size() == 1) { 1630 if (!isa<ListRecTy>(ItemType)) { 1631 Error(OpLoc, 1632 Twine("expected output type to be a list, got type '") + 1633 ItemType->getAsString() + "'"); 1634 return nullptr; 1635 } 1636 if (!ArgType->getListTy()->typeIsConvertibleTo(ItemType)) { 1637 Error(OpLoc, Twine("expected first arg type to be '") + 1638 ArgType->getAsString() + 1639 "', got value of type '" + 1640 cast<ListRecTy>(ItemType) 1641 ->getElementType() 1642 ->getAsString() + 1643 "'"); 1644 return nullptr; 1645 } 1646 } 1647 if (InitList.size() == 2 && !isa<IntRecTy>(ArgType)) { 1648 Error(InitLoc, Twine("expected second parameter to be an int, got " 1649 "value of type '") + 1650 ArgType->getAsString() + "'"); 1651 return nullptr; 1652 } 1653 ArgType = nullptr; // Broken invariant: types not identical. 1654 break; 1655 case BinOpInit::LISTREMOVE: 1656 if (!isa<ListRecTy>(ArgType)) { 1657 Error(InitLoc, Twine("expected a list, got value of type '") + 1658 ArgType->getAsString() + "'"); 1659 return nullptr; 1660 } 1661 break; 1662 case BinOpInit::EQ: 1663 case BinOpInit::NE: 1664 if (!ArgType->typeIsConvertibleTo(IntRecTy::get(Records)) && 1665 !ArgType->typeIsConvertibleTo(StringRecTy::get(Records)) && 1666 !ArgType->typeIsConvertibleTo(RecordRecTy::get(Records, {}))) { 1667 Error(InitLoc, Twine("expected bit, bits, int, string, or record; " 1668 "got value of type '") + 1669 ArgType->getAsString() + "'"); 1670 return nullptr; 1671 } 1672 break; 1673 case BinOpInit::GETDAGARG: // The 2nd argument of !getdagarg could be 1674 // index or name. 1675 case BinOpInit::LE: 1676 case BinOpInit::LT: 1677 case BinOpInit::GE: 1678 case BinOpInit::GT: 1679 if (!ArgType->typeIsConvertibleTo(IntRecTy::get(Records)) && 1680 !ArgType->typeIsConvertibleTo(StringRecTy::get(Records))) { 1681 Error(InitLoc, Twine("expected bit, bits, int, or string; " 1682 "got value of type '") + 1683 ArgType->getAsString() + "'"); 1684 return nullptr; 1685 } 1686 break; 1687 case BinOpInit::INTERLEAVE: 1688 switch (InitList.size()) { 1689 case 1: // First argument must be a list of strings or integers. 1690 if (ArgType != StringRecTy::get(Records)->getListTy() && 1691 !ArgType->typeIsConvertibleTo( 1692 IntRecTy::get(Records)->getListTy())) { 1693 Error(InitLoc, Twine("expected list of string, int, bits, or bit; " 1694 "got value of type '") + 1695 ArgType->getAsString() + "'"); 1696 return nullptr; 1697 } 1698 break; 1699 case 2: // Second argument must be a string. 1700 if (!isa<StringRecTy>(ArgType)) { 1701 Error(InitLoc, Twine("expected second argument to be a string, " 1702 "got value of type '") + 1703 ArgType->getAsString() + "'"); 1704 return nullptr; 1705 } 1706 break; 1707 default: ; 1708 } 1709 ArgType = nullptr; // Broken invariant: types not identical. 1710 break; 1711 default: llvm_unreachable("other ops have fixed argument types"); 1712 } 1713 1714 } else { 1715 // Desired argument type is a known and in ArgType. 1716 const RecTy *Resolved = resolveTypes(ArgType, ListType); 1717 if (!Resolved) { 1718 Error(InitLoc, Twine("expected value of type '") + 1719 ArgType->getAsString() + "', got '" + 1720 ListType->getAsString() + "'"); 1721 return nullptr; 1722 } 1723 if (Code != BinOpInit::ADD && Code != BinOpInit::SUB && 1724 Code != BinOpInit::AND && Code != BinOpInit::OR && 1725 Code != BinOpInit::XOR && Code != BinOpInit::SRA && 1726 Code != BinOpInit::SRL && Code != BinOpInit::SHL && 1727 Code != BinOpInit::MUL && Code != BinOpInit::DIV) 1728 ArgType = Resolved; 1729 } 1730 1731 // Deal with BinOps whose arguments have different types, by 1732 // rewriting ArgType in between them. 1733 switch (Code) { 1734 case BinOpInit::SETDAGOP: 1735 // After parsing the first dag argument, switch to expecting 1736 // a record, with no restriction on its superclasses. 1737 ArgType = RecordRecTy::get(Records, {}); 1738 break; 1739 case BinOpInit::GETDAGARG: 1740 // After parsing the first dag argument, expect an index integer or a 1741 // name string. 1742 ArgType = nullptr; 1743 break; 1744 case BinOpInit::GETDAGNAME: 1745 // After parsing the first dag argument, expect an index integer. 1746 ArgType = IntRecTy::get(Records); 1747 break; 1748 default: 1749 break; 1750 } 1751 1752 if (!consume(tgtok::comma)) 1753 break; 1754 } 1755 1756 if (!consume(tgtok::r_paren)) { 1757 TokError("expected ')' in operator"); 1758 return nullptr; 1759 } 1760 1761 // listconcat returns a list with type of the argument. 1762 if (Code == BinOpInit::LISTCONCAT) 1763 Type = ArgType; 1764 // listsplat returns a list of type of the *first* argument. 1765 if (Code == BinOpInit::LISTSPLAT) 1766 Type = cast<TypedInit>(InitList.front())->getType()->getListTy(); 1767 // listremove returns a list with type of the argument. 1768 if (Code == BinOpInit::LISTREMOVE) 1769 Type = ArgType; 1770 1771 // We allow multiple operands to associative operators like !strconcat as 1772 // shorthand for nesting them. 1773 if (Code == BinOpInit::STRCONCAT || Code == BinOpInit::LISTCONCAT || 1774 Code == BinOpInit::CONCAT || Code == BinOpInit::ADD || 1775 Code == BinOpInit::AND || Code == BinOpInit::OR || 1776 Code == BinOpInit::XOR || Code == BinOpInit::MUL) { 1777 while (InitList.size() > 2) { 1778 const Init *RHS = InitList.pop_back_val(); 1779 RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type))->Fold(CurRec); 1780 InitList.back() = RHS; 1781 } 1782 } 1783 1784 if (InitList.size() == 2) 1785 return (BinOpInit::get(Code, InitList[0], InitList[1], Type)) 1786 ->Fold(CurRec); 1787 1788 Error(OpLoc, "expected two operands to operator"); 1789 return nullptr; 1790 } 1791 1792 case tgtok::XForEach: 1793 case tgtok::XFilter: { 1794 return ParseOperationForEachFilter(CurRec, ItemType); 1795 } 1796 1797 case tgtok::XRange: { 1798 SMLoc OpLoc = Lex.getLoc(); 1799 Lex.Lex(); // eat the operation 1800 1801 if (!consume(tgtok::l_paren)) { 1802 TokError("expected '(' after !range operator"); 1803 return nullptr; 1804 } 1805 1806 SmallVector<const Init *, 2> Args; 1807 bool FirstArgIsList = false; 1808 for (;;) { 1809 if (Args.size() >= 3) { 1810 TokError("expected at most three values of integer"); 1811 return nullptr; 1812 } 1813 1814 SMLoc InitLoc = Lex.getLoc(); 1815 Args.push_back(ParseValue(CurRec)); 1816 if (!Args.back()) 1817 return nullptr; 1818 1819 const auto *ArgBack = dyn_cast<TypedInit>(Args.back()); 1820 if (!ArgBack) { 1821 Error(OpLoc, Twine("expected value to be a typed value, got '" + 1822 Args.back()->getAsString() + "'")); 1823 return nullptr; 1824 } 1825 1826 const RecTy *ArgBackType = ArgBack->getType(); 1827 if (!FirstArgIsList || Args.size() == 1) { 1828 if (Args.size() == 1 && isa<ListRecTy>(ArgBackType)) { 1829 FirstArgIsList = true; // Detect error if 2nd arg were present. 1830 } else if (isa<IntRecTy>(ArgBackType)) { 1831 // Assume 2nd arg should be IntRecTy 1832 } else { 1833 if (Args.size() != 1) 1834 Error(InitLoc, Twine("expected value of type 'int', got '" + 1835 ArgBackType->getAsString() + "'")); 1836 else 1837 Error(InitLoc, Twine("expected list or int, got value of type '") + 1838 ArgBackType->getAsString() + "'"); 1839 return nullptr; 1840 } 1841 } else { 1842 // Don't come here unless 1st arg is ListRecTy. 1843 assert(isa<ListRecTy>(cast<TypedInit>(Args[0])->getType())); 1844 Error(InitLoc, Twine("expected one list, got extra value of type '") + 1845 ArgBackType->getAsString() + "'"); 1846 return nullptr; 1847 } 1848 if (!consume(tgtok::comma)) 1849 break; 1850 } 1851 1852 if (!consume(tgtok::r_paren)) { 1853 TokError("expected ')' in operator"); 1854 return nullptr; 1855 } 1856 1857 const Init *LHS, *MHS, *RHS; 1858 auto ArgCount = Args.size(); 1859 assert(ArgCount >= 1); 1860 const auto *Arg0 = cast<TypedInit>(Args[0]); 1861 const auto *Arg0Ty = Arg0->getType(); 1862 if (ArgCount == 1) { 1863 if (isa<ListRecTy>(Arg0Ty)) { 1864 // (0, !size(arg), 1) 1865 LHS = IntInit::get(Records, 0); 1866 MHS = UnOpInit::get(UnOpInit::SIZE, Arg0, IntRecTy::get(Records)) 1867 ->Fold(CurRec); 1868 RHS = IntInit::get(Records, 1); 1869 } else { 1870 assert(isa<IntRecTy>(Arg0Ty)); 1871 // (0, arg, 1) 1872 LHS = IntInit::get(Records, 0); 1873 MHS = Arg0; 1874 RHS = IntInit::get(Records, 1); 1875 } 1876 } else { 1877 assert(isa<IntRecTy>(Arg0Ty)); 1878 const auto *Arg1 = cast<TypedInit>(Args[1]); 1879 assert(isa<IntRecTy>(Arg1->getType())); 1880 LHS = Arg0; 1881 MHS = Arg1; 1882 if (ArgCount == 3) { 1883 // (start, end, step) 1884 const auto *Arg2 = cast<TypedInit>(Args[2]); 1885 assert(isa<IntRecTy>(Arg2->getType())); 1886 RHS = Arg2; 1887 } else 1888 // (start, end, 1) 1889 RHS = IntInit::get(Records, 1); 1890 } 1891 return TernOpInit::get(TernOpInit::RANGE, LHS, MHS, RHS, 1892 IntRecTy::get(Records)->getListTy()) 1893 ->Fold(CurRec); 1894 } 1895 1896 case tgtok::XSetDagArg: 1897 case tgtok::XSetDagName: 1898 case tgtok::XDag: 1899 case tgtok::XIf: 1900 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' 1901 TernOpInit::TernaryOp Code; 1902 const RecTy *Type = nullptr; 1903 1904 tgtok::TokKind LexCode = Lex.getCode(); 1905 Lex.Lex(); // eat the operation 1906 switch (LexCode) { 1907 default: llvm_unreachable("Unhandled code!"); 1908 case tgtok::XDag: 1909 Code = TernOpInit::DAG; 1910 Type = DagRecTy::get(Records); 1911 ItemType = nullptr; 1912 break; 1913 case tgtok::XIf: 1914 Code = TernOpInit::IF; 1915 break; 1916 case tgtok::XSubst: 1917 Code = TernOpInit::SUBST; 1918 break; 1919 case tgtok::XSetDagArg: 1920 Code = TernOpInit::SETDAGARG; 1921 Type = DagRecTy::get(Records); 1922 ItemType = nullptr; 1923 break; 1924 case tgtok::XSetDagName: 1925 Code = TernOpInit::SETDAGNAME; 1926 Type = DagRecTy::get(Records); 1927 ItemType = nullptr; 1928 break; 1929 } 1930 if (!consume(tgtok::l_paren)) { 1931 TokError("expected '(' after ternary operator"); 1932 return nullptr; 1933 } 1934 1935 const Init *LHS = ParseValue(CurRec); 1936 if (!LHS) return nullptr; 1937 1938 if (!consume(tgtok::comma)) { 1939 TokError("expected ',' in ternary operator"); 1940 return nullptr; 1941 } 1942 1943 SMLoc MHSLoc = Lex.getLoc(); 1944 const Init *MHS = ParseValue(CurRec, ItemType); 1945 if (!MHS) 1946 return nullptr; 1947 1948 if (!consume(tgtok::comma)) { 1949 TokError("expected ',' in ternary operator"); 1950 return nullptr; 1951 } 1952 1953 SMLoc RHSLoc = Lex.getLoc(); 1954 const Init *RHS = ParseValue(CurRec, ItemType); 1955 if (!RHS) 1956 return nullptr; 1957 1958 if (!consume(tgtok::r_paren)) { 1959 TokError("expected ')' in binary operator"); 1960 return nullptr; 1961 } 1962 1963 switch (LexCode) { 1964 default: llvm_unreachable("Unhandled code!"); 1965 case tgtok::XDag: { 1966 const auto *MHSt = dyn_cast<TypedInit>(MHS); 1967 if (!MHSt && !isa<UnsetInit>(MHS)) { 1968 Error(MHSLoc, "could not determine type of the child list in !dag"); 1969 return nullptr; 1970 } 1971 if (MHSt && !isa<ListRecTy>(MHSt->getType())) { 1972 Error(MHSLoc, Twine("expected list of children, got type '") + 1973 MHSt->getType()->getAsString() + "'"); 1974 return nullptr; 1975 } 1976 1977 const auto *RHSt = dyn_cast<TypedInit>(RHS); 1978 if (!RHSt && !isa<UnsetInit>(RHS)) { 1979 Error(RHSLoc, "could not determine type of the name list in !dag"); 1980 return nullptr; 1981 } 1982 if (RHSt && StringRecTy::get(Records)->getListTy() != RHSt->getType()) { 1983 Error(RHSLoc, Twine("expected list<string>, got type '") + 1984 RHSt->getType()->getAsString() + "'"); 1985 return nullptr; 1986 } 1987 1988 if (!MHSt && !RHSt) { 1989 Error(MHSLoc, 1990 "cannot have both unset children and unset names in !dag"); 1991 return nullptr; 1992 } 1993 break; 1994 } 1995 case tgtok::XIf: { 1996 const RecTy *MHSTy = nullptr; 1997 const RecTy *RHSTy = nullptr; 1998 1999 if (const auto *MHSt = dyn_cast<TypedInit>(MHS)) 2000 MHSTy = MHSt->getType(); 2001 if (const auto *MHSbits = dyn_cast<BitsInit>(MHS)) 2002 MHSTy = BitsRecTy::get(Records, MHSbits->getNumBits()); 2003 if (isa<BitInit>(MHS)) 2004 MHSTy = BitRecTy::get(Records); 2005 2006 if (const auto *RHSt = dyn_cast<TypedInit>(RHS)) 2007 RHSTy = RHSt->getType(); 2008 if (const auto *RHSbits = dyn_cast<BitsInit>(RHS)) 2009 RHSTy = BitsRecTy::get(Records, RHSbits->getNumBits()); 2010 if (isa<BitInit>(RHS)) 2011 RHSTy = BitRecTy::get(Records); 2012 2013 // For UnsetInit, it's typed from the other hand. 2014 if (isa<UnsetInit>(MHS)) 2015 MHSTy = RHSTy; 2016 if (isa<UnsetInit>(RHS)) 2017 RHSTy = MHSTy; 2018 2019 if (!MHSTy || !RHSTy) { 2020 TokError("could not get type for !if"); 2021 return nullptr; 2022 } 2023 2024 Type = resolveTypes(MHSTy, RHSTy); 2025 if (!Type) { 2026 TokError(Twine("inconsistent types '") + MHSTy->getAsString() + 2027 "' and '" + RHSTy->getAsString() + "' for !if"); 2028 return nullptr; 2029 } 2030 break; 2031 } 2032 case tgtok::XSubst: { 2033 const auto *RHSt = dyn_cast<TypedInit>(RHS); 2034 if (!RHSt) { 2035 TokError("could not get type for !subst"); 2036 return nullptr; 2037 } 2038 Type = RHSt->getType(); 2039 break; 2040 } 2041 case tgtok::XSetDagArg: { 2042 const auto *MHSt = dyn_cast<TypedInit>(MHS); 2043 if (!MHSt || !isa<IntRecTy, StringRecTy>(MHSt->getType())) { 2044 Error(MHSLoc, Twine("expected integer index or string name, got ") + 2045 (MHSt ? ("type '" + MHSt->getType()->getAsString()) 2046 : ("'" + MHS->getAsString())) + 2047 "'"); 2048 return nullptr; 2049 } 2050 break; 2051 } 2052 case tgtok::XSetDagName: { 2053 const auto *MHSt = dyn_cast<TypedInit>(MHS); 2054 if (!MHSt || !isa<IntRecTy, StringRecTy>(MHSt->getType())) { 2055 Error(MHSLoc, Twine("expected integer index or string name, got ") + 2056 (MHSt ? ("type '" + MHSt->getType()->getAsString()) 2057 : ("'" + MHS->getAsString())) + 2058 "'"); 2059 return nullptr; 2060 } 2061 const auto *RHSt = dyn_cast<TypedInit>(RHS); 2062 // The name could be a string or unset. 2063 if (RHSt && !isa<StringRecTy>(RHSt->getType())) { 2064 Error(RHSLoc, Twine("expected string or unset name, got type '") + 2065 RHSt->getType()->getAsString() + "'"); 2066 return nullptr; 2067 } 2068 break; 2069 } 2070 } 2071 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); 2072 } 2073 2074 case tgtok::XSubstr: 2075 return ParseOperationSubstr(CurRec, ItemType); 2076 2077 case tgtok::XFind: 2078 return ParseOperationFind(CurRec, ItemType); 2079 2080 case tgtok::XCond: 2081 return ParseOperationCond(CurRec, ItemType); 2082 2083 case tgtok::XFoldl: { 2084 // Value ::= !foldl '(' Value ',' Value ',' Id ',' Id ',' Expr ')' 2085 Lex.Lex(); // eat the operation 2086 if (!consume(tgtok::l_paren)) { 2087 TokError("expected '(' after !foldl"); 2088 return nullptr; 2089 } 2090 2091 const Init *StartUntyped = ParseValue(CurRec); 2092 if (!StartUntyped) 2093 return nullptr; 2094 2095 const auto *Start = dyn_cast<TypedInit>(StartUntyped); 2096 if (!Start) { 2097 TokError(Twine("could not get type of !foldl start: '") + 2098 StartUntyped->getAsString() + "'"); 2099 return nullptr; 2100 } 2101 2102 if (!consume(tgtok::comma)) { 2103 TokError("expected ',' in !foldl"); 2104 return nullptr; 2105 } 2106 2107 const Init *ListUntyped = ParseValue(CurRec); 2108 if (!ListUntyped) 2109 return nullptr; 2110 2111 const auto *List = dyn_cast<TypedInit>(ListUntyped); 2112 if (!List) { 2113 TokError(Twine("could not get type of !foldl list: '") + 2114 ListUntyped->getAsString() + "'"); 2115 return nullptr; 2116 } 2117 2118 const auto *ListType = dyn_cast<ListRecTy>(List->getType()); 2119 if (!ListType) { 2120 TokError(Twine("!foldl list must be a list, but is of type '") + 2121 List->getType()->getAsString()); 2122 return nullptr; 2123 } 2124 2125 if (Lex.getCode() != tgtok::comma) { 2126 TokError("expected ',' in !foldl"); 2127 return nullptr; 2128 } 2129 2130 if (Lex.Lex() != tgtok::Id) { // eat the ',' 2131 TokError("third argument of !foldl must be an identifier"); 2132 return nullptr; 2133 } 2134 2135 const Init *A = StringInit::get(Records, Lex.getCurStrVal()); 2136 if (CurRec && CurRec->getValue(A)) { 2137 TokError((Twine("left !foldl variable '") + A->getAsString() + 2138 "' already defined") 2139 .str()); 2140 return nullptr; 2141 } 2142 2143 if (Lex.Lex() != tgtok::comma) { // eat the id 2144 TokError("expected ',' in !foldl"); 2145 return nullptr; 2146 } 2147 2148 if (Lex.Lex() != tgtok::Id) { // eat the ',' 2149 TokError("fourth argument of !foldl must be an identifier"); 2150 return nullptr; 2151 } 2152 2153 const Init *B = StringInit::get(Records, Lex.getCurStrVal()); 2154 if (CurRec && CurRec->getValue(B)) { 2155 TokError((Twine("right !foldl variable '") + B->getAsString() + 2156 "' already defined") 2157 .str()); 2158 return nullptr; 2159 } 2160 2161 if (Lex.Lex() != tgtok::comma) { // eat the id 2162 TokError("expected ',' in !foldl"); 2163 return nullptr; 2164 } 2165 Lex.Lex(); // eat the ',' 2166 2167 // We need to create a temporary record to provide a scope for the 2168 // two variables. 2169 std::unique_ptr<Record> ParseRecTmp; 2170 Record *ParseRec = CurRec; 2171 if (!ParseRec) { 2172 ParseRecTmp = std::make_unique<Record>(".parse", ArrayRef<SMLoc>{}, Records); 2173 ParseRec = ParseRecTmp.get(); 2174 } 2175 2176 TGVarScope *FoldScope = PushScope(ParseRec); 2177 ParseRec->addValue(RecordVal(A, Start->getType(), RecordVal::FK_Normal)); 2178 ParseRec->addValue( 2179 RecordVal(B, ListType->getElementType(), RecordVal::FK_Normal)); 2180 const Init *ExprUntyped = ParseValue(ParseRec); 2181 ParseRec->removeValue(A); 2182 ParseRec->removeValue(B); 2183 PopScope(FoldScope); 2184 if (!ExprUntyped) 2185 return nullptr; 2186 2187 const auto *Expr = dyn_cast<TypedInit>(ExprUntyped); 2188 if (!Expr) { 2189 TokError("could not get type of !foldl expression"); 2190 return nullptr; 2191 } 2192 2193 if (Expr->getType() != Start->getType()) { 2194 TokError(Twine("!foldl expression must be of same type as start (") + 2195 Start->getType()->getAsString() + "), but is of type " + 2196 Expr->getType()->getAsString()); 2197 return nullptr; 2198 } 2199 2200 if (!consume(tgtok::r_paren)) { 2201 TokError("expected ')' in fold operator"); 2202 return nullptr; 2203 } 2204 2205 return FoldOpInit::get(Start, List, A, B, Expr, Start->getType()) 2206 ->Fold(CurRec); 2207 } 2208 } 2209 } 2210 2211 /// ParseOperatorType - Parse a type for an operator. This returns 2212 /// null on error. 2213 /// 2214 /// OperatorType ::= '<' Type '>' 2215 /// 2216 const RecTy *TGParser::ParseOperatorType() { 2217 const RecTy *Type = nullptr; 2218 2219 if (!consume(tgtok::less)) { 2220 TokError("expected type name for operator"); 2221 return nullptr; 2222 } 2223 2224 if (Lex.getCode() == tgtok::Code) 2225 TokError("the 'code' type is not allowed in bang operators; use 'string'"); 2226 2227 Type = ParseType(); 2228 2229 if (!Type) { 2230 TokError("expected type name for operator"); 2231 return nullptr; 2232 } 2233 2234 if (!consume(tgtok::greater)) { 2235 TokError("expected type name for operator"); 2236 return nullptr; 2237 } 2238 2239 return Type; 2240 } 2241 2242 /// Parse the !substr operation. Return null on error. 2243 /// 2244 /// Substr ::= !substr(string, start-int [, length-int]) => string 2245 const Init *TGParser::ParseOperationSubstr(Record *CurRec, 2246 const RecTy *ItemType) { 2247 TernOpInit::TernaryOp Code = TernOpInit::SUBSTR; 2248 const RecTy *Type = StringRecTy::get(Records); 2249 2250 Lex.Lex(); // eat the operation 2251 2252 if (!consume(tgtok::l_paren)) { 2253 TokError("expected '(' after !substr operator"); 2254 return nullptr; 2255 } 2256 2257 const Init *LHS = ParseValue(CurRec); 2258 if (!LHS) 2259 return nullptr; 2260 2261 if (!consume(tgtok::comma)) { 2262 TokError("expected ',' in !substr operator"); 2263 return nullptr; 2264 } 2265 2266 SMLoc MHSLoc = Lex.getLoc(); 2267 const Init *MHS = ParseValue(CurRec); 2268 if (!MHS) 2269 return nullptr; 2270 2271 SMLoc RHSLoc = Lex.getLoc(); 2272 const Init *RHS; 2273 if (consume(tgtok::comma)) { 2274 RHSLoc = Lex.getLoc(); 2275 RHS = ParseValue(CurRec); 2276 if (!RHS) 2277 return nullptr; 2278 } else { 2279 RHS = IntInit::get(Records, std::numeric_limits<int64_t>::max()); 2280 } 2281 2282 if (!consume(tgtok::r_paren)) { 2283 TokError("expected ')' in !substr operator"); 2284 return nullptr; 2285 } 2286 2287 if (ItemType && !Type->typeIsConvertibleTo(ItemType)) { 2288 Error(RHSLoc, Twine("expected value of type '") + 2289 ItemType->getAsString() + "', got '" + 2290 Type->getAsString() + "'"); 2291 } 2292 2293 const auto *LHSt = dyn_cast<TypedInit>(LHS); 2294 if (!LHSt && !isa<UnsetInit>(LHS)) { 2295 TokError("could not determine type of the string in !substr"); 2296 return nullptr; 2297 } 2298 if (LHSt && !isa<StringRecTy>(LHSt->getType())) { 2299 TokError(Twine("expected string, got type '") + 2300 LHSt->getType()->getAsString() + "'"); 2301 return nullptr; 2302 } 2303 2304 const auto *MHSt = dyn_cast<TypedInit>(MHS); 2305 if (!MHSt && !isa<UnsetInit>(MHS)) { 2306 TokError("could not determine type of the start position in !substr"); 2307 return nullptr; 2308 } 2309 if (MHSt && !isa<IntRecTy>(MHSt->getType())) { 2310 Error(MHSLoc, Twine("expected int, got type '") + 2311 MHSt->getType()->getAsString() + "'"); 2312 return nullptr; 2313 } 2314 2315 if (RHS) { 2316 const auto *RHSt = dyn_cast<TypedInit>(RHS); 2317 if (!RHSt && !isa<UnsetInit>(RHS)) { 2318 TokError("could not determine type of the length in !substr"); 2319 return nullptr; 2320 } 2321 if (RHSt && !isa<IntRecTy>(RHSt->getType())) { 2322 TokError(Twine("expected int, got type '") + 2323 RHSt->getType()->getAsString() + "'"); 2324 return nullptr; 2325 } 2326 } 2327 2328 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); 2329 } 2330 2331 /// Parse the !find operation. Return null on error. 2332 /// 2333 /// Substr ::= !find(string, string [, start-int]) => int 2334 const Init *TGParser::ParseOperationFind(Record *CurRec, 2335 const RecTy *ItemType) { 2336 TernOpInit::TernaryOp Code = TernOpInit::FIND; 2337 const RecTy *Type = IntRecTy::get(Records); 2338 2339 Lex.Lex(); // eat the operation 2340 2341 if (!consume(tgtok::l_paren)) { 2342 TokError("expected '(' after !find operator"); 2343 return nullptr; 2344 } 2345 2346 const Init *LHS = ParseValue(CurRec); 2347 if (!LHS) 2348 return nullptr; 2349 2350 if (!consume(tgtok::comma)) { 2351 TokError("expected ',' in !find operator"); 2352 return nullptr; 2353 } 2354 2355 SMLoc MHSLoc = Lex.getLoc(); 2356 const Init *MHS = ParseValue(CurRec); 2357 if (!MHS) 2358 return nullptr; 2359 2360 SMLoc RHSLoc = Lex.getLoc(); 2361 const Init *RHS; 2362 if (consume(tgtok::comma)) { 2363 RHSLoc = Lex.getLoc(); 2364 RHS = ParseValue(CurRec); 2365 if (!RHS) 2366 return nullptr; 2367 } else { 2368 RHS = IntInit::get(Records, 0); 2369 } 2370 2371 if (!consume(tgtok::r_paren)) { 2372 TokError("expected ')' in !find operator"); 2373 return nullptr; 2374 } 2375 2376 if (ItemType && !Type->typeIsConvertibleTo(ItemType)) { 2377 Error(RHSLoc, Twine("expected value of type '") + 2378 ItemType->getAsString() + "', got '" + 2379 Type->getAsString() + "'"); 2380 } 2381 2382 const auto *LHSt = dyn_cast<TypedInit>(LHS); 2383 if (!LHSt && !isa<UnsetInit>(LHS)) { 2384 TokError("could not determine type of the source string in !find"); 2385 return nullptr; 2386 } 2387 if (LHSt && !isa<StringRecTy>(LHSt->getType())) { 2388 TokError(Twine("expected string, got type '") + 2389 LHSt->getType()->getAsString() + "'"); 2390 return nullptr; 2391 } 2392 2393 const auto *MHSt = dyn_cast<TypedInit>(MHS); 2394 if (!MHSt && !isa<UnsetInit>(MHS)) { 2395 TokError("could not determine type of the target string in !find"); 2396 return nullptr; 2397 } 2398 if (MHSt && !isa<StringRecTy>(MHSt->getType())) { 2399 Error(MHSLoc, Twine("expected string, got type '") + 2400 MHSt->getType()->getAsString() + "'"); 2401 return nullptr; 2402 } 2403 2404 if (RHS) { 2405 const auto *RHSt = dyn_cast<TypedInit>(RHS); 2406 if (!RHSt && !isa<UnsetInit>(RHS)) { 2407 TokError("could not determine type of the start position in !find"); 2408 return nullptr; 2409 } 2410 if (RHSt && !isa<IntRecTy>(RHSt->getType())) { 2411 TokError(Twine("expected int, got type '") + 2412 RHSt->getType()->getAsString() + "'"); 2413 return nullptr; 2414 } 2415 } 2416 2417 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); 2418 } 2419 2420 /// Parse the !foreach and !filter operations. Return null on error. 2421 /// 2422 /// ForEach ::= !foreach(ID, list-or-dag, expr) => list<expr type> 2423 /// Filter ::= !foreach(ID, list, predicate) ==> list<list type> 2424 const Init *TGParser::ParseOperationForEachFilter(Record *CurRec, 2425 const RecTy *ItemType) { 2426 SMLoc OpLoc = Lex.getLoc(); 2427 tgtok::TokKind Operation = Lex.getCode(); 2428 Lex.Lex(); // eat the operation 2429 if (Lex.getCode() != tgtok::l_paren) { 2430 TokError("expected '(' after !foreach/!filter"); 2431 return nullptr; 2432 } 2433 2434 if (Lex.Lex() != tgtok::Id) { // eat the '(' 2435 TokError("first argument of !foreach/!filter must be an identifier"); 2436 return nullptr; 2437 } 2438 2439 const Init *LHS = StringInit::get(Records, Lex.getCurStrVal()); 2440 Lex.Lex(); // eat the ID. 2441 2442 if (CurRec && CurRec->getValue(LHS)) { 2443 TokError((Twine("iteration variable '") + LHS->getAsString() + 2444 "' is already defined") 2445 .str()); 2446 return nullptr; 2447 } 2448 2449 if (!consume(tgtok::comma)) { 2450 TokError("expected ',' in !foreach/!filter"); 2451 return nullptr; 2452 } 2453 2454 const Init *MHS = ParseValue(CurRec); 2455 if (!MHS) 2456 return nullptr; 2457 2458 if (!consume(tgtok::comma)) { 2459 TokError("expected ',' in !foreach/!filter"); 2460 return nullptr; 2461 } 2462 2463 const auto *MHSt = dyn_cast<TypedInit>(MHS); 2464 if (!MHSt) { 2465 TokError("could not get type of !foreach/!filter list or dag"); 2466 return nullptr; 2467 } 2468 2469 const RecTy *InEltType = nullptr; 2470 const RecTy *ExprEltType = nullptr; 2471 bool IsDAG = false; 2472 2473 if (const auto *InListTy = dyn_cast<ListRecTy>(MHSt->getType())) { 2474 InEltType = InListTy->getElementType(); 2475 if (ItemType) { 2476 if (const auto *OutListTy = dyn_cast<ListRecTy>(ItemType)) { 2477 ExprEltType = (Operation == tgtok::XForEach) 2478 ? OutListTy->getElementType() 2479 : IntRecTy::get(Records); 2480 } else { 2481 Error(OpLoc, 2482 "expected value of type '" + 2483 Twine(ItemType->getAsString()) + 2484 "', but got list type"); 2485 return nullptr; 2486 } 2487 } 2488 } else if (const auto *InDagTy = dyn_cast<DagRecTy>(MHSt->getType())) { 2489 if (Operation == tgtok::XFilter) { 2490 TokError("!filter must have a list argument"); 2491 return nullptr; 2492 } 2493 InEltType = InDagTy; 2494 if (ItemType && !isa<DagRecTy>(ItemType)) { 2495 Error(OpLoc, 2496 "expected value of type '" + Twine(ItemType->getAsString()) + 2497 "', but got dag type"); 2498 return nullptr; 2499 } 2500 IsDAG = true; 2501 } else { 2502 if (Operation == tgtok::XForEach) 2503 TokError("!foreach must have a list or dag argument"); 2504 else 2505 TokError("!filter must have a list argument"); 2506 return nullptr; 2507 } 2508 2509 // We need to create a temporary record to provide a scope for the 2510 // iteration variable. 2511 std::unique_ptr<Record> ParseRecTmp; 2512 Record *ParseRec = CurRec; 2513 if (!ParseRec) { 2514 ParseRecTmp = 2515 std::make_unique<Record>(".parse", ArrayRef<SMLoc>{}, Records); 2516 ParseRec = ParseRecTmp.get(); 2517 } 2518 TGVarScope *TempScope = PushScope(ParseRec); 2519 ParseRec->addValue(RecordVal(LHS, InEltType, RecordVal::FK_Normal)); 2520 const Init *RHS = ParseValue(ParseRec, ExprEltType); 2521 ParseRec->removeValue(LHS); 2522 PopScope(TempScope); 2523 if (!RHS) 2524 return nullptr; 2525 2526 if (!consume(tgtok::r_paren)) { 2527 TokError("expected ')' in !foreach/!filter"); 2528 return nullptr; 2529 } 2530 2531 const RecTy *OutType = InEltType; 2532 if (Operation == tgtok::XForEach && !IsDAG) { 2533 const auto *RHSt = dyn_cast<TypedInit>(RHS); 2534 if (!RHSt) { 2535 TokError("could not get type of !foreach result expression"); 2536 return nullptr; 2537 } 2538 OutType = RHSt->getType()->getListTy(); 2539 } else if (Operation == tgtok::XFilter) { 2540 OutType = InEltType->getListTy(); 2541 } 2542 2543 return (TernOpInit::get((Operation == tgtok::XForEach) ? TernOpInit::FOREACH 2544 : TernOpInit::FILTER, 2545 LHS, MHS, RHS, OutType)) 2546 ->Fold(CurRec); 2547 } 2548 2549 const Init *TGParser::ParseOperationCond(Record *CurRec, 2550 const RecTy *ItemType) { 2551 Lex.Lex(); // eat the operation 'cond' 2552 2553 if (!consume(tgtok::l_paren)) { 2554 TokError("expected '(' after !cond operator"); 2555 return nullptr; 2556 } 2557 2558 // Parse through '[Case: Val,]+' 2559 SmallVector<const Init *, 4> Case; 2560 SmallVector<const Init *, 4> Val; 2561 while (true) { 2562 if (consume(tgtok::r_paren)) 2563 break; 2564 2565 const Init *V = ParseValue(CurRec); 2566 if (!V) 2567 return nullptr; 2568 Case.push_back(V); 2569 2570 if (!consume(tgtok::colon)) { 2571 TokError("expected ':' following a condition in !cond operator"); 2572 return nullptr; 2573 } 2574 2575 V = ParseValue(CurRec, ItemType); 2576 if (!V) 2577 return nullptr; 2578 Val.push_back(V); 2579 2580 if (consume(tgtok::r_paren)) 2581 break; 2582 2583 if (!consume(tgtok::comma)) { 2584 TokError("expected ',' or ')' following a value in !cond operator"); 2585 return nullptr; 2586 } 2587 } 2588 2589 if (Case.size() < 1) { 2590 TokError("there should be at least 1 'condition : value' in the !cond operator"); 2591 return nullptr; 2592 } 2593 2594 // resolve type 2595 const RecTy *Type = nullptr; 2596 for (const Init *V : Val) { 2597 const RecTy *VTy = nullptr; 2598 if (const auto *Vt = dyn_cast<TypedInit>(V)) 2599 VTy = Vt->getType(); 2600 if (const auto *Vbits = dyn_cast<BitsInit>(V)) 2601 VTy = BitsRecTy::get(Records, Vbits->getNumBits()); 2602 if (isa<BitInit>(V)) 2603 VTy = BitRecTy::get(Records); 2604 2605 if (Type == nullptr) { 2606 if (!isa<UnsetInit>(V)) 2607 Type = VTy; 2608 } else { 2609 if (!isa<UnsetInit>(V)) { 2610 const RecTy *RType = resolveTypes(Type, VTy); 2611 if (!RType) { 2612 TokError(Twine("inconsistent types '") + Type->getAsString() + 2613 "' and '" + VTy->getAsString() + "' for !cond"); 2614 return nullptr; 2615 } 2616 Type = RType; 2617 } 2618 } 2619 } 2620 2621 if (!Type) { 2622 TokError("could not determine type for !cond from its arguments"); 2623 return nullptr; 2624 } 2625 return CondOpInit::get(Case, Val, Type)->Fold(CurRec); 2626 } 2627 2628 /// ParseSimpleValue - Parse a tblgen value. This returns null on error. 2629 /// 2630 /// SimpleValue ::= IDValue 2631 /// SimpleValue ::= INTVAL 2632 /// SimpleValue ::= STRVAL+ 2633 /// SimpleValue ::= CODEFRAGMENT 2634 /// SimpleValue ::= '?' 2635 /// SimpleValue ::= '{' ValueList '}' 2636 /// SimpleValue ::= ID '<' ValueListNE '>' 2637 /// SimpleValue ::= '[' ValueList ']' 2638 /// SimpleValue ::= '(' IDValue DagArgList ')' 2639 /// SimpleValue ::= CONCATTOK '(' Value ',' Value ')' 2640 /// SimpleValue ::= ADDTOK '(' Value ',' Value ')' 2641 /// SimpleValue ::= DIVTOK '(' Value ',' Value ')' 2642 /// SimpleValue ::= SUBTOK '(' Value ',' Value ')' 2643 /// SimpleValue ::= SHLTOK '(' Value ',' Value ')' 2644 /// SimpleValue ::= SRATOK '(' Value ',' Value ')' 2645 /// SimpleValue ::= SRLTOK '(' Value ',' Value ')' 2646 /// SimpleValue ::= LISTCONCATTOK '(' Value ',' Value ')' 2647 /// SimpleValue ::= LISTSPLATTOK '(' Value ',' Value ')' 2648 /// SimpleValue ::= LISTREMOVETOK '(' Value ',' Value ')' 2649 /// SimpleValue ::= RANGE '(' Value ')' 2650 /// SimpleValue ::= RANGE '(' Value ',' Value ')' 2651 /// SimpleValue ::= RANGE '(' Value ',' Value ',' Value ')' 2652 /// SimpleValue ::= STRCONCATTOK '(' Value ',' Value ')' 2653 /// SimpleValue ::= COND '(' [Value ':' Value,]+ ')' 2654 /// 2655 const Init *TGParser::ParseSimpleValue(Record *CurRec, const RecTy *ItemType, 2656 IDParseMode Mode) { 2657 const Init *R = nullptr; 2658 tgtok::TokKind Code = Lex.getCode(); 2659 2660 // Parse bang operators. 2661 if (tgtok::isBangOperator(Code)) 2662 return ParseOperation(CurRec, ItemType); 2663 2664 switch (Code) { 2665 default: TokError("Unknown or reserved token when parsing a value"); break; 2666 2667 case tgtok::TrueVal: 2668 R = IntInit::get(Records, 1); 2669 Lex.Lex(); 2670 break; 2671 case tgtok::FalseVal: 2672 R = IntInit::get(Records, 0); 2673 Lex.Lex(); 2674 break; 2675 case tgtok::IntVal: 2676 R = IntInit::get(Records, Lex.getCurIntVal()); 2677 Lex.Lex(); 2678 break; 2679 case tgtok::BinaryIntVal: { 2680 auto BinaryVal = Lex.getCurBinaryIntVal(); 2681 SmallVector<Init*, 16> Bits(BinaryVal.second); 2682 for (unsigned i = 0, e = BinaryVal.second; i != e; ++i) 2683 Bits[i] = BitInit::get(Records, BinaryVal.first & (1LL << i)); 2684 R = BitsInit::get(Records, Bits); 2685 Lex.Lex(); 2686 break; 2687 } 2688 case tgtok::StrVal: { 2689 std::string Val = Lex.getCurStrVal(); 2690 Lex.Lex(); 2691 2692 // Handle multiple consecutive concatenated strings. 2693 while (Lex.getCode() == tgtok::StrVal) { 2694 Val += Lex.getCurStrVal(); 2695 Lex.Lex(); 2696 } 2697 2698 R = StringInit::get(Records, Val); 2699 break; 2700 } 2701 case tgtok::CodeFragment: 2702 R = StringInit::get(Records, Lex.getCurStrVal(), StringInit::SF_Code); 2703 Lex.Lex(); 2704 break; 2705 case tgtok::question: 2706 R = UnsetInit::get(Records); 2707 Lex.Lex(); 2708 break; 2709 case tgtok::Id: { 2710 SMRange NameLoc = Lex.getLocRange(); 2711 const StringInit *Name = StringInit::get(Records, Lex.getCurStrVal()); 2712 tgtok::TokKind Next = Lex.Lex(); 2713 if (Next == tgtok::equal) // Named argument. 2714 return Name; 2715 if (Next != tgtok::less) // consume the Id. 2716 return ParseIDValue(CurRec, Name, NameLoc, Mode); // Value ::= IDValue 2717 2718 // Value ::= CLASSID '<' ArgValueList '>' (CLASSID has been consumed) 2719 // This is supposed to synthesize a new anonymous definition, deriving 2720 // from the class with the template arguments, but no body. 2721 const Record *Class = Records.getClass(Name->getValue()); 2722 if (!Class) { 2723 Error(NameLoc.Start, 2724 "Expected a class name, got '" + Name->getValue() + "'"); 2725 return nullptr; 2726 } 2727 2728 SmallVector<const ArgumentInit *, 8> Args; 2729 SmallVector<SMLoc> ArgLocs; 2730 Lex.Lex(); // consume the < 2731 if (ParseTemplateArgValueList(Args, ArgLocs, CurRec, Class)) 2732 return nullptr; // Error parsing value list. 2733 2734 if (CheckTemplateArgValues(Args, ArgLocs, Class)) 2735 return nullptr; // Error checking template argument values. 2736 2737 if (resolveArguments(Class, Args, NameLoc.Start)) 2738 return nullptr; 2739 2740 if (TrackReferenceLocs) 2741 Class->appendReferenceLoc(NameLoc); 2742 return VarDefInit::get(NameLoc.Start, Class, Args)->Fold(); 2743 } 2744 case tgtok::l_brace: { // Value ::= '{' ValueList '}' 2745 SMLoc BraceLoc = Lex.getLoc(); 2746 Lex.Lex(); // eat the '{' 2747 SmallVector<const Init *, 16> Vals; 2748 2749 if (Lex.getCode() != tgtok::r_brace) { 2750 ParseValueList(Vals, CurRec); 2751 if (Vals.empty()) return nullptr; 2752 } 2753 if (!consume(tgtok::r_brace)) { 2754 TokError("expected '}' at end of bit list value"); 2755 return nullptr; 2756 } 2757 2758 SmallVector<const Init *, 16> NewBits; 2759 2760 // As we parse { a, b, ... }, 'a' is the highest bit, but we parse it 2761 // first. We'll first read everything in to a vector, then we can reverse 2762 // it to get the bits in the correct order for the BitsInit value. 2763 for (unsigned i = 0, e = Vals.size(); i != e; ++i) { 2764 // FIXME: The following two loops would not be duplicated 2765 // if the API was a little more orthogonal. 2766 2767 // bits<n> values are allowed to initialize n bits. 2768 if (const auto *BI = dyn_cast<BitsInit>(Vals[i])) { 2769 for (unsigned i = 0, e = BI->getNumBits(); i != e; ++i) 2770 NewBits.push_back(BI->getBit((e - i) - 1)); 2771 continue; 2772 } 2773 // bits<n> can also come from variable initializers. 2774 if (const auto *VI = dyn_cast<VarInit>(Vals[i])) { 2775 if (const auto *BitsRec = dyn_cast<BitsRecTy>(VI->getType())) { 2776 for (unsigned i = 0, e = BitsRec->getNumBits(); i != e; ++i) 2777 NewBits.push_back(VI->getBit((e - i) - 1)); 2778 continue; 2779 } 2780 // Fallthrough to try convert this to a bit. 2781 } 2782 // All other values must be convertible to just a single bit. 2783 const Init *Bit = Vals[i]->getCastTo(BitRecTy::get(Records)); 2784 if (!Bit) { 2785 Error(BraceLoc, "Element #" + Twine(i) + " (" + Vals[i]->getAsString() + 2786 ") is not convertable to a bit"); 2787 return nullptr; 2788 } 2789 NewBits.push_back(Bit); 2790 } 2791 std::reverse(NewBits.begin(), NewBits.end()); 2792 return BitsInit::get(Records, NewBits); 2793 } 2794 case tgtok::l_square: { // Value ::= '[' ValueList ']' 2795 Lex.Lex(); // eat the '[' 2796 SmallVector<const Init *, 16> Vals; 2797 2798 const RecTy *DeducedEltTy = nullptr; 2799 const ListRecTy *GivenListTy = nullptr; 2800 2801 if (ItemType) { 2802 const auto *ListType = dyn_cast<ListRecTy>(ItemType); 2803 if (!ListType) { 2804 TokError(Twine("Encountered a list when expecting a ") + 2805 ItemType->getAsString()); 2806 return nullptr; 2807 } 2808 GivenListTy = ListType; 2809 } 2810 2811 if (Lex.getCode() != tgtok::r_square) { 2812 ParseValueList(Vals, CurRec, 2813 GivenListTy ? GivenListTy->getElementType() : nullptr); 2814 if (Vals.empty()) return nullptr; 2815 } 2816 if (!consume(tgtok::r_square)) { 2817 TokError("expected ']' at end of list value"); 2818 return nullptr; 2819 } 2820 2821 const RecTy *GivenEltTy = nullptr; 2822 if (consume(tgtok::less)) { 2823 // Optional list element type 2824 GivenEltTy = ParseType(); 2825 if (!GivenEltTy) { 2826 // Couldn't parse element type 2827 return nullptr; 2828 } 2829 2830 if (!consume(tgtok::greater)) { 2831 TokError("expected '>' at end of list element type"); 2832 return nullptr; 2833 } 2834 } 2835 2836 // Check elements 2837 const RecTy *EltTy = nullptr; 2838 for (const Init *V : Vals) { 2839 const auto *TArg = dyn_cast<TypedInit>(V); 2840 if (TArg) { 2841 if (EltTy) { 2842 EltTy = resolveTypes(EltTy, TArg->getType()); 2843 if (!EltTy) { 2844 TokError("Incompatible types in list elements"); 2845 return nullptr; 2846 } 2847 } else { 2848 EltTy = TArg->getType(); 2849 } 2850 } 2851 } 2852 2853 if (GivenEltTy) { 2854 if (EltTy) { 2855 // Verify consistency 2856 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) { 2857 TokError("Incompatible types in list elements"); 2858 return nullptr; 2859 } 2860 } 2861 EltTy = GivenEltTy; 2862 } 2863 2864 if (!EltTy) { 2865 if (!ItemType) { 2866 TokError("No type for list"); 2867 return nullptr; 2868 } 2869 DeducedEltTy = GivenListTy->getElementType(); 2870 } else { 2871 // Make sure the deduced type is compatible with the given type 2872 if (GivenListTy) { 2873 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) { 2874 TokError(Twine("Element type mismatch for list: element type '") + 2875 EltTy->getAsString() + "' not convertible to '" + 2876 GivenListTy->getElementType()->getAsString()); 2877 return nullptr; 2878 } 2879 } 2880 DeducedEltTy = EltTy; 2881 } 2882 2883 return ListInit::get(Vals, DeducedEltTy); 2884 } 2885 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')' 2886 // Value ::= '(' '[' ValueList ']' DagArgList ')' 2887 Lex.Lex(); // eat the '(' 2888 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast && 2889 Lex.getCode() != tgtok::question && Lex.getCode() != tgtok::XGetDagOp && 2890 Lex.getCode() != tgtok::l_square) { 2891 TokError("expected identifier or list of value types in dag init"); 2892 return nullptr; 2893 } 2894 2895 const Init *Operator = ParseValue(CurRec); 2896 if (!Operator) return nullptr; 2897 2898 // If the operator name is present, parse it. 2899 const StringInit *OperatorName = nullptr; 2900 if (consume(tgtok::colon)) { 2901 if (Lex.getCode() != tgtok::VarName) { // eat the ':' 2902 TokError("expected variable name in dag operator"); 2903 return nullptr; 2904 } 2905 OperatorName = StringInit::get(Records, Lex.getCurStrVal()); 2906 Lex.Lex(); // eat the VarName. 2907 } 2908 2909 SmallVector<std::pair<const Init *, const StringInit *>, 8> DagArgs; 2910 if (Lex.getCode() != tgtok::r_paren) { 2911 ParseDagArgList(DagArgs, CurRec); 2912 if (DagArgs.empty()) return nullptr; 2913 } 2914 2915 if (!consume(tgtok::r_paren)) { 2916 TokError("expected ')' in dag init"); 2917 return nullptr; 2918 } 2919 2920 return DagInit::get(Operator, OperatorName, DagArgs); 2921 } 2922 } 2923 2924 return R; 2925 } 2926 2927 /// ParseValue - Parse a TableGen value. This returns null on error. 2928 /// 2929 /// Value ::= SimpleValue ValueSuffix* 2930 /// ValueSuffix ::= '{' BitList '}' 2931 /// ValueSuffix ::= '[' SliceElements ']' 2932 /// ValueSuffix ::= '.' ID 2933 /// 2934 const Init *TGParser::ParseValue(Record *CurRec, const RecTy *ItemType, 2935 IDParseMode Mode) { 2936 SMLoc LHSLoc = Lex.getLoc(); 2937 const Init *Result = ParseSimpleValue(CurRec, ItemType, Mode); 2938 if (!Result) return nullptr; 2939 2940 // Parse the suffixes now if present. 2941 while (true) { 2942 switch (Lex.getCode()) { 2943 default: return Result; 2944 case tgtok::l_brace: { 2945 if (Mode == ParseNameMode) 2946 // This is the beginning of the object body. 2947 return Result; 2948 2949 SMLoc CurlyLoc = Lex.getLoc(); 2950 Lex.Lex(); // eat the '{' 2951 SmallVector<unsigned, 16> Ranges; 2952 ParseRangeList(Ranges); 2953 if (Ranges.empty()) return nullptr; 2954 2955 // Reverse the bitlist. 2956 std::reverse(Ranges.begin(), Ranges.end()); 2957 Result = Result->convertInitializerBitRange(Ranges); 2958 if (!Result) { 2959 Error(CurlyLoc, "Invalid bit range for value"); 2960 return nullptr; 2961 } 2962 2963 // Eat the '}'. 2964 if (!consume(tgtok::r_brace)) { 2965 TokError("expected '}' at end of bit range list"); 2966 return nullptr; 2967 } 2968 break; 2969 } 2970 case tgtok::l_square: { 2971 const auto *LHS = dyn_cast<TypedInit>(Result); 2972 if (!LHS) { 2973 Error(LHSLoc, "Invalid value, list expected"); 2974 return nullptr; 2975 } 2976 2977 const auto *LHSTy = dyn_cast<ListRecTy>(LHS->getType()); 2978 if (!LHSTy) { 2979 Error(LHSLoc, "Type '" + Twine(LHS->getType()->getAsString()) + 2980 "' is invalid, list expected"); 2981 return nullptr; 2982 } 2983 2984 Lex.Lex(); // eat the '[' 2985 const TypedInit *RHS = ParseSliceElements(CurRec, /*Single=*/true); 2986 if (!RHS) 2987 return nullptr; 2988 2989 if (isa<ListRecTy>(RHS->getType())) { 2990 Result = 2991 BinOpInit::get(BinOpInit::LISTSLICE, LHS, RHS, LHSTy)->Fold(CurRec); 2992 } else { 2993 Result = BinOpInit::get(BinOpInit::LISTELEM, LHS, RHS, 2994 LHSTy->getElementType()) 2995 ->Fold(CurRec); 2996 } 2997 2998 assert(Result); 2999 3000 // Eat the ']'. 3001 if (!consume(tgtok::r_square)) { 3002 TokError("expected ']' at end of list slice"); 3003 return nullptr; 3004 } 3005 break; 3006 } 3007 case tgtok::dot: { 3008 if (Lex.Lex() != tgtok::Id) { // eat the . 3009 TokError("expected field identifier after '.'"); 3010 return nullptr; 3011 } 3012 SMRange FieldNameLoc = Lex.getLocRange(); 3013 const StringInit *FieldName = 3014 StringInit::get(Records, Lex.getCurStrVal()); 3015 if (!Result->getFieldType(FieldName)) { 3016 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" + 3017 Result->getAsString() + "'"); 3018 return nullptr; 3019 } 3020 3021 // Add a reference to this field if we know the record class. 3022 if (TrackReferenceLocs) { 3023 if (const auto *DI = dyn_cast<DefInit>(Result)) { 3024 const RecordVal *V = DI->getDef()->getValue(FieldName); 3025 const_cast<RecordVal *>(V)->addReferenceLoc(FieldNameLoc); 3026 } else if (const auto *TI = dyn_cast<TypedInit>(Result)) { 3027 if (const auto *RecTy = dyn_cast<RecordRecTy>(TI->getType())) { 3028 for (const Record *R : RecTy->getClasses()) 3029 if (const auto *RV = R->getValue(FieldName)) 3030 const_cast<RecordVal *>(RV)->addReferenceLoc(FieldNameLoc); 3031 } 3032 } 3033 } 3034 3035 Result = FieldInit::get(Result, FieldName)->Fold(CurRec); 3036 Lex.Lex(); // eat field name 3037 break; 3038 } 3039 3040 case tgtok::paste: 3041 SMLoc PasteLoc = Lex.getLoc(); 3042 const auto *LHS = dyn_cast<TypedInit>(Result); 3043 if (!LHS) { 3044 Error(PasteLoc, "LHS of paste is not typed!"); 3045 return nullptr; 3046 } 3047 3048 // Check if it's a 'listA # listB' 3049 if (isa<ListRecTy>(LHS->getType())) { 3050 Lex.Lex(); // Eat the '#'. 3051 3052 assert(Mode == ParseValueMode && "encountered paste of lists in name"); 3053 3054 switch (Lex.getCode()) { 3055 case tgtok::colon: 3056 case tgtok::semi: 3057 case tgtok::l_brace: 3058 Result = LHS; // trailing paste, ignore. 3059 break; 3060 default: 3061 const Init *RHSResult = ParseValue(CurRec, ItemType, ParseValueMode); 3062 if (!RHSResult) 3063 return nullptr; 3064 Result = BinOpInit::getListConcat(LHS, RHSResult); 3065 break; 3066 } 3067 break; 3068 } 3069 3070 // Create a !strconcat() operation, first casting each operand to 3071 // a string if necessary. 3072 if (LHS->getType() != StringRecTy::get(Records)) { 3073 auto CastLHS = dyn_cast<TypedInit>( 3074 UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get(Records)) 3075 ->Fold(CurRec)); 3076 if (!CastLHS) { 3077 Error(PasteLoc, 3078 Twine("can't cast '") + LHS->getAsString() + "' to string"); 3079 return nullptr; 3080 } 3081 LHS = CastLHS; 3082 } 3083 3084 const TypedInit *RHS = nullptr; 3085 3086 Lex.Lex(); // Eat the '#'. 3087 switch (Lex.getCode()) { 3088 case tgtok::colon: 3089 case tgtok::semi: 3090 case tgtok::l_brace: 3091 // These are all of the tokens that can begin an object body. 3092 // Some of these can also begin values but we disallow those cases 3093 // because they are unlikely to be useful. 3094 3095 // Trailing paste, concat with an empty string. 3096 RHS = StringInit::get(Records, ""); 3097 break; 3098 3099 default: 3100 const Init *RHSResult = ParseValue(CurRec, nullptr, ParseNameMode); 3101 if (!RHSResult) 3102 return nullptr; 3103 RHS = dyn_cast<TypedInit>(RHSResult); 3104 if (!RHS) { 3105 Error(PasteLoc, "RHS of paste is not typed!"); 3106 return nullptr; 3107 } 3108 3109 if (RHS->getType() != StringRecTy::get(Records)) { 3110 auto CastRHS = dyn_cast<TypedInit>( 3111 UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get(Records)) 3112 ->Fold(CurRec)); 3113 if (!CastRHS) { 3114 Error(PasteLoc, 3115 Twine("can't cast '") + RHS->getAsString() + "' to string"); 3116 return nullptr; 3117 } 3118 RHS = CastRHS; 3119 } 3120 3121 break; 3122 } 3123 3124 Result = BinOpInit::getStrConcat(LHS, RHS); 3125 break; 3126 } 3127 } 3128 } 3129 3130 /// ParseDagArgList - Parse the argument list for a dag literal expression. 3131 /// 3132 /// DagArg ::= Value (':' VARNAME)? 3133 /// DagArg ::= VARNAME 3134 /// DagArgList ::= DagArg 3135 /// DagArgList ::= DagArgList ',' DagArg 3136 void TGParser::ParseDagArgList( 3137 SmallVectorImpl<std::pair<const Init *, const StringInit *>> &Result, 3138 Record *CurRec) { 3139 3140 while (true) { 3141 // DagArg ::= VARNAME 3142 if (Lex.getCode() == tgtok::VarName) { 3143 // A missing value is treated like '?'. 3144 const StringInit *VarName = StringInit::get(Records, Lex.getCurStrVal()); 3145 Result.emplace_back(UnsetInit::get(Records), VarName); 3146 Lex.Lex(); 3147 } else { 3148 // DagArg ::= Value (':' VARNAME)? 3149 const Init *Val = ParseValue(CurRec); 3150 if (!Val) { 3151 Result.clear(); 3152 return; 3153 } 3154 3155 // If the variable name is present, add it. 3156 const StringInit *VarName = nullptr; 3157 if (Lex.getCode() == tgtok::colon) { 3158 if (Lex.Lex() != tgtok::VarName) { // eat the ':' 3159 TokError("expected variable name in dag literal"); 3160 Result.clear(); 3161 return; 3162 } 3163 VarName = StringInit::get(Records, Lex.getCurStrVal()); 3164 Lex.Lex(); // eat the VarName. 3165 } 3166 3167 Result.emplace_back(Val, VarName); 3168 } 3169 if (!consume(tgtok::comma)) 3170 break; 3171 } 3172 } 3173 3174 /// ParseValueList - Parse a comma separated list of values, returning them 3175 /// in a vector. Note that this always expects to be able to parse at least one 3176 /// value. It returns an empty list if this is not possible. 3177 /// 3178 /// ValueList ::= Value (',' Value) 3179 /// 3180 void TGParser::ParseValueList(SmallVectorImpl<const Init *> &Result, 3181 Record *CurRec, const RecTy *ItemType) { 3182 Result.push_back(ParseValue(CurRec, ItemType)); 3183 if (!Result.back()) { 3184 Result.clear(); 3185 return; 3186 } 3187 3188 while (consume(tgtok::comma)) { 3189 // ignore trailing comma for lists 3190 if (Lex.getCode() == tgtok::r_square) 3191 return; 3192 Result.push_back(ParseValue(CurRec, ItemType)); 3193 if (!Result.back()) { 3194 Result.clear(); 3195 return; 3196 } 3197 } 3198 } 3199 3200 // ParseTemplateArgValueList - Parse a template argument list with the syntax 3201 // shown, filling in the Result vector. The open angle has been consumed. 3202 // An empty argument list is allowed. Return false if okay, true if an 3203 // error was detected. 3204 // 3205 // ArgValueList ::= '<' PostionalArgValueList [','] NamedArgValueList '>' 3206 // PostionalArgValueList ::= [Value {',' Value}*] 3207 // NamedArgValueList ::= [NameValue '=' Value {',' NameValue '=' Value}*] 3208 bool TGParser::ParseTemplateArgValueList( 3209 SmallVectorImpl<const ArgumentInit *> &Result, 3210 SmallVectorImpl<SMLoc> &ArgLocs, Record *CurRec, const Record *ArgsRec) { 3211 assert(Result.empty() && "Result vector is not empty"); 3212 ArrayRef<const Init *> TArgs = ArgsRec->getTemplateArgs(); 3213 3214 if (consume(tgtok::greater)) // empty value list 3215 return false; 3216 3217 bool HasNamedArg = false; 3218 unsigned ArgIndex = 0; 3219 while (true) { 3220 if (ArgIndex >= TArgs.size()) { 3221 TokError("Too many template arguments: " + utostr(ArgIndex + 1)); 3222 return true; 3223 } 3224 3225 SMLoc ValueLoc = ArgLocs.emplace_back(Lex.getLoc()); 3226 // If we are parsing named argument, we don't need to know the argument name 3227 // and argument type will be resolved after we know the name. 3228 const Init *Value = ParseValue( 3229 CurRec, 3230 HasNamedArg ? nullptr : ArgsRec->getValue(TArgs[ArgIndex])->getType()); 3231 if (!Value) 3232 return true; 3233 3234 // If we meet '=', then we are parsing named arguments. 3235 if (Lex.getCode() == tgtok::equal) { 3236 if (!isa<StringInit>(Value)) 3237 return Error(ValueLoc, 3238 "The name of named argument should be a valid identifier"); 3239 3240 auto *Name = cast<StringInit>(Value); 3241 const Init *QualifiedName = QualifyName(*ArgsRec, Name); 3242 auto *NamedArg = ArgsRec->getValue(QualifiedName); 3243 if (!NamedArg) 3244 return Error(ValueLoc, 3245 "Argument " + Name->getAsString() + " doesn't exist"); 3246 3247 Lex.Lex(); // eat the '='. 3248 ValueLoc = Lex.getLoc(); 3249 Value = ParseValue(CurRec, NamedArg->getType()); 3250 // Named value can't be uninitialized. 3251 if (isa<UnsetInit>(Value)) 3252 return Error(ValueLoc, 3253 "The value of named argument should be initialized, " 3254 "but we got '" + 3255 Value->getAsString() + "'"); 3256 3257 Result.push_back(ArgumentInit::get(Value, QualifiedName)); 3258 HasNamedArg = true; 3259 } else { 3260 // Positional arguments should be put before named arguments. 3261 if (HasNamedArg) 3262 return Error(ValueLoc, 3263 "Positional argument should be put before named argument"); 3264 3265 Result.push_back(ArgumentInit::get(Value, ArgIndex)); 3266 } 3267 3268 if (consume(tgtok::greater)) // end of argument list? 3269 return false; 3270 if (!consume(tgtok::comma)) 3271 return TokError("Expected comma before next argument"); 3272 ++ArgIndex; 3273 } 3274 } 3275 3276 /// ParseDeclaration - Read a declaration, returning the name of field ID, or an 3277 /// empty string on error. This can happen in a number of different contexts, 3278 /// including within a def or in the template args for a class (in which case 3279 /// CurRec will be non-null) and within the template args for a multiclass (in 3280 /// which case CurRec will be null, but CurMultiClass will be set). This can 3281 /// also happen within a def that is within a multiclass, which will set both 3282 /// CurRec and CurMultiClass. 3283 /// 3284 /// Declaration ::= FIELD? Type ID ('=' Value)? 3285 /// 3286 const Init *TGParser::ParseDeclaration(Record *CurRec, 3287 bool ParsingTemplateArgs) { 3288 // Read the field prefix if present. 3289 bool HasField = consume(tgtok::Field); 3290 3291 const RecTy *Type = ParseType(); 3292 if (!Type) return nullptr; 3293 3294 if (Lex.getCode() != tgtok::Id) { 3295 TokError("Expected identifier in declaration"); 3296 return nullptr; 3297 } 3298 3299 std::string Str = Lex.getCurStrVal(); 3300 if (Str == "NAME") { 3301 TokError("'" + Str + "' is a reserved variable name"); 3302 return nullptr; 3303 } 3304 3305 if (!ParsingTemplateArgs && CurScope->varAlreadyDefined(Str)) { 3306 TokError("local variable of this name already exists"); 3307 return nullptr; 3308 } 3309 3310 SMLoc IdLoc = Lex.getLoc(); 3311 const Init *DeclName = StringInit::get(Records, Str); 3312 Lex.Lex(); 3313 3314 bool BadField; 3315 if (!ParsingTemplateArgs) { // def, possibly in a multiclass 3316 BadField = AddValue(CurRec, IdLoc, 3317 RecordVal(DeclName, IdLoc, Type, 3318 HasField ? RecordVal::FK_NonconcreteOK 3319 : RecordVal::FK_Normal)); 3320 } else if (CurRec) { // class template argument 3321 DeclName = QualifyName(*CurRec, DeclName); 3322 BadField = 3323 AddValue(CurRec, IdLoc, 3324 RecordVal(DeclName, IdLoc, Type, RecordVal::FK_TemplateArg)); 3325 } else { // multiclass template argument 3326 assert(CurMultiClass && "invalid context for template argument"); 3327 DeclName = QualifyName(CurMultiClass, DeclName); 3328 BadField = 3329 AddValue(CurRec, IdLoc, 3330 RecordVal(DeclName, IdLoc, Type, RecordVal::FK_TemplateArg)); 3331 } 3332 if (BadField) 3333 return nullptr; 3334 3335 // If a value is present, parse it and set new field's value. 3336 if (consume(tgtok::equal)) { 3337 SMLoc ValLoc = Lex.getLoc(); 3338 const Init *Val = ParseValue(CurRec, Type); 3339 if (!Val || 3340 SetValue(CurRec, ValLoc, DeclName, {}, Val, 3341 /*AllowSelfAssignment=*/false, /*OverrideDefLoc=*/false)) { 3342 // Return the name, even if an error is thrown. This is so that we can 3343 // continue to make some progress, even without the value having been 3344 // initialized. 3345 return DeclName; 3346 } 3347 } 3348 3349 return DeclName; 3350 } 3351 3352 /// ParseForeachDeclaration - Read a foreach declaration, returning 3353 /// the name of the declared object or a NULL Init on error. Return 3354 /// the name of the parsed initializer list through ForeachListName. 3355 /// 3356 /// ForeachDeclaration ::= ID '=' '{' RangeList '}' 3357 /// ForeachDeclaration ::= ID '=' RangePiece 3358 /// ForeachDeclaration ::= ID '=' Value 3359 /// 3360 const VarInit * 3361 TGParser::ParseForeachDeclaration(const Init *&ForeachListValue) { 3362 if (Lex.getCode() != tgtok::Id) { 3363 TokError("Expected identifier in foreach declaration"); 3364 return nullptr; 3365 } 3366 3367 const Init *DeclName = StringInit::get(Records, Lex.getCurStrVal()); 3368 Lex.Lex(); 3369 3370 // If a value is present, parse it. 3371 if (!consume(tgtok::equal)) { 3372 TokError("Expected '=' in foreach declaration"); 3373 return nullptr; 3374 } 3375 3376 const RecTy *IterType = nullptr; 3377 SmallVector<unsigned, 16> Ranges; 3378 3379 switch (Lex.getCode()) { 3380 case tgtok::l_brace: { // '{' RangeList '}' 3381 Lex.Lex(); // eat the '{' 3382 ParseRangeList(Ranges); 3383 if (!consume(tgtok::r_brace)) { 3384 TokError("expected '}' at end of bit range list"); 3385 return nullptr; 3386 } 3387 break; 3388 } 3389 3390 default: { 3391 SMLoc ValueLoc = Lex.getLoc(); 3392 const Init *I = ParseValue(nullptr); 3393 if (!I) 3394 return nullptr; 3395 3396 const auto *TI = dyn_cast<TypedInit>(I); 3397 if (TI && isa<ListRecTy>(TI->getType())) { 3398 ForeachListValue = I; 3399 IterType = cast<ListRecTy>(TI->getType())->getElementType(); 3400 break; 3401 } 3402 3403 if (TI) { 3404 if (ParseRangePiece(Ranges, TI)) 3405 return nullptr; 3406 break; 3407 } 3408 3409 Error(ValueLoc, "expected a list, got '" + I->getAsString() + "'"); 3410 if (CurMultiClass) { 3411 PrintNote({}, "references to multiclass template arguments cannot be " 3412 "resolved at this time"); 3413 } 3414 return nullptr; 3415 } 3416 } 3417 3418 3419 if (!Ranges.empty()) { 3420 assert(!IterType && "Type already initialized?"); 3421 IterType = IntRecTy::get(Records); 3422 std::vector<Init *> Values; 3423 for (unsigned R : Ranges) 3424 Values.push_back(IntInit::get(Records, R)); 3425 ForeachListValue = ListInit::get(Values, IterType); 3426 } 3427 3428 if (!IterType) 3429 return nullptr; 3430 3431 return VarInit::get(DeclName, IterType); 3432 } 3433 3434 /// ParseTemplateArgList - Read a template argument list, which is a non-empty 3435 /// sequence of template-declarations in <>'s. If CurRec is non-null, these are 3436 /// template args for a class. If null, these are the template args for a 3437 /// multiclass. 3438 /// 3439 /// TemplateArgList ::= '<' Declaration (',' Declaration)* '>' 3440 /// 3441 bool TGParser::ParseTemplateArgList(Record *CurRec) { 3442 assert(Lex.getCode() == tgtok::less && "Not a template arg list!"); 3443 Lex.Lex(); // eat the '<' 3444 3445 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec; 3446 3447 // Read the first declaration. 3448 const Init *TemplArg = ParseDeclaration(CurRec, true /*templateargs*/); 3449 if (!TemplArg) 3450 return true; 3451 3452 TheRecToAddTo->addTemplateArg(TemplArg); 3453 3454 while (consume(tgtok::comma)) { 3455 // Read the following declarations. 3456 SMLoc Loc = Lex.getLoc(); 3457 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); 3458 if (!TemplArg) 3459 return true; 3460 3461 if (TheRecToAddTo->isTemplateArg(TemplArg)) 3462 return Error(Loc, "template argument with the same name has already been " 3463 "defined"); 3464 3465 TheRecToAddTo->addTemplateArg(TemplArg); 3466 } 3467 3468 if (!consume(tgtok::greater)) 3469 return TokError("expected '>' at end of template argument list"); 3470 return false; 3471 } 3472 3473 /// ParseBodyItem - Parse a single item within the body of a def or class. 3474 /// 3475 /// BodyItem ::= Declaration ';' 3476 /// BodyItem ::= LET ID OptionalBitList '=' Value ';' 3477 /// BodyItem ::= Defvar 3478 /// BodyItem ::= Dump 3479 /// BodyItem ::= Assert 3480 /// 3481 bool TGParser::ParseBodyItem(Record *CurRec) { 3482 if (Lex.getCode() == tgtok::Assert) 3483 return ParseAssert(nullptr, CurRec); 3484 3485 if (Lex.getCode() == tgtok::Defvar) 3486 return ParseDefvar(CurRec); 3487 3488 if (Lex.getCode() == tgtok::Dump) 3489 return ParseDump(nullptr, CurRec); 3490 3491 if (Lex.getCode() != tgtok::Let) { 3492 if (!ParseDeclaration(CurRec, false)) 3493 return true; 3494 3495 if (!consume(tgtok::semi)) 3496 return TokError("expected ';' after declaration"); 3497 return false; 3498 } 3499 3500 // LET ID OptionalRangeList '=' Value ';' 3501 if (Lex.Lex() != tgtok::Id) 3502 return TokError("expected field identifier after let"); 3503 3504 SMLoc IdLoc = Lex.getLoc(); 3505 const StringInit *FieldName = StringInit::get(Records, Lex.getCurStrVal()); 3506 Lex.Lex(); // eat the field name. 3507 3508 SmallVector<unsigned, 16> BitList; 3509 if (ParseOptionalBitList(BitList)) 3510 return true; 3511 std::reverse(BitList.begin(), BitList.end()); 3512 3513 if (!consume(tgtok::equal)) 3514 return TokError("expected '=' in let expression"); 3515 3516 RecordVal *Field = CurRec->getValue(FieldName); 3517 if (!Field) 3518 return Error(IdLoc, "Value '" + FieldName->getValue() + "' unknown!"); 3519 3520 const RecTy *Type = Field->getType(); 3521 if (!BitList.empty() && isa<BitsRecTy>(Type)) { 3522 // When assigning to a subset of a 'bits' object, expect the RHS to have 3523 // the type of that subset instead of the type of the whole object. 3524 Type = BitsRecTy::get(Records, BitList.size()); 3525 } 3526 3527 const Init *Val = ParseValue(CurRec, Type); 3528 if (!Val) return true; 3529 3530 if (!consume(tgtok::semi)) 3531 return TokError("expected ';' after let expression"); 3532 3533 return SetValue(CurRec, IdLoc, FieldName, BitList, Val); 3534 } 3535 3536 /// ParseBody - Read the body of a class or def. Return true on error, false on 3537 /// success. 3538 /// 3539 /// Body ::= ';' 3540 /// Body ::= '{' BodyList '}' 3541 /// BodyList BodyItem* 3542 /// 3543 bool TGParser::ParseBody(Record *CurRec) { 3544 // If this is a null definition, just eat the semi and return. 3545 if (consume(tgtok::semi)) 3546 return false; 3547 3548 if (!consume(tgtok::l_brace)) 3549 return TokError("Expected '{' to start body or ';' for declaration only"); 3550 3551 while (Lex.getCode() != tgtok::r_brace) 3552 if (ParseBodyItem(CurRec)) 3553 return true; 3554 3555 // Eat the '}'. 3556 Lex.Lex(); 3557 3558 // If we have a semicolon, print a gentle error. 3559 SMLoc SemiLoc = Lex.getLoc(); 3560 if (consume(tgtok::semi)) { 3561 PrintError(SemiLoc, "A class or def body should not end with a semicolon"); 3562 PrintNote("Semicolon ignored; remove to eliminate this error"); 3563 } 3564 3565 return false; 3566 } 3567 3568 /// Apply the current let bindings to \a CurRec. 3569 /// \returns true on error, false otherwise. 3570 bool TGParser::ApplyLetStack(Record *CurRec) { 3571 for (SmallVectorImpl<LetRecord> &LetInfo : LetStack) 3572 for (LetRecord &LR : LetInfo) 3573 if (SetValue(CurRec, LR.Loc, LR.Name, LR.Bits, LR.Value)) 3574 return true; 3575 return false; 3576 } 3577 3578 /// Apply the current let bindings to the RecordsEntry. 3579 bool TGParser::ApplyLetStack(RecordsEntry &Entry) { 3580 if (Entry.Rec) 3581 return ApplyLetStack(Entry.Rec.get()); 3582 3583 // Let bindings are not applied to assertions. 3584 if (Entry.Assertion) 3585 return false; 3586 3587 // Let bindings are not applied to dumps. 3588 if (Entry.Dump) 3589 return false; 3590 3591 for (auto &E : Entry.Loop->Entries) { 3592 if (ApplyLetStack(E)) 3593 return true; 3594 } 3595 3596 return false; 3597 } 3598 3599 /// ParseObjectBody - Parse the body of a def or class. This consists of an 3600 /// optional ClassList followed by a Body. CurRec is the current def or class 3601 /// that is being parsed. 3602 /// 3603 /// ObjectBody ::= BaseClassList Body 3604 /// BaseClassList ::= /*empty*/ 3605 /// BaseClassList ::= ':' BaseClassListNE 3606 /// BaseClassListNE ::= SubClassRef (',' SubClassRef)* 3607 /// 3608 bool TGParser::ParseObjectBody(Record *CurRec) { 3609 // An object body introduces a new scope for local variables. 3610 TGVarScope *ObjectScope = PushScope(CurRec); 3611 // If there is a baseclass list, read it. 3612 if (consume(tgtok::colon)) { 3613 3614 // Read all of the subclasses. 3615 SubClassReference SubClass = ParseSubClassReference(CurRec, false); 3616 while (true) { 3617 // Check for error. 3618 if (!SubClass.Rec) return true; 3619 3620 // Add it. 3621 if (AddSubClass(CurRec, SubClass)) 3622 return true; 3623 3624 if (!consume(tgtok::comma)) 3625 break; 3626 SubClass = ParseSubClassReference(CurRec, false); 3627 } 3628 } 3629 3630 if (ApplyLetStack(CurRec)) 3631 return true; 3632 3633 bool Result = ParseBody(CurRec); 3634 PopScope(ObjectScope); 3635 return Result; 3636 } 3637 3638 /// ParseDef - Parse and return a top level or multiclass record definition. 3639 /// Return false if okay, true if error. 3640 /// 3641 /// DefInst ::= DEF ObjectName ObjectBody 3642 /// 3643 bool TGParser::ParseDef(MultiClass *CurMultiClass) { 3644 SMLoc DefLoc = Lex.getLoc(); 3645 assert(Lex.getCode() == tgtok::Def && "Unknown tok"); 3646 Lex.Lex(); // Eat the 'def' token. 3647 3648 // If the name of the def is an Id token, use that for the location. 3649 // Otherwise, the name is more complex and we use the location of the 'def' 3650 // token. 3651 SMLoc NameLoc = Lex.getCode() == tgtok::Id ? Lex.getLoc() : DefLoc; 3652 3653 // Parse ObjectName and make a record for it. 3654 std::unique_ptr<Record> CurRec; 3655 const Init *Name = ParseObjectName(CurMultiClass); 3656 if (!Name) 3657 return true; 3658 3659 if (isa<UnsetInit>(Name)) { 3660 CurRec = std::make_unique<Record>(Records.getNewAnonymousName(), DefLoc, 3661 Records, Record::RK_AnonymousDef); 3662 } else { 3663 CurRec = std::make_unique<Record>(Name, NameLoc, Records); 3664 } 3665 3666 if (ParseObjectBody(CurRec.get())) 3667 return true; 3668 3669 return addEntry(std::move(CurRec)); 3670 } 3671 3672 /// ParseDefset - Parse a defset statement. 3673 /// 3674 /// Defset ::= DEFSET Type Id '=' '{' ObjectList '}' 3675 /// 3676 bool TGParser::ParseDefset() { 3677 assert(Lex.getCode() == tgtok::Defset); 3678 Lex.Lex(); // Eat the 'defset' token 3679 3680 DefsetRecord Defset; 3681 Defset.Loc = Lex.getLoc(); 3682 const RecTy *Type = ParseType(); 3683 if (!Type) 3684 return true; 3685 if (!isa<ListRecTy>(Type)) 3686 return Error(Defset.Loc, "expected list type"); 3687 Defset.EltTy = cast<ListRecTy>(Type)->getElementType(); 3688 3689 if (Lex.getCode() != tgtok::Id) 3690 return TokError("expected identifier"); 3691 const StringInit *DeclName = StringInit::get(Records, Lex.getCurStrVal()); 3692 if (Records.getGlobal(DeclName->getValue())) 3693 return TokError("def or global variable of this name already exists"); 3694 3695 if (Lex.Lex() != tgtok::equal) // Eat the identifier 3696 return TokError("expected '='"); 3697 if (Lex.Lex() != tgtok::l_brace) // Eat the '=' 3698 return TokError("expected '{'"); 3699 SMLoc BraceLoc = Lex.getLoc(); 3700 Lex.Lex(); // Eat the '{' 3701 3702 Defsets.push_back(&Defset); 3703 bool Err = ParseObjectList(nullptr); 3704 Defsets.pop_back(); 3705 if (Err) 3706 return true; 3707 3708 if (!consume(tgtok::r_brace)) { 3709 TokError("expected '}' at end of defset"); 3710 return Error(BraceLoc, "to match this '{'"); 3711 } 3712 3713 Records.addExtraGlobal(DeclName->getValue(), 3714 ListInit::get(Defset.Elements, Defset.EltTy)); 3715 return false; 3716 } 3717 3718 /// ParseDeftype - Parse a defvar statement. 3719 /// 3720 /// Deftype ::= DEFTYPE Id '=' Type ';' 3721 /// 3722 bool TGParser::ParseDeftype() { 3723 assert(Lex.getCode() == tgtok::Deftype); 3724 Lex.Lex(); // Eat the 'deftype' token 3725 3726 if (Lex.getCode() != tgtok::Id) 3727 return TokError("expected identifier"); 3728 3729 const std::string TypeName = Lex.getCurStrVal(); 3730 if (TypeAliases.count(TypeName) || Records.getClass(TypeName)) 3731 return TokError("type of this name '" + TypeName + "' already exists"); 3732 3733 Lex.Lex(); 3734 if (!consume(tgtok::equal)) 3735 return TokError("expected '='"); 3736 3737 SMLoc Loc = Lex.getLoc(); 3738 const RecTy *Type = ParseType(); 3739 if (!Type) 3740 return true; 3741 3742 if (Type->getRecTyKind() == RecTy::RecordRecTyKind) 3743 return Error(Loc, "cannot define type alias for class type '" + 3744 Type->getAsString() + "'"); 3745 3746 TypeAliases[TypeName] = Type; 3747 3748 if (!consume(tgtok::semi)) 3749 return TokError("expected ';'"); 3750 3751 return false; 3752 } 3753 3754 /// ParseDefvar - Parse a defvar statement. 3755 /// 3756 /// Defvar ::= DEFVAR Id '=' Value ';' 3757 /// 3758 bool TGParser::ParseDefvar(Record *CurRec) { 3759 assert(Lex.getCode() == tgtok::Defvar); 3760 Lex.Lex(); // Eat the 'defvar' token 3761 3762 if (Lex.getCode() != tgtok::Id) 3763 return TokError("expected identifier"); 3764 const StringInit *DeclName = StringInit::get(Records, Lex.getCurStrVal()); 3765 if (CurScope->varAlreadyDefined(DeclName->getValue())) 3766 return TokError("local variable of this name already exists"); 3767 3768 // The name should not be conflicted with existed field names. 3769 if (CurRec) { 3770 auto *V = CurRec->getValue(DeclName->getValue()); 3771 if (V && !V->isTemplateArg()) 3772 return TokError("field of this name already exists"); 3773 } 3774 3775 // If this defvar is in the top level, the name should not be conflicted 3776 // with existed global names. 3777 if (CurScope->isOutermost() && Records.getGlobal(DeclName->getValue())) 3778 return TokError("def or global variable of this name already exists"); 3779 3780 Lex.Lex(); 3781 if (!consume(tgtok::equal)) 3782 return TokError("expected '='"); 3783 3784 const Init *Value = ParseValue(CurRec); 3785 if (!Value) 3786 return true; 3787 3788 if (!consume(tgtok::semi)) 3789 return TokError("expected ';'"); 3790 3791 if (!CurScope->isOutermost()) 3792 CurScope->addVar(DeclName->getValue(), Value); 3793 else 3794 Records.addExtraGlobal(DeclName->getValue(), Value); 3795 3796 return false; 3797 } 3798 3799 /// ParseForeach - Parse a for statement. Return the record corresponding 3800 /// to it. This returns true on error. 3801 /// 3802 /// Foreach ::= FOREACH Declaration IN '{ ObjectList '}' 3803 /// Foreach ::= FOREACH Declaration IN Object 3804 /// 3805 bool TGParser::ParseForeach(MultiClass *CurMultiClass) { 3806 SMLoc Loc = Lex.getLoc(); 3807 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok"); 3808 Lex.Lex(); // Eat the 'for' token. 3809 3810 // Make a temporary object to record items associated with the for 3811 // loop. 3812 const Init *ListValue = nullptr; 3813 const VarInit *IterName = ParseForeachDeclaration(ListValue); 3814 if (!IterName) 3815 return TokError("expected declaration in for"); 3816 3817 if (!consume(tgtok::In)) 3818 return TokError("Unknown tok"); 3819 3820 // Create a loop object and remember it. 3821 auto TheLoop = std::make_unique<ForeachLoop>(Loc, IterName, ListValue); 3822 // A foreach loop introduces a new scope for local variables. 3823 TGVarScope *ForeachScope = PushScope(TheLoop.get()); 3824 Loops.push_back(std::move(TheLoop)); 3825 3826 if (Lex.getCode() != tgtok::l_brace) { 3827 // FOREACH Declaration IN Object 3828 if (ParseObject(CurMultiClass)) 3829 return true; 3830 } else { 3831 SMLoc BraceLoc = Lex.getLoc(); 3832 // Otherwise, this is a group foreach. 3833 Lex.Lex(); // eat the '{'. 3834 3835 // Parse the object list. 3836 if (ParseObjectList(CurMultiClass)) 3837 return true; 3838 3839 if (!consume(tgtok::r_brace)) { 3840 TokError("expected '}' at end of foreach command"); 3841 return Error(BraceLoc, "to match this '{'"); 3842 } 3843 } 3844 3845 PopScope(ForeachScope); 3846 3847 // Resolve the loop or store it for later resolution. 3848 std::unique_ptr<ForeachLoop> Loop = std::move(Loops.back()); 3849 Loops.pop_back(); 3850 3851 return addEntry(std::move(Loop)); 3852 } 3853 3854 /// ParseIf - Parse an if statement. 3855 /// 3856 /// If ::= IF Value THEN IfBody 3857 /// If ::= IF Value THEN IfBody ELSE IfBody 3858 /// 3859 bool TGParser::ParseIf(MultiClass *CurMultiClass) { 3860 SMLoc Loc = Lex.getLoc(); 3861 assert(Lex.getCode() == tgtok::If && "Unknown tok"); 3862 Lex.Lex(); // Eat the 'if' token. 3863 3864 // Make a temporary object to record items associated with the for 3865 // loop. 3866 const Init *Condition = ParseValue(nullptr); 3867 if (!Condition) 3868 return true; 3869 3870 if (!consume(tgtok::Then)) 3871 return TokError("Unknown tok"); 3872 3873 // We have to be able to save if statements to execute later, and they have 3874 // to live on the same stack as foreach loops. The simplest implementation 3875 // technique is to convert each 'then' or 'else' clause *into* a foreach 3876 // loop, over a list of length 0 or 1 depending on the condition, and with no 3877 // iteration variable being assigned. 3878 3879 const ListInit *EmptyList = ListInit::get({}, BitRecTy::get(Records)); 3880 const ListInit *SingletonList = 3881 ListInit::get({BitInit::get(Records, true)}, BitRecTy::get(Records)); 3882 const RecTy *BitListTy = ListRecTy::get(BitRecTy::get(Records)); 3883 3884 // The foreach containing the then-clause selects SingletonList if 3885 // the condition is true. 3886 const Init *ThenClauseList = 3887 TernOpInit::get(TernOpInit::IF, Condition, SingletonList, EmptyList, 3888 BitListTy) 3889 ->Fold(nullptr); 3890 Loops.push_back(std::make_unique<ForeachLoop>(Loc, nullptr, ThenClauseList)); 3891 3892 if (ParseIfBody(CurMultiClass, "then")) 3893 return true; 3894 3895 std::unique_ptr<ForeachLoop> Loop = std::move(Loops.back()); 3896 Loops.pop_back(); 3897 3898 if (addEntry(std::move(Loop))) 3899 return true; 3900 3901 // Now look for an optional else clause. The if-else syntax has the usual 3902 // dangling-else ambiguity, and by greedily matching an else here if we can, 3903 // we implement the usual resolution of pairing with the innermost unmatched 3904 // if. 3905 if (consume(tgtok::ElseKW)) { 3906 // The foreach containing the else-clause uses the same pair of lists as 3907 // above, but this time, selects SingletonList if the condition is *false*. 3908 const Init *ElseClauseList = 3909 TernOpInit::get(TernOpInit::IF, Condition, EmptyList, SingletonList, 3910 BitListTy) 3911 ->Fold(nullptr); 3912 Loops.push_back( 3913 std::make_unique<ForeachLoop>(Loc, nullptr, ElseClauseList)); 3914 3915 if (ParseIfBody(CurMultiClass, "else")) 3916 return true; 3917 3918 Loop = std::move(Loops.back()); 3919 Loops.pop_back(); 3920 3921 if (addEntry(std::move(Loop))) 3922 return true; 3923 } 3924 3925 return false; 3926 } 3927 3928 /// ParseIfBody - Parse the then-clause or else-clause of an if statement. 3929 /// 3930 /// IfBody ::= Object 3931 /// IfBody ::= '{' ObjectList '}' 3932 /// 3933 bool TGParser::ParseIfBody(MultiClass *CurMultiClass, StringRef Kind) { 3934 // An if-statement introduces a new scope for local variables. 3935 TGVarScope *BodyScope = PushScope(); 3936 3937 if (Lex.getCode() != tgtok::l_brace) { 3938 // A single object. 3939 if (ParseObject(CurMultiClass)) 3940 return true; 3941 } else { 3942 SMLoc BraceLoc = Lex.getLoc(); 3943 // A braced block. 3944 Lex.Lex(); // eat the '{'. 3945 3946 // Parse the object list. 3947 if (ParseObjectList(CurMultiClass)) 3948 return true; 3949 3950 if (!consume(tgtok::r_brace)) { 3951 TokError("expected '}' at end of '" + Kind + "' clause"); 3952 return Error(BraceLoc, "to match this '{'"); 3953 } 3954 } 3955 3956 PopScope(BodyScope); 3957 return false; 3958 } 3959 3960 /// ParseAssert - Parse an assert statement. 3961 /// 3962 /// Assert ::= ASSERT condition , message ; 3963 bool TGParser::ParseAssert(MultiClass *CurMultiClass, Record *CurRec) { 3964 assert(Lex.getCode() == tgtok::Assert && "Unknown tok"); 3965 Lex.Lex(); // Eat the 'assert' token. 3966 3967 SMLoc ConditionLoc = Lex.getLoc(); 3968 const Init *Condition = ParseValue(CurRec); 3969 if (!Condition) 3970 return true; 3971 3972 if (!consume(tgtok::comma)) { 3973 TokError("expected ',' in assert statement"); 3974 return true; 3975 } 3976 3977 const Init *Message = ParseValue(CurRec); 3978 if (!Message) 3979 return true; 3980 3981 if (!consume(tgtok::semi)) 3982 return TokError("expected ';'"); 3983 3984 if (CurRec) 3985 CurRec->addAssertion(ConditionLoc, Condition, Message); 3986 else 3987 addEntry(std::make_unique<Record::AssertionInfo>(ConditionLoc, Condition, 3988 Message)); 3989 return false; 3990 } 3991 3992 /// ParseClass - Parse a tblgen class definition. 3993 /// 3994 /// ClassInst ::= CLASS ID TemplateArgList? ObjectBody 3995 /// 3996 bool TGParser::ParseClass() { 3997 assert(Lex.getCode() == tgtok::Class && "Unexpected token!"); 3998 Lex.Lex(); 3999 4000 if (Lex.getCode() != tgtok::Id) 4001 return TokError("expected class name after 'class' keyword"); 4002 4003 const std::string &Name = Lex.getCurStrVal(); 4004 Record *CurRec = const_cast<Record *>(Records.getClass(Name)); 4005 if (CurRec) { 4006 // If the body was previously defined, this is an error. 4007 if (!CurRec->getValues().empty() || 4008 !CurRec->getSuperClasses().empty() || 4009 !CurRec->getTemplateArgs().empty()) 4010 return TokError("Class '" + CurRec->getNameInitAsString() + 4011 "' already defined"); 4012 4013 CurRec->updateClassLoc(Lex.getLoc()); 4014 } else { 4015 // If this is the first reference to this class, create and add it. 4016 auto NewRec = std::make_unique<Record>(Lex.getCurStrVal(), Lex.getLoc(), 4017 Records, Record::RK_Class); 4018 CurRec = NewRec.get(); 4019 Records.addClass(std::move(NewRec)); 4020 } 4021 4022 if (TypeAliases.count(Name)) 4023 return TokError("there is already a defined type alias '" + Name + "'"); 4024 4025 Lex.Lex(); // eat the name. 4026 4027 // A class definition introduces a new scope. 4028 TGVarScope *ClassScope = PushScope(CurRec); 4029 // If there are template args, parse them. 4030 if (Lex.getCode() == tgtok::less) 4031 if (ParseTemplateArgList(CurRec)) 4032 return true; 4033 4034 if (ParseObjectBody(CurRec)) 4035 return true; 4036 4037 if (!NoWarnOnUnusedTemplateArgs) 4038 CurRec->checkUnusedTemplateArgs(); 4039 4040 PopScope(ClassScope); 4041 return false; 4042 } 4043 4044 /// ParseLetList - Parse a non-empty list of assignment expressions into a list 4045 /// of LetRecords. 4046 /// 4047 /// LetList ::= LetItem (',' LetItem)* 4048 /// LetItem ::= ID OptionalRangeList '=' Value 4049 /// 4050 void TGParser::ParseLetList(SmallVectorImpl<LetRecord> &Result) { 4051 do { 4052 if (Lex.getCode() != tgtok::Id) { 4053 TokError("expected identifier in let definition"); 4054 Result.clear(); 4055 return; 4056 } 4057 4058 const StringInit *Name = StringInit::get(Records, Lex.getCurStrVal()); 4059 SMLoc NameLoc = Lex.getLoc(); 4060 Lex.Lex(); // Eat the identifier. 4061 4062 // Check for an optional RangeList. 4063 SmallVector<unsigned, 16> Bits; 4064 if (ParseOptionalRangeList(Bits)) { 4065 Result.clear(); 4066 return; 4067 } 4068 std::reverse(Bits.begin(), Bits.end()); 4069 4070 if (!consume(tgtok::equal)) { 4071 TokError("expected '=' in let expression"); 4072 Result.clear(); 4073 return; 4074 } 4075 4076 const Init *Val = ParseValue(nullptr); 4077 if (!Val) { 4078 Result.clear(); 4079 return; 4080 } 4081 4082 // Now that we have everything, add the record. 4083 Result.emplace_back(Name, Bits, Val, NameLoc); 4084 } while (consume(tgtok::comma)); 4085 } 4086 4087 /// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of 4088 /// different related productions. This works inside multiclasses too. 4089 /// 4090 /// Object ::= LET LetList IN '{' ObjectList '}' 4091 /// Object ::= LET LetList IN Object 4092 /// 4093 bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) { 4094 assert(Lex.getCode() == tgtok::Let && "Unexpected token"); 4095 Lex.Lex(); 4096 4097 // Add this entry to the let stack. 4098 SmallVector<LetRecord, 8> LetInfo; 4099 ParseLetList(LetInfo); 4100 if (LetInfo.empty()) return true; 4101 LetStack.push_back(std::move(LetInfo)); 4102 4103 if (!consume(tgtok::In)) 4104 return TokError("expected 'in' at end of top-level 'let'"); 4105 4106 // If this is a scalar let, just handle it now 4107 if (Lex.getCode() != tgtok::l_brace) { 4108 // LET LetList IN Object 4109 if (ParseObject(CurMultiClass)) 4110 return true; 4111 } else { // Object ::= LETCommand '{' ObjectList '}' 4112 SMLoc BraceLoc = Lex.getLoc(); 4113 // Otherwise, this is a group let. 4114 Lex.Lex(); // eat the '{'. 4115 4116 // A group let introduces a new scope for local variables. 4117 TGVarScope *LetScope = PushScope(); 4118 4119 // Parse the object list. 4120 if (ParseObjectList(CurMultiClass)) 4121 return true; 4122 4123 if (!consume(tgtok::r_brace)) { 4124 TokError("expected '}' at end of top level let command"); 4125 return Error(BraceLoc, "to match this '{'"); 4126 } 4127 4128 PopScope(LetScope); 4129 } 4130 4131 // Outside this let scope, this let block is not active. 4132 LetStack.pop_back(); 4133 return false; 4134 } 4135 4136 /// ParseMultiClass - Parse a multiclass definition. 4137 /// 4138 /// MultiClassInst ::= MULTICLASS ID TemplateArgList? 4139 /// ':' BaseMultiClassList '{' MultiClassObject+ '}' 4140 /// MultiClassObject ::= Assert 4141 /// MultiClassObject ::= DefInst 4142 /// MultiClassObject ::= DefMInst 4143 /// MultiClassObject ::= Defvar 4144 /// MultiClassObject ::= Foreach 4145 /// MultiClassObject ::= If 4146 /// MultiClassObject ::= LETCommand '{' ObjectList '}' 4147 /// MultiClassObject ::= LETCommand Object 4148 /// 4149 bool TGParser::ParseMultiClass() { 4150 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token"); 4151 Lex.Lex(); // Eat the multiclass token. 4152 4153 if (Lex.getCode() != tgtok::Id) 4154 return TokError("expected identifier after multiclass for name"); 4155 std::string Name = Lex.getCurStrVal(); 4156 4157 auto Result = MultiClasses.try_emplace( 4158 Name, std::make_unique<MultiClass>(Name, Lex.getLoc(), Records)); 4159 4160 if (!Result.second) 4161 return TokError("multiclass '" + Name + "' already defined"); 4162 4163 CurMultiClass = Result.first->second.get(); 4164 Lex.Lex(); // Eat the identifier. 4165 4166 // A multiclass body introduces a new scope for local variables. 4167 TGVarScope *MulticlassScope = PushScope(CurMultiClass); 4168 4169 // If there are template args, parse them. 4170 if (Lex.getCode() == tgtok::less) 4171 if (ParseTemplateArgList(nullptr)) 4172 return true; 4173 4174 bool inherits = false; 4175 4176 // If there are submulticlasses, parse them. 4177 if (consume(tgtok::colon)) { 4178 inherits = true; 4179 4180 // Read all of the submulticlasses. 4181 SubMultiClassReference SubMultiClass = 4182 ParseSubMultiClassReference(CurMultiClass); 4183 while (true) { 4184 // Check for error. 4185 if (!SubMultiClass.MC) return true; 4186 4187 // Add it. 4188 if (AddSubMultiClass(CurMultiClass, SubMultiClass)) 4189 return true; 4190 4191 if (!consume(tgtok::comma)) 4192 break; 4193 SubMultiClass = ParseSubMultiClassReference(CurMultiClass); 4194 } 4195 } 4196 4197 if (Lex.getCode() != tgtok::l_brace) { 4198 if (!inherits) 4199 return TokError("expected '{' in multiclass definition"); 4200 if (!consume(tgtok::semi)) 4201 return TokError("expected ';' in multiclass definition"); 4202 } else { 4203 if (Lex.Lex() == tgtok::r_brace) // eat the '{'. 4204 return TokError("multiclass must contain at least one def"); 4205 4206 while (Lex.getCode() != tgtok::r_brace) { 4207 switch (Lex.getCode()) { 4208 default: 4209 return TokError("expected 'assert', 'def', 'defm', 'defvar', 'dump', " 4210 "'foreach', 'if', or 'let' in multiclass body"); 4211 4212 case tgtok::Assert: 4213 case tgtok::Def: 4214 case tgtok::Defm: 4215 case tgtok::Defvar: 4216 case tgtok::Dump: 4217 case tgtok::Foreach: 4218 case tgtok::If: 4219 case tgtok::Let: 4220 if (ParseObject(CurMultiClass)) 4221 return true; 4222 break; 4223 } 4224 } 4225 Lex.Lex(); // eat the '}'. 4226 4227 // If we have a semicolon, print a gentle error. 4228 SMLoc SemiLoc = Lex.getLoc(); 4229 if (consume(tgtok::semi)) { 4230 PrintError(SemiLoc, "A multiclass body should not end with a semicolon"); 4231 PrintNote("Semicolon ignored; remove to eliminate this error"); 4232 } 4233 } 4234 4235 if (!NoWarnOnUnusedTemplateArgs) 4236 CurMultiClass->Rec.checkUnusedTemplateArgs(); 4237 4238 PopScope(MulticlassScope); 4239 CurMultiClass = nullptr; 4240 return false; 4241 } 4242 4243 /// ParseDefm - Parse the instantiation of a multiclass. 4244 /// 4245 /// DefMInst ::= DEFM ID ':' DefmSubClassRef ';' 4246 /// 4247 bool TGParser::ParseDefm(MultiClass *CurMultiClass) { 4248 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!"); 4249 Lex.Lex(); // eat the defm 4250 4251 const Init *DefmName = ParseObjectName(CurMultiClass); 4252 if (!DefmName) 4253 return true; 4254 if (isa<UnsetInit>(DefmName)) { 4255 DefmName = Records.getNewAnonymousName(); 4256 if (CurMultiClass) 4257 DefmName = BinOpInit::getStrConcat( 4258 VarInit::get(QualifiedNameOfImplicitName(CurMultiClass), 4259 StringRecTy::get(Records)), 4260 DefmName); 4261 } 4262 4263 if (Lex.getCode() != tgtok::colon) 4264 return TokError("expected ':' after defm identifier"); 4265 4266 // Keep track of the new generated record definitions. 4267 std::vector<RecordsEntry> NewEntries; 4268 4269 // This record also inherits from a regular class (non-multiclass)? 4270 bool InheritFromClass = false; 4271 4272 // eat the colon. 4273 Lex.Lex(); 4274 4275 SMLoc SubClassLoc = Lex.getLoc(); 4276 SubClassReference Ref = ParseSubClassReference(nullptr, true); 4277 4278 while (true) { 4279 if (!Ref.Rec) return true; 4280 4281 // To instantiate a multiclass, we get the multiclass and then loop 4282 // through its template argument names. Substs contains a substitution 4283 // value for each argument, either the value specified or the default. 4284 // Then we can resolve the template arguments. 4285 MultiClass *MC = MultiClasses[std::string(Ref.Rec->getName())].get(); 4286 assert(MC && "Didn't lookup multiclass correctly?"); 4287 4288 SubstStack Substs; 4289 if (resolveArgumentsOfMultiClass(Substs, MC, Ref.TemplateArgs, DefmName, 4290 SubClassLoc)) 4291 return true; 4292 4293 if (resolve(MC->Entries, Substs, !CurMultiClass && Loops.empty(), 4294 &NewEntries, &SubClassLoc)) 4295 return true; 4296 4297 if (!consume(tgtok::comma)) 4298 break; 4299 4300 if (Lex.getCode() != tgtok::Id) 4301 return TokError("expected identifier"); 4302 4303 SubClassLoc = Lex.getLoc(); 4304 4305 // A defm can inherit from regular classes (non-multiclasses) as 4306 // long as they come in the end of the inheritance list. 4307 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != nullptr); 4308 4309 if (InheritFromClass) 4310 break; 4311 4312 Ref = ParseSubClassReference(nullptr, true); 4313 } 4314 4315 if (InheritFromClass) { 4316 // Process all the classes to inherit as if they were part of a 4317 // regular 'def' and inherit all record values. 4318 SubClassReference SubClass = ParseSubClassReference(nullptr, false); 4319 while (true) { 4320 // Check for error. 4321 if (!SubClass.Rec) return true; 4322 4323 // Get the expanded definition prototypes and teach them about 4324 // the record values the current class to inherit has 4325 for (auto &E : NewEntries) { 4326 // Add it. 4327 if (AddSubClass(E, SubClass)) 4328 return true; 4329 } 4330 4331 if (!consume(tgtok::comma)) 4332 break; 4333 SubClass = ParseSubClassReference(nullptr, false); 4334 } 4335 } 4336 4337 for (auto &E : NewEntries) { 4338 if (ApplyLetStack(E)) 4339 return true; 4340 4341 addEntry(std::move(E)); 4342 } 4343 4344 if (!consume(tgtok::semi)) 4345 return TokError("expected ';' at end of defm"); 4346 4347 return false; 4348 } 4349 4350 /// ParseObject 4351 /// Object ::= ClassInst 4352 /// Object ::= DefInst 4353 /// Object ::= MultiClassInst 4354 /// Object ::= DefMInst 4355 /// Object ::= LETCommand '{' ObjectList '}' 4356 /// Object ::= LETCommand Object 4357 /// Object ::= Defset 4358 /// Object ::= Deftype 4359 /// Object ::= Defvar 4360 /// Object ::= Assert 4361 /// Object ::= Dump 4362 bool TGParser::ParseObject(MultiClass *MC) { 4363 switch (Lex.getCode()) { 4364 default: 4365 return TokError( 4366 "Expected assert, class, def, defm, defset, dump, foreach, if, or let"); 4367 case tgtok::Assert: return ParseAssert(MC); 4368 case tgtok::Def: return ParseDef(MC); 4369 case tgtok::Defm: return ParseDefm(MC); 4370 case tgtok::Deftype: 4371 return ParseDeftype(); 4372 case tgtok::Defvar: return ParseDefvar(); 4373 case tgtok::Dump: 4374 return ParseDump(MC); 4375 case tgtok::Foreach: return ParseForeach(MC); 4376 case tgtok::If: return ParseIf(MC); 4377 case tgtok::Let: return ParseTopLevelLet(MC); 4378 case tgtok::Defset: 4379 if (MC) 4380 return TokError("defset is not allowed inside multiclass"); 4381 return ParseDefset(); 4382 case tgtok::Class: 4383 if (MC) 4384 return TokError("class is not allowed inside multiclass"); 4385 if (!Loops.empty()) 4386 return TokError("class is not allowed inside foreach loop"); 4387 return ParseClass(); 4388 case tgtok::MultiClass: 4389 if (!Loops.empty()) 4390 return TokError("multiclass is not allowed inside foreach loop"); 4391 return ParseMultiClass(); 4392 } 4393 } 4394 4395 /// ParseObjectList 4396 /// ObjectList :== Object* 4397 bool TGParser::ParseObjectList(MultiClass *MC) { 4398 while (tgtok::isObjectStart(Lex.getCode())) { 4399 if (ParseObject(MC)) 4400 return true; 4401 } 4402 return false; 4403 } 4404 4405 bool TGParser::ParseFile() { 4406 Lex.Lex(); // Prime the lexer. 4407 TGVarScope *GlobalScope = PushScope(); 4408 if (ParseObjectList()) 4409 return true; 4410 PopScope(GlobalScope); 4411 4412 // If we have unread input at the end of the file, report it. 4413 if (Lex.getCode() == tgtok::Eof) 4414 return false; 4415 4416 return TokError("Unexpected token at top level"); 4417 } 4418 4419 // Check the types of the template argument values for a class 4420 // inheritance, multiclass invocation, or anonymous class invocation. 4421 // If necessary, replace an argument with a cast to the required type. 4422 // The argument count has already been checked. 4423 bool TGParser::CheckTemplateArgValues( 4424 SmallVectorImpl<const ArgumentInit *> &Values, ArrayRef<SMLoc> ValuesLocs, 4425 const Record *ArgsRec) { 4426 assert(Values.size() == ValuesLocs.size() && 4427 "expected as many values as locations"); 4428 4429 ArrayRef<const Init *> TArgs = ArgsRec->getTemplateArgs(); 4430 4431 bool HasError = false; 4432 for (auto [Value, Loc] : llvm::zip_equal(Values, ValuesLocs)) { 4433 const Init *ArgName = nullptr; 4434 if (Value->isPositional()) 4435 ArgName = TArgs[Value->getIndex()]; 4436 if (Value->isNamed()) 4437 ArgName = Value->getName(); 4438 4439 const RecordVal *Arg = ArgsRec->getValue(ArgName); 4440 const RecTy *ArgType = Arg->getType(); 4441 4442 if (const auto *ArgValue = dyn_cast<TypedInit>(Value->getValue())) { 4443 auto *CastValue = ArgValue->getCastTo(ArgType); 4444 if (CastValue) { 4445 assert((!isa<TypedInit>(CastValue) || 4446 cast<TypedInit>(CastValue)->getType()->typeIsA(ArgType)) && 4447 "result of template arg value cast has wrong type"); 4448 Value = Value->cloneWithValue(CastValue); 4449 } else { 4450 HasError |= Error( 4451 Loc, "Value specified for template argument '" + 4452 Arg->getNameInitAsString() + "' is of type " + 4453 ArgValue->getType()->getAsString() + "; expected type " + 4454 ArgType->getAsString() + ": " + ArgValue->getAsString()); 4455 } 4456 } 4457 } 4458 4459 return HasError; 4460 } 4461 4462 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 4463 LLVM_DUMP_METHOD void RecordsEntry::dump() const { 4464 if (Loop) 4465 Loop->dump(); 4466 if (Rec) 4467 Rec->dump(); 4468 } 4469 4470 LLVM_DUMP_METHOD void ForeachLoop::dump() const { 4471 errs() << "foreach " << IterVar->getAsString() << " = " 4472 << ListValue->getAsString() << " in {\n"; 4473 4474 for (const auto &E : Entries) 4475 E.dump(); 4476 4477 errs() << "}\n"; 4478 } 4479 4480 LLVM_DUMP_METHOD void MultiClass::dump() const { 4481 errs() << "Record:\n"; 4482 Rec.dump(); 4483 4484 errs() << "Defs:\n"; 4485 for (const auto &E : Entries) 4486 E.dump(); 4487 } 4488 #endif 4489 4490 bool TGParser::ParseDump(MultiClass *CurMultiClass, Record *CurRec) { 4491 // Location of the `dump` statement. 4492 SMLoc Loc = Lex.getLoc(); 4493 assert(Lex.getCode() == tgtok::Dump && "Unknown tok"); 4494 Lex.Lex(); // eat the operation 4495 4496 const Init *Message = ParseValue(CurRec); 4497 if (!Message) 4498 return true; 4499 4500 // Allow to use dump directly on `defvar` and `def`, by wrapping 4501 // them with a `!repl`. 4502 if (isa<DefInit>(Message)) 4503 Message = UnOpInit::get(UnOpInit::REPR, Message, StringRecTy::get(Records)) 4504 ->Fold(CurRec); 4505 4506 if (!consume(tgtok::semi)) 4507 return TokError("expected ';'"); 4508 4509 if (CurRec) 4510 CurRec->addDump(Loc, Message); 4511 else { 4512 HasReferenceResolver resolver{nullptr}; 4513 resolver.setFinal(true); 4514 // force a resolution with a dummy resolver 4515 const Init *ResolvedMessage = Message->resolveReferences(resolver); 4516 addEntry(std::make_unique<Record::DumpInfo>(Loc, ResolvedMessage)); 4517 } 4518 4519 return false; 4520 } 4521