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