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