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