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