blob: aee93e7696b99f074291e78d9c0f1ca28a7e3aa6 [file] [log] [blame]
Chris Lattnerf4601652007-11-22 20:49:04 +00001//===- TGParser.cpp - Parser for TableGen Files ---------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner30609102007-12-29 20:37:13 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattnerf4601652007-11-22 20:49:04 +00007//
8//===----------------------------------------------------------------------===//
9//
10// Implement the Parser for TableGen.
11//
12//===----------------------------------------------------------------------===//
13
14#include "TGParser.h"
Peter Collingbourne7c788882011-10-01 16:41:13 +000015#include "llvm/TableGen/Record.h"
Chris Lattnerf4601652007-11-22 20:49:04 +000016#include "llvm/ADT/StringExtras.h"
Daniel Dunbar1a551802009-07-03 00:10:29 +000017#include <algorithm>
18#include <sstream>
Chris Lattner8d978a72010-10-05 23:58:18 +000019#include "llvm/ADT/SmallVector.h"
Chris Lattner46f55522010-10-06 04:55:48 +000020#include "llvm/Support/CommandLine.h"
Chris Lattnerf4601652007-11-22 20:49:04 +000021using namespace llvm;
22
23//===----------------------------------------------------------------------===//
24// Support Code for the Semantic Actions.
25//===----------------------------------------------------------------------===//
26
27namespace llvm {
Chris Lattnerf4601652007-11-22 20:49:04 +000028struct SubClassReference {
Chris Lattner1e3a8a42009-06-21 03:39:35 +000029 SMLoc RefLoc;
Chris Lattnerf4601652007-11-22 20:49:04 +000030 Record *Rec;
David Greene05bce0b2011-07-29 22:43:06 +000031 std::vector<Init*> TemplateArgs;
Chris Lattner1c8ae592009-03-13 16:01:53 +000032 SubClassReference() : Rec(0) {}
David Greened34a73b2009-04-24 16:55:41 +000033
Chris Lattnerf4601652007-11-22 20:49:04 +000034 bool isInvalid() const { return Rec == 0; }
35};
David Greenede444af2009-04-22 16:42:54 +000036
37struct SubMultiClassReference {
Chris Lattner1e3a8a42009-06-21 03:39:35 +000038 SMLoc RefLoc;
David Greenede444af2009-04-22 16:42:54 +000039 MultiClass *MC;
David Greene05bce0b2011-07-29 22:43:06 +000040 std::vector<Init*> TemplateArgs;
David Greenede444af2009-04-22 16:42:54 +000041 SubMultiClassReference() : MC(0) {}
Bob Wilson32558652009-04-28 19:41:44 +000042
David Greenede444af2009-04-22 16:42:54 +000043 bool isInvalid() const { return MC == 0; }
David Greened34a73b2009-04-24 16:55:41 +000044 void dump() const;
David Greenede444af2009-04-22 16:42:54 +000045};
David Greened34a73b2009-04-24 16:55:41 +000046
47void SubMultiClassReference::dump() const {
Daniel Dunbar1a551802009-07-03 00:10:29 +000048 errs() << "Multiclass:\n";
Bob Wilson21870412009-11-22 04:24:42 +000049
David Greened34a73b2009-04-24 16:55:41 +000050 MC->dump();
Bob Wilson21870412009-11-22 04:24:42 +000051
Daniel Dunbar1a551802009-07-03 00:10:29 +000052 errs() << "Template args:\n";
David Greene05bce0b2011-07-29 22:43:06 +000053 for (std::vector<Init *>::const_iterator i = TemplateArgs.begin(),
David Greened34a73b2009-04-24 16:55:41 +000054 iend = TemplateArgs.end();
55 i != iend;
56 ++i) {
57 (*i)->dump();
58 }
59}
60
Chris Lattnerf4601652007-11-22 20:49:04 +000061} // end namespace llvm
62
Chris Lattner1e3a8a42009-06-21 03:39:35 +000063bool TGParser::AddValue(Record *CurRec, SMLoc Loc, const RecordVal &RV) {
Chris Lattnerf4601652007-11-22 20:49:04 +000064 if (CurRec == 0)
65 CurRec = &CurMultiClass->Rec;
Bob Wilson21870412009-11-22 04:24:42 +000066
Jakob Stoklund Olesenebaf92c2012-01-13 03:16:35 +000067 if (RecordVal *ERV = CurRec->getValue(RV.getNameInit())) {
Chris Lattnerf4601652007-11-22 20:49:04 +000068 // 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 " +
Bob Wilson21870412009-11-22 04:24:42 +000072 "previous definition of type '" +
Chris Lattnerf4601652007-11-22 20:49:04 +000073 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.
David Greene917924d2011-10-19 13:02:39 +000082bool TGParser::SetValue(Record *CurRec, SMLoc Loc, Init *ValName,
David Greene05bce0b2011-07-29 22:43:06 +000083 const std::vector<unsigned> &BitList, Init *V) {
Chris Lattnerf4601652007-11-22 20:49:04 +000084 if (!V) return false;
85
86 if (CurRec == 0) CurRec = &CurMultiClass->Rec;
87
88 RecordVal *RV = CurRec->getValue(ValName);
89 if (RV == 0)
David Greene917924d2011-10-19 13:02:39 +000090 return Error(Loc, "Value '" + ValName->getAsUnquotedString()
91 + "' unknown!");
Chris Lattnerf4601652007-11-22 20:49:04 +000092
93 // Do not allow assignments like 'X = X'. This will just cause infinite loops
94 // in the resolution machinery.
95 if (BitList.empty())
David Greene05bce0b2011-07-29 22:43:06 +000096 if (VarInit *VI = dynamic_cast<VarInit*>(V))
David Greene917924d2011-10-19 13:02:39 +000097 if (VI->getNameInit() == ValName)
Chris Lattnerf4601652007-11-22 20:49:04 +000098 return false;
Bob Wilson21870412009-11-22 04:24:42 +000099
Chris Lattnerf4601652007-11-22 20:49:04 +0000100 // If we are assigning to a subset of the bits in the value... then we must be
101 // assigning to a field of BitsRecTy, which must have a BitsInit
102 // initializer.
103 //
104 if (!BitList.empty()) {
David Greene05bce0b2011-07-29 22:43:06 +0000105 BitsInit *CurVal = dynamic_cast<BitsInit*>(RV->getValue());
Chris Lattnerf4601652007-11-22 20:49:04 +0000106 if (CurVal == 0)
David Greene917924d2011-10-19 13:02:39 +0000107 return Error(Loc, "Value '" + ValName->getAsUnquotedString()
108 + "' is not a bits type");
Chris Lattnerf4601652007-11-22 20:49:04 +0000109
110 // Convert the incoming value to a bits type of the appropriate size...
David Greene05bce0b2011-07-29 22:43:06 +0000111 Init *BI = V->convertInitializerTo(BitsRecTy::get(BitList.size()));
Chris Lattnerf4601652007-11-22 20:49:04 +0000112 if (BI == 0) {
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000113 V->convertInitializerTo(BitsRecTy::get(BitList.size()));
Chris Lattnerf4601652007-11-22 20:49:04 +0000114 return Error(Loc, "Initializer is not compatible with bit range");
115 }
Bob Wilson21870412009-11-22 04:24:42 +0000116
Chris Lattnerf4601652007-11-22 20:49:04 +0000117 // We should have a BitsInit type now.
David Greene05bce0b2011-07-29 22:43:06 +0000118 BitsInit *BInit = dynamic_cast<BitsInit*>(BI);
Chris Lattnerf4601652007-11-22 20:49:04 +0000119 assert(BInit != 0);
120
David Greene05bce0b2011-07-29 22:43:06 +0000121 SmallVector<Init *, 16> NewBits(CurVal->getNumBits());
Chris Lattnerf4601652007-11-22 20:49:04 +0000122
123 // Loop over bits, assigning values as appropriate.
124 for (unsigned i = 0, e = BitList.size(); i != e; ++i) {
125 unsigned Bit = BitList[i];
David Greeneca7fd3d2011-07-29 19:07:00 +0000126 if (NewBits[Bit])
Chris Lattnerf4601652007-11-22 20:49:04 +0000127 return Error(Loc, "Cannot set bit #" + utostr(Bit) + " of value '" +
David Greene917924d2011-10-19 13:02:39 +0000128 ValName->getAsUnquotedString() + "' more than once");
David Greeneca7fd3d2011-07-29 19:07:00 +0000129 NewBits[Bit] = BInit->getBit(i);
Chris Lattnerf4601652007-11-22 20:49:04 +0000130 }
131
132 for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i)
David Greeneca7fd3d2011-07-29 19:07:00 +0000133 if (NewBits[i] == 0)
134 NewBits[i] = CurVal->getBit(i);
Chris Lattnerf4601652007-11-22 20:49:04 +0000135
David Greenedcd35c72011-07-29 19:07:07 +0000136 V = BitsInit::get(NewBits);
Chris Lattnerf4601652007-11-22 20:49:04 +0000137 }
138
139 if (RV->setValue(V))
David Greene917924d2011-10-19 13:02:39 +0000140 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + "' of type '"
141 + RV->getType()->getAsString() +
142 "' is incompatible with initializer '" + V->getAsString()
143 + "'");
Chris Lattnerf4601652007-11-22 20:49:04 +0000144 return false;
145}
146
147/// AddSubClass - Add SubClass as a subclass to CurRec, resolving its template
148/// args as SubClass's template arguments.
Cedric Venetaff9c272009-02-14 16:06:42 +0000149bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000150 Record *SC = SubClass.Rec;
151 // Add all of the values in the subclass into the current class.
152 const std::vector<RecordVal> &Vals = SC->getValues();
153 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
154 if (AddValue(CurRec, SubClass.RefLoc, Vals[i]))
155 return true;
156
David Greenee22b3212011-10-19 13:02:42 +0000157 const std::vector<Init *> &TArgs = SC->getTemplateArgs();
Chris Lattnerf4601652007-11-22 20:49:04 +0000158
159 // Ensure that an appropriate number of template arguments are specified.
160 if (TArgs.size() < SubClass.TemplateArgs.size())
161 return Error(SubClass.RefLoc, "More template args specified than expected");
Bob Wilson21870412009-11-22 04:24:42 +0000162
Chris Lattnerf4601652007-11-22 20:49:04 +0000163 // Loop over all of the template arguments, setting them to the specified
164 // value or leaving them as the default if necessary.
165 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
166 if (i < SubClass.TemplateArgs.size()) {
167 // If a value is specified for this template arg, set it now.
Bob Wilson21870412009-11-22 04:24:42 +0000168 if (SetValue(CurRec, SubClass.RefLoc, TArgs[i], std::vector<unsigned>(),
Chris Lattnerf4601652007-11-22 20:49:04 +0000169 SubClass.TemplateArgs[i]))
170 return true;
Bob Wilson21870412009-11-22 04:24:42 +0000171
Chris Lattnerf4601652007-11-22 20:49:04 +0000172 // Resolve it next.
173 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i]));
Bob Wilson21870412009-11-22 04:24:42 +0000174
Chris Lattnerf4601652007-11-22 20:49:04 +0000175 // Now remove it.
176 CurRec->removeValue(TArgs[i]);
177
178 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) {
179 return Error(SubClass.RefLoc,"Value not specified for template argument #"
David Greenee22b3212011-10-19 13:02:42 +0000180 + utostr(i) + " (" + TArgs[i]->getAsUnquotedString()
181 + ") of subclass '" + SC->getNameInitAsString() + "'!");
Chris Lattnerf4601652007-11-22 20:49:04 +0000182 }
183 }
184
185 // Since everything went well, we can now set the "superclass" list for the
186 // current record.
187 const std::vector<Record*> &SCs = SC->getSuperClasses();
188 for (unsigned i = 0, e = SCs.size(); i != e; ++i) {
189 if (CurRec->isSubClassOf(SCs[i]))
190 return Error(SubClass.RefLoc,
191 "Already subclass of '" + SCs[i]->getName() + "'!\n");
192 CurRec->addSuperClass(SCs[i]);
193 }
Bob Wilson21870412009-11-22 04:24:42 +0000194
Chris Lattnerf4601652007-11-22 20:49:04 +0000195 if (CurRec->isSubClassOf(SC))
196 return Error(SubClass.RefLoc,
197 "Already subclass of '" + SC->getName() + "'!\n");
198 CurRec->addSuperClass(SC);
199 return false;
200}
201
David Greenede444af2009-04-22 16:42:54 +0000202/// AddSubMultiClass - Add SubMultiClass as a subclass to
Bob Wilson440548d2009-04-30 18:26:19 +0000203/// CurMC, resolving its template args as SubMultiClass's
David Greenede444af2009-04-22 16:42:54 +0000204/// template arguments.
Bob Wilson440548d2009-04-30 18:26:19 +0000205bool TGParser::AddSubMultiClass(MultiClass *CurMC,
Bob Wilson1d512df2009-04-30 17:46:20 +0000206 SubMultiClassReference &SubMultiClass) {
David Greenede444af2009-04-22 16:42:54 +0000207 MultiClass *SMC = SubMultiClass.MC;
Bob Wilson440548d2009-04-30 18:26:19 +0000208 Record *CurRec = &CurMC->Rec;
David Greenede444af2009-04-22 16:42:54 +0000209
Bob Wilson440548d2009-04-30 18:26:19 +0000210 const std::vector<RecordVal> &MCVals = CurRec->getValues();
David Greenede444af2009-04-22 16:42:54 +0000211
212 // Add all of the values in the subclass into the current class.
213 const std::vector<RecordVal> &SMCVals = SMC->Rec.getValues();
214 for (unsigned i = 0, e = SMCVals.size(); i != e; ++i)
215 if (AddValue(CurRec, SubMultiClass.RefLoc, SMCVals[i]))
216 return true;
217
Bob Wilson440548d2009-04-30 18:26:19 +0000218 int newDefStart = CurMC->DefPrototypes.size();
David Greened34a73b2009-04-24 16:55:41 +0000219
David Greenede444af2009-04-22 16:42:54 +0000220 // Add all of the defs in the subclass into the current multiclass.
221 for (MultiClass::RecordVector::const_iterator i = SMC->DefPrototypes.begin(),
222 iend = SMC->DefPrototypes.end();
223 i != iend;
224 ++i) {
225 // Clone the def and add it to the current multiclass
226 Record *NewDef = new Record(**i);
227
228 // Add all of the values in the superclass into the current def.
229 for (unsigned i = 0, e = MCVals.size(); i != e; ++i)
230 if (AddValue(NewDef, SubMultiClass.RefLoc, MCVals[i]))
231 return true;
232
Bob Wilson440548d2009-04-30 18:26:19 +0000233 CurMC->DefPrototypes.push_back(NewDef);
David Greenede444af2009-04-22 16:42:54 +0000234 }
Bob Wilson32558652009-04-28 19:41:44 +0000235
David Greenee22b3212011-10-19 13:02:42 +0000236 const std::vector<Init *> &SMCTArgs = SMC->Rec.getTemplateArgs();
David Greenede444af2009-04-22 16:42:54 +0000237
David Greened34a73b2009-04-24 16:55:41 +0000238 // Ensure that an appropriate number of template arguments are
239 // specified.
David Greenede444af2009-04-22 16:42:54 +0000240 if (SMCTArgs.size() < SubMultiClass.TemplateArgs.size())
David Greened34a73b2009-04-24 16:55:41 +0000241 return Error(SubMultiClass.RefLoc,
242 "More template args specified than expected");
Bob Wilson32558652009-04-28 19:41:44 +0000243
David Greenede444af2009-04-22 16:42:54 +0000244 // Loop over all of the template arguments, setting them to the specified
245 // value or leaving them as the default if necessary.
246 for (unsigned i = 0, e = SMCTArgs.size(); i != e; ++i) {
247 if (i < SubMultiClass.TemplateArgs.size()) {
David Greened34a73b2009-04-24 16:55:41 +0000248 // If a value is specified for this template arg, set it in the
249 // superclass now.
250 if (SetValue(CurRec, SubMultiClass.RefLoc, SMCTArgs[i],
Bob Wilson32558652009-04-28 19:41:44 +0000251 std::vector<unsigned>(),
David Greenede444af2009-04-22 16:42:54 +0000252 SubMultiClass.TemplateArgs[i]))
253 return true;
254
255 // Resolve it next.
256 CurRec->resolveReferencesTo(CurRec->getValue(SMCTArgs[i]));
Bob Wilson32558652009-04-28 19:41:44 +0000257
David Greenede444af2009-04-22 16:42:54 +0000258 // Now remove it.
259 CurRec->removeValue(SMCTArgs[i]);
260
David Greened34a73b2009-04-24 16:55:41 +0000261 // If a value is specified for this template arg, set it in the
262 // new defs now.
263 for (MultiClass::RecordVector::iterator j =
Bob Wilson440548d2009-04-30 18:26:19 +0000264 CurMC->DefPrototypes.begin() + newDefStart,
265 jend = CurMC->DefPrototypes.end();
David Greenede444af2009-04-22 16:42:54 +0000266 j != jend;
267 ++j) {
268 Record *Def = *j;
269
David Greened34a73b2009-04-24 16:55:41 +0000270 if (SetValue(Def, SubMultiClass.RefLoc, SMCTArgs[i],
Bob Wilson32558652009-04-28 19:41:44 +0000271 std::vector<unsigned>(),
David Greenede444af2009-04-22 16:42:54 +0000272 SubMultiClass.TemplateArgs[i]))
273 return true;
274
275 // Resolve it next.
276 Def->resolveReferencesTo(Def->getValue(SMCTArgs[i]));
277
278 // Now remove it
279 Def->removeValue(SMCTArgs[i]);
280 }
281 } else if (!CurRec->getValue(SMCTArgs[i])->getValue()->isComplete()) {
David Greened34a73b2009-04-24 16:55:41 +0000282 return Error(SubMultiClass.RefLoc,
283 "Value not specified for template argument #"
David Greenee22b3212011-10-19 13:02:42 +0000284 + utostr(i) + " (" + SMCTArgs[i]->getAsUnquotedString()
285 + ") of subclass '" + SMC->Rec.getNameInitAsString() + "'!");
David Greenede444af2009-04-22 16:42:54 +0000286 }
287 }
288
289 return false;
290}
291
David Greenecebb4ee2012-02-22 16:09:41 +0000292/// ProcessForeachDefs - Given a record, apply all of the variable
293/// values in all surrounding foreach loops, creating new records for
294/// each combination of values.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000295bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc) {
296 if (Loops.empty())
297 return false;
298
David Greenecebb4ee2012-02-22 16:09:41 +0000299 // We want to instantiate a new copy of CurRec for each combination
300 // of nested loop iterator values. We don't want top instantiate
301 // any copies until we have values for each loop iterator.
302 IterSet IterVals;
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000303 return ProcessForeachDefs(CurRec, Loc, IterVals);
David Greenecebb4ee2012-02-22 16:09:41 +0000304}
305
306/// ProcessForeachDefs - Given a record, a loop and a loop iterator,
307/// apply each of the variable values in this loop and then process
308/// subloops.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000309bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){
310 // Recursively build a tuple of iterator values.
311 if (IterVals.size() != Loops.size()) {
312 assert(IterVals.size() < Loops.size());
313 ForeachLoop &CurLoop = Loops[IterVals.size()];
314 ListInit *List = dynamic_cast<ListInit *>(CurLoop.ListValue);
315 if (List == 0) {
316 Error(Loc, "Loop list is not a list");
317 return true;
318 }
David Greenecebb4ee2012-02-22 16:09:41 +0000319
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000320 // Process each value.
321 for (int64_t i = 0; i < List->getSize(); ++i) {
322 Init *ItemVal = List->resolveListElementReference(*CurRec, 0, i);
323 IterVals.push_back(IterRecord(CurLoop.IterVar, ItemVal));
324 if (ProcessForeachDefs(CurRec, Loc, IterVals))
325 return true;
326 IterVals.pop_back();
327 }
328 return false;
329 }
330
331 // This is the bottom of the recursion. We have all of the iterator values
332 // for this point in the iteration space. Instantiate a new record to
333 // reflect this combination of values.
334 Record *IterRec = new Record(*CurRec);
335
336 // Set the iterator values now.
337 for (unsigned i = 0, e = IterVals.size(); i != e; ++i) {
338 VarInit *IterVar = IterVals[i].IterVar;
339 TypedInit *IVal = dynamic_cast<TypedInit *>(IterVals[i].IterValue);
340 if (IVal == 0) {
341 Error(Loc, "foreach iterator value is untyped");
342 return true;
343 }
344
345 IterRec->addValue(RecordVal(IterVar->getName(), IVal->getType(), false));
346
347 if (SetValue(IterRec, Loc, IterVar->getName(),
348 std::vector<unsigned>(), IVal)) {
349 Error(Loc, "when instantiating this def");
350 return true;
351 }
352
353 // Resolve it next.
354 IterRec->resolveReferencesTo(IterRec->getValue(IterVar->getName()));
355
356 // Remove it.
357 IterRec->removeValue(IterVar->getName());
358 }
359
360 if (Records.getDef(IterRec->getNameInitAsString())) {
361 Error(Loc, "def already exists: " + IterRec->getNameInitAsString());
David Greenecebb4ee2012-02-22 16:09:41 +0000362 return true;
363 }
364
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000365 Records.addDef(IterRec);
366 IterRec->resolveReferences();
David Greenecebb4ee2012-02-22 16:09:41 +0000367 return false;
368}
369
Chris Lattnerf4601652007-11-22 20:49:04 +0000370//===----------------------------------------------------------------------===//
371// Parser Code
372//===----------------------------------------------------------------------===//
373
374/// isObjectStart - Return true if this is a valid first token for an Object.
375static bool isObjectStart(tgtok::TokKind K) {
376 return K == tgtok::Class || K == tgtok::Def ||
David Greenecebb4ee2012-02-22 16:09:41 +0000377 K == tgtok::Defm || K == tgtok::Let ||
378 K == tgtok::MultiClass || K == tgtok::Foreach;
Chris Lattnerf4601652007-11-22 20:49:04 +0000379}
380
Chris Lattnerdf72eae2010-10-05 22:51:56 +0000381static std::string GetNewAnonymousName() {
382 static unsigned AnonCounter = 0;
383 return "anonymous."+utostr(AnonCounter++);
384}
385
Chris Lattnerf4601652007-11-22 20:49:04 +0000386/// ParseObjectName - If an object name is specified, return it. Otherwise,
387/// return an anonymous name.
David Greenea9e07dd2011-10-19 13:04:29 +0000388/// ObjectName ::= Value [ '#' Value ]*
Chris Lattnerf4601652007-11-22 20:49:04 +0000389/// ObjectName ::= /*empty*/
390///
David Greenea9e07dd2011-10-19 13:04:29 +0000391Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) {
392 switch (Lex.getCode()) {
393 case tgtok::colon:
394 case tgtok::semi:
395 case tgtok::l_brace:
396 // These are all of the tokens that can begin an object body.
397 // Some of these can also begin values but we disallow those cases
398 // because they are unlikely to be useful.
399 return StringInit::get(GetNewAnonymousName());
David Greenea9e07dd2011-10-19 13:04:29 +0000400 default:
401 break;
402 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000403
David Greenea9e07dd2011-10-19 13:04:29 +0000404 Record *CurRec = 0;
405 if (CurMultiClass)
406 CurRec = &CurMultiClass->Rec;
407
408 RecTy *Type = 0;
409 if (CurRec) {
410 const TypedInit *CurRecName =
411 dynamic_cast<const TypedInit *>(CurRec->getNameInit());
412 if (!CurRecName) {
413 TokError("Record name is not typed!");
414 return 0;
415 }
416 Type = CurRecName->getType();
417 }
418
419 return ParseValue(CurRec, Type, ParseNameMode);
Chris Lattnerf4601652007-11-22 20:49:04 +0000420}
421
Chris Lattnerf4601652007-11-22 20:49:04 +0000422/// ParseClassID - Parse and resolve a reference to a class name. This returns
423/// null on error.
424///
425/// ClassID ::= ID
426///
427Record *TGParser::ParseClassID() {
428 if (Lex.getCode() != tgtok::Id) {
429 TokError("expected name for ClassID");
430 return 0;
431 }
Bob Wilson21870412009-11-22 04:24:42 +0000432
Chris Lattnerf4601652007-11-22 20:49:04 +0000433 Record *Result = Records.getClass(Lex.getCurStrVal());
434 if (Result == 0)
435 TokError("Couldn't find class '" + Lex.getCurStrVal() + "'");
Bob Wilson21870412009-11-22 04:24:42 +0000436
Chris Lattnerf4601652007-11-22 20:49:04 +0000437 Lex.Lex();
438 return Result;
439}
440
Bob Wilson32558652009-04-28 19:41:44 +0000441/// ParseMultiClassID - Parse and resolve a reference to a multiclass name.
442/// This returns null on error.
David Greenede444af2009-04-22 16:42:54 +0000443///
444/// MultiClassID ::= ID
445///
446MultiClass *TGParser::ParseMultiClassID() {
447 if (Lex.getCode() != tgtok::Id) {
448 TokError("expected name for ClassID");
449 return 0;
450 }
Bob Wilson32558652009-04-28 19:41:44 +0000451
David Greenede444af2009-04-22 16:42:54 +0000452 MultiClass *Result = MultiClasses[Lex.getCurStrVal()];
453 if (Result == 0)
454 TokError("Couldn't find class '" + Lex.getCurStrVal() + "'");
Bob Wilson32558652009-04-28 19:41:44 +0000455
David Greenede444af2009-04-22 16:42:54 +0000456 Lex.Lex();
457 return Result;
458}
459
Chris Lattnerf4601652007-11-22 20:49:04 +0000460Record *TGParser::ParseDefmID() {
461 if (Lex.getCode() != tgtok::Id) {
462 TokError("expected multiclass name");
463 return 0;
464 }
Bob Wilson21870412009-11-22 04:24:42 +0000465
Chris Lattnerf4601652007-11-22 20:49:04 +0000466 MultiClass *MC = MultiClasses[Lex.getCurStrVal()];
467 if (MC == 0) {
468 TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'");
469 return 0;
470 }
Bob Wilson21870412009-11-22 04:24:42 +0000471
Chris Lattnerf4601652007-11-22 20:49:04 +0000472 Lex.Lex();
473 return &MC->Rec;
Bob Wilson21870412009-11-22 04:24:42 +0000474}
Chris Lattnerf4601652007-11-22 20:49:04 +0000475
476
477/// ParseSubClassReference - Parse a reference to a subclass or to a templated
478/// subclass. This returns a SubClassRefTy with a null Record* on error.
479///
480/// SubClassRef ::= ClassID
481/// SubClassRef ::= ClassID '<' ValueList '>'
482///
483SubClassReference TGParser::
484ParseSubClassReference(Record *CurRec, bool isDefm) {
485 SubClassReference Result;
486 Result.RefLoc = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +0000487
Chris Lattnerf4601652007-11-22 20:49:04 +0000488 if (isDefm)
489 Result.Rec = ParseDefmID();
490 else
491 Result.Rec = ParseClassID();
492 if (Result.Rec == 0) return Result;
Bob Wilson21870412009-11-22 04:24:42 +0000493
Chris Lattnerf4601652007-11-22 20:49:04 +0000494 // If there is no template arg list, we're done.
495 if (Lex.getCode() != tgtok::less)
496 return Result;
497 Lex.Lex(); // Eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +0000498
Chris Lattnerf4601652007-11-22 20:49:04 +0000499 if (Lex.getCode() == tgtok::greater) {
500 TokError("subclass reference requires a non-empty list of template values");
501 Result.Rec = 0;
502 return Result;
503 }
Bob Wilson21870412009-11-22 04:24:42 +0000504
David Greenee1b46912009-06-08 20:23:18 +0000505 Result.TemplateArgs = ParseValueList(CurRec, Result.Rec);
Chris Lattnerf4601652007-11-22 20:49:04 +0000506 if (Result.TemplateArgs.empty()) {
507 Result.Rec = 0; // Error parsing value list.
508 return Result;
509 }
Bob Wilson21870412009-11-22 04:24:42 +0000510
Chris Lattnerf4601652007-11-22 20:49:04 +0000511 if (Lex.getCode() != tgtok::greater) {
512 TokError("expected '>' in template value list");
513 Result.Rec = 0;
514 return Result;
515 }
516 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +0000517
Chris Lattnerf4601652007-11-22 20:49:04 +0000518 return Result;
519}
520
Bob Wilson32558652009-04-28 19:41:44 +0000521/// ParseSubMultiClassReference - Parse a reference to a subclass or to a
522/// templated submulticlass. This returns a SubMultiClassRefTy with a null
523/// Record* on error.
David Greenede444af2009-04-22 16:42:54 +0000524///
525/// SubMultiClassRef ::= MultiClassID
526/// SubMultiClassRef ::= MultiClassID '<' ValueList '>'
527///
528SubMultiClassReference TGParser::
529ParseSubMultiClassReference(MultiClass *CurMC) {
530 SubMultiClassReference Result;
531 Result.RefLoc = Lex.getLoc();
Bob Wilson32558652009-04-28 19:41:44 +0000532
David Greenede444af2009-04-22 16:42:54 +0000533 Result.MC = ParseMultiClassID();
534 if (Result.MC == 0) return Result;
Bob Wilson32558652009-04-28 19:41:44 +0000535
David Greenede444af2009-04-22 16:42:54 +0000536 // If there is no template arg list, we're done.
537 if (Lex.getCode() != tgtok::less)
538 return Result;
539 Lex.Lex(); // Eat the '<'
Bob Wilson32558652009-04-28 19:41:44 +0000540
David Greenede444af2009-04-22 16:42:54 +0000541 if (Lex.getCode() == tgtok::greater) {
542 TokError("subclass reference requires a non-empty list of template values");
543 Result.MC = 0;
544 return Result;
545 }
Bob Wilson32558652009-04-28 19:41:44 +0000546
David Greenee1b46912009-06-08 20:23:18 +0000547 Result.TemplateArgs = ParseValueList(&CurMC->Rec, &Result.MC->Rec);
David Greenede444af2009-04-22 16:42:54 +0000548 if (Result.TemplateArgs.empty()) {
549 Result.MC = 0; // Error parsing value list.
550 return Result;
551 }
Bob Wilson32558652009-04-28 19:41:44 +0000552
David Greenede444af2009-04-22 16:42:54 +0000553 if (Lex.getCode() != tgtok::greater) {
554 TokError("expected '>' in template value list");
555 Result.MC = 0;
556 return Result;
557 }
558 Lex.Lex();
559
560 return Result;
561}
562
Chris Lattnerf4601652007-11-22 20:49:04 +0000563/// ParseRangePiece - Parse a bit/value range.
564/// RangePiece ::= INTVAL
565/// RangePiece ::= INTVAL '-' INTVAL
566/// RangePiece ::= INTVAL INTVAL
567bool TGParser::ParseRangePiece(std::vector<unsigned> &Ranges) {
Chris Lattner811281e2008-01-10 07:01:53 +0000568 if (Lex.getCode() != tgtok::IntVal) {
569 TokError("expected integer or bitrange");
570 return true;
571 }
Dan Gohman63f97202008-10-17 01:33:43 +0000572 int64_t Start = Lex.getCurIntVal();
573 int64_t End;
Bob Wilson21870412009-11-22 04:24:42 +0000574
Chris Lattnerf4601652007-11-22 20:49:04 +0000575 if (Start < 0)
576 return TokError("invalid range, cannot be negative");
Bob Wilson21870412009-11-22 04:24:42 +0000577
Chris Lattnerf4601652007-11-22 20:49:04 +0000578 switch (Lex.Lex()) { // eat first character.
Bob Wilson21870412009-11-22 04:24:42 +0000579 default:
Chris Lattnerf4601652007-11-22 20:49:04 +0000580 Ranges.push_back(Start);
581 return false;
582 case tgtok::minus:
583 if (Lex.Lex() != tgtok::IntVal) {
584 TokError("expected integer value as end of range");
585 return true;
586 }
587 End = Lex.getCurIntVal();
588 break;
589 case tgtok::IntVal:
590 End = -Lex.getCurIntVal();
591 break;
592 }
Bob Wilson21870412009-11-22 04:24:42 +0000593 if (End < 0)
Chris Lattnerf4601652007-11-22 20:49:04 +0000594 return TokError("invalid range, cannot be negative");
595 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +0000596
Chris Lattnerf4601652007-11-22 20:49:04 +0000597 // Add to the range.
598 if (Start < End) {
599 for (; Start <= End; ++Start)
600 Ranges.push_back(Start);
601 } else {
602 for (; Start >= End; --Start)
603 Ranges.push_back(Start);
604 }
605 return false;
606}
607
608/// ParseRangeList - Parse a list of scalars and ranges into scalar values.
609///
610/// RangeList ::= RangePiece (',' RangePiece)*
611///
612std::vector<unsigned> TGParser::ParseRangeList() {
613 std::vector<unsigned> Result;
Bob Wilson21870412009-11-22 04:24:42 +0000614
Chris Lattnerf4601652007-11-22 20:49:04 +0000615 // Parse the first piece.
616 if (ParseRangePiece(Result))
617 return std::vector<unsigned>();
618 while (Lex.getCode() == tgtok::comma) {
619 Lex.Lex(); // Eat the comma.
620
621 // Parse the next range piece.
622 if (ParseRangePiece(Result))
623 return std::vector<unsigned>();
624 }
625 return Result;
626}
627
628/// ParseOptionalRangeList - Parse either a range list in <>'s or nothing.
629/// OptionalRangeList ::= '<' RangeList '>'
630/// OptionalRangeList ::= /*empty*/
631bool TGParser::ParseOptionalRangeList(std::vector<unsigned> &Ranges) {
632 if (Lex.getCode() != tgtok::less)
633 return false;
Bob Wilson21870412009-11-22 04:24:42 +0000634
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000635 SMLoc StartLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000636 Lex.Lex(); // eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +0000637
Chris Lattnerf4601652007-11-22 20:49:04 +0000638 // Parse the range list.
639 Ranges = ParseRangeList();
640 if (Ranges.empty()) return true;
Bob Wilson21870412009-11-22 04:24:42 +0000641
Chris Lattnerf4601652007-11-22 20:49:04 +0000642 if (Lex.getCode() != tgtok::greater) {
643 TokError("expected '>' at end of range list");
644 return Error(StartLoc, "to match this '<'");
645 }
646 Lex.Lex(); // eat the '>'.
647 return false;
648}
649
650/// ParseOptionalBitList - Parse either a bit list in {}'s or nothing.
651/// OptionalBitList ::= '{' RangeList '}'
652/// OptionalBitList ::= /*empty*/
653bool TGParser::ParseOptionalBitList(std::vector<unsigned> &Ranges) {
654 if (Lex.getCode() != tgtok::l_brace)
655 return false;
Bob Wilson21870412009-11-22 04:24:42 +0000656
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000657 SMLoc StartLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000658 Lex.Lex(); // eat the '{'
Bob Wilson21870412009-11-22 04:24:42 +0000659
Chris Lattnerf4601652007-11-22 20:49:04 +0000660 // Parse the range list.
661 Ranges = ParseRangeList();
662 if (Ranges.empty()) return true;
Bob Wilson21870412009-11-22 04:24:42 +0000663
Chris Lattnerf4601652007-11-22 20:49:04 +0000664 if (Lex.getCode() != tgtok::r_brace) {
665 TokError("expected '}' at end of bit list");
666 return Error(StartLoc, "to match this '{'");
667 }
668 Lex.Lex(); // eat the '}'.
669 return false;
670}
671
672
673/// ParseType - Parse and return a tblgen type. This returns null on error.
674///
675/// Type ::= STRING // string type
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +0000676/// Type ::= CODE // code type
Chris Lattnerf4601652007-11-22 20:49:04 +0000677/// Type ::= BIT // bit type
678/// Type ::= BITS '<' INTVAL '>' // bits<x> type
679/// Type ::= INT // int type
680/// Type ::= LIST '<' Type '>' // list<x> type
Chris Lattnerf4601652007-11-22 20:49:04 +0000681/// Type ::= DAG // dag type
682/// Type ::= ClassID // Record Type
683///
684RecTy *TGParser::ParseType() {
685 switch (Lex.getCode()) {
686 default: TokError("Unknown token when expecting a type"); return 0;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000687 case tgtok::String: Lex.Lex(); return StringRecTy::get();
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +0000688 case tgtok::Code: Lex.Lex(); return StringRecTy::get();
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000689 case tgtok::Bit: Lex.Lex(); return BitRecTy::get();
690 case tgtok::Int: Lex.Lex(); return IntRecTy::get();
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000691 case tgtok::Dag: Lex.Lex(); return DagRecTy::get();
Chris Lattnerf4601652007-11-22 20:49:04 +0000692 case tgtok::Id:
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000693 if (Record *R = ParseClassID()) return RecordRecTy::get(R);
Chris Lattnerf4601652007-11-22 20:49:04 +0000694 return 0;
695 case tgtok::Bits: {
696 if (Lex.Lex() != tgtok::less) { // Eat 'bits'
697 TokError("expected '<' after bits type");
698 return 0;
699 }
700 if (Lex.Lex() != tgtok::IntVal) { // Eat '<'
701 TokError("expected integer in bits<n> type");
702 return 0;
703 }
Dan Gohman63f97202008-10-17 01:33:43 +0000704 uint64_t Val = Lex.getCurIntVal();
Chris Lattnerf4601652007-11-22 20:49:04 +0000705 if (Lex.Lex() != tgtok::greater) { // Eat count.
706 TokError("expected '>' at end of bits<n> type");
707 return 0;
708 }
709 Lex.Lex(); // Eat '>'
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000710 return BitsRecTy::get(Val);
Chris Lattnerf4601652007-11-22 20:49:04 +0000711 }
712 case tgtok::List: {
713 if (Lex.Lex() != tgtok::less) { // Eat 'bits'
714 TokError("expected '<' after list type");
715 return 0;
716 }
717 Lex.Lex(); // Eat '<'
718 RecTy *SubType = ParseType();
719 if (SubType == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +0000720
Chris Lattnerf4601652007-11-22 20:49:04 +0000721 if (Lex.getCode() != tgtok::greater) {
722 TokError("expected '>' at end of list<ty> type");
723 return 0;
724 }
725 Lex.Lex(); // Eat '>'
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000726 return ListRecTy::get(SubType);
Chris Lattnerf4601652007-11-22 20:49:04 +0000727 }
Bob Wilson21870412009-11-22 04:24:42 +0000728 }
Chris Lattnerf4601652007-11-22 20:49:04 +0000729}
730
731/// ParseIDValue - Parse an ID as a value and decode what it means.
732///
733/// IDValue ::= ID [def local value]
734/// IDValue ::= ID [def template arg]
735/// IDValue ::= ID [multiclass local value]
736/// IDValue ::= ID [multiclass template argument]
737/// IDValue ::= ID [def name]
738///
David Greenef3744a02011-10-19 13:04:20 +0000739Init *TGParser::ParseIDValue(Record *CurRec, IDParseMode Mode) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000740 assert(Lex.getCode() == tgtok::Id && "Expected ID in ParseIDValue");
741 std::string Name = Lex.getCurStrVal();
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000742 SMLoc Loc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000743 Lex.Lex();
744 return ParseIDValue(CurRec, Name, Loc);
745}
746
747/// ParseIDValue - This is just like ParseIDValue above, but it assumes the ID
748/// has already been read.
David Greene05bce0b2011-07-29 22:43:06 +0000749Init *TGParser::ParseIDValue(Record *CurRec,
David Greenef3744a02011-10-19 13:04:20 +0000750 const std::string &Name, SMLoc NameLoc,
751 IDParseMode Mode) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000752 if (CurRec) {
753 if (const RecordVal *RV = CurRec->getValue(Name))
David Greenedcd35c72011-07-29 19:07:07 +0000754 return VarInit::get(Name, RV->getType());
Bob Wilson21870412009-11-22 04:24:42 +0000755
David Greenee22b3212011-10-19 13:02:42 +0000756 Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, ":");
757
David Greenecaa25c82011-10-05 22:42:54 +0000758 if (CurMultiClass)
David Greenee22b3212011-10-19 13:02:42 +0000759 TemplateArgName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name,
760 "::");
David Greenecaa25c82011-10-05 22:42:54 +0000761
Chris Lattnerf4601652007-11-22 20:49:04 +0000762 if (CurRec->isTemplateArg(TemplateArgName)) {
763 const RecordVal *RV = CurRec->getValue(TemplateArgName);
764 assert(RV && "Template arg doesn't exist??");
David Greenedcd35c72011-07-29 19:07:07 +0000765 return VarInit::get(TemplateArgName, RV->getType());
Chris Lattnerf4601652007-11-22 20:49:04 +0000766 }
767 }
Bob Wilson21870412009-11-22 04:24:42 +0000768
Chris Lattnerf4601652007-11-22 20:49:04 +0000769 if (CurMultiClass) {
David Greenee22b3212011-10-19 13:02:42 +0000770 Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name,
771 "::");
772
Chris Lattnerf4601652007-11-22 20:49:04 +0000773 if (CurMultiClass->Rec.isTemplateArg(MCName)) {
774 const RecordVal *RV = CurMultiClass->Rec.getValue(MCName);
775 assert(RV && "Template arg doesn't exist??");
David Greenedcd35c72011-07-29 19:07:07 +0000776 return VarInit::get(MCName, RV->getType());
Chris Lattnerf4601652007-11-22 20:49:04 +0000777 }
778 }
Bob Wilson21870412009-11-22 04:24:42 +0000779
David Greenecebb4ee2012-02-22 16:09:41 +0000780 // If this is in a foreach loop, make sure it's not a loop iterator
781 for (LoopVector::iterator i = Loops.begin(), iend = Loops.end();
782 i != iend;
783 ++i) {
784 VarInit *IterVar = dynamic_cast<VarInit *>(i->IterVar);
785 if (IterVar && IterVar->getName() == Name)
786 return IterVar;
787 }
788
David Greenebbec2792011-10-19 13:04:21 +0000789 if (Mode == ParseNameMode)
790 return StringInit::get(Name);
791
Chris Lattnerf4601652007-11-22 20:49:04 +0000792 if (Record *D = Records.getDef(Name))
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000793 return DefInit::get(D);
Chris Lattnerf4601652007-11-22 20:49:04 +0000794
David Greenebbec2792011-10-19 13:04:21 +0000795 if (Mode == ParseValueMode) {
796 Error(NameLoc, "Variable not defined: '" + Name + "'");
797 return 0;
798 }
799
800 return StringInit::get(Name);
Chris Lattnerf4601652007-11-22 20:49:04 +0000801}
802
David Greened418c1b2009-05-14 20:54:48 +0000803/// ParseOperation - Parse an operator. This returns null on error.
804///
805/// Operation ::= XOperator ['<' Type '>'] '(' Args ')'
806///
David Greene05bce0b2011-07-29 22:43:06 +0000807Init *TGParser::ParseOperation(Record *CurRec) {
David Greened418c1b2009-05-14 20:54:48 +0000808 switch (Lex.getCode()) {
809 default:
810 TokError("unknown operation");
811 return 0;
David Greene1434f662011-01-07 17:05:37 +0000812 case tgtok::XHead:
813 case tgtok::XTail:
814 case tgtok::XEmpty:
David Greenee6c27de2009-05-14 21:22:49 +0000815 case tgtok::XCast: { // Value ::= !unop '(' Value ')'
816 UnOpInit::UnaryOp Code;
817 RecTy *Type = 0;
David Greened418c1b2009-05-14 20:54:48 +0000818
David Greenee6c27de2009-05-14 21:22:49 +0000819 switch (Lex.getCode()) {
Craig Topper85814382012-02-07 05:05:23 +0000820 default: llvm_unreachable("Unhandled code!");
David Greenee6c27de2009-05-14 21:22:49 +0000821 case tgtok::XCast:
822 Lex.Lex(); // eat the operation
823 Code = UnOpInit::CAST;
David Greened418c1b2009-05-14 20:54:48 +0000824
David Greenee6c27de2009-05-14 21:22:49 +0000825 Type = ParseOperatorType();
David Greened418c1b2009-05-14 20:54:48 +0000826
David Greenee6c27de2009-05-14 21:22:49 +0000827 if (Type == 0) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000828 TokError("did not get type for unary operator");
David Greenee6c27de2009-05-14 21:22:49 +0000829 return 0;
830 }
David Greened418c1b2009-05-14 20:54:48 +0000831
David Greenee6c27de2009-05-14 21:22:49 +0000832 break;
David Greene1434f662011-01-07 17:05:37 +0000833 case tgtok::XHead:
David Greene5f9f9ba2009-05-14 22:38:31 +0000834 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000835 Code = UnOpInit::HEAD;
David Greene5f9f9ba2009-05-14 22:38:31 +0000836 break;
David Greene1434f662011-01-07 17:05:37 +0000837 case tgtok::XTail:
David Greene5f9f9ba2009-05-14 22:38:31 +0000838 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000839 Code = UnOpInit::TAIL;
David Greene5f9f9ba2009-05-14 22:38:31 +0000840 break;
David Greene1434f662011-01-07 17:05:37 +0000841 case tgtok::XEmpty:
David Greene5f9f9ba2009-05-14 22:38:31 +0000842 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000843 Code = UnOpInit::EMPTY;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000844 Type = IntRecTy::get();
David Greene5f9f9ba2009-05-14 22:38:31 +0000845 break;
David Greenee6c27de2009-05-14 21:22:49 +0000846 }
847 if (Lex.getCode() != tgtok::l_paren) {
848 TokError("expected '(' after unary operator");
849 return 0;
850 }
851 Lex.Lex(); // eat the '('
David Greened418c1b2009-05-14 20:54:48 +0000852
David Greene05bce0b2011-07-29 22:43:06 +0000853 Init *LHS = ParseValue(CurRec);
David Greenee6c27de2009-05-14 21:22:49 +0000854 if (LHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000855
David Greene1434f662011-01-07 17:05:37 +0000856 if (Code == UnOpInit::HEAD
857 || Code == UnOpInit::TAIL
858 || Code == UnOpInit::EMPTY) {
David Greene05bce0b2011-07-29 22:43:06 +0000859 ListInit *LHSl = dynamic_cast<ListInit*>(LHS);
860 StringInit *LHSs = dynamic_cast<StringInit*>(LHS);
861 TypedInit *LHSt = dynamic_cast<TypedInit*>(LHS);
David Greenee1b46912009-06-08 20:23:18 +0000862 if (LHSl == 0 && LHSs == 0 && LHSt == 0) {
863 TokError("expected list or string type argument in unary operator");
David Greene5f9f9ba2009-05-14 22:38:31 +0000864 return 0;
865 }
866 if (LHSt) {
867 ListRecTy *LType = dynamic_cast<ListRecTy*>(LHSt->getType());
David Greenee1b46912009-06-08 20:23:18 +0000868 StringRecTy *SType = dynamic_cast<StringRecTy*>(LHSt->getType());
869 if (LType == 0 && SType == 0) {
870 TokError("expected list or string type argumnet in unary operator");
David Greene5f9f9ba2009-05-14 22:38:31 +0000871 return 0;
872 }
873 }
874
David Greene1434f662011-01-07 17:05:37 +0000875 if (Code == UnOpInit::HEAD
876 || Code == UnOpInit::TAIL) {
David Greenee1b46912009-06-08 20:23:18 +0000877 if (LHSl == 0 && LHSt == 0) {
878 TokError("expected list type argumnet in unary operator");
879 return 0;
880 }
Bob Wilson21870412009-11-22 04:24:42 +0000881
David Greene5f9f9ba2009-05-14 22:38:31 +0000882 if (LHSl && LHSl->getSize() == 0) {
883 TokError("empty list argument in unary operator");
884 return 0;
885 }
886 if (LHSl) {
David Greene05bce0b2011-07-29 22:43:06 +0000887 Init *Item = LHSl->getElement(0);
888 TypedInit *Itemt = dynamic_cast<TypedInit*>(Item);
David Greene5f9f9ba2009-05-14 22:38:31 +0000889 if (Itemt == 0) {
890 TokError("untyped list element in unary operator");
891 return 0;
892 }
David Greene1434f662011-01-07 17:05:37 +0000893 if (Code == UnOpInit::HEAD) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000894 Type = Itemt->getType();
Bob Wilson21870412009-11-22 04:24:42 +0000895 } else {
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000896 Type = ListRecTy::get(Itemt->getType());
David Greene5f9f9ba2009-05-14 22:38:31 +0000897 }
Bob Wilson21870412009-11-22 04:24:42 +0000898 } else {
David Greene5f9f9ba2009-05-14 22:38:31 +0000899 assert(LHSt && "expected list type argument in unary operator");
900 ListRecTy *LType = dynamic_cast<ListRecTy*>(LHSt->getType());
901 if (LType == 0) {
902 TokError("expected list type argumnet in unary operator");
903 return 0;
904 }
David Greene1434f662011-01-07 17:05:37 +0000905 if (Code == UnOpInit::HEAD) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000906 Type = LType->getElementType();
Bob Wilson21870412009-11-22 04:24:42 +0000907 } else {
David Greene5f9f9ba2009-05-14 22:38:31 +0000908 Type = LType;
909 }
910 }
911 }
912 }
913
David Greenee6c27de2009-05-14 21:22:49 +0000914 if (Lex.getCode() != tgtok::r_paren) {
915 TokError("expected ')' in unary operator");
916 return 0;
917 }
918 Lex.Lex(); // eat the ')'
David Greenedcd35c72011-07-29 19:07:07 +0000919 return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec, CurMultiClass);
David Greenee6c27de2009-05-14 21:22:49 +0000920 }
David Greened418c1b2009-05-14 20:54:48 +0000921
922 case tgtok::XConcat:
Bob Wilson21870412009-11-22 04:24:42 +0000923 case tgtok::XSRA:
David Greened418c1b2009-05-14 20:54:48 +0000924 case tgtok::XSRL:
925 case tgtok::XSHL:
David Greene6786d5e2010-01-05 19:11:42 +0000926 case tgtok::XEq:
Chris Lattnerc7252ce2010-10-06 00:19:21 +0000927 case tgtok::XStrConcat: { // Value ::= !binop '(' Value ',' Value ')'
Chris Lattner8d978a72010-10-05 23:58:18 +0000928 tgtok::TokKind OpTok = Lex.getCode();
929 SMLoc OpLoc = Lex.getLoc();
930 Lex.Lex(); // eat the operation
931
David Greened418c1b2009-05-14 20:54:48 +0000932 BinOpInit::BinaryOp Code;
933 RecTy *Type = 0;
934
Chris Lattner8d978a72010-10-05 23:58:18 +0000935 switch (OpTok) {
Craig Topper85814382012-02-07 05:05:23 +0000936 default: llvm_unreachable("Unhandled code!");
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000937 case tgtok::XConcat: Code = BinOpInit::CONCAT;Type = DagRecTy::get(); break;
938 case tgtok::XSRA: Code = BinOpInit::SRA; Type = IntRecTy::get(); break;
939 case tgtok::XSRL: Code = BinOpInit::SRL; Type = IntRecTy::get(); break;
940 case tgtok::XSHL: Code = BinOpInit::SHL; Type = IntRecTy::get(); break;
941 case tgtok::XEq: Code = BinOpInit::EQ; Type = BitRecTy::get(); break;
Bob Wilson21870412009-11-22 04:24:42 +0000942 case tgtok::XStrConcat:
David Greened418c1b2009-05-14 20:54:48 +0000943 Code = BinOpInit::STRCONCAT;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000944 Type = StringRecTy::get();
David Greened418c1b2009-05-14 20:54:48 +0000945 break;
David Greened418c1b2009-05-14 20:54:48 +0000946 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000947
David Greened418c1b2009-05-14 20:54:48 +0000948 if (Lex.getCode() != tgtok::l_paren) {
949 TokError("expected '(' after binary operator");
950 return 0;
951 }
952 Lex.Lex(); // eat the '('
953
David Greene05bce0b2011-07-29 22:43:06 +0000954 SmallVector<Init*, 2> InitList;
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000955
Chris Lattner8d978a72010-10-05 23:58:18 +0000956 InitList.push_back(ParseValue(CurRec));
957 if (InitList.back() == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000958
Chris Lattner8d978a72010-10-05 23:58:18 +0000959 while (Lex.getCode() == tgtok::comma) {
960 Lex.Lex(); // eat the ','
961
962 InitList.push_back(ParseValue(CurRec));
963 if (InitList.back() == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000964 }
David Greened418c1b2009-05-14 20:54:48 +0000965
966 if (Lex.getCode() != tgtok::r_paren) {
Chris Lattner8d978a72010-10-05 23:58:18 +0000967 TokError("expected ')' in operator");
David Greened418c1b2009-05-14 20:54:48 +0000968 return 0;
969 }
970 Lex.Lex(); // eat the ')'
Chris Lattner8d978a72010-10-05 23:58:18 +0000971
972 // We allow multiple operands to associative operators like !strconcat as
973 // shorthand for nesting them.
974 if (Code == BinOpInit::STRCONCAT) {
975 while (InitList.size() > 2) {
David Greene05bce0b2011-07-29 22:43:06 +0000976 Init *RHS = InitList.pop_back_val();
David Greenedcd35c72011-07-29 19:07:07 +0000977 RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type))
978 ->Fold(CurRec, CurMultiClass);
Chris Lattner8d978a72010-10-05 23:58:18 +0000979 InitList.back() = RHS;
980 }
981 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000982
Chris Lattner8d978a72010-10-05 23:58:18 +0000983 if (InitList.size() == 2)
David Greenedcd35c72011-07-29 19:07:07 +0000984 return (BinOpInit::get(Code, InitList[0], InitList[1], Type))
Chris Lattner8d978a72010-10-05 23:58:18 +0000985 ->Fold(CurRec, CurMultiClass);
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000986
Chris Lattner8d978a72010-10-05 23:58:18 +0000987 Error(OpLoc, "expected two operands to operator");
988 return 0;
David Greened418c1b2009-05-14 20:54:48 +0000989 }
990
David Greene9bea7c82009-05-14 23:26:46 +0000991 case tgtok::XIf:
David Greenebeb31a52009-05-14 22:23:47 +0000992 case tgtok::XForEach:
David Greene4afc5092009-05-14 21:54:42 +0000993 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
994 TernOpInit::TernaryOp Code;
995 RecTy *Type = 0;
David Greened418c1b2009-05-14 20:54:48 +0000996
David Greene4afc5092009-05-14 21:54:42 +0000997 tgtok::TokKind LexCode = Lex.getCode();
998 Lex.Lex(); // eat the operation
999 switch (LexCode) {
Craig Topper85814382012-02-07 05:05:23 +00001000 default: llvm_unreachable("Unhandled code!");
David Greene9bea7c82009-05-14 23:26:46 +00001001 case tgtok::XIf:
1002 Code = TernOpInit::IF;
1003 break;
David Greenebeb31a52009-05-14 22:23:47 +00001004 case tgtok::XForEach:
1005 Code = TernOpInit::FOREACH;
1006 break;
David Greene4afc5092009-05-14 21:54:42 +00001007 case tgtok::XSubst:
1008 Code = TernOpInit::SUBST;
1009 break;
1010 }
1011 if (Lex.getCode() != tgtok::l_paren) {
1012 TokError("expected '(' after ternary operator");
1013 return 0;
1014 }
1015 Lex.Lex(); // eat the '('
David Greened418c1b2009-05-14 20:54:48 +00001016
David Greene05bce0b2011-07-29 22:43:06 +00001017 Init *LHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001018 if (LHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001019
David Greene4afc5092009-05-14 21:54:42 +00001020 if (Lex.getCode() != tgtok::comma) {
1021 TokError("expected ',' in ternary operator");
1022 return 0;
1023 }
1024 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001025
David Greene05bce0b2011-07-29 22:43:06 +00001026 Init *MHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001027 if (MHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001028
David Greene4afc5092009-05-14 21:54:42 +00001029 if (Lex.getCode() != tgtok::comma) {
1030 TokError("expected ',' in ternary operator");
1031 return 0;
1032 }
1033 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001034
David Greene05bce0b2011-07-29 22:43:06 +00001035 Init *RHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001036 if (RHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001037
David Greene4afc5092009-05-14 21:54:42 +00001038 if (Lex.getCode() != tgtok::r_paren) {
1039 TokError("expected ')' in binary operator");
1040 return 0;
1041 }
1042 Lex.Lex(); // eat the ')'
David Greened418c1b2009-05-14 20:54:48 +00001043
David Greene4afc5092009-05-14 21:54:42 +00001044 switch (LexCode) {
Craig Topper85814382012-02-07 05:05:23 +00001045 default: llvm_unreachable("Unhandled code!");
David Greene9bea7c82009-05-14 23:26:46 +00001046 case tgtok::XIf: {
Bill Wendling548f5a02010-12-13 01:46:19 +00001047 RecTy *MHSTy = 0;
1048 RecTy *RHSTy = 0;
1049
Michael Liao307525c2012-09-06 23:32:48 +00001050 if (TypedInit *MHSt = dynamic_cast<TypedInit*>(MHS))
Bill Wendling548f5a02010-12-13 01:46:19 +00001051 MHSTy = MHSt->getType();
Michael Liao307525c2012-09-06 23:32:48 +00001052 if (BitsInit *MHSbits = dynamic_cast<BitsInit*>(MHS))
1053 MHSTy = BitsRecTy::get(MHSbits->getNumBits());
1054 if (dynamic_cast<BitInit*>(MHS))
1055 MHSTy = BitRecTy::get();
1056
1057 if (TypedInit *RHSt = dynamic_cast<TypedInit*>(RHS))
Bill Wendling548f5a02010-12-13 01:46:19 +00001058 RHSTy = RHSt->getType();
Michael Liao307525c2012-09-06 23:32:48 +00001059 if (BitsInit *RHSbits = dynamic_cast<BitsInit*>(RHS))
1060 RHSTy = BitsRecTy::get(RHSbits->getNumBits());
1061 if (dynamic_cast<BitInit*>(RHS))
1062 RHSTy = BitRecTy::get();
1063
1064 // For UnsetInit, it's typed from the other hand.
1065 if (dynamic_cast<UnsetInit*>(MHS))
1066 MHSTy = RHSTy;
1067 if (dynamic_cast<UnsetInit*>(RHS))
1068 RHSTy = MHSTy;
Bill Wendling548f5a02010-12-13 01:46:19 +00001069
1070 if (!MHSTy || !RHSTy) {
David Greene9bea7c82009-05-14 23:26:46 +00001071 TokError("could not get type for !if");
1072 return 0;
1073 }
Bill Wendling548f5a02010-12-13 01:46:19 +00001074
1075 if (MHSTy->typeIsConvertibleTo(RHSTy)) {
1076 Type = RHSTy;
1077 } else if (RHSTy->typeIsConvertibleTo(MHSTy)) {
1078 Type = MHSTy;
Bob Wilson21870412009-11-22 04:24:42 +00001079 } else {
David Greene9bea7c82009-05-14 23:26:46 +00001080 TokError("inconsistent types for !if");
1081 return 0;
1082 }
1083 break;
1084 }
David Greenebeb31a52009-05-14 22:23:47 +00001085 case tgtok::XForEach: {
David Greene05bce0b2011-07-29 22:43:06 +00001086 TypedInit *MHSt = dynamic_cast<TypedInit *>(MHS);
David Greenebeb31a52009-05-14 22:23:47 +00001087 if (MHSt == 0) {
1088 TokError("could not get type for !foreach");
1089 return 0;
1090 }
1091 Type = MHSt->getType();
1092 break;
1093 }
David Greene4afc5092009-05-14 21:54:42 +00001094 case tgtok::XSubst: {
David Greene05bce0b2011-07-29 22:43:06 +00001095 TypedInit *RHSt = dynamic_cast<TypedInit *>(RHS);
David Greene4afc5092009-05-14 21:54:42 +00001096 if (RHSt == 0) {
1097 TokError("could not get type for !subst");
1098 return 0;
1099 }
1100 Type = RHSt->getType();
1101 break;
1102 }
1103 }
David Greenedcd35c72011-07-29 19:07:07 +00001104 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec,
Bob Wilson21870412009-11-22 04:24:42 +00001105 CurMultiClass);
David Greene4afc5092009-05-14 21:54:42 +00001106 }
David Greened418c1b2009-05-14 20:54:48 +00001107 }
David Greened418c1b2009-05-14 20:54:48 +00001108}
1109
1110/// ParseOperatorType - Parse a type for an operator. This returns
1111/// null on error.
1112///
1113/// OperatorType ::= '<' Type '>'
1114///
Dan Gohmana9ad0412009-08-12 22:10:57 +00001115RecTy *TGParser::ParseOperatorType() {
David Greened418c1b2009-05-14 20:54:48 +00001116 RecTy *Type = 0;
1117
1118 if (Lex.getCode() != tgtok::less) {
1119 TokError("expected type name for operator");
1120 return 0;
1121 }
1122 Lex.Lex(); // eat the <
1123
1124 Type = ParseType();
1125
1126 if (Type == 0) {
1127 TokError("expected type name for operator");
1128 return 0;
1129 }
1130
1131 if (Lex.getCode() != tgtok::greater) {
1132 TokError("expected type name for operator");
1133 return 0;
1134 }
1135 Lex.Lex(); // eat the >
1136
1137 return Type;
1138}
1139
1140
Chris Lattnerf4601652007-11-22 20:49:04 +00001141/// ParseSimpleValue - Parse a tblgen value. This returns null on error.
1142///
1143/// SimpleValue ::= IDValue
1144/// SimpleValue ::= INTVAL
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001145/// SimpleValue ::= STRVAL+
Chris Lattnerf4601652007-11-22 20:49:04 +00001146/// SimpleValue ::= CODEFRAGMENT
1147/// SimpleValue ::= '?'
1148/// SimpleValue ::= '{' ValueList '}'
1149/// SimpleValue ::= ID '<' ValueListNE '>'
1150/// SimpleValue ::= '[' ValueList ']'
1151/// SimpleValue ::= '(' IDValue DagArgList ')'
1152/// SimpleValue ::= CONCATTOK '(' Value ',' Value ')'
1153/// SimpleValue ::= SHLTOK '(' Value ',' Value ')'
1154/// SimpleValue ::= SRATOK '(' Value ',' Value ')'
1155/// SimpleValue ::= SRLTOK '(' Value ',' Value ')'
1156/// SimpleValue ::= STRCONCATTOK '(' Value ',' Value ')'
1157///
David Greenef3744a02011-10-19 13:04:20 +00001158Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType,
1159 IDParseMode Mode) {
David Greene05bce0b2011-07-29 22:43:06 +00001160 Init *R = 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001161 switch (Lex.getCode()) {
1162 default: TokError("Unknown token when parsing a value"); break;
David Greened3d1cad2011-10-19 13:04:43 +00001163 case tgtok::paste:
1164 // This is a leading paste operation. This is deprecated but
1165 // still exists in some .td files. Ignore it.
1166 Lex.Lex(); // Skip '#'.
1167 return ParseSimpleValue(CurRec, ItemType, Mode);
David Greenedcd35c72011-07-29 19:07:07 +00001168 case tgtok::IntVal: R = IntInit::get(Lex.getCurIntVal()); Lex.Lex(); break;
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001169 case tgtok::StrVal: {
1170 std::string Val = Lex.getCurStrVal();
1171 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001172
Jim Grosbachda4231f2009-03-26 16:17:51 +00001173 // Handle multiple consecutive concatenated strings.
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001174 while (Lex.getCode() == tgtok::StrVal) {
1175 Val += Lex.getCurStrVal();
1176 Lex.Lex();
1177 }
Bob Wilson21870412009-11-22 04:24:42 +00001178
David Greenedcd35c72011-07-29 19:07:07 +00001179 R = StringInit::get(Val);
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001180 break;
1181 }
Chris Lattnerf4601652007-11-22 20:49:04 +00001182 case tgtok::CodeFragment:
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +00001183 R = StringInit::get(Lex.getCurStrVal());
Chris Lattner578bcf02010-10-06 04:31:40 +00001184 Lex.Lex();
1185 break;
1186 case tgtok::question:
David Greenedcd35c72011-07-29 19:07:07 +00001187 R = UnsetInit::get();
Chris Lattner578bcf02010-10-06 04:31:40 +00001188 Lex.Lex();
1189 break;
Chris Lattnerf4601652007-11-22 20:49:04 +00001190 case tgtok::Id: {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001191 SMLoc NameLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001192 std::string Name = Lex.getCurStrVal();
1193 if (Lex.Lex() != tgtok::less) // consume the Id.
David Greenef3744a02011-10-19 13:04:20 +00001194 return ParseIDValue(CurRec, Name, NameLoc, Mode); // Value ::= IDValue
Bob Wilson21870412009-11-22 04:24:42 +00001195
Chris Lattnerf4601652007-11-22 20:49:04 +00001196 // Value ::= ID '<' ValueListNE '>'
1197 if (Lex.Lex() == tgtok::greater) {
1198 TokError("expected non-empty value list");
1199 return 0;
1200 }
David Greenee1b46912009-06-08 20:23:18 +00001201
Chris Lattnerf4601652007-11-22 20:49:04 +00001202 // This is a CLASS<initvalslist> expression. This is supposed to synthesize
1203 // a new anonymous definition, deriving from CLASS<initvalslist> with no
1204 // body.
1205 Record *Class = Records.getClass(Name);
1206 if (!Class) {
1207 Error(NameLoc, "Expected a class name, got '" + Name + "'");
1208 return 0;
1209 }
David Greenee1b46912009-06-08 20:23:18 +00001210
David Greene05bce0b2011-07-29 22:43:06 +00001211 std::vector<Init*> ValueList = ParseValueList(CurRec, Class);
David Greenee1b46912009-06-08 20:23:18 +00001212 if (ValueList.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001213
David Greenee1b46912009-06-08 20:23:18 +00001214 if (Lex.getCode() != tgtok::greater) {
1215 TokError("expected '>' at end of value list");
1216 return 0;
1217 }
1218 Lex.Lex(); // eat the '>'
Bob Wilson21870412009-11-22 04:24:42 +00001219
Chris Lattnerf4601652007-11-22 20:49:04 +00001220 // Create the new record, set it as CurRec temporarily.
1221 static unsigned AnonCounter = 0;
Chris Lattner9c6b60e2010-12-15 04:48:22 +00001222 Record *NewRec = new Record("anonymous.val."+utostr(AnonCounter++),
1223 NameLoc,
1224 Records);
Chris Lattnerf4601652007-11-22 20:49:04 +00001225 SubClassReference SCRef;
1226 SCRef.RefLoc = NameLoc;
1227 SCRef.Rec = Class;
1228 SCRef.TemplateArgs = ValueList;
1229 // Add info about the subclass to NewRec.
1230 if (AddSubClass(NewRec, SCRef))
1231 return 0;
1232 NewRec->resolveReferences();
1233 Records.addDef(NewRec);
Bob Wilson21870412009-11-22 04:24:42 +00001234
Chris Lattnerf4601652007-11-22 20:49:04 +00001235 // The result of the expression is a reference to the new record.
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +00001236 return DefInit::get(NewRec);
Bob Wilson21870412009-11-22 04:24:42 +00001237 }
Chris Lattnerf4601652007-11-22 20:49:04 +00001238 case tgtok::l_brace: { // Value ::= '{' ValueList '}'
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001239 SMLoc BraceLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001240 Lex.Lex(); // eat the '{'
David Greene05bce0b2011-07-29 22:43:06 +00001241 std::vector<Init*> Vals;
Bob Wilson21870412009-11-22 04:24:42 +00001242
Chris Lattnerf4601652007-11-22 20:49:04 +00001243 if (Lex.getCode() != tgtok::r_brace) {
1244 Vals = ParseValueList(CurRec);
1245 if (Vals.empty()) return 0;
1246 }
1247 if (Lex.getCode() != tgtok::r_brace) {
1248 TokError("expected '}' at end of bit list value");
1249 return 0;
1250 }
1251 Lex.Lex(); // eat the '}'
Bob Wilson21870412009-11-22 04:24:42 +00001252
David Greene05bce0b2011-07-29 22:43:06 +00001253 SmallVector<Init *, 16> NewBits(Vals.size());
David Greeneca7fd3d2011-07-29 19:07:00 +00001254
Chris Lattnerf4601652007-11-22 20:49:04 +00001255 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
David Greene05bce0b2011-07-29 22:43:06 +00001256 Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get());
Chris Lattnerf4601652007-11-22 20:49:04 +00001257 if (Bit == 0) {
Chris Lattner5d814862007-11-22 21:06:59 +00001258 Error(BraceLoc, "Element #" + utostr(i) + " (" + Vals[i]->getAsString()+
1259 ") is not convertable to a bit");
Chris Lattnerf4601652007-11-22 20:49:04 +00001260 return 0;
1261 }
David Greeneca7fd3d2011-07-29 19:07:00 +00001262 NewBits[Vals.size()-i-1] = Bit;
Chris Lattnerf4601652007-11-22 20:49:04 +00001263 }
David Greenedcd35c72011-07-29 19:07:07 +00001264 return BitsInit::get(NewBits);
Chris Lattnerf4601652007-11-22 20:49:04 +00001265 }
1266 case tgtok::l_square: { // Value ::= '[' ValueList ']'
1267 Lex.Lex(); // eat the '['
David Greene05bce0b2011-07-29 22:43:06 +00001268 std::vector<Init*> Vals;
Bob Wilson21870412009-11-22 04:24:42 +00001269
David Greenee1b46912009-06-08 20:23:18 +00001270 RecTy *DeducedEltTy = 0;
1271 ListRecTy *GivenListTy = 0;
Bob Wilson21870412009-11-22 04:24:42 +00001272
David Greenee1b46912009-06-08 20:23:18 +00001273 if (ItemType != 0) {
1274 ListRecTy *ListType = dynamic_cast<ListRecTy*>(ItemType);
1275 if (ListType == 0) {
1276 std::stringstream s;
Bob Wilson21870412009-11-22 04:24:42 +00001277 s << "Type mismatch for list, expected list type, got "
David Greenee1b46912009-06-08 20:23:18 +00001278 << ItemType->getAsString();
1279 TokError(s.str());
Jim Grosbach6a44ada2011-03-11 19:52:52 +00001280 return 0;
David Greenee1b46912009-06-08 20:23:18 +00001281 }
1282 GivenListTy = ListType;
Bob Wilson21870412009-11-22 04:24:42 +00001283 }
David Greenee1b46912009-06-08 20:23:18 +00001284
Chris Lattnerf4601652007-11-22 20:49:04 +00001285 if (Lex.getCode() != tgtok::r_square) {
Bob Wilson21870412009-11-22 04:24:42 +00001286 Vals = ParseValueList(CurRec, 0,
1287 GivenListTy ? GivenListTy->getElementType() : 0);
Chris Lattnerf4601652007-11-22 20:49:04 +00001288 if (Vals.empty()) return 0;
1289 }
1290 if (Lex.getCode() != tgtok::r_square) {
1291 TokError("expected ']' at end of list value");
1292 return 0;
1293 }
1294 Lex.Lex(); // eat the ']'
David Greenee1b46912009-06-08 20:23:18 +00001295
1296 RecTy *GivenEltTy = 0;
1297 if (Lex.getCode() == tgtok::less) {
1298 // Optional list element type
1299 Lex.Lex(); // eat the '<'
1300
1301 GivenEltTy = ParseType();
1302 if (GivenEltTy == 0) {
1303 // Couldn't parse element type
1304 return 0;
1305 }
1306
1307 if (Lex.getCode() != tgtok::greater) {
1308 TokError("expected '>' at end of list element type");
1309 return 0;
1310 }
1311 Lex.Lex(); // eat the '>'
1312 }
1313
1314 // Check elements
1315 RecTy *EltTy = 0;
David Greene05bce0b2011-07-29 22:43:06 +00001316 for (std::vector<Init *>::iterator i = Vals.begin(), ie = Vals.end();
David Greenee1b46912009-06-08 20:23:18 +00001317 i != ie;
1318 ++i) {
David Greene05bce0b2011-07-29 22:43:06 +00001319 TypedInit *TArg = dynamic_cast<TypedInit*>(*i);
David Greenee1b46912009-06-08 20:23:18 +00001320 if (TArg == 0) {
1321 TokError("Untyped list element");
1322 return 0;
1323 }
1324 if (EltTy != 0) {
1325 EltTy = resolveTypes(EltTy, TArg->getType());
1326 if (EltTy == 0) {
1327 TokError("Incompatible types in list elements");
1328 return 0;
1329 }
Bob Wilson21870412009-11-22 04:24:42 +00001330 } else {
David Greenee1b46912009-06-08 20:23:18 +00001331 EltTy = TArg->getType();
1332 }
1333 }
1334
1335 if (GivenEltTy != 0) {
1336 if (EltTy != 0) {
1337 // Verify consistency
1338 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) {
1339 TokError("Incompatible types in list elements");
1340 return 0;
1341 }
1342 }
1343 EltTy = GivenEltTy;
1344 }
1345
1346 if (EltTy == 0) {
1347 if (ItemType == 0) {
1348 TokError("No type for list");
1349 return 0;
1350 }
1351 DeducedEltTy = GivenListTy->getElementType();
Bob Wilson21870412009-11-22 04:24:42 +00001352 } else {
David Greenee1b46912009-06-08 20:23:18 +00001353 // Make sure the deduced type is compatible with the given type
1354 if (GivenListTy) {
1355 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) {
1356 TokError("Element type mismatch for list");
1357 return 0;
1358 }
1359 }
1360 DeducedEltTy = EltTy;
1361 }
Bob Wilson21870412009-11-22 04:24:42 +00001362
David Greenedcd35c72011-07-29 19:07:07 +00001363 return ListInit::get(Vals, DeducedEltTy);
Chris Lattnerf4601652007-11-22 20:49:04 +00001364 }
1365 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')'
1366 Lex.Lex(); // eat the '('
Chris Lattnerc7252ce2010-10-06 00:19:21 +00001367 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast) {
Chris Lattner3dc2e962008-04-10 04:48:34 +00001368 TokError("expected identifier in dag init");
1369 return 0;
1370 }
Bob Wilson21870412009-11-22 04:24:42 +00001371
David Greene05bce0b2011-07-29 22:43:06 +00001372 Init *Operator = ParseValue(CurRec);
Chris Lattner578bcf02010-10-06 04:31:40 +00001373 if (Operator == 0) return 0;
David Greenec7cafcd2009-04-22 20:18:10 +00001374
Nate Begeman7cee8172009-03-19 05:21:56 +00001375 // If the operator name is present, parse it.
1376 std::string OperatorName;
1377 if (Lex.getCode() == tgtok::colon) {
1378 if (Lex.Lex() != tgtok::VarName) { // eat the ':'
1379 TokError("expected variable name in dag operator");
1380 return 0;
1381 }
1382 OperatorName = Lex.getCurStrVal();
1383 Lex.Lex(); // eat the VarName.
1384 }
Bob Wilson21870412009-11-22 04:24:42 +00001385
David Greene05bce0b2011-07-29 22:43:06 +00001386 std::vector<std::pair<llvm::Init*, std::string> > DagArgs;
Chris Lattnerf4601652007-11-22 20:49:04 +00001387 if (Lex.getCode() != tgtok::r_paren) {
1388 DagArgs = ParseDagArgList(CurRec);
1389 if (DagArgs.empty()) return 0;
1390 }
Bob Wilson21870412009-11-22 04:24:42 +00001391
Chris Lattnerf4601652007-11-22 20:49:04 +00001392 if (Lex.getCode() != tgtok::r_paren) {
1393 TokError("expected ')' in dag init");
1394 return 0;
1395 }
1396 Lex.Lex(); // eat the ')'
Bob Wilson21870412009-11-22 04:24:42 +00001397
David Greenedcd35c72011-07-29 19:07:07 +00001398 return DagInit::get(Operator, OperatorName, DagArgs);
Chris Lattnerf4601652007-11-22 20:49:04 +00001399 }
Bob Wilson21870412009-11-22 04:24:42 +00001400
David Greene1434f662011-01-07 17:05:37 +00001401 case tgtok::XHead:
1402 case tgtok::XTail:
1403 case tgtok::XEmpty:
David Greenee6c27de2009-05-14 21:22:49 +00001404 case tgtok::XCast: // Value ::= !unop '(' Value ')'
Chris Lattnerf4601652007-11-22 20:49:04 +00001405 case tgtok::XConcat:
Bob Wilson21870412009-11-22 04:24:42 +00001406 case tgtok::XSRA:
Chris Lattnerf4601652007-11-22 20:49:04 +00001407 case tgtok::XSRL:
1408 case tgtok::XSHL:
David Greene6786d5e2010-01-05 19:11:42 +00001409 case tgtok::XEq:
Chris Lattnerc7252ce2010-10-06 00:19:21 +00001410 case tgtok::XStrConcat: // Value ::= !binop '(' Value ',' Value ')'
David Greene9bea7c82009-05-14 23:26:46 +00001411 case tgtok::XIf:
David Greenebeb31a52009-05-14 22:23:47 +00001412 case tgtok::XForEach:
David Greene4afc5092009-05-14 21:54:42 +00001413 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
David Greened418c1b2009-05-14 20:54:48 +00001414 return ParseOperation(CurRec);
Chris Lattnerf4601652007-11-22 20:49:04 +00001415 }
1416 }
Bob Wilson21870412009-11-22 04:24:42 +00001417
Chris Lattnerf4601652007-11-22 20:49:04 +00001418 return R;
1419}
1420
1421/// ParseValue - Parse a tblgen value. This returns null on error.
1422///
1423/// Value ::= SimpleValue ValueSuffix*
1424/// ValueSuffix ::= '{' BitList '}'
1425/// ValueSuffix ::= '[' BitList ']'
1426/// ValueSuffix ::= '.' ID
1427///
David Greenef3744a02011-10-19 13:04:20 +00001428Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
1429 Init *Result = ParseSimpleValue(CurRec, ItemType, Mode);
Chris Lattnerf4601652007-11-22 20:49:04 +00001430 if (Result == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001431
Chris Lattnerf4601652007-11-22 20:49:04 +00001432 // Parse the suffixes now if present.
1433 while (1) {
1434 switch (Lex.getCode()) {
1435 default: return Result;
1436 case tgtok::l_brace: {
David Greenecebb4ee2012-02-22 16:09:41 +00001437 if (Mode == ParseNameMode || Mode == ParseForeachMode)
David Greene8592b2b2011-10-19 13:04:26 +00001438 // This is the beginning of the object body.
1439 return Result;
1440
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001441 SMLoc CurlyLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001442 Lex.Lex(); // eat the '{'
1443 std::vector<unsigned> Ranges = ParseRangeList();
1444 if (Ranges.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001445
Chris Lattnerf4601652007-11-22 20:49:04 +00001446 // Reverse the bitlist.
1447 std::reverse(Ranges.begin(), Ranges.end());
1448 Result = Result->convertInitializerBitRange(Ranges);
1449 if (Result == 0) {
1450 Error(CurlyLoc, "Invalid bit range for value");
1451 return 0;
1452 }
Bob Wilson21870412009-11-22 04:24:42 +00001453
Chris Lattnerf4601652007-11-22 20:49:04 +00001454 // Eat the '}'.
1455 if (Lex.getCode() != tgtok::r_brace) {
1456 TokError("expected '}' at end of bit range list");
1457 return 0;
1458 }
1459 Lex.Lex();
1460 break;
1461 }
1462 case tgtok::l_square: {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001463 SMLoc SquareLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001464 Lex.Lex(); // eat the '['
1465 std::vector<unsigned> Ranges = ParseRangeList();
1466 if (Ranges.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001467
Chris Lattnerf4601652007-11-22 20:49:04 +00001468 Result = Result->convertInitListSlice(Ranges);
1469 if (Result == 0) {
1470 Error(SquareLoc, "Invalid range for list slice");
1471 return 0;
1472 }
Bob Wilson21870412009-11-22 04:24:42 +00001473
Chris Lattnerf4601652007-11-22 20:49:04 +00001474 // Eat the ']'.
1475 if (Lex.getCode() != tgtok::r_square) {
1476 TokError("expected ']' at end of list slice");
1477 return 0;
1478 }
1479 Lex.Lex();
1480 break;
1481 }
1482 case tgtok::period:
1483 if (Lex.Lex() != tgtok::Id) { // eat the .
1484 TokError("expected field identifier after '.'");
1485 return 0;
1486 }
1487 if (!Result->getFieldType(Lex.getCurStrVal())) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001488 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" +
Chris Lattner5d814862007-11-22 21:06:59 +00001489 Result->getAsString() + "'");
Chris Lattnerf4601652007-11-22 20:49:04 +00001490 return 0;
1491 }
David Greenedcd35c72011-07-29 19:07:07 +00001492 Result = FieldInit::get(Result, Lex.getCurStrVal());
Chris Lattnerf4601652007-11-22 20:49:04 +00001493 Lex.Lex(); // eat field name
1494 break;
David Greened3d1cad2011-10-19 13:04:43 +00001495
1496 case tgtok::paste:
1497 SMLoc PasteLoc = Lex.getLoc();
1498
1499 // Create a !strconcat() operation, first casting each operand to
1500 // a string if necessary.
1501
1502 TypedInit *LHS = dynamic_cast<TypedInit *>(Result);
1503 if (!LHS) {
1504 Error(PasteLoc, "LHS of paste is not typed!");
1505 return 0;
1506 }
1507
1508 if (LHS->getType() != StringRecTy::get()) {
1509 LHS = UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get());
1510 }
1511
1512 TypedInit *RHS = 0;
1513
1514 Lex.Lex(); // Eat the '#'.
1515 switch (Lex.getCode()) {
1516 case tgtok::colon:
1517 case tgtok::semi:
1518 case tgtok::l_brace:
1519 // These are all of the tokens that can begin an object body.
1520 // Some of these can also begin values but we disallow those cases
1521 // because they are unlikely to be useful.
1522
1523 // Trailing paste, concat with an empty string.
1524 RHS = StringInit::get("");
1525 break;
1526
1527 default:
1528 Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode);
1529 RHS = dynamic_cast<TypedInit *>(RHSResult);
1530 if (!RHS) {
1531 Error(PasteLoc, "RHS of paste is not typed!");
1532 return 0;
1533 }
1534
1535 if (RHS->getType() != StringRecTy::get()) {
1536 RHS = UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get());
1537 }
1538
1539 break;
1540 }
1541
1542 Result = BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS,
1543 StringRecTy::get())->Fold(CurRec, CurMultiClass);
1544 break;
Chris Lattnerf4601652007-11-22 20:49:04 +00001545 }
1546 }
1547}
1548
1549/// ParseDagArgList - Parse the argument list for a dag literal expression.
1550///
1551/// ParseDagArgList ::= Value (':' VARNAME)?
1552/// ParseDagArgList ::= ParseDagArgList ',' Value (':' VARNAME)?
David Greene05bce0b2011-07-29 22:43:06 +00001553std::vector<std::pair<llvm::Init*, std::string> >
Chris Lattnerf4601652007-11-22 20:49:04 +00001554TGParser::ParseDagArgList(Record *CurRec) {
David Greene05bce0b2011-07-29 22:43:06 +00001555 std::vector<std::pair<llvm::Init*, std::string> > Result;
Bob Wilson21870412009-11-22 04:24:42 +00001556
Chris Lattnerf4601652007-11-22 20:49:04 +00001557 while (1) {
David Greene05bce0b2011-07-29 22:43:06 +00001558 Init *Val = ParseValue(CurRec);
1559 if (Val == 0) return std::vector<std::pair<llvm::Init*, std::string> >();
Bob Wilson21870412009-11-22 04:24:42 +00001560
Chris Lattnerf4601652007-11-22 20:49:04 +00001561 // If the variable name is present, add it.
1562 std::string VarName;
1563 if (Lex.getCode() == tgtok::colon) {
1564 if (Lex.Lex() != tgtok::VarName) { // eat the ':'
1565 TokError("expected variable name in dag literal");
David Greene05bce0b2011-07-29 22:43:06 +00001566 return std::vector<std::pair<llvm::Init*, std::string> >();
Chris Lattnerf4601652007-11-22 20:49:04 +00001567 }
1568 VarName = Lex.getCurStrVal();
1569 Lex.Lex(); // eat the VarName.
1570 }
Bob Wilson21870412009-11-22 04:24:42 +00001571
Chris Lattnerf4601652007-11-22 20:49:04 +00001572 Result.push_back(std::make_pair(Val, VarName));
Bob Wilson21870412009-11-22 04:24:42 +00001573
Chris Lattnerf4601652007-11-22 20:49:04 +00001574 if (Lex.getCode() != tgtok::comma) break;
Bob Wilson21870412009-11-22 04:24:42 +00001575 Lex.Lex(); // eat the ','
Chris Lattnerf4601652007-11-22 20:49:04 +00001576 }
Bob Wilson21870412009-11-22 04:24:42 +00001577
Chris Lattnerf4601652007-11-22 20:49:04 +00001578 return Result;
1579}
1580
1581
1582/// ParseValueList - Parse a comma separated list of values, returning them as a
1583/// vector. Note that this always expects to be able to parse at least one
1584/// value. It returns an empty list if this is not possible.
1585///
1586/// ValueList ::= Value (',' Value)
1587///
David Greene05bce0b2011-07-29 22:43:06 +00001588std::vector<Init*> TGParser::ParseValueList(Record *CurRec, Record *ArgsRec,
Eric Christopherd568b3f2011-07-11 23:06:52 +00001589 RecTy *EltTy) {
David Greene05bce0b2011-07-29 22:43:06 +00001590 std::vector<Init*> Result;
David Greenee1b46912009-06-08 20:23:18 +00001591 RecTy *ItemType = EltTy;
David Greene67acdf22009-06-29 19:59:52 +00001592 unsigned int ArgN = 0;
David Greenee1b46912009-06-08 20:23:18 +00001593 if (ArgsRec != 0 && EltTy == 0) {
David Greenee22b3212011-10-19 13:02:42 +00001594 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs();
Jim Grosbachb1320cb2012-01-20 20:02:39 +00001595 if (!TArgs.size()) {
1596 TokError("template argument provided to non-template class");
1597 return std::vector<Init*>();
1598 }
David Greenee1b46912009-06-08 20:23:18 +00001599 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]);
David Greened9746fe2011-09-19 18:26:07 +00001600 if (!RV) {
1601 errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN]
1602 << ")\n";
1603 }
David Greenee1b46912009-06-08 20:23:18 +00001604 assert(RV && "Template argument record not found??");
1605 ItemType = RV->getType();
1606 ++ArgN;
1607 }
1608 Result.push_back(ParseValue(CurRec, ItemType));
David Greene05bce0b2011-07-29 22:43:06 +00001609 if (Result.back() == 0) return std::vector<Init*>();
Bob Wilson21870412009-11-22 04:24:42 +00001610
Chris Lattnerf4601652007-11-22 20:49:04 +00001611 while (Lex.getCode() == tgtok::comma) {
1612 Lex.Lex(); // Eat the comma
Bob Wilson21870412009-11-22 04:24:42 +00001613
David Greenee1b46912009-06-08 20:23:18 +00001614 if (ArgsRec != 0 && EltTy == 0) {
David Greenee22b3212011-10-19 13:02:42 +00001615 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs();
David Greene67acdf22009-06-29 19:59:52 +00001616 if (ArgN >= TArgs.size()) {
1617 TokError("too many template arguments");
David Greene05bce0b2011-07-29 22:43:06 +00001618 return std::vector<Init*>();
Bob Wilson21870412009-11-22 04:24:42 +00001619 }
David Greenee1b46912009-06-08 20:23:18 +00001620 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]);
1621 assert(RV && "Template argument record not found??");
1622 ItemType = RV->getType();
1623 ++ArgN;
1624 }
1625 Result.push_back(ParseValue(CurRec, ItemType));
David Greene05bce0b2011-07-29 22:43:06 +00001626 if (Result.back() == 0) return std::vector<Init*>();
Chris Lattnerf4601652007-11-22 20:49:04 +00001627 }
Bob Wilson21870412009-11-22 04:24:42 +00001628
Chris Lattnerf4601652007-11-22 20:49:04 +00001629 return Result;
1630}
1631
1632
Chris Lattnerf4601652007-11-22 20:49:04 +00001633/// ParseDeclaration - Read a declaration, returning the name of field ID, or an
1634/// empty string on error. This can happen in a number of different context's,
1635/// including within a def or in the template args for a def (which which case
1636/// CurRec will be non-null) and within the template args for a multiclass (in
1637/// which case CurRec will be null, but CurMultiClass will be set). This can
1638/// also happen within a def that is within a multiclass, which will set both
1639/// CurRec and CurMultiClass.
1640///
1641/// Declaration ::= FIELD? Type ID ('=' Value)?
1642///
David Greenee22b3212011-10-19 13:02:42 +00001643Init *TGParser::ParseDeclaration(Record *CurRec,
Chris Lattnerf4601652007-11-22 20:49:04 +00001644 bool ParsingTemplateArgs) {
1645 // Read the field prefix if present.
1646 bool HasField = Lex.getCode() == tgtok::Field;
1647 if (HasField) Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001648
Chris Lattnerf4601652007-11-22 20:49:04 +00001649 RecTy *Type = ParseType();
David Greenee22b3212011-10-19 13:02:42 +00001650 if (Type == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001651
Chris Lattnerf4601652007-11-22 20:49:04 +00001652 if (Lex.getCode() != tgtok::Id) {
1653 TokError("Expected identifier in declaration");
David Greenee22b3212011-10-19 13:02:42 +00001654 return 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001655 }
Bob Wilson21870412009-11-22 04:24:42 +00001656
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001657 SMLoc IdLoc = Lex.getLoc();
David Greenee22b3212011-10-19 13:02:42 +00001658 Init *DeclName = StringInit::get(Lex.getCurStrVal());
Chris Lattnerf4601652007-11-22 20:49:04 +00001659 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001660
Chris Lattnerf4601652007-11-22 20:49:04 +00001661 if (ParsingTemplateArgs) {
1662 if (CurRec) {
David Greenee22b3212011-10-19 13:02:42 +00001663 DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":");
Chris Lattnerf4601652007-11-22 20:49:04 +00001664 } else {
1665 assert(CurMultiClass);
1666 }
1667 if (CurMultiClass)
David Greenee22b3212011-10-19 13:02:42 +00001668 DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName,
1669 "::");
Chris Lattnerf4601652007-11-22 20:49:04 +00001670 }
Bob Wilson21870412009-11-22 04:24:42 +00001671
Chris Lattnerf4601652007-11-22 20:49:04 +00001672 // Add the value.
1673 if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField)))
David Greenee22b3212011-10-19 13:02:42 +00001674 return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001675
Chris Lattnerf4601652007-11-22 20:49:04 +00001676 // If a value is present, parse it.
1677 if (Lex.getCode() == tgtok::equal) {
1678 Lex.Lex();
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001679 SMLoc ValLoc = Lex.getLoc();
David Greene05bce0b2011-07-29 22:43:06 +00001680 Init *Val = ParseValue(CurRec, Type);
Chris Lattnerf4601652007-11-22 20:49:04 +00001681 if (Val == 0 ||
1682 SetValue(CurRec, ValLoc, DeclName, std::vector<unsigned>(), Val))
David Greenee22b3212011-10-19 13:02:42 +00001683 return 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001684 }
Bob Wilson21870412009-11-22 04:24:42 +00001685
Chris Lattnerf4601652007-11-22 20:49:04 +00001686 return DeclName;
1687}
1688
David Greenecebb4ee2012-02-22 16:09:41 +00001689/// ParseForeachDeclaration - Read a foreach declaration, returning
1690/// the name of the declared object or a NULL Init on error. Return
1691/// the name of the parsed initializer list through ForeachListName.
1692///
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001693/// ForeachDeclaration ::= ID '=' '[' ValueList ']'
1694/// ForeachDeclaration ::= ID '=' '{' RangeList '}'
1695/// ForeachDeclaration ::= ID '=' RangePiece
David Greenecebb4ee2012-02-22 16:09:41 +00001696///
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00001697VarInit *TGParser::ParseForeachDeclaration(ListInit *&ForeachListValue) {
David Greenecebb4ee2012-02-22 16:09:41 +00001698 if (Lex.getCode() != tgtok::Id) {
1699 TokError("Expected identifier in foreach declaration");
1700 return 0;
1701 }
1702
1703 Init *DeclName = StringInit::get(Lex.getCurStrVal());
1704 Lex.Lex();
1705
1706 // If a value is present, parse it.
1707 if (Lex.getCode() != tgtok::equal) {
1708 TokError("Expected '=' in foreach declaration");
1709 return 0;
1710 }
1711 Lex.Lex(); // Eat the '='
1712
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001713 RecTy *IterType = 0;
1714 std::vector<unsigned> Ranges;
David Greenecebb4ee2012-02-22 16:09:41 +00001715
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001716 switch (Lex.getCode()) {
1717 default: TokError("Unknown token when expecting a range list"); return 0;
1718 case tgtok::l_square: { // '[' ValueList ']'
1719 Init *List = ParseSimpleValue(0, 0, ParseForeachMode);
1720 ForeachListValue = dynamic_cast<ListInit*>(List);
1721 if (ForeachListValue == 0) {
1722 TokError("Expected a Value list");
1723 return 0;
1724 }
1725 RecTy *ValueType = ForeachListValue->getType();
1726 ListRecTy *ListType = dynamic_cast<ListRecTy *>(ValueType);
1727 if (ListType == 0) {
1728 TokError("Value list is not of list type");
1729 return 0;
1730 }
1731 IterType = ListType->getElementType();
1732 break;
David Greenecebb4ee2012-02-22 16:09:41 +00001733 }
1734
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001735 case tgtok::IntVal: { // RangePiece.
1736 if (ParseRangePiece(Ranges))
1737 return 0;
1738 break;
David Greenecebb4ee2012-02-22 16:09:41 +00001739 }
1740
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001741 case tgtok::l_brace: { // '{' RangeList '}'
1742 Lex.Lex(); // eat the '{'
1743 Ranges = ParseRangeList();
1744 if (Lex.getCode() != tgtok::r_brace) {
1745 TokError("expected '}' at end of bit range list");
1746 return 0;
1747 }
1748 Lex.Lex();
1749 break;
1750 }
1751 }
David Greenecebb4ee2012-02-22 16:09:41 +00001752
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001753 if (!Ranges.empty()) {
1754 assert(!IterType && "Type already initialized?");
1755 IterType = IntRecTy::get();
1756 std::vector<Init*> Values;
1757 for (unsigned i = 0, e = Ranges.size(); i != e; ++i)
1758 Values.push_back(IntInit::get(Ranges[i]));
1759 ForeachListValue = ListInit::get(Values, IterType);
1760 }
1761
1762 if (!IterType)
1763 return 0;
1764
1765 return VarInit::get(DeclName, IterType);
David Greenecebb4ee2012-02-22 16:09:41 +00001766}
1767
Chris Lattnerf4601652007-11-22 20:49:04 +00001768/// ParseTemplateArgList - Read a template argument list, which is a non-empty
1769/// sequence of template-declarations in <>'s. If CurRec is non-null, these are
1770/// template args for a def, which may or may not be in a multiclass. If null,
1771/// these are the template args for a multiclass.
1772///
1773/// TemplateArgList ::= '<' Declaration (',' Declaration)* '>'
Bob Wilson21870412009-11-22 04:24:42 +00001774///
Chris Lattnerf4601652007-11-22 20:49:04 +00001775bool TGParser::ParseTemplateArgList(Record *CurRec) {
1776 assert(Lex.getCode() == tgtok::less && "Not a template arg list!");
1777 Lex.Lex(); // eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +00001778
Chris Lattnerf4601652007-11-22 20:49:04 +00001779 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec;
Bob Wilson21870412009-11-22 04:24:42 +00001780
Chris Lattnerf4601652007-11-22 20:49:04 +00001781 // Read the first declaration.
David Greenee22b3212011-10-19 13:02:42 +00001782 Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/);
1783 if (TemplArg == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001784 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001785
Chris Lattnerf4601652007-11-22 20:49:04 +00001786 TheRecToAddTo->addTemplateArg(TemplArg);
Bob Wilson21870412009-11-22 04:24:42 +00001787
Chris Lattnerf4601652007-11-22 20:49:04 +00001788 while (Lex.getCode() == tgtok::comma) {
1789 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001790
Chris Lattnerf4601652007-11-22 20:49:04 +00001791 // Read the following declarations.
1792 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/);
David Greenee22b3212011-10-19 13:02:42 +00001793 if (TemplArg == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001794 return true;
1795 TheRecToAddTo->addTemplateArg(TemplArg);
1796 }
Bob Wilson21870412009-11-22 04:24:42 +00001797
Chris Lattnerf4601652007-11-22 20:49:04 +00001798 if (Lex.getCode() != tgtok::greater)
1799 return TokError("expected '>' at end of template argument list");
1800 Lex.Lex(); // eat the '>'.
1801 return false;
1802}
1803
1804
1805/// ParseBodyItem - Parse a single item at within the body of a def or class.
1806///
1807/// BodyItem ::= Declaration ';'
1808/// BodyItem ::= LET ID OptionalBitList '=' Value ';'
1809bool TGParser::ParseBodyItem(Record *CurRec) {
1810 if (Lex.getCode() != tgtok::Let) {
David Greenee22b3212011-10-19 13:02:42 +00001811 if (ParseDeclaration(CurRec, false) == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001812 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001813
Chris Lattnerf4601652007-11-22 20:49:04 +00001814 if (Lex.getCode() != tgtok::semi)
1815 return TokError("expected ';' after declaration");
1816 Lex.Lex();
1817 return false;
1818 }
1819
1820 // LET ID OptionalRangeList '=' Value ';'
1821 if (Lex.Lex() != tgtok::Id)
1822 return TokError("expected field identifier after let");
Bob Wilson21870412009-11-22 04:24:42 +00001823
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001824 SMLoc IdLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001825 std::string FieldName = Lex.getCurStrVal();
1826 Lex.Lex(); // eat the field name.
Bob Wilson21870412009-11-22 04:24:42 +00001827
Chris Lattnerf4601652007-11-22 20:49:04 +00001828 std::vector<unsigned> BitList;
Bob Wilson21870412009-11-22 04:24:42 +00001829 if (ParseOptionalBitList(BitList))
Chris Lattnerf4601652007-11-22 20:49:04 +00001830 return true;
1831 std::reverse(BitList.begin(), BitList.end());
Bob Wilson21870412009-11-22 04:24:42 +00001832
Chris Lattnerf4601652007-11-22 20:49:04 +00001833 if (Lex.getCode() != tgtok::equal)
1834 return TokError("expected '=' in let expression");
1835 Lex.Lex(); // eat the '='.
Bob Wilson21870412009-11-22 04:24:42 +00001836
David Greenee1b46912009-06-08 20:23:18 +00001837 RecordVal *Field = CurRec->getValue(FieldName);
1838 if (Field == 0)
1839 return TokError("Value '" + FieldName + "' unknown!");
1840
1841 RecTy *Type = Field->getType();
Bob Wilson21870412009-11-22 04:24:42 +00001842
David Greene05bce0b2011-07-29 22:43:06 +00001843 Init *Val = ParseValue(CurRec, Type);
Chris Lattnerf4601652007-11-22 20:49:04 +00001844 if (Val == 0) return true;
Bob Wilson21870412009-11-22 04:24:42 +00001845
Chris Lattnerf4601652007-11-22 20:49:04 +00001846 if (Lex.getCode() != tgtok::semi)
1847 return TokError("expected ';' after let expression");
1848 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001849
Chris Lattnerf4601652007-11-22 20:49:04 +00001850 return SetValue(CurRec, IdLoc, FieldName, BitList, Val);
1851}
1852
1853/// ParseBody - Read the body of a class or def. Return true on error, false on
1854/// success.
1855///
1856/// Body ::= ';'
1857/// Body ::= '{' BodyList '}'
1858/// BodyList BodyItem*
1859///
1860bool TGParser::ParseBody(Record *CurRec) {
1861 // If this is a null definition, just eat the semi and return.
1862 if (Lex.getCode() == tgtok::semi) {
1863 Lex.Lex();
1864 return false;
1865 }
Bob Wilson21870412009-11-22 04:24:42 +00001866
Chris Lattnerf4601652007-11-22 20:49:04 +00001867 if (Lex.getCode() != tgtok::l_brace)
1868 return TokError("Expected ';' or '{' to start body");
1869 // Eat the '{'.
1870 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001871
Chris Lattnerf4601652007-11-22 20:49:04 +00001872 while (Lex.getCode() != tgtok::r_brace)
1873 if (ParseBodyItem(CurRec))
1874 return true;
1875
1876 // Eat the '}'.
1877 Lex.Lex();
1878 return false;
1879}
1880
1881/// ParseObjectBody - Parse the body of a def or class. This consists of an
1882/// optional ClassList followed by a Body. CurRec is the current def or class
1883/// that is being parsed.
1884///
1885/// ObjectBody ::= BaseClassList Body
1886/// BaseClassList ::= /*empty*/
1887/// BaseClassList ::= ':' BaseClassListNE
1888/// BaseClassListNE ::= SubClassRef (',' SubClassRef)*
1889///
1890bool TGParser::ParseObjectBody(Record *CurRec) {
1891 // If there is a baseclass list, read it.
1892 if (Lex.getCode() == tgtok::colon) {
1893 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001894
Chris Lattnerf4601652007-11-22 20:49:04 +00001895 // Read all of the subclasses.
1896 SubClassReference SubClass = ParseSubClassReference(CurRec, false);
1897 while (1) {
1898 // Check for error.
1899 if (SubClass.Rec == 0) return true;
Bob Wilson21870412009-11-22 04:24:42 +00001900
Chris Lattnerf4601652007-11-22 20:49:04 +00001901 // Add it.
1902 if (AddSubClass(CurRec, SubClass))
1903 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001904
Chris Lattnerf4601652007-11-22 20:49:04 +00001905 if (Lex.getCode() != tgtok::comma) break;
1906 Lex.Lex(); // eat ','.
1907 SubClass = ParseSubClassReference(CurRec, false);
1908 }
1909 }
1910
1911 // Process any variables on the let stack.
1912 for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
1913 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
1914 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name,
1915 LetStack[i][j].Bits, LetStack[i][j].Value))
1916 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001917
Chris Lattnerf4601652007-11-22 20:49:04 +00001918 return ParseBody(CurRec);
1919}
1920
Chris Lattnerf4601652007-11-22 20:49:04 +00001921/// ParseDef - Parse and return a top level or multiclass def, return the record
1922/// corresponding to it. This returns null on error.
1923///
1924/// DefInst ::= DEF ObjectName ObjectBody
1925///
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001926bool TGParser::ParseDef(MultiClass *CurMultiClass) {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001927 SMLoc DefLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001928 assert(Lex.getCode() == tgtok::Def && "Unknown tok");
Bob Wilson21870412009-11-22 04:24:42 +00001929 Lex.Lex(); // Eat the 'def' token.
Chris Lattnerf4601652007-11-22 20:49:04 +00001930
1931 // Parse ObjectName and make a record for it.
David Greenea9e07dd2011-10-19 13:04:29 +00001932 Record *CurRec = new Record(ParseObjectName(CurMultiClass), DefLoc, Records);
Bob Wilson21870412009-11-22 04:24:42 +00001933
Jakob Stoklund Olesen72cba6c2012-05-24 22:17:36 +00001934 if (!CurMultiClass && Loops.empty()) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001935 // Top-level def definition.
Bob Wilson21870412009-11-22 04:24:42 +00001936
Chris Lattnerf4601652007-11-22 20:49:04 +00001937 // Ensure redefinition doesn't happen.
David Greene1d501392012-01-28 00:03:24 +00001938 if (Records.getDef(CurRec->getNameInitAsString())) {
David Greene2c49fbb2011-10-19 13:03:45 +00001939 Error(DefLoc, "def '" + CurRec->getNameInitAsString()
1940 + "' already defined");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001941 return true;
Chris Lattnerf4601652007-11-22 20:49:04 +00001942 }
1943 Records.addDef(CurRec);
Jakob Stoklund Olesen72cba6c2012-05-24 22:17:36 +00001944 } else if (CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001945 // Otherwise, a def inside a multiclass, add it to the multiclass.
1946 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i)
David Greene91919cd2011-10-19 13:03:51 +00001947 if (CurMultiClass->DefPrototypes[i]->getNameInit()
1948 == CurRec->getNameInit()) {
1949 Error(DefLoc, "def '" + CurRec->getNameInitAsString() +
Chris Lattnerf4601652007-11-22 20:49:04 +00001950 "' already defined in this multiclass!");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001951 return true;
Chris Lattnerf4601652007-11-22 20:49:04 +00001952 }
1953 CurMultiClass->DefPrototypes.push_back(CurRec);
1954 }
Bob Wilson21870412009-11-22 04:24:42 +00001955
Chris Lattnerf4601652007-11-22 20:49:04 +00001956 if (ParseObjectBody(CurRec))
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001957 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001958
Chris Lattnerf4601652007-11-22 20:49:04 +00001959 if (CurMultiClass == 0) // Def's in multiclasses aren't really defs.
David Greene0d886402011-08-10 18:27:46 +00001960 // See Record::setName(). This resolve step will see any new name
1961 // for the def that might have been created when resolving
1962 // inheritance, values and arguments above.
Chris Lattnerf4601652007-11-22 20:49:04 +00001963 CurRec->resolveReferences();
Bob Wilson21870412009-11-22 04:24:42 +00001964
Chris Lattnerf4601652007-11-22 20:49:04 +00001965 // If ObjectBody has template arguments, it's an error.
1966 assert(CurRec->getTemplateArgs().empty() && "How'd this get template args?");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001967
1968 if (CurMultiClass) {
1969 // Copy the template arguments for the multiclass into the def.
David Greenee22b3212011-10-19 13:02:42 +00001970 const std::vector<Init *> &TArgs =
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001971 CurMultiClass->Rec.getTemplateArgs();
1972
1973 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
1974 const RecordVal *RV = CurMultiClass->Rec.getValue(TArgs[i]);
1975 assert(RV && "Template arg doesn't exist?");
1976 CurRec->addValue(*RV);
1977 }
1978 }
1979
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00001980 if (ProcessForeachDefs(CurRec, DefLoc)) {
David Greenecebb4ee2012-02-22 16:09:41 +00001981 Error(DefLoc,
1982 "Could not process loops for def" + CurRec->getNameInitAsString());
1983 return true;
1984 }
1985
1986 return false;
1987}
1988
1989/// ParseForeach - Parse a for statement. Return the record corresponding
1990/// to it. This returns true on error.
1991///
1992/// Foreach ::= FOREACH Declaration IN '{ ObjectList '}'
1993/// Foreach ::= FOREACH Declaration IN Object
1994///
1995bool TGParser::ParseForeach(MultiClass *CurMultiClass) {
1996 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok");
1997 Lex.Lex(); // Eat the 'for' token.
1998
1999 // Make a temporary object to record items associated with the for
2000 // loop.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00002001 ListInit *ListValue = 0;
2002 VarInit *IterName = ParseForeachDeclaration(ListValue);
David Greenecebb4ee2012-02-22 16:09:41 +00002003 if (IterName == 0)
2004 return TokError("expected declaration in for");
2005
2006 if (Lex.getCode() != tgtok::In)
2007 return TokError("Unknown tok");
2008 Lex.Lex(); // Eat the in
2009
2010 // Create a loop object and remember it.
2011 Loops.push_back(ForeachLoop(IterName, ListValue));
2012
2013 if (Lex.getCode() != tgtok::l_brace) {
2014 // FOREACH Declaration IN Object
2015 if (ParseObject(CurMultiClass))
2016 return true;
2017 }
2018 else {
2019 SMLoc BraceLoc = Lex.getLoc();
2020 // Otherwise, this is a group foreach.
2021 Lex.Lex(); // eat the '{'.
2022
2023 // Parse the object list.
2024 if (ParseObjectList(CurMultiClass))
2025 return true;
2026
2027 if (Lex.getCode() != tgtok::r_brace) {
2028 TokError("expected '}' at end of foreach command");
2029 return Error(BraceLoc, "to match this '{'");
2030 }
2031 Lex.Lex(); // Eat the }
2032 }
2033
2034 // We've processed everything in this loop.
2035 Loops.pop_back();
2036
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002037 return false;
Chris Lattnerf4601652007-11-22 20:49:04 +00002038}
2039
Chris Lattnerf4601652007-11-22 20:49:04 +00002040/// ParseClass - Parse a tblgen class definition.
2041///
2042/// ClassInst ::= CLASS ID TemplateArgList? ObjectBody
2043///
2044bool TGParser::ParseClass() {
2045 assert(Lex.getCode() == tgtok::Class && "Unexpected token!");
2046 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002047
Chris Lattnerf4601652007-11-22 20:49:04 +00002048 if (Lex.getCode() != tgtok::Id)
2049 return TokError("expected class name after 'class' keyword");
Bob Wilson21870412009-11-22 04:24:42 +00002050
Chris Lattnerf4601652007-11-22 20:49:04 +00002051 Record *CurRec = Records.getClass(Lex.getCurStrVal());
2052 if (CurRec) {
2053 // If the body was previously defined, this is an error.
David Greenee3385652011-10-19 13:04:13 +00002054 if (CurRec->getValues().size() > 1 || // Account for NAME.
Chris Lattnerf4601652007-11-22 20:49:04 +00002055 !CurRec->getSuperClasses().empty() ||
2056 !CurRec->getTemplateArgs().empty())
David Greene69a23942011-10-19 13:03:58 +00002057 return TokError("Class '" + CurRec->getNameInitAsString()
2058 + "' already defined");
Chris Lattnerf4601652007-11-22 20:49:04 +00002059 } else {
2060 // If this is the first reference to this class, create and add it.
Chris Lattner9c6b60e2010-12-15 04:48:22 +00002061 CurRec = new Record(Lex.getCurStrVal(), Lex.getLoc(), Records);
Chris Lattnerf4601652007-11-22 20:49:04 +00002062 Records.addClass(CurRec);
2063 }
2064 Lex.Lex(); // eat the name.
Bob Wilson21870412009-11-22 04:24:42 +00002065
Chris Lattnerf4601652007-11-22 20:49:04 +00002066 // If there are template args, parse them.
2067 if (Lex.getCode() == tgtok::less)
2068 if (ParseTemplateArgList(CurRec))
2069 return true;
2070
2071 // Finally, parse the object body.
2072 return ParseObjectBody(CurRec);
2073}
2074
2075/// ParseLetList - Parse a non-empty list of assignment expressions into a list
2076/// of LetRecords.
2077///
2078/// LetList ::= LetItem (',' LetItem)*
2079/// LetItem ::= ID OptionalRangeList '=' Value
2080///
2081std::vector<LetRecord> TGParser::ParseLetList() {
2082 std::vector<LetRecord> Result;
Bob Wilson21870412009-11-22 04:24:42 +00002083
Chris Lattnerf4601652007-11-22 20:49:04 +00002084 while (1) {
2085 if (Lex.getCode() != tgtok::Id) {
2086 TokError("expected identifier in let definition");
2087 return std::vector<LetRecord>();
2088 }
2089 std::string Name = Lex.getCurStrVal();
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002090 SMLoc NameLoc = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +00002091 Lex.Lex(); // Eat the identifier.
Chris Lattnerf4601652007-11-22 20:49:04 +00002092
2093 // Check for an optional RangeList.
2094 std::vector<unsigned> Bits;
Bob Wilson21870412009-11-22 04:24:42 +00002095 if (ParseOptionalRangeList(Bits))
Chris Lattnerf4601652007-11-22 20:49:04 +00002096 return std::vector<LetRecord>();
2097 std::reverse(Bits.begin(), Bits.end());
Bob Wilson21870412009-11-22 04:24:42 +00002098
Chris Lattnerf4601652007-11-22 20:49:04 +00002099 if (Lex.getCode() != tgtok::equal) {
2100 TokError("expected '=' in let expression");
2101 return std::vector<LetRecord>();
2102 }
2103 Lex.Lex(); // eat the '='.
Bob Wilson21870412009-11-22 04:24:42 +00002104
David Greene05bce0b2011-07-29 22:43:06 +00002105 Init *Val = ParseValue(0);
Chris Lattnerf4601652007-11-22 20:49:04 +00002106 if (Val == 0) return std::vector<LetRecord>();
Bob Wilson21870412009-11-22 04:24:42 +00002107
Chris Lattnerf4601652007-11-22 20:49:04 +00002108 // Now that we have everything, add the record.
2109 Result.push_back(LetRecord(Name, Bits, Val, NameLoc));
Bob Wilson21870412009-11-22 04:24:42 +00002110
Chris Lattnerf4601652007-11-22 20:49:04 +00002111 if (Lex.getCode() != tgtok::comma)
2112 return Result;
Bob Wilson21870412009-11-22 04:24:42 +00002113 Lex.Lex(); // eat the comma.
Chris Lattnerf4601652007-11-22 20:49:04 +00002114 }
2115}
2116
2117/// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002118/// different related productions. This works inside multiclasses too.
Chris Lattnerf4601652007-11-22 20:49:04 +00002119///
2120/// Object ::= LET LetList IN '{' ObjectList '}'
2121/// Object ::= LET LetList IN Object
2122///
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002123bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002124 assert(Lex.getCode() == tgtok::Let && "Unexpected token");
2125 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002126
Chris Lattnerf4601652007-11-22 20:49:04 +00002127 // Add this entry to the let stack.
2128 std::vector<LetRecord> LetInfo = ParseLetList();
2129 if (LetInfo.empty()) return true;
2130 LetStack.push_back(LetInfo);
2131
2132 if (Lex.getCode() != tgtok::In)
2133 return TokError("expected 'in' at end of top-level 'let'");
2134 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002135
Chris Lattnerf4601652007-11-22 20:49:04 +00002136 // If this is a scalar let, just handle it now
2137 if (Lex.getCode() != tgtok::l_brace) {
2138 // LET LetList IN Object
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002139 if (ParseObject(CurMultiClass))
Chris Lattnerf4601652007-11-22 20:49:04 +00002140 return true;
2141 } else { // Object ::= LETCommand '{' ObjectList '}'
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002142 SMLoc BraceLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00002143 // Otherwise, this is a group let.
2144 Lex.Lex(); // eat the '{'.
Bob Wilson21870412009-11-22 04:24:42 +00002145
Chris Lattnerf4601652007-11-22 20:49:04 +00002146 // Parse the object list.
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002147 if (ParseObjectList(CurMultiClass))
Chris Lattnerf4601652007-11-22 20:49:04 +00002148 return true;
Bob Wilson21870412009-11-22 04:24:42 +00002149
Chris Lattnerf4601652007-11-22 20:49:04 +00002150 if (Lex.getCode() != tgtok::r_brace) {
2151 TokError("expected '}' at end of top level let command");
2152 return Error(BraceLoc, "to match this '{'");
2153 }
2154 Lex.Lex();
2155 }
Bob Wilson21870412009-11-22 04:24:42 +00002156
Chris Lattnerf4601652007-11-22 20:49:04 +00002157 // Outside this let scope, this let block is not active.
2158 LetStack.pop_back();
2159 return false;
2160}
2161
Chris Lattnerf4601652007-11-22 20:49:04 +00002162/// ParseMultiClass - Parse a multiclass definition.
2163///
Bob Wilson32558652009-04-28 19:41:44 +00002164/// MultiClassInst ::= MULTICLASS ID TemplateArgList?
2165/// ':' BaseMultiClassList '{' MultiClassDef+ '}'
Chris Lattnerf4601652007-11-22 20:49:04 +00002166///
2167bool TGParser::ParseMultiClass() {
2168 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token");
2169 Lex.Lex(); // Eat the multiclass token.
2170
2171 if (Lex.getCode() != tgtok::Id)
2172 return TokError("expected identifier after multiclass for name");
2173 std::string Name = Lex.getCurStrVal();
Bob Wilson21870412009-11-22 04:24:42 +00002174
Chris Lattnerf4601652007-11-22 20:49:04 +00002175 if (MultiClasses.count(Name))
2176 return TokError("multiclass '" + Name + "' already defined");
Bob Wilson21870412009-11-22 04:24:42 +00002177
Chris Lattner67db8832010-12-13 00:23:57 +00002178 CurMultiClass = MultiClasses[Name] = new MultiClass(Name,
2179 Lex.getLoc(), Records);
Chris Lattnerf4601652007-11-22 20:49:04 +00002180 Lex.Lex(); // Eat the identifier.
Bob Wilson21870412009-11-22 04:24:42 +00002181
Chris Lattnerf4601652007-11-22 20:49:04 +00002182 // If there are template args, parse them.
2183 if (Lex.getCode() == tgtok::less)
2184 if (ParseTemplateArgList(0))
2185 return true;
2186
David Greened34a73b2009-04-24 16:55:41 +00002187 bool inherits = false;
2188
David Greenede444af2009-04-22 16:42:54 +00002189 // If there are submulticlasses, parse them.
2190 if (Lex.getCode() == tgtok::colon) {
David Greened34a73b2009-04-24 16:55:41 +00002191 inherits = true;
2192
David Greenede444af2009-04-22 16:42:54 +00002193 Lex.Lex();
Bob Wilson32558652009-04-28 19:41:44 +00002194
David Greenede444af2009-04-22 16:42:54 +00002195 // Read all of the submulticlasses.
Bob Wilson32558652009-04-28 19:41:44 +00002196 SubMultiClassReference SubMultiClass =
2197 ParseSubMultiClassReference(CurMultiClass);
David Greenede444af2009-04-22 16:42:54 +00002198 while (1) {
2199 // Check for error.
2200 if (SubMultiClass.MC == 0) return true;
Bob Wilson32558652009-04-28 19:41:44 +00002201
David Greenede444af2009-04-22 16:42:54 +00002202 // Add it.
2203 if (AddSubMultiClass(CurMultiClass, SubMultiClass))
2204 return true;
Bob Wilson32558652009-04-28 19:41:44 +00002205
David Greenede444af2009-04-22 16:42:54 +00002206 if (Lex.getCode() != tgtok::comma) break;
2207 Lex.Lex(); // eat ','.
2208 SubMultiClass = ParseSubMultiClassReference(CurMultiClass);
2209 }
2210 }
2211
David Greened34a73b2009-04-24 16:55:41 +00002212 if (Lex.getCode() != tgtok::l_brace) {
2213 if (!inherits)
2214 return TokError("expected '{' in multiclass definition");
Bob Wilson21870412009-11-22 04:24:42 +00002215 else if (Lex.getCode() != tgtok::semi)
2216 return TokError("expected ';' in multiclass definition");
David Greened34a73b2009-04-24 16:55:41 +00002217 else
Bob Wilson21870412009-11-22 04:24:42 +00002218 Lex.Lex(); // eat the ';'.
2219 } else {
David Greened34a73b2009-04-24 16:55:41 +00002220 if (Lex.Lex() == tgtok::r_brace) // eat the '{'.
2221 return TokError("multiclass must contain at least one def");
Bob Wilson21870412009-11-22 04:24:42 +00002222
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002223 while (Lex.getCode() != tgtok::r_brace) {
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002224 switch (Lex.getCode()) {
2225 default:
David Greenea1b1b792011-10-07 18:25:05 +00002226 return TokError("expected 'let', 'def' or 'defm' in multiclass body");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002227 case tgtok::Let:
2228 case tgtok::Def:
2229 case tgtok::Defm:
David Greenecebb4ee2012-02-22 16:09:41 +00002230 case tgtok::Foreach:
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002231 if (ParseObject(CurMultiClass))
2232 return true;
2233 break;
2234 }
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002235 }
David Greened34a73b2009-04-24 16:55:41 +00002236 Lex.Lex(); // eat the '}'.
2237 }
Bob Wilson21870412009-11-22 04:24:42 +00002238
Chris Lattnerf4601652007-11-22 20:49:04 +00002239 CurMultiClass = 0;
2240 return false;
2241}
2242
David Greenee499a2d2011-10-05 22:42:07 +00002243Record *TGParser::
2244InstantiateMulticlassDef(MultiClass &MC,
2245 Record *DefProto,
David Greene7be867e2011-10-19 13:04:31 +00002246 Init *DefmPrefix,
David Greenee499a2d2011-10-05 22:42:07 +00002247 SMLoc DefmPrefixLoc) {
David Greene7be867e2011-10-19 13:04:31 +00002248 // We need to preserve DefProto so it can be reused for later
2249 // instantiations, so create a new Record to inherit from it.
2250
David Greenee499a2d2011-10-05 22:42:07 +00002251 // Add in the defm name. If the defm prefix is empty, give each
2252 // instantiated def a unique name. Otherwise, if "#NAME#" exists in the
2253 // name, substitute the prefix for #NAME#. Otherwise, use the defm name
2254 // as a prefix.
David Greenee499a2d2011-10-05 22:42:07 +00002255
David Greene7be867e2011-10-19 13:04:31 +00002256 if (DefmPrefix == 0)
2257 DefmPrefix = StringInit::get(GetNewAnonymousName());
2258
2259 Init *DefName = DefProto->getNameInit();
2260
David Greened3d1cad2011-10-19 13:04:43 +00002261 StringInit *DefNameString = dynamic_cast<StringInit *>(DefName);
David Greene7be867e2011-10-19 13:04:31 +00002262
David Greened3d1cad2011-10-19 13:04:43 +00002263 if (DefNameString != 0) {
2264 // We have a fully expanded string so there are no operators to
2265 // resolve. We should concatenate the given prefix and name.
David Greene7be867e2011-10-19 13:04:31 +00002266 DefName =
2267 BinOpInit::get(BinOpInit::STRCONCAT,
2268 UnOpInit::get(UnOpInit::CAST, DefmPrefix,
2269 StringRecTy::get())->Fold(DefProto, &MC),
2270 DefName, StringRecTy::get())->Fold(DefProto, &MC);
2271 }
David Greene7be867e2011-10-19 13:04:31 +00002272
Jakob Stoklund Olesen376a8a72012-08-22 23:33:58 +00002273 // Make a trail of SMLocs from the multiclass instantiations.
2274 SmallVector<SMLoc, 4> Locs(1, DefmPrefixLoc);
2275 Locs.append(DefProto->getLoc().begin(), DefProto->getLoc().end());
2276 Record *CurRec = new Record(DefName, Locs, Records);
David Greenee499a2d2011-10-05 22:42:07 +00002277
2278 SubClassReference Ref;
2279 Ref.RefLoc = DefmPrefixLoc;
2280 Ref.Rec = DefProto;
2281 AddSubClass(CurRec, Ref);
2282
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002283 // Set the value for NAME. We don't resolve references to it 'til later,
2284 // though, so that uses in nested multiclass names don't get
2285 // confused.
2286 if (SetValue(CurRec, Ref.RefLoc, "NAME", std::vector<unsigned>(),
2287 DefmPrefix)) {
2288 Error(DefmPrefixLoc, "Could not resolve "
2289 + CurRec->getNameInitAsString() + ":NAME to '"
2290 + DefmPrefix->getAsUnquotedString() + "'");
2291 return 0;
2292 }
David Greenee5b252f2011-10-19 13:04:35 +00002293
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002294 // If the DefNameString didn't resolve, we probably have a reference to
2295 // NAME and need to replace it. We need to do at least this much greedily,
2296 // otherwise nested multiclasses will end up with incorrect NAME expansions.
2297 if (DefNameString == 0) {
David Greenee5b252f2011-10-19 13:04:35 +00002298 RecordVal *DefNameRV = CurRec->getValue("NAME");
2299 CurRec->resolveReferencesTo(DefNameRV);
2300 }
2301
2302 if (!CurMultiClass) {
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002303 // Now that we're at the top level, resolve all NAME references
2304 // in the resultant defs that weren't in the def names themselves.
2305 RecordVal *DefNameRV = CurRec->getValue("NAME");
2306 CurRec->resolveReferencesTo(DefNameRV);
2307
2308 // Now that NAME references are resolved and we're at the top level of
2309 // any multiclass expansions, add the record to the RecordKeeper. If we are
David Greenee5b252f2011-10-19 13:04:35 +00002310 // currently in a multiclass, it means this defm appears inside a
2311 // multiclass and its name won't be fully resolvable until we see
2312 // the top-level defm. Therefore, we don't add this to the
2313 // RecordKeeper at this point. If we did we could get duplicate
2314 // defs as more than one probably refers to NAME or some other
2315 // common internal placeholder.
2316
2317 // Ensure redefinition doesn't happen.
2318 if (Records.getDef(CurRec->getNameInitAsString())) {
2319 Error(DefmPrefixLoc, "def '" + CurRec->getNameInitAsString() +
2320 "' already defined, instantiating defm with subdef '" +
2321 DefProto->getNameInitAsString() + "'");
2322 return 0;
2323 }
2324
2325 Records.addDef(CurRec);
2326 }
2327
David Greenee499a2d2011-10-05 22:42:07 +00002328 return CurRec;
2329}
2330
2331bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC,
2332 Record *CurRec,
2333 SMLoc DefmPrefixLoc,
2334 SMLoc SubClassLoc,
David Greenee22b3212011-10-19 13:02:42 +00002335 const std::vector<Init *> &TArgs,
David Greenee499a2d2011-10-05 22:42:07 +00002336 std::vector<Init *> &TemplateVals,
2337 bool DeleteArgs) {
2338 // Loop over all of the template arguments, setting them to the specified
2339 // value or leaving them as the default if necessary.
2340 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
2341 // Check if a value is specified for this temp-arg.
2342 if (i < TemplateVals.size()) {
2343 // Set it now.
2344 if (SetValue(CurRec, DefmPrefixLoc, TArgs[i], std::vector<unsigned>(),
2345 TemplateVals[i]))
2346 return true;
2347
2348 // Resolve it next.
2349 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i]));
2350
2351 if (DeleteArgs)
2352 // Now remove it.
2353 CurRec->removeValue(TArgs[i]);
2354
2355 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) {
2356 return Error(SubClassLoc, "value not specified for template argument #"+
David Greenee22b3212011-10-19 13:02:42 +00002357 utostr(i) + " (" + TArgs[i]->getAsUnquotedString()
2358 + ") of multiclassclass '" + MC.Rec.getNameInitAsString()
2359 + "'");
David Greenee499a2d2011-10-05 22:42:07 +00002360 }
2361 }
2362 return false;
2363}
2364
2365bool TGParser::ResolveMulticlassDef(MultiClass &MC,
2366 Record *CurRec,
2367 Record *DefProto,
2368 SMLoc DefmPrefixLoc) {
2369 // If the mdef is inside a 'let' expression, add to each def.
2370 for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
2371 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
2372 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name,
2373 LetStack[i][j].Bits, LetStack[i][j].Value))
2374 return Error(DefmPrefixLoc, "when instantiating this defm");
2375
David Greenee499a2d2011-10-05 22:42:07 +00002376 // Don't create a top level definition for defm inside multiclasses,
2377 // instead, only update the prototypes and bind the template args
2378 // with the new created definition.
2379 if (CurMultiClass) {
2380 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size();
2381 i != e; ++i)
David Greene22dde7e2011-10-19 13:04:02 +00002382 if (CurMultiClass->DefPrototypes[i]->getNameInit()
2383 == CurRec->getNameInit())
2384 return Error(DefmPrefixLoc, "defm '" + CurRec->getNameInitAsString() +
David Greenee499a2d2011-10-05 22:42:07 +00002385 "' already defined in this multiclass!");
2386 CurMultiClass->DefPrototypes.push_back(CurRec);
2387
2388 // Copy the template arguments for the multiclass into the new def.
David Greenee22b3212011-10-19 13:02:42 +00002389 const std::vector<Init *> &TA =
David Greenee499a2d2011-10-05 22:42:07 +00002390 CurMultiClass->Rec.getTemplateArgs();
2391
2392 for (unsigned i = 0, e = TA.size(); i != e; ++i) {
2393 const RecordVal *RV = CurMultiClass->Rec.getValue(TA[i]);
2394 assert(RV && "Template arg doesn't exist?");
2395 CurRec->addValue(*RV);
2396 }
David Greenee499a2d2011-10-05 22:42:07 +00002397 }
2398
2399 return false;
2400}
2401
Chris Lattnerf4601652007-11-22 20:49:04 +00002402/// ParseDefm - Parse the instantiation of a multiclass.
2403///
2404/// DefMInst ::= DEFM ID ':' DefmSubClassRef ';'
2405///
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002406bool TGParser::ParseDefm(MultiClass *CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002407 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!");
Bob Wilson21870412009-11-22 04:24:42 +00002408
David Greenea9e07dd2011-10-19 13:04:29 +00002409 Init *DefmPrefix = 0;
David Greenea9e07dd2011-10-19 13:04:29 +00002410
Chris Lattnerdf72eae2010-10-05 22:51:56 +00002411 if (Lex.Lex() == tgtok::Id) { // eat the defm.
David Greenea9e07dd2011-10-19 13:04:29 +00002412 DefmPrefix = ParseObjectName(CurMultiClass);
Chris Lattnerdf72eae2010-10-05 22:51:56 +00002413 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +00002414
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002415 SMLoc DefmPrefixLoc = Lex.getLoc();
Chris Lattnerdf72eae2010-10-05 22:51:56 +00002416 if (Lex.getCode() != tgtok::colon)
Chris Lattnerf4601652007-11-22 20:49:04 +00002417 return TokError("expected ':' after defm identifier");
Bob Wilson21870412009-11-22 04:24:42 +00002418
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002419 // Keep track of the new generated record definitions.
2420 std::vector<Record*> NewRecDefs;
2421
2422 // This record also inherits from a regular class (non-multiclass)?
2423 bool InheritFromClass = false;
2424
Chris Lattnerf4601652007-11-22 20:49:04 +00002425 // eat the colon.
2426 Lex.Lex();
2427
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002428 SMLoc SubClassLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00002429 SubClassReference Ref = ParseSubClassReference(0, true);
David Greene56546132009-04-22 22:17:51 +00002430
2431 while (1) {
2432 if (Ref.Rec == 0) return true;
2433
2434 // To instantiate a multiclass, we need to first get the multiclass, then
2435 // instantiate each def contained in the multiclass with the SubClassRef
2436 // template parameters.
2437 MultiClass *MC = MultiClasses[Ref.Rec->getName()];
2438 assert(MC && "Didn't lookup multiclass correctly?");
David Greene05bce0b2011-07-29 22:43:06 +00002439 std::vector<Init*> &TemplateVals = Ref.TemplateArgs;
David Greene56546132009-04-22 22:17:51 +00002440
2441 // Verify that the correct number of template arguments were specified.
David Greenee22b3212011-10-19 13:02:42 +00002442 const std::vector<Init *> &TArgs = MC->Rec.getTemplateArgs();
David Greene56546132009-04-22 22:17:51 +00002443 if (TArgs.size() < TemplateVals.size())
2444 return Error(SubClassLoc,
2445 "more template args specified than multiclass expects");
2446
2447 // Loop over all the def's in the multiclass, instantiating each one.
2448 for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) {
2449 Record *DefProto = MC->DefPrototypes[i];
2450
David Greene7be867e2011-10-19 13:04:31 +00002451 Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix, DefmPrefixLoc);
Jim Grosbach94f2dc92011-12-02 18:33:03 +00002452 if (!CurRec)
2453 return true;
David Greene065f2592009-05-05 16:28:25 +00002454
David Greenee499a2d2011-10-05 22:42:07 +00002455 if (ResolveMulticlassDefArgs(*MC, CurRec, DefmPrefixLoc, SubClassLoc,
2456 TArgs, TemplateVals, true/*Delete args*/))
2457 return Error(SubClassLoc, "could not instantiate def");
David Greene56546132009-04-22 22:17:51 +00002458
David Greenee499a2d2011-10-05 22:42:07 +00002459 if (ResolveMulticlassDef(*MC, CurRec, DefProto, DefmPrefixLoc))
2460 return Error(SubClassLoc, "could not instantiate def");
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002461
2462 NewRecDefs.push_back(CurRec);
David Greene56546132009-04-22 22:17:51 +00002463 }
2464
David Greenee499a2d2011-10-05 22:42:07 +00002465
David Greene56546132009-04-22 22:17:51 +00002466 if (Lex.getCode() != tgtok::comma) break;
2467 Lex.Lex(); // eat ','.
2468
2469 SubClassLoc = Lex.getLoc();
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002470
2471 // A defm can inherit from regular classes (non-multiclass) as
2472 // long as they come in the end of the inheritance list.
2473 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != 0);
2474
2475 if (InheritFromClass)
2476 break;
2477
David Greene56546132009-04-22 22:17:51 +00002478 Ref = ParseSubClassReference(0, true);
2479 }
2480
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002481 if (InheritFromClass) {
2482 // Process all the classes to inherit as if they were part of a
2483 // regular 'def' and inherit all record values.
2484 SubClassReference SubClass = ParseSubClassReference(0, false);
2485 while (1) {
2486 // Check for error.
2487 if (SubClass.Rec == 0) return true;
2488
2489 // Get the expanded definition prototypes and teach them about
2490 // the record values the current class to inherit has
2491 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) {
2492 Record *CurRec = NewRecDefs[i];
2493
2494 // Add it.
2495 if (AddSubClass(CurRec, SubClass))
2496 return true;
2497
2498 // Process any variables on the let stack.
2499 for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
2500 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
2501 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name,
2502 LetStack[i][j].Bits, LetStack[i][j].Value))
2503 return true;
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002504 }
2505
2506 if (Lex.getCode() != tgtok::comma) break;
2507 Lex.Lex(); // eat ','.
2508 SubClass = ParseSubClassReference(0, false);
2509 }
2510 }
2511
Bruno Cardoso Lopese5104ac2010-06-22 20:30:50 +00002512 if (!CurMultiClass)
2513 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i)
David Greene0d886402011-08-10 18:27:46 +00002514 // See Record::setName(). This resolve step will see any new
2515 // name for the def that might have been created when resolving
2516 // inheritance, values and arguments above.
Bruno Cardoso Lopese5104ac2010-06-22 20:30:50 +00002517 NewRecDefs[i]->resolveReferences();
2518
Chris Lattnerf4601652007-11-22 20:49:04 +00002519 if (Lex.getCode() != tgtok::semi)
2520 return TokError("expected ';' at end of defm");
2521 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002522
Chris Lattnerf4601652007-11-22 20:49:04 +00002523 return false;
2524}
2525
2526/// ParseObject
2527/// Object ::= ClassInst
2528/// Object ::= DefInst
2529/// Object ::= MultiClassInst
2530/// Object ::= DefMInst
2531/// Object ::= LETCommand '{' ObjectList '}'
2532/// Object ::= LETCommand Object
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002533bool TGParser::ParseObject(MultiClass *MC) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002534 switch (Lex.getCode()) {
Chris Lattnerd6d9dd92010-10-31 19:27:15 +00002535 default:
2536 return TokError("Expected class, def, defm, multiclass or let definition");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002537 case tgtok::Let: return ParseTopLevelLet(MC);
2538 case tgtok::Def: return ParseDef(MC);
David Greenecebb4ee2012-02-22 16:09:41 +00002539 case tgtok::Foreach: return ParseForeach(MC);
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002540 case tgtok::Defm: return ParseDefm(MC);
Chris Lattnerf4601652007-11-22 20:49:04 +00002541 case tgtok::Class: return ParseClass();
2542 case tgtok::MultiClass: return ParseMultiClass();
2543 }
2544}
2545
2546/// ParseObjectList
2547/// ObjectList :== Object*
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002548bool TGParser::ParseObjectList(MultiClass *MC) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002549 while (isObjectStart(Lex.getCode())) {
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002550 if (ParseObject(MC))
Chris Lattnerf4601652007-11-22 20:49:04 +00002551 return true;
2552 }
2553 return false;
2554}
2555
Chris Lattnerf4601652007-11-22 20:49:04 +00002556bool TGParser::ParseFile() {
2557 Lex.Lex(); // Prime the lexer.
2558 if (ParseObjectList()) return true;
Bob Wilson21870412009-11-22 04:24:42 +00002559
Chris Lattnerf4601652007-11-22 20:49:04 +00002560 // If we have unread input at the end of the file, report it.
2561 if (Lex.getCode() == tgtok::Eof)
2562 return false;
Bob Wilson21870412009-11-22 04:24:42 +00002563
Chris Lattnerf4601652007-11-22 20:49:04 +00002564 return TokError("Unexpected input at top level");
2565}
2566