blob: 8ee3a7b4ec7513692131d33bd1e4f801ac28097f [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"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000015#include "llvm/ADT/SmallVector.h"
Chris Lattnerf4601652007-11-22 20:49:04 +000016#include "llvm/ADT/StringExtras.h"
Chandler Carruthd04a8d42012-12-03 16:50:05 +000017#include "llvm/Support/CommandLine.h"
18#include "llvm/TableGen/Record.h"
Daniel Dunbar1a551802009-07-03 00:10:29 +000019#include <algorithm>
20#include <sstream>
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 {
Jordan Roseb50df4a2013-01-10 18:50:11 +000029 SMRange RefRange;
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 {
Jordan Roseb50df4a2013-01-10 18:50:11 +000038 SMRange RefRange;
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())
Sean Silva6cfc8062012-10-10 20:24:43 +000096 if (VarInit *VI = dyn_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()) {
Sean Silva6cfc8062012-10-10 20:24:43 +0000105 BitsInit *CurVal = dyn_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) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000113 return Error(Loc, "Initializer is not compatible with bit range");
114 }
Bob Wilson21870412009-11-22 04:24:42 +0000115
Chris Lattnerf4601652007-11-22 20:49:04 +0000116 // We should have a BitsInit type now.
Sean Silva6cfc8062012-10-10 20:24:43 +0000117 BitsInit *BInit = dyn_cast<BitsInit>(BI);
Chris Lattnerf4601652007-11-22 20:49:04 +0000118 assert(BInit != 0);
119
David Greene05bce0b2011-07-29 22:43:06 +0000120 SmallVector<Init *, 16> NewBits(CurVal->getNumBits());
Chris Lattnerf4601652007-11-22 20:49:04 +0000121
122 // Loop over bits, assigning values as appropriate.
123 for (unsigned i = 0, e = BitList.size(); i != e; ++i) {
124 unsigned Bit = BitList[i];
David Greeneca7fd3d2011-07-29 19:07:00 +0000125 if (NewBits[Bit])
Chris Lattnerf4601652007-11-22 20:49:04 +0000126 return Error(Loc, "Cannot set bit #" + utostr(Bit) + " of value '" +
David Greene917924d2011-10-19 13:02:39 +0000127 ValName->getAsUnquotedString() + "' more than once");
David Greeneca7fd3d2011-07-29 19:07:00 +0000128 NewBits[Bit] = BInit->getBit(i);
Chris Lattnerf4601652007-11-22 20:49:04 +0000129 }
130
131 for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i)
David Greeneca7fd3d2011-07-29 19:07:00 +0000132 if (NewBits[i] == 0)
133 NewBits[i] = CurVal->getBit(i);
Chris Lattnerf4601652007-11-22 20:49:04 +0000134
David Greenedcd35c72011-07-29 19:07:07 +0000135 V = BitsInit::get(NewBits);
Chris Lattnerf4601652007-11-22 20:49:04 +0000136 }
137
138 if (RV->setValue(V))
David Greene917924d2011-10-19 13:02:39 +0000139 return Error(Loc, "Value '" + ValName->getAsUnquotedString() + "' of type '"
140 + RV->getType()->getAsString() +
141 "' is incompatible with initializer '" + V->getAsString()
142 + "'");
Chris Lattnerf4601652007-11-22 20:49:04 +0000143 return false;
144}
145
146/// AddSubClass - Add SubClass as a subclass to CurRec, resolving its template
147/// args as SubClass's template arguments.
Cedric Venetaff9c272009-02-14 16:06:42 +0000148bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000149 Record *SC = SubClass.Rec;
150 // Add all of the values in the subclass into the current class.
151 const std::vector<RecordVal> &Vals = SC->getValues();
152 for (unsigned i = 0, e = Vals.size(); i != e; ++i)
Jordan Roseb50df4a2013-01-10 18:50:11 +0000153 if (AddValue(CurRec, SubClass.RefRange.Start, Vals[i]))
Chris Lattnerf4601652007-11-22 20:49:04 +0000154 return true;
155
David Greenee22b3212011-10-19 13:02:42 +0000156 const std::vector<Init *> &TArgs = SC->getTemplateArgs();
Chris Lattnerf4601652007-11-22 20:49:04 +0000157
158 // Ensure that an appropriate number of template arguments are specified.
159 if (TArgs.size() < SubClass.TemplateArgs.size())
Jordan Roseb50df4a2013-01-10 18:50:11 +0000160 return Error(SubClass.RefRange.Start,
161 "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.
Jordan Roseb50df4a2013-01-10 18:50:11 +0000168 if (SetValue(CurRec, SubClass.RefRange.Start, TArgs[i],
169 std::vector<unsigned>(), SubClass.TemplateArgs[i]))
Chris Lattnerf4601652007-11-22 20:49:04 +0000170 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()) {
Jordan Roseb50df4a2013-01-10 18:50:11 +0000179 return Error(SubClass.RefRange.Start,
180 "Value not specified for template argument #"
David Greenee22b3212011-10-19 13:02:42 +0000181 + utostr(i) + " (" + TArgs[i]->getAsUnquotedString()
182 + ") of subclass '" + SC->getNameInitAsString() + "'!");
Chris Lattnerf4601652007-11-22 20:49:04 +0000183 }
184 }
185
186 // Since everything went well, we can now set the "superclass" list for the
187 // current record.
188 const std::vector<Record*> &SCs = SC->getSuperClasses();
Jordan Roseb50df4a2013-01-10 18:50:11 +0000189 ArrayRef<SMRange> SCRanges = SC->getSuperClassRanges();
Chris Lattnerf4601652007-11-22 20:49:04 +0000190 for (unsigned i = 0, e = SCs.size(); i != e; ++i) {
191 if (CurRec->isSubClassOf(SCs[i]))
Jordan Roseb50df4a2013-01-10 18:50:11 +0000192 return Error(SubClass.RefRange.Start,
Chris Lattnerf4601652007-11-22 20:49:04 +0000193 "Already subclass of '" + SCs[i]->getName() + "'!\n");
Jordan Roseb50df4a2013-01-10 18:50:11 +0000194 CurRec->addSuperClass(SCs[i], SCRanges[i]);
Chris Lattnerf4601652007-11-22 20:49:04 +0000195 }
Bob Wilson21870412009-11-22 04:24:42 +0000196
Chris Lattnerf4601652007-11-22 20:49:04 +0000197 if (CurRec->isSubClassOf(SC))
Jordan Roseb50df4a2013-01-10 18:50:11 +0000198 return Error(SubClass.RefRange.Start,
Chris Lattnerf4601652007-11-22 20:49:04 +0000199 "Already subclass of '" + SC->getName() + "'!\n");
Jordan Roseb50df4a2013-01-10 18:50:11 +0000200 CurRec->addSuperClass(SC, SubClass.RefRange);
Chris Lattnerf4601652007-11-22 20:49:04 +0000201 return false;
202}
203
David Greenede444af2009-04-22 16:42:54 +0000204/// AddSubMultiClass - Add SubMultiClass as a subclass to
Bob Wilson440548d2009-04-30 18:26:19 +0000205/// CurMC, resolving its template args as SubMultiClass's
David Greenede444af2009-04-22 16:42:54 +0000206/// template arguments.
Bob Wilson440548d2009-04-30 18:26:19 +0000207bool TGParser::AddSubMultiClass(MultiClass *CurMC,
Bob Wilson1d512df2009-04-30 17:46:20 +0000208 SubMultiClassReference &SubMultiClass) {
David Greenede444af2009-04-22 16:42:54 +0000209 MultiClass *SMC = SubMultiClass.MC;
Bob Wilson440548d2009-04-30 18:26:19 +0000210 Record *CurRec = &CurMC->Rec;
David Greenede444af2009-04-22 16:42:54 +0000211
Bob Wilson440548d2009-04-30 18:26:19 +0000212 const std::vector<RecordVal> &MCVals = CurRec->getValues();
David Greenede444af2009-04-22 16:42:54 +0000213
214 // Add all of the values in the subclass into the current class.
215 const std::vector<RecordVal> &SMCVals = SMC->Rec.getValues();
216 for (unsigned i = 0, e = SMCVals.size(); i != e; ++i)
Jordan Roseb50df4a2013-01-10 18:50:11 +0000217 if (AddValue(CurRec, SubMultiClass.RefRange.Start, SMCVals[i]))
David Greenede444af2009-04-22 16:42:54 +0000218 return true;
219
Bob Wilson440548d2009-04-30 18:26:19 +0000220 int newDefStart = CurMC->DefPrototypes.size();
David Greened34a73b2009-04-24 16:55:41 +0000221
David Greenede444af2009-04-22 16:42:54 +0000222 // Add all of the defs in the subclass into the current multiclass.
223 for (MultiClass::RecordVector::const_iterator i = SMC->DefPrototypes.begin(),
224 iend = SMC->DefPrototypes.end();
225 i != iend;
226 ++i) {
227 // Clone the def and add it to the current multiclass
228 Record *NewDef = new Record(**i);
229
230 // Add all of the values in the superclass into the current def.
231 for (unsigned i = 0, e = MCVals.size(); i != e; ++i)
Jordan Roseb50df4a2013-01-10 18:50:11 +0000232 if (AddValue(NewDef, SubMultiClass.RefRange.Start, MCVals[i]))
David Greenede444af2009-04-22 16:42:54 +0000233 return true;
234
Bob Wilson440548d2009-04-30 18:26:19 +0000235 CurMC->DefPrototypes.push_back(NewDef);
David Greenede444af2009-04-22 16:42:54 +0000236 }
Bob Wilson32558652009-04-28 19:41:44 +0000237
David Greenee22b3212011-10-19 13:02:42 +0000238 const std::vector<Init *> &SMCTArgs = SMC->Rec.getTemplateArgs();
David Greenede444af2009-04-22 16:42:54 +0000239
David Greened34a73b2009-04-24 16:55:41 +0000240 // Ensure that an appropriate number of template arguments are
241 // specified.
David Greenede444af2009-04-22 16:42:54 +0000242 if (SMCTArgs.size() < SubMultiClass.TemplateArgs.size())
Jordan Roseb50df4a2013-01-10 18:50:11 +0000243 return Error(SubMultiClass.RefRange.Start,
David Greened34a73b2009-04-24 16:55:41 +0000244 "More template args specified than expected");
Bob Wilson32558652009-04-28 19:41:44 +0000245
David Greenede444af2009-04-22 16:42:54 +0000246 // Loop over all of the template arguments, setting them to the specified
247 // value or leaving them as the default if necessary.
248 for (unsigned i = 0, e = SMCTArgs.size(); i != e; ++i) {
249 if (i < SubMultiClass.TemplateArgs.size()) {
David Greened34a73b2009-04-24 16:55:41 +0000250 // If a value is specified for this template arg, set it in the
251 // superclass now.
Jordan Roseb50df4a2013-01-10 18:50:11 +0000252 if (SetValue(CurRec, SubMultiClass.RefRange.Start, SMCTArgs[i],
Bob Wilson32558652009-04-28 19:41:44 +0000253 std::vector<unsigned>(),
David Greenede444af2009-04-22 16:42:54 +0000254 SubMultiClass.TemplateArgs[i]))
255 return true;
256
257 // Resolve it next.
258 CurRec->resolveReferencesTo(CurRec->getValue(SMCTArgs[i]));
Bob Wilson32558652009-04-28 19:41:44 +0000259
David Greenede444af2009-04-22 16:42:54 +0000260 // Now remove it.
261 CurRec->removeValue(SMCTArgs[i]);
262
David Greened34a73b2009-04-24 16:55:41 +0000263 // If a value is specified for this template arg, set it in the
264 // new defs now.
265 for (MultiClass::RecordVector::iterator j =
Bob Wilson440548d2009-04-30 18:26:19 +0000266 CurMC->DefPrototypes.begin() + newDefStart,
267 jend = CurMC->DefPrototypes.end();
David Greenede444af2009-04-22 16:42:54 +0000268 j != jend;
269 ++j) {
270 Record *Def = *j;
271
Jordan Roseb50df4a2013-01-10 18:50:11 +0000272 if (SetValue(Def, SubMultiClass.RefRange.Start, SMCTArgs[i],
Bob Wilson32558652009-04-28 19:41:44 +0000273 std::vector<unsigned>(),
David Greenede444af2009-04-22 16:42:54 +0000274 SubMultiClass.TemplateArgs[i]))
275 return true;
276
277 // Resolve it next.
278 Def->resolveReferencesTo(Def->getValue(SMCTArgs[i]));
279
280 // Now remove it
281 Def->removeValue(SMCTArgs[i]);
282 }
283 } else if (!CurRec->getValue(SMCTArgs[i])->getValue()->isComplete()) {
Jordan Roseb50df4a2013-01-10 18:50:11 +0000284 return Error(SubMultiClass.RefRange.Start,
David Greened34a73b2009-04-24 16:55:41 +0000285 "Value not specified for template argument #"
David Greenee22b3212011-10-19 13:02:42 +0000286 + utostr(i) + " (" + SMCTArgs[i]->getAsUnquotedString()
287 + ") of subclass '" + SMC->Rec.getNameInitAsString() + "'!");
David Greenede444af2009-04-22 16:42:54 +0000288 }
289 }
290
291 return false;
292}
293
David Greenecebb4ee2012-02-22 16:09:41 +0000294/// ProcessForeachDefs - Given a record, apply all of the variable
295/// values in all surrounding foreach loops, creating new records for
296/// each combination of values.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000297bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc) {
298 if (Loops.empty())
299 return false;
300
David Greenecebb4ee2012-02-22 16:09:41 +0000301 // We want to instantiate a new copy of CurRec for each combination
302 // of nested loop iterator values. We don't want top instantiate
303 // any copies until we have values for each loop iterator.
304 IterSet IterVals;
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000305 return ProcessForeachDefs(CurRec, Loc, IterVals);
David Greenecebb4ee2012-02-22 16:09:41 +0000306}
307
308/// ProcessForeachDefs - Given a record, a loop and a loop iterator,
309/// apply each of the variable values in this loop and then process
310/// subloops.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000311bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){
312 // Recursively build a tuple of iterator values.
313 if (IterVals.size() != Loops.size()) {
314 assert(IterVals.size() < Loops.size());
315 ForeachLoop &CurLoop = Loops[IterVals.size()];
Sean Silva6cfc8062012-10-10 20:24:43 +0000316 ListInit *List = dyn_cast<ListInit>(CurLoop.ListValue);
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000317 if (List == 0) {
318 Error(Loc, "Loop list is not a list");
319 return true;
320 }
David Greenecebb4ee2012-02-22 16:09:41 +0000321
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000322 // Process each value.
323 for (int64_t i = 0; i < List->getSize(); ++i) {
324 Init *ItemVal = List->resolveListElementReference(*CurRec, 0, i);
325 IterVals.push_back(IterRecord(CurLoop.IterVar, ItemVal));
326 if (ProcessForeachDefs(CurRec, Loc, IterVals))
327 return true;
328 IterVals.pop_back();
329 }
330 return false;
331 }
332
333 // This is the bottom of the recursion. We have all of the iterator values
334 // for this point in the iteration space. Instantiate a new record to
335 // reflect this combination of values.
336 Record *IterRec = new Record(*CurRec);
337
338 // Set the iterator values now.
339 for (unsigned i = 0, e = IterVals.size(); i != e; ++i) {
340 VarInit *IterVar = IterVals[i].IterVar;
Sean Silva6cfc8062012-10-10 20:24:43 +0000341 TypedInit *IVal = dyn_cast<TypedInit>(IterVals[i].IterValue);
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000342 if (IVal == 0) {
343 Error(Loc, "foreach iterator value is untyped");
344 return true;
345 }
346
347 IterRec->addValue(RecordVal(IterVar->getName(), IVal->getType(), false));
348
349 if (SetValue(IterRec, Loc, IterVar->getName(),
350 std::vector<unsigned>(), IVal)) {
351 Error(Loc, "when instantiating this def");
352 return true;
353 }
354
355 // Resolve it next.
356 IterRec->resolveReferencesTo(IterRec->getValue(IterVar->getName()));
357
358 // Remove it.
359 IterRec->removeValue(IterVar->getName());
360 }
361
362 if (Records.getDef(IterRec->getNameInitAsString())) {
363 Error(Loc, "def already exists: " + IterRec->getNameInitAsString());
David Greenecebb4ee2012-02-22 16:09:41 +0000364 return true;
365 }
366
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +0000367 Records.addDef(IterRec);
368 IterRec->resolveReferences();
David Greenecebb4ee2012-02-22 16:09:41 +0000369 return false;
370}
371
Chris Lattnerf4601652007-11-22 20:49:04 +0000372//===----------------------------------------------------------------------===//
373// Parser Code
374//===----------------------------------------------------------------------===//
375
376/// isObjectStart - Return true if this is a valid first token for an Object.
377static bool isObjectStart(tgtok::TokKind K) {
378 return K == tgtok::Class || K == tgtok::Def ||
David Greenecebb4ee2012-02-22 16:09:41 +0000379 K == tgtok::Defm || K == tgtok::Let ||
380 K == tgtok::MultiClass || K == tgtok::Foreach;
Chris Lattnerf4601652007-11-22 20:49:04 +0000381}
382
Chris Lattnerdf72eae2010-10-05 22:51:56 +0000383static std::string GetNewAnonymousName() {
384 static unsigned AnonCounter = 0;
385 return "anonymous."+utostr(AnonCounter++);
386}
387
Chris Lattnerf4601652007-11-22 20:49:04 +0000388/// ParseObjectName - If an object name is specified, return it. Otherwise,
Jordan Rosed1220092013-01-10 18:50:05 +0000389/// return 0.
David Greenea9e07dd2011-10-19 13:04:29 +0000390/// ObjectName ::= Value [ '#' Value ]*
Chris Lattnerf4601652007-11-22 20:49:04 +0000391/// ObjectName ::= /*empty*/
392///
David Greenea9e07dd2011-10-19 13:04:29 +0000393Init *TGParser::ParseObjectName(MultiClass *CurMultiClass) {
394 switch (Lex.getCode()) {
395 case tgtok::colon:
396 case tgtok::semi:
397 case tgtok::l_brace:
398 // These are all of the tokens that can begin an object body.
399 // Some of these can also begin values but we disallow those cases
400 // because they are unlikely to be useful.
Jordan Rosed1220092013-01-10 18:50:05 +0000401 return 0;
David Greenea9e07dd2011-10-19 13:04:29 +0000402 default:
403 break;
404 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000405
David Greenea9e07dd2011-10-19 13:04:29 +0000406 Record *CurRec = 0;
407 if (CurMultiClass)
408 CurRec = &CurMultiClass->Rec;
409
410 RecTy *Type = 0;
411 if (CurRec) {
Sean Silva3f7b7f82012-10-10 20:24:47 +0000412 const TypedInit *CurRecName = dyn_cast<TypedInit>(CurRec->getNameInit());
David Greenea9e07dd2011-10-19 13:04:29 +0000413 if (!CurRecName) {
414 TokError("Record name is not typed!");
415 return 0;
416 }
417 Type = CurRecName->getType();
418 }
419
420 return ParseValue(CurRec, Type, ParseNameMode);
Chris Lattnerf4601652007-11-22 20:49:04 +0000421}
422
Chris Lattnerf4601652007-11-22 20:49:04 +0000423/// ParseClassID - Parse and resolve a reference to a class name. This returns
424/// null on error.
425///
426/// ClassID ::= ID
427///
428Record *TGParser::ParseClassID() {
429 if (Lex.getCode() != tgtok::Id) {
430 TokError("expected name for ClassID");
431 return 0;
432 }
Bob Wilson21870412009-11-22 04:24:42 +0000433
Chris Lattnerf4601652007-11-22 20:49:04 +0000434 Record *Result = Records.getClass(Lex.getCurStrVal());
435 if (Result == 0)
436 TokError("Couldn't find class '" + Lex.getCurStrVal() + "'");
Bob Wilson21870412009-11-22 04:24:42 +0000437
Chris Lattnerf4601652007-11-22 20:49:04 +0000438 Lex.Lex();
439 return Result;
440}
441
Bob Wilson32558652009-04-28 19:41:44 +0000442/// ParseMultiClassID - Parse and resolve a reference to a multiclass name.
443/// This returns null on error.
David Greenede444af2009-04-22 16:42:54 +0000444///
445/// MultiClassID ::= ID
446///
447MultiClass *TGParser::ParseMultiClassID() {
448 if (Lex.getCode() != tgtok::Id) {
Sean Silva36febfd2013-01-09 02:11:57 +0000449 TokError("expected name for MultiClassID");
David Greenede444af2009-04-22 16:42:54 +0000450 return 0;
451 }
Bob Wilson32558652009-04-28 19:41:44 +0000452
David Greenede444af2009-04-22 16:42:54 +0000453 MultiClass *Result = MultiClasses[Lex.getCurStrVal()];
454 if (Result == 0)
Sean Silva36febfd2013-01-09 02:11:57 +0000455 TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'");
Bob Wilson32558652009-04-28 19:41:44 +0000456
David Greenede444af2009-04-22 16:42:54 +0000457 Lex.Lex();
458 return Result;
459}
460
Chris Lattnerf4601652007-11-22 20:49:04 +0000461/// ParseSubClassReference - Parse a reference to a subclass or to a templated
462/// subclass. This returns a SubClassRefTy with a null Record* on error.
463///
464/// SubClassRef ::= ClassID
465/// SubClassRef ::= ClassID '<' ValueList '>'
466///
467SubClassReference TGParser::
468ParseSubClassReference(Record *CurRec, bool isDefm) {
469 SubClassReference Result;
Jordan Roseb50df4a2013-01-10 18:50:11 +0000470 Result.RefRange.Start = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +0000471
Sean Silva7be90212013-01-09 02:17:14 +0000472 if (isDefm) {
473 if (MultiClass *MC = ParseMultiClassID())
474 Result.Rec = &MC->Rec;
475 } else {
Chris Lattnerf4601652007-11-22 20:49:04 +0000476 Result.Rec = ParseClassID();
Sean Silva7be90212013-01-09 02:17:14 +0000477 }
Chris Lattnerf4601652007-11-22 20:49:04 +0000478 if (Result.Rec == 0) return Result;
Bob Wilson21870412009-11-22 04:24:42 +0000479
Chris Lattnerf4601652007-11-22 20:49:04 +0000480 // If there is no template arg list, we're done.
Jordan Roseb50df4a2013-01-10 18:50:11 +0000481 if (Lex.getCode() != tgtok::less) {
482 Result.RefRange.End = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000483 return Result;
Jordan Roseb50df4a2013-01-10 18:50:11 +0000484 }
Chris Lattnerf4601652007-11-22 20:49:04 +0000485 Lex.Lex(); // Eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +0000486
Chris Lattnerf4601652007-11-22 20:49:04 +0000487 if (Lex.getCode() == tgtok::greater) {
488 TokError("subclass reference requires a non-empty list of template values");
489 Result.Rec = 0;
490 return Result;
491 }
Bob Wilson21870412009-11-22 04:24:42 +0000492
David Greenee1b46912009-06-08 20:23:18 +0000493 Result.TemplateArgs = ParseValueList(CurRec, Result.Rec);
Chris Lattnerf4601652007-11-22 20:49:04 +0000494 if (Result.TemplateArgs.empty()) {
495 Result.Rec = 0; // Error parsing value list.
496 return Result;
497 }
Bob Wilson21870412009-11-22 04:24:42 +0000498
Chris Lattnerf4601652007-11-22 20:49:04 +0000499 if (Lex.getCode() != tgtok::greater) {
500 TokError("expected '>' in template value list");
501 Result.Rec = 0;
502 return Result;
503 }
504 Lex.Lex();
Jordan Roseb50df4a2013-01-10 18:50:11 +0000505 Result.RefRange.End = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +0000506
Chris Lattnerf4601652007-11-22 20:49:04 +0000507 return Result;
508}
509
Bob Wilson32558652009-04-28 19:41:44 +0000510/// ParseSubMultiClassReference - Parse a reference to a subclass or to a
511/// templated submulticlass. This returns a SubMultiClassRefTy with a null
512/// Record* on error.
David Greenede444af2009-04-22 16:42:54 +0000513///
514/// SubMultiClassRef ::= MultiClassID
515/// SubMultiClassRef ::= MultiClassID '<' ValueList '>'
516///
517SubMultiClassReference TGParser::
518ParseSubMultiClassReference(MultiClass *CurMC) {
519 SubMultiClassReference Result;
Jordan Roseb50df4a2013-01-10 18:50:11 +0000520 Result.RefRange.Start = Lex.getLoc();
Bob Wilson32558652009-04-28 19:41:44 +0000521
David Greenede444af2009-04-22 16:42:54 +0000522 Result.MC = ParseMultiClassID();
523 if (Result.MC == 0) return Result;
Bob Wilson32558652009-04-28 19:41:44 +0000524
David Greenede444af2009-04-22 16:42:54 +0000525 // If there is no template arg list, we're done.
Jordan Roseb50df4a2013-01-10 18:50:11 +0000526 if (Lex.getCode() != tgtok::less) {
527 Result.RefRange.End = Lex.getLoc();
David Greenede444af2009-04-22 16:42:54 +0000528 return Result;
Jordan Roseb50df4a2013-01-10 18:50:11 +0000529 }
David Greenede444af2009-04-22 16:42:54 +0000530 Lex.Lex(); // Eat the '<'
Bob Wilson32558652009-04-28 19:41:44 +0000531
David Greenede444af2009-04-22 16:42:54 +0000532 if (Lex.getCode() == tgtok::greater) {
533 TokError("subclass reference requires a non-empty list of template values");
534 Result.MC = 0;
535 return Result;
536 }
Bob Wilson32558652009-04-28 19:41:44 +0000537
David Greenee1b46912009-06-08 20:23:18 +0000538 Result.TemplateArgs = ParseValueList(&CurMC->Rec, &Result.MC->Rec);
David Greenede444af2009-04-22 16:42:54 +0000539 if (Result.TemplateArgs.empty()) {
540 Result.MC = 0; // Error parsing value list.
541 return Result;
542 }
Bob Wilson32558652009-04-28 19:41:44 +0000543
David Greenede444af2009-04-22 16:42:54 +0000544 if (Lex.getCode() != tgtok::greater) {
545 TokError("expected '>' in template value list");
546 Result.MC = 0;
547 return Result;
548 }
549 Lex.Lex();
Jordan Roseb50df4a2013-01-10 18:50:11 +0000550 Result.RefRange.End = Lex.getLoc();
David Greenede444af2009-04-22 16:42:54 +0000551
552 return Result;
553}
554
Chris Lattnerf4601652007-11-22 20:49:04 +0000555/// ParseRangePiece - Parse a bit/value range.
556/// RangePiece ::= INTVAL
557/// RangePiece ::= INTVAL '-' INTVAL
558/// RangePiece ::= INTVAL INTVAL
559bool TGParser::ParseRangePiece(std::vector<unsigned> &Ranges) {
Chris Lattner811281e2008-01-10 07:01:53 +0000560 if (Lex.getCode() != tgtok::IntVal) {
561 TokError("expected integer or bitrange");
562 return true;
563 }
Dan Gohman63f97202008-10-17 01:33:43 +0000564 int64_t Start = Lex.getCurIntVal();
565 int64_t End;
Bob Wilson21870412009-11-22 04:24:42 +0000566
Chris Lattnerf4601652007-11-22 20:49:04 +0000567 if (Start < 0)
568 return TokError("invalid range, cannot be negative");
Bob Wilson21870412009-11-22 04:24:42 +0000569
Chris Lattnerf4601652007-11-22 20:49:04 +0000570 switch (Lex.Lex()) { // eat first character.
Bob Wilson21870412009-11-22 04:24:42 +0000571 default:
Chris Lattnerf4601652007-11-22 20:49:04 +0000572 Ranges.push_back(Start);
573 return false;
574 case tgtok::minus:
575 if (Lex.Lex() != tgtok::IntVal) {
576 TokError("expected integer value as end of range");
577 return true;
578 }
579 End = Lex.getCurIntVal();
580 break;
581 case tgtok::IntVal:
582 End = -Lex.getCurIntVal();
583 break;
584 }
Bob Wilson21870412009-11-22 04:24:42 +0000585 if (End < 0)
Chris Lattnerf4601652007-11-22 20:49:04 +0000586 return TokError("invalid range, cannot be negative");
587 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +0000588
Chris Lattnerf4601652007-11-22 20:49:04 +0000589 // Add to the range.
590 if (Start < End) {
591 for (; Start <= End; ++Start)
592 Ranges.push_back(Start);
593 } else {
594 for (; Start >= End; --Start)
595 Ranges.push_back(Start);
596 }
597 return false;
598}
599
600/// ParseRangeList - Parse a list of scalars and ranges into scalar values.
601///
602/// RangeList ::= RangePiece (',' RangePiece)*
603///
604std::vector<unsigned> TGParser::ParseRangeList() {
605 std::vector<unsigned> Result;
Bob Wilson21870412009-11-22 04:24:42 +0000606
Chris Lattnerf4601652007-11-22 20:49:04 +0000607 // Parse the first piece.
608 if (ParseRangePiece(Result))
609 return std::vector<unsigned>();
610 while (Lex.getCode() == tgtok::comma) {
611 Lex.Lex(); // Eat the comma.
612
613 // Parse the next range piece.
614 if (ParseRangePiece(Result))
615 return std::vector<unsigned>();
616 }
617 return Result;
618}
619
620/// ParseOptionalRangeList - Parse either a range list in <>'s or nothing.
621/// OptionalRangeList ::= '<' RangeList '>'
622/// OptionalRangeList ::= /*empty*/
623bool TGParser::ParseOptionalRangeList(std::vector<unsigned> &Ranges) {
624 if (Lex.getCode() != tgtok::less)
625 return false;
Bob Wilson21870412009-11-22 04:24:42 +0000626
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000627 SMLoc StartLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000628 Lex.Lex(); // eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +0000629
Chris Lattnerf4601652007-11-22 20:49:04 +0000630 // Parse the range list.
631 Ranges = ParseRangeList();
632 if (Ranges.empty()) return true;
Bob Wilson21870412009-11-22 04:24:42 +0000633
Chris Lattnerf4601652007-11-22 20:49:04 +0000634 if (Lex.getCode() != tgtok::greater) {
635 TokError("expected '>' at end of range list");
636 return Error(StartLoc, "to match this '<'");
637 }
638 Lex.Lex(); // eat the '>'.
639 return false;
640}
641
642/// ParseOptionalBitList - Parse either a bit list in {}'s or nothing.
643/// OptionalBitList ::= '{' RangeList '}'
644/// OptionalBitList ::= /*empty*/
645bool TGParser::ParseOptionalBitList(std::vector<unsigned> &Ranges) {
646 if (Lex.getCode() != tgtok::l_brace)
647 return false;
Bob Wilson21870412009-11-22 04:24:42 +0000648
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000649 SMLoc StartLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000650 Lex.Lex(); // eat the '{'
Bob Wilson21870412009-11-22 04:24:42 +0000651
Chris Lattnerf4601652007-11-22 20:49:04 +0000652 // Parse the range list.
653 Ranges = ParseRangeList();
654 if (Ranges.empty()) return true;
Bob Wilson21870412009-11-22 04:24:42 +0000655
Chris Lattnerf4601652007-11-22 20:49:04 +0000656 if (Lex.getCode() != tgtok::r_brace) {
657 TokError("expected '}' at end of bit list");
658 return Error(StartLoc, "to match this '{'");
659 }
660 Lex.Lex(); // eat the '}'.
661 return false;
662}
663
664
665/// ParseType - Parse and return a tblgen type. This returns null on error.
666///
667/// Type ::= STRING // string type
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +0000668/// Type ::= CODE // code type
Chris Lattnerf4601652007-11-22 20:49:04 +0000669/// Type ::= BIT // bit type
670/// Type ::= BITS '<' INTVAL '>' // bits<x> type
671/// Type ::= INT // int type
672/// Type ::= LIST '<' Type '>' // list<x> type
Chris Lattnerf4601652007-11-22 20:49:04 +0000673/// Type ::= DAG // dag type
674/// Type ::= ClassID // Record Type
675///
676RecTy *TGParser::ParseType() {
677 switch (Lex.getCode()) {
678 default: TokError("Unknown token when expecting a type"); return 0;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000679 case tgtok::String: Lex.Lex(); return StringRecTy::get();
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +0000680 case tgtok::Code: Lex.Lex(); return StringRecTy::get();
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000681 case tgtok::Bit: Lex.Lex(); return BitRecTy::get();
682 case tgtok::Int: Lex.Lex(); return IntRecTy::get();
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000683 case tgtok::Dag: Lex.Lex(); return DagRecTy::get();
Chris Lattnerf4601652007-11-22 20:49:04 +0000684 case tgtok::Id:
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000685 if (Record *R = ParseClassID()) return RecordRecTy::get(R);
Chris Lattnerf4601652007-11-22 20:49:04 +0000686 return 0;
687 case tgtok::Bits: {
688 if (Lex.Lex() != tgtok::less) { // Eat 'bits'
689 TokError("expected '<' after bits type");
690 return 0;
691 }
692 if (Lex.Lex() != tgtok::IntVal) { // Eat '<'
693 TokError("expected integer in bits<n> type");
694 return 0;
695 }
Dan Gohman63f97202008-10-17 01:33:43 +0000696 uint64_t Val = Lex.getCurIntVal();
Chris Lattnerf4601652007-11-22 20:49:04 +0000697 if (Lex.Lex() != tgtok::greater) { // Eat count.
698 TokError("expected '>' at end of bits<n> type");
699 return 0;
700 }
701 Lex.Lex(); // Eat '>'
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000702 return BitsRecTy::get(Val);
Chris Lattnerf4601652007-11-22 20:49:04 +0000703 }
704 case tgtok::List: {
705 if (Lex.Lex() != tgtok::less) { // Eat 'bits'
706 TokError("expected '<' after list type");
707 return 0;
708 }
709 Lex.Lex(); // Eat '<'
710 RecTy *SubType = ParseType();
711 if (SubType == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +0000712
Chris Lattnerf4601652007-11-22 20:49:04 +0000713 if (Lex.getCode() != tgtok::greater) {
714 TokError("expected '>' at end of list<ty> type");
715 return 0;
716 }
717 Lex.Lex(); // Eat '>'
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000718 return ListRecTy::get(SubType);
Chris Lattnerf4601652007-11-22 20:49:04 +0000719 }
Bob Wilson21870412009-11-22 04:24:42 +0000720 }
Chris Lattnerf4601652007-11-22 20:49:04 +0000721}
722
723/// ParseIDValue - Parse an ID as a value and decode what it means.
724///
725/// IDValue ::= ID [def local value]
726/// IDValue ::= ID [def template arg]
727/// IDValue ::= ID [multiclass local value]
728/// IDValue ::= ID [multiclass template argument]
729/// IDValue ::= ID [def name]
730///
David Greenef3744a02011-10-19 13:04:20 +0000731Init *TGParser::ParseIDValue(Record *CurRec, IDParseMode Mode) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000732 assert(Lex.getCode() == tgtok::Id && "Expected ID in ParseIDValue");
733 std::string Name = Lex.getCurStrVal();
Chris Lattner1e3a8a42009-06-21 03:39:35 +0000734 SMLoc Loc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +0000735 Lex.Lex();
736 return ParseIDValue(CurRec, Name, Loc);
737}
738
739/// ParseIDValue - This is just like ParseIDValue above, but it assumes the ID
740/// has already been read.
David Greene05bce0b2011-07-29 22:43:06 +0000741Init *TGParser::ParseIDValue(Record *CurRec,
David Greenef3744a02011-10-19 13:04:20 +0000742 const std::string &Name, SMLoc NameLoc,
743 IDParseMode Mode) {
Chris Lattnerf4601652007-11-22 20:49:04 +0000744 if (CurRec) {
745 if (const RecordVal *RV = CurRec->getValue(Name))
David Greenedcd35c72011-07-29 19:07:07 +0000746 return VarInit::get(Name, RV->getType());
Bob Wilson21870412009-11-22 04:24:42 +0000747
David Greenee22b3212011-10-19 13:02:42 +0000748 Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, ":");
749
David Greenecaa25c82011-10-05 22:42:54 +0000750 if (CurMultiClass)
David Greenee22b3212011-10-19 13:02:42 +0000751 TemplateArgName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name,
752 "::");
David Greenecaa25c82011-10-05 22:42:54 +0000753
Chris Lattnerf4601652007-11-22 20:49:04 +0000754 if (CurRec->isTemplateArg(TemplateArgName)) {
755 const RecordVal *RV = CurRec->getValue(TemplateArgName);
756 assert(RV && "Template arg doesn't exist??");
David Greenedcd35c72011-07-29 19:07:07 +0000757 return VarInit::get(TemplateArgName, RV->getType());
Chris Lattnerf4601652007-11-22 20:49:04 +0000758 }
759 }
Bob Wilson21870412009-11-22 04:24:42 +0000760
Chris Lattnerf4601652007-11-22 20:49:04 +0000761 if (CurMultiClass) {
David Greenee22b3212011-10-19 13:02:42 +0000762 Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name,
763 "::");
764
Chris Lattnerf4601652007-11-22 20:49:04 +0000765 if (CurMultiClass->Rec.isTemplateArg(MCName)) {
766 const RecordVal *RV = CurMultiClass->Rec.getValue(MCName);
767 assert(RV && "Template arg doesn't exist??");
David Greenedcd35c72011-07-29 19:07:07 +0000768 return VarInit::get(MCName, RV->getType());
Chris Lattnerf4601652007-11-22 20:49:04 +0000769 }
770 }
Bob Wilson21870412009-11-22 04:24:42 +0000771
David Greenecebb4ee2012-02-22 16:09:41 +0000772 // If this is in a foreach loop, make sure it's not a loop iterator
773 for (LoopVector::iterator i = Loops.begin(), iend = Loops.end();
774 i != iend;
775 ++i) {
Sean Silva6cfc8062012-10-10 20:24:43 +0000776 VarInit *IterVar = dyn_cast<VarInit>(i->IterVar);
David Greenecebb4ee2012-02-22 16:09:41 +0000777 if (IterVar && IterVar->getName() == Name)
778 return IterVar;
779 }
780
David Greenebbec2792011-10-19 13:04:21 +0000781 if (Mode == ParseNameMode)
782 return StringInit::get(Name);
783
Chris Lattnerf4601652007-11-22 20:49:04 +0000784 if (Record *D = Records.getDef(Name))
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000785 return DefInit::get(D);
Chris Lattnerf4601652007-11-22 20:49:04 +0000786
David Greenebbec2792011-10-19 13:04:21 +0000787 if (Mode == ParseValueMode) {
788 Error(NameLoc, "Variable not defined: '" + Name + "'");
789 return 0;
790 }
791
792 return StringInit::get(Name);
Chris Lattnerf4601652007-11-22 20:49:04 +0000793}
794
David Greened418c1b2009-05-14 20:54:48 +0000795/// ParseOperation - Parse an operator. This returns null on error.
796///
797/// Operation ::= XOperator ['<' Type '>'] '(' Args ')'
798///
David Greene05bce0b2011-07-29 22:43:06 +0000799Init *TGParser::ParseOperation(Record *CurRec) {
David Greened418c1b2009-05-14 20:54:48 +0000800 switch (Lex.getCode()) {
801 default:
802 TokError("unknown operation");
803 return 0;
David Greene1434f662011-01-07 17:05:37 +0000804 case tgtok::XHead:
805 case tgtok::XTail:
806 case tgtok::XEmpty:
David Greenee6c27de2009-05-14 21:22:49 +0000807 case tgtok::XCast: { // Value ::= !unop '(' Value ')'
808 UnOpInit::UnaryOp Code;
809 RecTy *Type = 0;
David Greened418c1b2009-05-14 20:54:48 +0000810
David Greenee6c27de2009-05-14 21:22:49 +0000811 switch (Lex.getCode()) {
Craig Topper85814382012-02-07 05:05:23 +0000812 default: llvm_unreachable("Unhandled code!");
David Greenee6c27de2009-05-14 21:22:49 +0000813 case tgtok::XCast:
814 Lex.Lex(); // eat the operation
815 Code = UnOpInit::CAST;
David Greened418c1b2009-05-14 20:54:48 +0000816
David Greenee6c27de2009-05-14 21:22:49 +0000817 Type = ParseOperatorType();
David Greened418c1b2009-05-14 20:54:48 +0000818
David Greenee6c27de2009-05-14 21:22:49 +0000819 if (Type == 0) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000820 TokError("did not get type for unary operator");
David Greenee6c27de2009-05-14 21:22:49 +0000821 return 0;
822 }
David Greened418c1b2009-05-14 20:54:48 +0000823
David Greenee6c27de2009-05-14 21:22:49 +0000824 break;
David Greene1434f662011-01-07 17:05:37 +0000825 case tgtok::XHead:
David Greene5f9f9ba2009-05-14 22:38:31 +0000826 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000827 Code = UnOpInit::HEAD;
David Greene5f9f9ba2009-05-14 22:38:31 +0000828 break;
David Greene1434f662011-01-07 17:05:37 +0000829 case tgtok::XTail:
David Greene5f9f9ba2009-05-14 22:38:31 +0000830 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000831 Code = UnOpInit::TAIL;
David Greene5f9f9ba2009-05-14 22:38:31 +0000832 break;
David Greene1434f662011-01-07 17:05:37 +0000833 case tgtok::XEmpty:
David Greene5f9f9ba2009-05-14 22:38:31 +0000834 Lex.Lex(); // eat the operation
David Greene1434f662011-01-07 17:05:37 +0000835 Code = UnOpInit::EMPTY;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000836 Type = IntRecTy::get();
David Greene5f9f9ba2009-05-14 22:38:31 +0000837 break;
David Greenee6c27de2009-05-14 21:22:49 +0000838 }
839 if (Lex.getCode() != tgtok::l_paren) {
840 TokError("expected '(' after unary operator");
841 return 0;
842 }
843 Lex.Lex(); // eat the '('
David Greened418c1b2009-05-14 20:54:48 +0000844
David Greene05bce0b2011-07-29 22:43:06 +0000845 Init *LHS = ParseValue(CurRec);
David Greenee6c27de2009-05-14 21:22:49 +0000846 if (LHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000847
David Greene1434f662011-01-07 17:05:37 +0000848 if (Code == UnOpInit::HEAD
849 || Code == UnOpInit::TAIL
850 || Code == UnOpInit::EMPTY) {
Sean Silva6cfc8062012-10-10 20:24:43 +0000851 ListInit *LHSl = dyn_cast<ListInit>(LHS);
852 StringInit *LHSs = dyn_cast<StringInit>(LHS);
853 TypedInit *LHSt = dyn_cast<TypedInit>(LHS);
David Greenee1b46912009-06-08 20:23:18 +0000854 if (LHSl == 0 && LHSs == 0 && LHSt == 0) {
855 TokError("expected list or string type argument in unary operator");
David Greene5f9f9ba2009-05-14 22:38:31 +0000856 return 0;
857 }
858 if (LHSt) {
Sean Silva736ceac2012-10-05 03:31:58 +0000859 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType());
860 StringRecTy *SType = dyn_cast<StringRecTy>(LHSt->getType());
David Greenee1b46912009-06-08 20:23:18 +0000861 if (LType == 0 && SType == 0) {
862 TokError("expected list or string type argumnet in unary operator");
David Greene5f9f9ba2009-05-14 22:38:31 +0000863 return 0;
864 }
865 }
866
David Greene1434f662011-01-07 17:05:37 +0000867 if (Code == UnOpInit::HEAD
868 || Code == UnOpInit::TAIL) {
David Greenee1b46912009-06-08 20:23:18 +0000869 if (LHSl == 0 && LHSt == 0) {
870 TokError("expected list type argumnet in unary operator");
871 return 0;
872 }
Bob Wilson21870412009-11-22 04:24:42 +0000873
David Greene5f9f9ba2009-05-14 22:38:31 +0000874 if (LHSl && LHSl->getSize() == 0) {
875 TokError("empty list argument in unary operator");
876 return 0;
877 }
878 if (LHSl) {
David Greene05bce0b2011-07-29 22:43:06 +0000879 Init *Item = LHSl->getElement(0);
Sean Silva6cfc8062012-10-10 20:24:43 +0000880 TypedInit *Itemt = dyn_cast<TypedInit>(Item);
David Greene5f9f9ba2009-05-14 22:38:31 +0000881 if (Itemt == 0) {
882 TokError("untyped list element in unary operator");
883 return 0;
884 }
David Greene1434f662011-01-07 17:05:37 +0000885 if (Code == UnOpInit::HEAD) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000886 Type = Itemt->getType();
Bob Wilson21870412009-11-22 04:24:42 +0000887 } else {
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000888 Type = ListRecTy::get(Itemt->getType());
David Greene5f9f9ba2009-05-14 22:38:31 +0000889 }
Bob Wilson21870412009-11-22 04:24:42 +0000890 } else {
David Greene5f9f9ba2009-05-14 22:38:31 +0000891 assert(LHSt && "expected list type argument in unary operator");
Sean Silva736ceac2012-10-05 03:31:58 +0000892 ListRecTy *LType = dyn_cast<ListRecTy>(LHSt->getType());
David Greene5f9f9ba2009-05-14 22:38:31 +0000893 if (LType == 0) {
894 TokError("expected list type argumnet in unary operator");
895 return 0;
896 }
David Greene1434f662011-01-07 17:05:37 +0000897 if (Code == UnOpInit::HEAD) {
David Greene5f9f9ba2009-05-14 22:38:31 +0000898 Type = LType->getElementType();
Bob Wilson21870412009-11-22 04:24:42 +0000899 } else {
David Greene5f9f9ba2009-05-14 22:38:31 +0000900 Type = LType;
901 }
902 }
903 }
904 }
905
David Greenee6c27de2009-05-14 21:22:49 +0000906 if (Lex.getCode() != tgtok::r_paren) {
907 TokError("expected ')' in unary operator");
908 return 0;
909 }
910 Lex.Lex(); // eat the ')'
David Greenedcd35c72011-07-29 19:07:07 +0000911 return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec, CurMultiClass);
David Greenee6c27de2009-05-14 21:22:49 +0000912 }
David Greened418c1b2009-05-14 20:54:48 +0000913
914 case tgtok::XConcat:
Bob Wilson21870412009-11-22 04:24:42 +0000915 case tgtok::XSRA:
David Greened418c1b2009-05-14 20:54:48 +0000916 case tgtok::XSRL:
917 case tgtok::XSHL:
David Greene6786d5e2010-01-05 19:11:42 +0000918 case tgtok::XEq:
Chris Lattnerc7252ce2010-10-06 00:19:21 +0000919 case tgtok::XStrConcat: { // Value ::= !binop '(' Value ',' Value ')'
Chris Lattner8d978a72010-10-05 23:58:18 +0000920 tgtok::TokKind OpTok = Lex.getCode();
921 SMLoc OpLoc = Lex.getLoc();
922 Lex.Lex(); // eat the operation
923
David Greened418c1b2009-05-14 20:54:48 +0000924 BinOpInit::BinaryOp Code;
925 RecTy *Type = 0;
926
Chris Lattner8d978a72010-10-05 23:58:18 +0000927 switch (OpTok) {
Craig Topper85814382012-02-07 05:05:23 +0000928 default: llvm_unreachable("Unhandled code!");
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000929 case tgtok::XConcat: Code = BinOpInit::CONCAT;Type = DagRecTy::get(); break;
930 case tgtok::XSRA: Code = BinOpInit::SRA; Type = IntRecTy::get(); break;
931 case tgtok::XSRL: Code = BinOpInit::SRL; Type = IntRecTy::get(); break;
932 case tgtok::XSHL: Code = BinOpInit::SHL; Type = IntRecTy::get(); break;
933 case tgtok::XEq: Code = BinOpInit::EQ; Type = BitRecTy::get(); break;
Bob Wilson21870412009-11-22 04:24:42 +0000934 case tgtok::XStrConcat:
David Greened418c1b2009-05-14 20:54:48 +0000935 Code = BinOpInit::STRCONCAT;
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +0000936 Type = StringRecTy::get();
David Greened418c1b2009-05-14 20:54:48 +0000937 break;
David Greened418c1b2009-05-14 20:54:48 +0000938 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000939
David Greened418c1b2009-05-14 20:54:48 +0000940 if (Lex.getCode() != tgtok::l_paren) {
941 TokError("expected '(' after binary operator");
942 return 0;
943 }
944 Lex.Lex(); // eat the '('
945
David Greene05bce0b2011-07-29 22:43:06 +0000946 SmallVector<Init*, 2> InitList;
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000947
Chris Lattner8d978a72010-10-05 23:58:18 +0000948 InitList.push_back(ParseValue(CurRec));
949 if (InitList.back() == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000950
Chris Lattner8d978a72010-10-05 23:58:18 +0000951 while (Lex.getCode() == tgtok::comma) {
952 Lex.Lex(); // eat the ','
953
954 InitList.push_back(ParseValue(CurRec));
955 if (InitList.back() == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +0000956 }
David Greened418c1b2009-05-14 20:54:48 +0000957
958 if (Lex.getCode() != tgtok::r_paren) {
Chris Lattner8d978a72010-10-05 23:58:18 +0000959 TokError("expected ')' in operator");
David Greened418c1b2009-05-14 20:54:48 +0000960 return 0;
961 }
962 Lex.Lex(); // eat the ')'
Chris Lattner8d978a72010-10-05 23:58:18 +0000963
964 // We allow multiple operands to associative operators like !strconcat as
965 // shorthand for nesting them.
966 if (Code == BinOpInit::STRCONCAT) {
967 while (InitList.size() > 2) {
David Greene05bce0b2011-07-29 22:43:06 +0000968 Init *RHS = InitList.pop_back_val();
David Greenedcd35c72011-07-29 19:07:07 +0000969 RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type))
970 ->Fold(CurRec, CurMultiClass);
Chris Lattner8d978a72010-10-05 23:58:18 +0000971 InitList.back() = RHS;
972 }
973 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000974
Chris Lattner8d978a72010-10-05 23:58:18 +0000975 if (InitList.size() == 2)
David Greenedcd35c72011-07-29 19:07:07 +0000976 return (BinOpInit::get(Code, InitList[0], InitList[1], Type))
Chris Lattner8d978a72010-10-05 23:58:18 +0000977 ->Fold(CurRec, CurMultiClass);
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +0000978
Chris Lattner8d978a72010-10-05 23:58:18 +0000979 Error(OpLoc, "expected two operands to operator");
980 return 0;
David Greened418c1b2009-05-14 20:54:48 +0000981 }
982
David Greene9bea7c82009-05-14 23:26:46 +0000983 case tgtok::XIf:
David Greenebeb31a52009-05-14 22:23:47 +0000984 case tgtok::XForEach:
David Greene4afc5092009-05-14 21:54:42 +0000985 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
986 TernOpInit::TernaryOp Code;
987 RecTy *Type = 0;
David Greened418c1b2009-05-14 20:54:48 +0000988
David Greene4afc5092009-05-14 21:54:42 +0000989 tgtok::TokKind LexCode = Lex.getCode();
990 Lex.Lex(); // eat the operation
991 switch (LexCode) {
Craig Topper85814382012-02-07 05:05:23 +0000992 default: llvm_unreachable("Unhandled code!");
David Greene9bea7c82009-05-14 23:26:46 +0000993 case tgtok::XIf:
994 Code = TernOpInit::IF;
995 break;
David Greenebeb31a52009-05-14 22:23:47 +0000996 case tgtok::XForEach:
997 Code = TernOpInit::FOREACH;
998 break;
David Greene4afc5092009-05-14 21:54:42 +0000999 case tgtok::XSubst:
1000 Code = TernOpInit::SUBST;
1001 break;
1002 }
1003 if (Lex.getCode() != tgtok::l_paren) {
1004 TokError("expected '(' after ternary operator");
1005 return 0;
1006 }
1007 Lex.Lex(); // eat the '('
David Greened418c1b2009-05-14 20:54:48 +00001008
David Greene05bce0b2011-07-29 22:43:06 +00001009 Init *LHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001010 if (LHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001011
David Greene4afc5092009-05-14 21:54:42 +00001012 if (Lex.getCode() != tgtok::comma) {
1013 TokError("expected ',' in ternary operator");
1014 return 0;
1015 }
1016 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001017
David Greene05bce0b2011-07-29 22:43:06 +00001018 Init *MHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001019 if (MHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001020
David Greene4afc5092009-05-14 21:54:42 +00001021 if (Lex.getCode() != tgtok::comma) {
1022 TokError("expected ',' in ternary operator");
1023 return 0;
1024 }
1025 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001026
David Greene05bce0b2011-07-29 22:43:06 +00001027 Init *RHS = ParseValue(CurRec);
David Greene4afc5092009-05-14 21:54:42 +00001028 if (RHS == 0) return 0;
David Greened418c1b2009-05-14 20:54:48 +00001029
David Greene4afc5092009-05-14 21:54:42 +00001030 if (Lex.getCode() != tgtok::r_paren) {
1031 TokError("expected ')' in binary operator");
1032 return 0;
1033 }
1034 Lex.Lex(); // eat the ')'
David Greened418c1b2009-05-14 20:54:48 +00001035
David Greene4afc5092009-05-14 21:54:42 +00001036 switch (LexCode) {
Craig Topper85814382012-02-07 05:05:23 +00001037 default: llvm_unreachable("Unhandled code!");
David Greene9bea7c82009-05-14 23:26:46 +00001038 case tgtok::XIf: {
Bill Wendling548f5a02010-12-13 01:46:19 +00001039 RecTy *MHSTy = 0;
1040 RecTy *RHSTy = 0;
1041
Sean Silva6cfc8062012-10-10 20:24:43 +00001042 if (TypedInit *MHSt = dyn_cast<TypedInit>(MHS))
Bill Wendling548f5a02010-12-13 01:46:19 +00001043 MHSTy = MHSt->getType();
Sean Silva6cfc8062012-10-10 20:24:43 +00001044 if (BitsInit *MHSbits = dyn_cast<BitsInit>(MHS))
Michael Liao307525c2012-09-06 23:32:48 +00001045 MHSTy = BitsRecTy::get(MHSbits->getNumBits());
Sean Silva3f7b7f82012-10-10 20:24:47 +00001046 if (isa<BitInit>(MHS))
Michael Liao307525c2012-09-06 23:32:48 +00001047 MHSTy = BitRecTy::get();
1048
Sean Silva6cfc8062012-10-10 20:24:43 +00001049 if (TypedInit *RHSt = dyn_cast<TypedInit>(RHS))
Bill Wendling548f5a02010-12-13 01:46:19 +00001050 RHSTy = RHSt->getType();
Sean Silva6cfc8062012-10-10 20:24:43 +00001051 if (BitsInit *RHSbits = dyn_cast<BitsInit>(RHS))
Michael Liao307525c2012-09-06 23:32:48 +00001052 RHSTy = BitsRecTy::get(RHSbits->getNumBits());
Sean Silva3f7b7f82012-10-10 20:24:47 +00001053 if (isa<BitInit>(RHS))
Michael Liao307525c2012-09-06 23:32:48 +00001054 RHSTy = BitRecTy::get();
1055
1056 // For UnsetInit, it's typed from the other hand.
Sean Silva3f7b7f82012-10-10 20:24:47 +00001057 if (isa<UnsetInit>(MHS))
Michael Liao307525c2012-09-06 23:32:48 +00001058 MHSTy = RHSTy;
Sean Silva3f7b7f82012-10-10 20:24:47 +00001059 if (isa<UnsetInit>(RHS))
Michael Liao307525c2012-09-06 23:32:48 +00001060 RHSTy = MHSTy;
Bill Wendling548f5a02010-12-13 01:46:19 +00001061
1062 if (!MHSTy || !RHSTy) {
David Greene9bea7c82009-05-14 23:26:46 +00001063 TokError("could not get type for !if");
1064 return 0;
1065 }
Bill Wendling548f5a02010-12-13 01:46:19 +00001066
1067 if (MHSTy->typeIsConvertibleTo(RHSTy)) {
1068 Type = RHSTy;
1069 } else if (RHSTy->typeIsConvertibleTo(MHSTy)) {
1070 Type = MHSTy;
Bob Wilson21870412009-11-22 04:24:42 +00001071 } else {
David Greene9bea7c82009-05-14 23:26:46 +00001072 TokError("inconsistent types for !if");
1073 return 0;
1074 }
1075 break;
1076 }
David Greenebeb31a52009-05-14 22:23:47 +00001077 case tgtok::XForEach: {
Sean Silva6cfc8062012-10-10 20:24:43 +00001078 TypedInit *MHSt = dyn_cast<TypedInit>(MHS);
David Greenebeb31a52009-05-14 22:23:47 +00001079 if (MHSt == 0) {
1080 TokError("could not get type for !foreach");
1081 return 0;
1082 }
1083 Type = MHSt->getType();
1084 break;
1085 }
David Greene4afc5092009-05-14 21:54:42 +00001086 case tgtok::XSubst: {
Sean Silva6cfc8062012-10-10 20:24:43 +00001087 TypedInit *RHSt = dyn_cast<TypedInit>(RHS);
David Greene4afc5092009-05-14 21:54:42 +00001088 if (RHSt == 0) {
1089 TokError("could not get type for !subst");
1090 return 0;
1091 }
1092 Type = RHSt->getType();
1093 break;
1094 }
1095 }
David Greenedcd35c72011-07-29 19:07:07 +00001096 return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec,
Bob Wilson21870412009-11-22 04:24:42 +00001097 CurMultiClass);
David Greene4afc5092009-05-14 21:54:42 +00001098 }
David Greened418c1b2009-05-14 20:54:48 +00001099 }
David Greened418c1b2009-05-14 20:54:48 +00001100}
1101
1102/// ParseOperatorType - Parse a type for an operator. This returns
1103/// null on error.
1104///
1105/// OperatorType ::= '<' Type '>'
1106///
Dan Gohmana9ad0412009-08-12 22:10:57 +00001107RecTy *TGParser::ParseOperatorType() {
David Greened418c1b2009-05-14 20:54:48 +00001108 RecTy *Type = 0;
1109
1110 if (Lex.getCode() != tgtok::less) {
1111 TokError("expected type name for operator");
1112 return 0;
1113 }
1114 Lex.Lex(); // eat the <
1115
1116 Type = ParseType();
1117
1118 if (Type == 0) {
1119 TokError("expected type name for operator");
1120 return 0;
1121 }
1122
1123 if (Lex.getCode() != tgtok::greater) {
1124 TokError("expected type name for operator");
1125 return 0;
1126 }
1127 Lex.Lex(); // eat the >
1128
1129 return Type;
1130}
1131
1132
Chris Lattnerf4601652007-11-22 20:49:04 +00001133/// ParseSimpleValue - Parse a tblgen value. This returns null on error.
1134///
1135/// SimpleValue ::= IDValue
1136/// SimpleValue ::= INTVAL
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001137/// SimpleValue ::= STRVAL+
Chris Lattnerf4601652007-11-22 20:49:04 +00001138/// SimpleValue ::= CODEFRAGMENT
1139/// SimpleValue ::= '?'
1140/// SimpleValue ::= '{' ValueList '}'
1141/// SimpleValue ::= ID '<' ValueListNE '>'
1142/// SimpleValue ::= '[' ValueList ']'
1143/// SimpleValue ::= '(' IDValue DagArgList ')'
1144/// SimpleValue ::= CONCATTOK '(' Value ',' Value ')'
1145/// SimpleValue ::= SHLTOK '(' Value ',' Value ')'
1146/// SimpleValue ::= SRATOK '(' Value ',' Value ')'
1147/// SimpleValue ::= SRLTOK '(' Value ',' Value ')'
1148/// SimpleValue ::= STRCONCATTOK '(' Value ',' Value ')'
1149///
David Greenef3744a02011-10-19 13:04:20 +00001150Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType,
1151 IDParseMode Mode) {
David Greene05bce0b2011-07-29 22:43:06 +00001152 Init *R = 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001153 switch (Lex.getCode()) {
1154 default: TokError("Unknown token when parsing a value"); break;
David Greened3d1cad2011-10-19 13:04:43 +00001155 case tgtok::paste:
1156 // This is a leading paste operation. This is deprecated but
1157 // still exists in some .td files. Ignore it.
1158 Lex.Lex(); // Skip '#'.
1159 return ParseSimpleValue(CurRec, ItemType, Mode);
David Greenedcd35c72011-07-29 19:07:07 +00001160 case tgtok::IntVal: R = IntInit::get(Lex.getCurIntVal()); Lex.Lex(); break;
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001161 case tgtok::StrVal: {
1162 std::string Val = Lex.getCurStrVal();
1163 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001164
Jim Grosbachda4231f2009-03-26 16:17:51 +00001165 // Handle multiple consecutive concatenated strings.
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001166 while (Lex.getCode() == tgtok::StrVal) {
1167 Val += Lex.getCurStrVal();
1168 Lex.Lex();
1169 }
Bob Wilson21870412009-11-22 04:24:42 +00001170
David Greenedcd35c72011-07-29 19:07:07 +00001171 R = StringInit::get(Val);
Chris Lattnerd7a50cf2009-03-11 17:08:13 +00001172 break;
1173 }
Chris Lattnerf4601652007-11-22 20:49:04 +00001174 case tgtok::CodeFragment:
Jakob Stoklund Olesen8dd6f0c2012-01-13 03:38:34 +00001175 R = StringInit::get(Lex.getCurStrVal());
Chris Lattner578bcf02010-10-06 04:31:40 +00001176 Lex.Lex();
1177 break;
1178 case tgtok::question:
David Greenedcd35c72011-07-29 19:07:07 +00001179 R = UnsetInit::get();
Chris Lattner578bcf02010-10-06 04:31:40 +00001180 Lex.Lex();
1181 break;
Chris Lattnerf4601652007-11-22 20:49:04 +00001182 case tgtok::Id: {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001183 SMLoc NameLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001184 std::string Name = Lex.getCurStrVal();
1185 if (Lex.Lex() != tgtok::less) // consume the Id.
David Greenef3744a02011-10-19 13:04:20 +00001186 return ParseIDValue(CurRec, Name, NameLoc, Mode); // Value ::= IDValue
Bob Wilson21870412009-11-22 04:24:42 +00001187
Chris Lattnerf4601652007-11-22 20:49:04 +00001188 // Value ::= ID '<' ValueListNE '>'
1189 if (Lex.Lex() == tgtok::greater) {
1190 TokError("expected non-empty value list");
1191 return 0;
1192 }
David Greenee1b46912009-06-08 20:23:18 +00001193
Chris Lattnerf4601652007-11-22 20:49:04 +00001194 // This is a CLASS<initvalslist> expression. This is supposed to synthesize
1195 // a new anonymous definition, deriving from CLASS<initvalslist> with no
1196 // body.
1197 Record *Class = Records.getClass(Name);
1198 if (!Class) {
1199 Error(NameLoc, "Expected a class name, got '" + Name + "'");
1200 return 0;
1201 }
David Greenee1b46912009-06-08 20:23:18 +00001202
David Greene05bce0b2011-07-29 22:43:06 +00001203 std::vector<Init*> ValueList = ParseValueList(CurRec, Class);
David Greenee1b46912009-06-08 20:23:18 +00001204 if (ValueList.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001205
David Greenee1b46912009-06-08 20:23:18 +00001206 if (Lex.getCode() != tgtok::greater) {
1207 TokError("expected '>' at end of value list");
1208 return 0;
1209 }
1210 Lex.Lex(); // eat the '>'
Jordan Roseb50df4a2013-01-10 18:50:11 +00001211 SMLoc EndLoc = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +00001212
Chris Lattnerf4601652007-11-22 20:49:04 +00001213 // Create the new record, set it as CurRec temporarily.
1214 static unsigned AnonCounter = 0;
Chris Lattner9c6b60e2010-12-15 04:48:22 +00001215 Record *NewRec = new Record("anonymous.val."+utostr(AnonCounter++),
1216 NameLoc,
Jordan Rosed1220092013-01-10 18:50:05 +00001217 Records,
1218 /*IsAnonymous=*/true);
Chris Lattnerf4601652007-11-22 20:49:04 +00001219 SubClassReference SCRef;
Jordan Roseb50df4a2013-01-10 18:50:11 +00001220 SCRef.RefRange = SMRange(NameLoc, EndLoc);
Chris Lattnerf4601652007-11-22 20:49:04 +00001221 SCRef.Rec = Class;
1222 SCRef.TemplateArgs = ValueList;
1223 // Add info about the subclass to NewRec.
1224 if (AddSubClass(NewRec, SCRef))
1225 return 0;
1226 NewRec->resolveReferences();
1227 Records.addDef(NewRec);
Bob Wilson21870412009-11-22 04:24:42 +00001228
Chris Lattnerf4601652007-11-22 20:49:04 +00001229 // The result of the expression is a reference to the new record.
Jakob Stoklund Olesen77f82742011-07-18 17:02:57 +00001230 return DefInit::get(NewRec);
Bob Wilson21870412009-11-22 04:24:42 +00001231 }
Chris Lattnerf4601652007-11-22 20:49:04 +00001232 case tgtok::l_brace: { // Value ::= '{' ValueList '}'
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001233 SMLoc BraceLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001234 Lex.Lex(); // eat the '{'
David Greene05bce0b2011-07-29 22:43:06 +00001235 std::vector<Init*> Vals;
Bob Wilson21870412009-11-22 04:24:42 +00001236
Chris Lattnerf4601652007-11-22 20:49:04 +00001237 if (Lex.getCode() != tgtok::r_brace) {
1238 Vals = ParseValueList(CurRec);
1239 if (Vals.empty()) return 0;
1240 }
1241 if (Lex.getCode() != tgtok::r_brace) {
1242 TokError("expected '}' at end of bit list value");
1243 return 0;
1244 }
1245 Lex.Lex(); // eat the '}'
Bob Wilson21870412009-11-22 04:24:42 +00001246
David Greene05bce0b2011-07-29 22:43:06 +00001247 SmallVector<Init *, 16> NewBits(Vals.size());
David Greeneca7fd3d2011-07-29 19:07:00 +00001248
Chris Lattnerf4601652007-11-22 20:49:04 +00001249 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
David Greene05bce0b2011-07-29 22:43:06 +00001250 Init *Bit = Vals[i]->convertInitializerTo(BitRecTy::get());
Chris Lattnerf4601652007-11-22 20:49:04 +00001251 if (Bit == 0) {
Chris Lattner5d814862007-11-22 21:06:59 +00001252 Error(BraceLoc, "Element #" + utostr(i) + " (" + Vals[i]->getAsString()+
1253 ") is not convertable to a bit");
Chris Lattnerf4601652007-11-22 20:49:04 +00001254 return 0;
1255 }
David Greeneca7fd3d2011-07-29 19:07:00 +00001256 NewBits[Vals.size()-i-1] = Bit;
Chris Lattnerf4601652007-11-22 20:49:04 +00001257 }
David Greenedcd35c72011-07-29 19:07:07 +00001258 return BitsInit::get(NewBits);
Chris Lattnerf4601652007-11-22 20:49:04 +00001259 }
1260 case tgtok::l_square: { // Value ::= '[' ValueList ']'
1261 Lex.Lex(); // eat the '['
David Greene05bce0b2011-07-29 22:43:06 +00001262 std::vector<Init*> Vals;
Bob Wilson21870412009-11-22 04:24:42 +00001263
David Greenee1b46912009-06-08 20:23:18 +00001264 RecTy *DeducedEltTy = 0;
1265 ListRecTy *GivenListTy = 0;
Bob Wilson21870412009-11-22 04:24:42 +00001266
David Greenee1b46912009-06-08 20:23:18 +00001267 if (ItemType != 0) {
Sean Silva736ceac2012-10-05 03:31:58 +00001268 ListRecTy *ListType = dyn_cast<ListRecTy>(ItemType);
David Greenee1b46912009-06-08 20:23:18 +00001269 if (ListType == 0) {
1270 std::stringstream s;
Bob Wilson21870412009-11-22 04:24:42 +00001271 s << "Type mismatch for list, expected list type, got "
David Greenee1b46912009-06-08 20:23:18 +00001272 << ItemType->getAsString();
1273 TokError(s.str());
Jim Grosbach6a44ada2011-03-11 19:52:52 +00001274 return 0;
David Greenee1b46912009-06-08 20:23:18 +00001275 }
1276 GivenListTy = ListType;
Bob Wilson21870412009-11-22 04:24:42 +00001277 }
David Greenee1b46912009-06-08 20:23:18 +00001278
Chris Lattnerf4601652007-11-22 20:49:04 +00001279 if (Lex.getCode() != tgtok::r_square) {
Bob Wilson21870412009-11-22 04:24:42 +00001280 Vals = ParseValueList(CurRec, 0,
1281 GivenListTy ? GivenListTy->getElementType() : 0);
Chris Lattnerf4601652007-11-22 20:49:04 +00001282 if (Vals.empty()) return 0;
1283 }
1284 if (Lex.getCode() != tgtok::r_square) {
1285 TokError("expected ']' at end of list value");
1286 return 0;
1287 }
1288 Lex.Lex(); // eat the ']'
David Greenee1b46912009-06-08 20:23:18 +00001289
1290 RecTy *GivenEltTy = 0;
1291 if (Lex.getCode() == tgtok::less) {
1292 // Optional list element type
1293 Lex.Lex(); // eat the '<'
1294
1295 GivenEltTy = ParseType();
1296 if (GivenEltTy == 0) {
1297 // Couldn't parse element type
1298 return 0;
1299 }
1300
1301 if (Lex.getCode() != tgtok::greater) {
1302 TokError("expected '>' at end of list element type");
1303 return 0;
1304 }
1305 Lex.Lex(); // eat the '>'
1306 }
1307
1308 // Check elements
1309 RecTy *EltTy = 0;
David Greene05bce0b2011-07-29 22:43:06 +00001310 for (std::vector<Init *>::iterator i = Vals.begin(), ie = Vals.end();
David Greenee1b46912009-06-08 20:23:18 +00001311 i != ie;
1312 ++i) {
Sean Silva6cfc8062012-10-10 20:24:43 +00001313 TypedInit *TArg = dyn_cast<TypedInit>(*i);
David Greenee1b46912009-06-08 20:23:18 +00001314 if (TArg == 0) {
1315 TokError("Untyped list element");
1316 return 0;
1317 }
1318 if (EltTy != 0) {
1319 EltTy = resolveTypes(EltTy, TArg->getType());
1320 if (EltTy == 0) {
1321 TokError("Incompatible types in list elements");
1322 return 0;
1323 }
Bob Wilson21870412009-11-22 04:24:42 +00001324 } else {
David Greenee1b46912009-06-08 20:23:18 +00001325 EltTy = TArg->getType();
1326 }
1327 }
1328
1329 if (GivenEltTy != 0) {
1330 if (EltTy != 0) {
1331 // Verify consistency
1332 if (!EltTy->typeIsConvertibleTo(GivenEltTy)) {
1333 TokError("Incompatible types in list elements");
1334 return 0;
1335 }
1336 }
1337 EltTy = GivenEltTy;
1338 }
1339
1340 if (EltTy == 0) {
1341 if (ItemType == 0) {
1342 TokError("No type for list");
1343 return 0;
1344 }
1345 DeducedEltTy = GivenListTy->getElementType();
Bob Wilson21870412009-11-22 04:24:42 +00001346 } else {
David Greenee1b46912009-06-08 20:23:18 +00001347 // Make sure the deduced type is compatible with the given type
1348 if (GivenListTy) {
1349 if (!EltTy->typeIsConvertibleTo(GivenListTy->getElementType())) {
1350 TokError("Element type mismatch for list");
1351 return 0;
1352 }
1353 }
1354 DeducedEltTy = EltTy;
1355 }
Bob Wilson21870412009-11-22 04:24:42 +00001356
David Greenedcd35c72011-07-29 19:07:07 +00001357 return ListInit::get(Vals, DeducedEltTy);
Chris Lattnerf4601652007-11-22 20:49:04 +00001358 }
1359 case tgtok::l_paren: { // Value ::= '(' IDValue DagArgList ')'
1360 Lex.Lex(); // eat the '('
Chris Lattnerc7252ce2010-10-06 00:19:21 +00001361 if (Lex.getCode() != tgtok::Id && Lex.getCode() != tgtok::XCast) {
Chris Lattner3dc2e962008-04-10 04:48:34 +00001362 TokError("expected identifier in dag init");
1363 return 0;
1364 }
Bob Wilson21870412009-11-22 04:24:42 +00001365
David Greene05bce0b2011-07-29 22:43:06 +00001366 Init *Operator = ParseValue(CurRec);
Chris Lattner578bcf02010-10-06 04:31:40 +00001367 if (Operator == 0) return 0;
David Greenec7cafcd2009-04-22 20:18:10 +00001368
Nate Begeman7cee8172009-03-19 05:21:56 +00001369 // If the operator name is present, parse it.
1370 std::string OperatorName;
1371 if (Lex.getCode() == tgtok::colon) {
1372 if (Lex.Lex() != tgtok::VarName) { // eat the ':'
1373 TokError("expected variable name in dag operator");
1374 return 0;
1375 }
1376 OperatorName = Lex.getCurStrVal();
1377 Lex.Lex(); // eat the VarName.
1378 }
Bob Wilson21870412009-11-22 04:24:42 +00001379
David Greene05bce0b2011-07-29 22:43:06 +00001380 std::vector<std::pair<llvm::Init*, std::string> > DagArgs;
Chris Lattnerf4601652007-11-22 20:49:04 +00001381 if (Lex.getCode() != tgtok::r_paren) {
1382 DagArgs = ParseDagArgList(CurRec);
1383 if (DagArgs.empty()) return 0;
1384 }
Bob Wilson21870412009-11-22 04:24:42 +00001385
Chris Lattnerf4601652007-11-22 20:49:04 +00001386 if (Lex.getCode() != tgtok::r_paren) {
1387 TokError("expected ')' in dag init");
1388 return 0;
1389 }
1390 Lex.Lex(); // eat the ')'
Bob Wilson21870412009-11-22 04:24:42 +00001391
David Greenedcd35c72011-07-29 19:07:07 +00001392 return DagInit::get(Operator, OperatorName, DagArgs);
Chris Lattnerf4601652007-11-22 20:49:04 +00001393 }
Bob Wilson21870412009-11-22 04:24:42 +00001394
David Greene1434f662011-01-07 17:05:37 +00001395 case tgtok::XHead:
1396 case tgtok::XTail:
1397 case tgtok::XEmpty:
David Greenee6c27de2009-05-14 21:22:49 +00001398 case tgtok::XCast: // Value ::= !unop '(' Value ')'
Chris Lattnerf4601652007-11-22 20:49:04 +00001399 case tgtok::XConcat:
Bob Wilson21870412009-11-22 04:24:42 +00001400 case tgtok::XSRA:
Chris Lattnerf4601652007-11-22 20:49:04 +00001401 case tgtok::XSRL:
1402 case tgtok::XSHL:
David Greene6786d5e2010-01-05 19:11:42 +00001403 case tgtok::XEq:
Chris Lattnerc7252ce2010-10-06 00:19:21 +00001404 case tgtok::XStrConcat: // Value ::= !binop '(' Value ',' Value ')'
David Greene9bea7c82009-05-14 23:26:46 +00001405 case tgtok::XIf:
David Greenebeb31a52009-05-14 22:23:47 +00001406 case tgtok::XForEach:
David Greene4afc5092009-05-14 21:54:42 +00001407 case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
David Greened418c1b2009-05-14 20:54:48 +00001408 return ParseOperation(CurRec);
Chris Lattnerf4601652007-11-22 20:49:04 +00001409 }
1410 }
Bob Wilson21870412009-11-22 04:24:42 +00001411
Chris Lattnerf4601652007-11-22 20:49:04 +00001412 return R;
1413}
1414
1415/// ParseValue - Parse a tblgen value. This returns null on error.
1416///
1417/// Value ::= SimpleValue ValueSuffix*
1418/// ValueSuffix ::= '{' BitList '}'
1419/// ValueSuffix ::= '[' BitList ']'
1420/// ValueSuffix ::= '.' ID
1421///
David Greenef3744a02011-10-19 13:04:20 +00001422Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
1423 Init *Result = ParseSimpleValue(CurRec, ItemType, Mode);
Chris Lattnerf4601652007-11-22 20:49:04 +00001424 if (Result == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001425
Chris Lattnerf4601652007-11-22 20:49:04 +00001426 // Parse the suffixes now if present.
1427 while (1) {
1428 switch (Lex.getCode()) {
1429 default: return Result;
1430 case tgtok::l_brace: {
David Greenecebb4ee2012-02-22 16:09:41 +00001431 if (Mode == ParseNameMode || Mode == ParseForeachMode)
David Greene8592b2b2011-10-19 13:04:26 +00001432 // This is the beginning of the object body.
1433 return Result;
1434
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001435 SMLoc CurlyLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001436 Lex.Lex(); // eat the '{'
1437 std::vector<unsigned> Ranges = ParseRangeList();
1438 if (Ranges.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001439
Chris Lattnerf4601652007-11-22 20:49:04 +00001440 // Reverse the bitlist.
1441 std::reverse(Ranges.begin(), Ranges.end());
1442 Result = Result->convertInitializerBitRange(Ranges);
1443 if (Result == 0) {
1444 Error(CurlyLoc, "Invalid bit range for value");
1445 return 0;
1446 }
Bob Wilson21870412009-11-22 04:24:42 +00001447
Chris Lattnerf4601652007-11-22 20:49:04 +00001448 // Eat the '}'.
1449 if (Lex.getCode() != tgtok::r_brace) {
1450 TokError("expected '}' at end of bit range list");
1451 return 0;
1452 }
1453 Lex.Lex();
1454 break;
1455 }
1456 case tgtok::l_square: {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001457 SMLoc SquareLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001458 Lex.Lex(); // eat the '['
1459 std::vector<unsigned> Ranges = ParseRangeList();
1460 if (Ranges.empty()) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001461
Chris Lattnerf4601652007-11-22 20:49:04 +00001462 Result = Result->convertInitListSlice(Ranges);
1463 if (Result == 0) {
1464 Error(SquareLoc, "Invalid range for list slice");
1465 return 0;
1466 }
Bob Wilson21870412009-11-22 04:24:42 +00001467
Chris Lattnerf4601652007-11-22 20:49:04 +00001468 // Eat the ']'.
1469 if (Lex.getCode() != tgtok::r_square) {
1470 TokError("expected ']' at end of list slice");
1471 return 0;
1472 }
1473 Lex.Lex();
1474 break;
1475 }
1476 case tgtok::period:
1477 if (Lex.Lex() != tgtok::Id) { // eat the .
1478 TokError("expected field identifier after '.'");
1479 return 0;
1480 }
1481 if (!Result->getFieldType(Lex.getCurStrVal())) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001482 TokError("Cannot access field '" + Lex.getCurStrVal() + "' of value '" +
Chris Lattner5d814862007-11-22 21:06:59 +00001483 Result->getAsString() + "'");
Chris Lattnerf4601652007-11-22 20:49:04 +00001484 return 0;
1485 }
David Greenedcd35c72011-07-29 19:07:07 +00001486 Result = FieldInit::get(Result, Lex.getCurStrVal());
Chris Lattnerf4601652007-11-22 20:49:04 +00001487 Lex.Lex(); // eat field name
1488 break;
David Greened3d1cad2011-10-19 13:04:43 +00001489
1490 case tgtok::paste:
1491 SMLoc PasteLoc = Lex.getLoc();
1492
1493 // Create a !strconcat() operation, first casting each operand to
1494 // a string if necessary.
1495
Sean Silva6cfc8062012-10-10 20:24:43 +00001496 TypedInit *LHS = dyn_cast<TypedInit>(Result);
David Greened3d1cad2011-10-19 13:04:43 +00001497 if (!LHS) {
1498 Error(PasteLoc, "LHS of paste is not typed!");
1499 return 0;
1500 }
1501
1502 if (LHS->getType() != StringRecTy::get()) {
1503 LHS = UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get());
1504 }
1505
1506 TypedInit *RHS = 0;
1507
1508 Lex.Lex(); // Eat the '#'.
1509 switch (Lex.getCode()) {
1510 case tgtok::colon:
1511 case tgtok::semi:
1512 case tgtok::l_brace:
1513 // These are all of the tokens that can begin an object body.
1514 // Some of these can also begin values but we disallow those cases
1515 // because they are unlikely to be useful.
1516
1517 // Trailing paste, concat with an empty string.
1518 RHS = StringInit::get("");
1519 break;
1520
1521 default:
1522 Init *RHSResult = ParseValue(CurRec, ItemType, ParseNameMode);
Sean Silva6cfc8062012-10-10 20:24:43 +00001523 RHS = dyn_cast<TypedInit>(RHSResult);
David Greened3d1cad2011-10-19 13:04:43 +00001524 if (!RHS) {
1525 Error(PasteLoc, "RHS of paste is not typed!");
1526 return 0;
1527 }
1528
1529 if (RHS->getType() != StringRecTy::get()) {
1530 RHS = UnOpInit::get(UnOpInit::CAST, RHS, StringRecTy::get());
1531 }
1532
1533 break;
1534 }
1535
1536 Result = BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS,
1537 StringRecTy::get())->Fold(CurRec, CurMultiClass);
1538 break;
Chris Lattnerf4601652007-11-22 20:49:04 +00001539 }
1540 }
1541}
1542
1543/// ParseDagArgList - Parse the argument list for a dag literal expression.
1544///
1545/// ParseDagArgList ::= Value (':' VARNAME)?
1546/// ParseDagArgList ::= ParseDagArgList ',' Value (':' VARNAME)?
David Greene05bce0b2011-07-29 22:43:06 +00001547std::vector<std::pair<llvm::Init*, std::string> >
Chris Lattnerf4601652007-11-22 20:49:04 +00001548TGParser::ParseDagArgList(Record *CurRec) {
David Greene05bce0b2011-07-29 22:43:06 +00001549 std::vector<std::pair<llvm::Init*, std::string> > Result;
Bob Wilson21870412009-11-22 04:24:42 +00001550
Chris Lattnerf4601652007-11-22 20:49:04 +00001551 while (1) {
David Greene05bce0b2011-07-29 22:43:06 +00001552 Init *Val = ParseValue(CurRec);
1553 if (Val == 0) return std::vector<std::pair<llvm::Init*, std::string> >();
Bob Wilson21870412009-11-22 04:24:42 +00001554
Chris Lattnerf4601652007-11-22 20:49:04 +00001555 // If the variable name is present, add it.
1556 std::string VarName;
1557 if (Lex.getCode() == tgtok::colon) {
1558 if (Lex.Lex() != tgtok::VarName) { // eat the ':'
1559 TokError("expected variable name in dag literal");
David Greene05bce0b2011-07-29 22:43:06 +00001560 return std::vector<std::pair<llvm::Init*, std::string> >();
Chris Lattnerf4601652007-11-22 20:49:04 +00001561 }
1562 VarName = Lex.getCurStrVal();
1563 Lex.Lex(); // eat the VarName.
1564 }
Bob Wilson21870412009-11-22 04:24:42 +00001565
Chris Lattnerf4601652007-11-22 20:49:04 +00001566 Result.push_back(std::make_pair(Val, VarName));
Bob Wilson21870412009-11-22 04:24:42 +00001567
Chris Lattnerf4601652007-11-22 20:49:04 +00001568 if (Lex.getCode() != tgtok::comma) break;
Bob Wilson21870412009-11-22 04:24:42 +00001569 Lex.Lex(); // eat the ','
Chris Lattnerf4601652007-11-22 20:49:04 +00001570 }
Bob Wilson21870412009-11-22 04:24:42 +00001571
Chris Lattnerf4601652007-11-22 20:49:04 +00001572 return Result;
1573}
1574
1575
1576/// ParseValueList - Parse a comma separated list of values, returning them as a
1577/// vector. Note that this always expects to be able to parse at least one
1578/// value. It returns an empty list if this is not possible.
1579///
1580/// ValueList ::= Value (',' Value)
1581///
David Greene05bce0b2011-07-29 22:43:06 +00001582std::vector<Init*> TGParser::ParseValueList(Record *CurRec, Record *ArgsRec,
Eric Christopherd568b3f2011-07-11 23:06:52 +00001583 RecTy *EltTy) {
David Greene05bce0b2011-07-29 22:43:06 +00001584 std::vector<Init*> Result;
David Greenee1b46912009-06-08 20:23:18 +00001585 RecTy *ItemType = EltTy;
David Greene67acdf22009-06-29 19:59:52 +00001586 unsigned int ArgN = 0;
David Greenee1b46912009-06-08 20:23:18 +00001587 if (ArgsRec != 0 && EltTy == 0) {
David Greenee22b3212011-10-19 13:02:42 +00001588 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs();
Jim Grosbachb1320cb2012-01-20 20:02:39 +00001589 if (!TArgs.size()) {
1590 TokError("template argument provided to non-template class");
1591 return std::vector<Init*>();
1592 }
David Greenee1b46912009-06-08 20:23:18 +00001593 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]);
David Greened9746fe2011-09-19 18:26:07 +00001594 if (!RV) {
1595 errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN]
1596 << ")\n";
1597 }
David Greenee1b46912009-06-08 20:23:18 +00001598 assert(RV && "Template argument record not found??");
1599 ItemType = RV->getType();
1600 ++ArgN;
1601 }
1602 Result.push_back(ParseValue(CurRec, ItemType));
David Greene05bce0b2011-07-29 22:43:06 +00001603 if (Result.back() == 0) return std::vector<Init*>();
Bob Wilson21870412009-11-22 04:24:42 +00001604
Chris Lattnerf4601652007-11-22 20:49:04 +00001605 while (Lex.getCode() == tgtok::comma) {
1606 Lex.Lex(); // Eat the comma
Bob Wilson21870412009-11-22 04:24:42 +00001607
David Greenee1b46912009-06-08 20:23:18 +00001608 if (ArgsRec != 0 && EltTy == 0) {
David Greenee22b3212011-10-19 13:02:42 +00001609 const std::vector<Init *> &TArgs = ArgsRec->getTemplateArgs();
David Greene67acdf22009-06-29 19:59:52 +00001610 if (ArgN >= TArgs.size()) {
1611 TokError("too many template arguments");
David Greene05bce0b2011-07-29 22:43:06 +00001612 return std::vector<Init*>();
Bob Wilson21870412009-11-22 04:24:42 +00001613 }
David Greenee1b46912009-06-08 20:23:18 +00001614 const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]);
1615 assert(RV && "Template argument record not found??");
1616 ItemType = RV->getType();
1617 ++ArgN;
1618 }
1619 Result.push_back(ParseValue(CurRec, ItemType));
David Greene05bce0b2011-07-29 22:43:06 +00001620 if (Result.back() == 0) return std::vector<Init*>();
Chris Lattnerf4601652007-11-22 20:49:04 +00001621 }
Bob Wilson21870412009-11-22 04:24:42 +00001622
Chris Lattnerf4601652007-11-22 20:49:04 +00001623 return Result;
1624}
1625
1626
Chris Lattnerf4601652007-11-22 20:49:04 +00001627/// ParseDeclaration - Read a declaration, returning the name of field ID, or an
1628/// empty string on error. This can happen in a number of different context's,
1629/// including within a def or in the template args for a def (which which case
1630/// CurRec will be non-null) and within the template args for a multiclass (in
1631/// which case CurRec will be null, but CurMultiClass will be set). This can
1632/// also happen within a def that is within a multiclass, which will set both
1633/// CurRec and CurMultiClass.
1634///
1635/// Declaration ::= FIELD? Type ID ('=' Value)?
1636///
David Greenee22b3212011-10-19 13:02:42 +00001637Init *TGParser::ParseDeclaration(Record *CurRec,
Chris Lattnerf4601652007-11-22 20:49:04 +00001638 bool ParsingTemplateArgs) {
1639 // Read the field prefix if present.
1640 bool HasField = Lex.getCode() == tgtok::Field;
1641 if (HasField) Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001642
Chris Lattnerf4601652007-11-22 20:49:04 +00001643 RecTy *Type = ParseType();
David Greenee22b3212011-10-19 13:02:42 +00001644 if (Type == 0) return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001645
Chris Lattnerf4601652007-11-22 20:49:04 +00001646 if (Lex.getCode() != tgtok::Id) {
1647 TokError("Expected identifier in declaration");
David Greenee22b3212011-10-19 13:02:42 +00001648 return 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001649 }
Bob Wilson21870412009-11-22 04:24:42 +00001650
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001651 SMLoc IdLoc = Lex.getLoc();
David Greenee22b3212011-10-19 13:02:42 +00001652 Init *DeclName = StringInit::get(Lex.getCurStrVal());
Chris Lattnerf4601652007-11-22 20:49:04 +00001653 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001654
Chris Lattnerf4601652007-11-22 20:49:04 +00001655 if (ParsingTemplateArgs) {
1656 if (CurRec) {
David Greenee22b3212011-10-19 13:02:42 +00001657 DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":");
Chris Lattnerf4601652007-11-22 20:49:04 +00001658 } else {
1659 assert(CurMultiClass);
1660 }
1661 if (CurMultiClass)
David Greenee22b3212011-10-19 13:02:42 +00001662 DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName,
1663 "::");
Chris Lattnerf4601652007-11-22 20:49:04 +00001664 }
Bob Wilson21870412009-11-22 04:24:42 +00001665
Chris Lattnerf4601652007-11-22 20:49:04 +00001666 // Add the value.
1667 if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField)))
David Greenee22b3212011-10-19 13:02:42 +00001668 return 0;
Bob Wilson21870412009-11-22 04:24:42 +00001669
Chris Lattnerf4601652007-11-22 20:49:04 +00001670 // If a value is present, parse it.
1671 if (Lex.getCode() == tgtok::equal) {
1672 Lex.Lex();
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001673 SMLoc ValLoc = Lex.getLoc();
David Greene05bce0b2011-07-29 22:43:06 +00001674 Init *Val = ParseValue(CurRec, Type);
Chris Lattnerf4601652007-11-22 20:49:04 +00001675 if (Val == 0 ||
1676 SetValue(CurRec, ValLoc, DeclName, std::vector<unsigned>(), Val))
David Greenee22b3212011-10-19 13:02:42 +00001677 return 0;
Chris Lattnerf4601652007-11-22 20:49:04 +00001678 }
Bob Wilson21870412009-11-22 04:24:42 +00001679
Chris Lattnerf4601652007-11-22 20:49:04 +00001680 return DeclName;
1681}
1682
David Greenecebb4ee2012-02-22 16:09:41 +00001683/// ParseForeachDeclaration - Read a foreach declaration, returning
1684/// the name of the declared object or a NULL Init on error. Return
1685/// the name of the parsed initializer list through ForeachListName.
1686///
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001687/// ForeachDeclaration ::= ID '=' '[' ValueList ']'
1688/// ForeachDeclaration ::= ID '=' '{' RangeList '}'
1689/// ForeachDeclaration ::= ID '=' RangePiece
David Greenecebb4ee2012-02-22 16:09:41 +00001690///
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00001691VarInit *TGParser::ParseForeachDeclaration(ListInit *&ForeachListValue) {
David Greenecebb4ee2012-02-22 16:09:41 +00001692 if (Lex.getCode() != tgtok::Id) {
1693 TokError("Expected identifier in foreach declaration");
1694 return 0;
1695 }
1696
1697 Init *DeclName = StringInit::get(Lex.getCurStrVal());
1698 Lex.Lex();
1699
1700 // If a value is present, parse it.
1701 if (Lex.getCode() != tgtok::equal) {
1702 TokError("Expected '=' in foreach declaration");
1703 return 0;
1704 }
1705 Lex.Lex(); // Eat the '='
1706
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001707 RecTy *IterType = 0;
1708 std::vector<unsigned> Ranges;
David Greenecebb4ee2012-02-22 16:09:41 +00001709
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001710 switch (Lex.getCode()) {
1711 default: TokError("Unknown token when expecting a range list"); return 0;
1712 case tgtok::l_square: { // '[' ValueList ']'
1713 Init *List = ParseSimpleValue(0, 0, ParseForeachMode);
Sean Silva6cfc8062012-10-10 20:24:43 +00001714 ForeachListValue = dyn_cast<ListInit>(List);
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001715 if (ForeachListValue == 0) {
1716 TokError("Expected a Value list");
1717 return 0;
1718 }
1719 RecTy *ValueType = ForeachListValue->getType();
Sean Silva736ceac2012-10-05 03:31:58 +00001720 ListRecTy *ListType = dyn_cast<ListRecTy>(ValueType);
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001721 if (ListType == 0) {
1722 TokError("Value list is not of list type");
1723 return 0;
1724 }
1725 IterType = ListType->getElementType();
1726 break;
David Greenecebb4ee2012-02-22 16:09:41 +00001727 }
1728
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001729 case tgtok::IntVal: { // RangePiece.
1730 if (ParseRangePiece(Ranges))
1731 return 0;
1732 break;
David Greenecebb4ee2012-02-22 16:09:41 +00001733 }
1734
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001735 case tgtok::l_brace: { // '{' RangeList '}'
1736 Lex.Lex(); // eat the '{'
1737 Ranges = ParseRangeList();
1738 if (Lex.getCode() != tgtok::r_brace) {
1739 TokError("expected '}' at end of bit range list");
1740 return 0;
1741 }
1742 Lex.Lex();
1743 break;
1744 }
1745 }
David Greenecebb4ee2012-02-22 16:09:41 +00001746
Jakob Stoklund Olesenfae8b1d2012-05-24 22:17:39 +00001747 if (!Ranges.empty()) {
1748 assert(!IterType && "Type already initialized?");
1749 IterType = IntRecTy::get();
1750 std::vector<Init*> Values;
1751 for (unsigned i = 0, e = Ranges.size(); i != e; ++i)
1752 Values.push_back(IntInit::get(Ranges[i]));
1753 ForeachListValue = ListInit::get(Values, IterType);
1754 }
1755
1756 if (!IterType)
1757 return 0;
1758
1759 return VarInit::get(DeclName, IterType);
David Greenecebb4ee2012-02-22 16:09:41 +00001760}
1761
Chris Lattnerf4601652007-11-22 20:49:04 +00001762/// ParseTemplateArgList - Read a template argument list, which is a non-empty
1763/// sequence of template-declarations in <>'s. If CurRec is non-null, these are
1764/// template args for a def, which may or may not be in a multiclass. If null,
1765/// these are the template args for a multiclass.
1766///
1767/// TemplateArgList ::= '<' Declaration (',' Declaration)* '>'
Bob Wilson21870412009-11-22 04:24:42 +00001768///
Chris Lattnerf4601652007-11-22 20:49:04 +00001769bool TGParser::ParseTemplateArgList(Record *CurRec) {
1770 assert(Lex.getCode() == tgtok::less && "Not a template arg list!");
1771 Lex.Lex(); // eat the '<'
Bob Wilson21870412009-11-22 04:24:42 +00001772
Chris Lattnerf4601652007-11-22 20:49:04 +00001773 Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec;
Bob Wilson21870412009-11-22 04:24:42 +00001774
Chris Lattnerf4601652007-11-22 20:49:04 +00001775 // Read the first declaration.
David Greenee22b3212011-10-19 13:02:42 +00001776 Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/);
1777 if (TemplArg == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001778 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001779
Chris Lattnerf4601652007-11-22 20:49:04 +00001780 TheRecToAddTo->addTemplateArg(TemplArg);
Bob Wilson21870412009-11-22 04:24:42 +00001781
Chris Lattnerf4601652007-11-22 20:49:04 +00001782 while (Lex.getCode() == tgtok::comma) {
1783 Lex.Lex(); // eat the ','
Bob Wilson21870412009-11-22 04:24:42 +00001784
Chris Lattnerf4601652007-11-22 20:49:04 +00001785 // Read the following declarations.
1786 TemplArg = ParseDeclaration(CurRec, true/*templateargs*/);
David Greenee22b3212011-10-19 13:02:42 +00001787 if (TemplArg == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001788 return true;
1789 TheRecToAddTo->addTemplateArg(TemplArg);
1790 }
Bob Wilson21870412009-11-22 04:24:42 +00001791
Chris Lattnerf4601652007-11-22 20:49:04 +00001792 if (Lex.getCode() != tgtok::greater)
1793 return TokError("expected '>' at end of template argument list");
1794 Lex.Lex(); // eat the '>'.
1795 return false;
1796}
1797
1798
1799/// ParseBodyItem - Parse a single item at within the body of a def or class.
1800///
1801/// BodyItem ::= Declaration ';'
1802/// BodyItem ::= LET ID OptionalBitList '=' Value ';'
1803bool TGParser::ParseBodyItem(Record *CurRec) {
1804 if (Lex.getCode() != tgtok::Let) {
David Greenee22b3212011-10-19 13:02:42 +00001805 if (ParseDeclaration(CurRec, false) == 0)
Chris Lattnerf4601652007-11-22 20:49:04 +00001806 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001807
Chris Lattnerf4601652007-11-22 20:49:04 +00001808 if (Lex.getCode() != tgtok::semi)
1809 return TokError("expected ';' after declaration");
1810 Lex.Lex();
1811 return false;
1812 }
1813
1814 // LET ID OptionalRangeList '=' Value ';'
1815 if (Lex.Lex() != tgtok::Id)
1816 return TokError("expected field identifier after let");
Bob Wilson21870412009-11-22 04:24:42 +00001817
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001818 SMLoc IdLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001819 std::string FieldName = Lex.getCurStrVal();
1820 Lex.Lex(); // eat the field name.
Bob Wilson21870412009-11-22 04:24:42 +00001821
Chris Lattnerf4601652007-11-22 20:49:04 +00001822 std::vector<unsigned> BitList;
Bob Wilson21870412009-11-22 04:24:42 +00001823 if (ParseOptionalBitList(BitList))
Chris Lattnerf4601652007-11-22 20:49:04 +00001824 return true;
1825 std::reverse(BitList.begin(), BitList.end());
Bob Wilson21870412009-11-22 04:24:42 +00001826
Chris Lattnerf4601652007-11-22 20:49:04 +00001827 if (Lex.getCode() != tgtok::equal)
1828 return TokError("expected '=' in let expression");
1829 Lex.Lex(); // eat the '='.
Bob Wilson21870412009-11-22 04:24:42 +00001830
David Greenee1b46912009-06-08 20:23:18 +00001831 RecordVal *Field = CurRec->getValue(FieldName);
1832 if (Field == 0)
1833 return TokError("Value '" + FieldName + "' unknown!");
1834
1835 RecTy *Type = Field->getType();
Bob Wilson21870412009-11-22 04:24:42 +00001836
David Greene05bce0b2011-07-29 22:43:06 +00001837 Init *Val = ParseValue(CurRec, Type);
Chris Lattnerf4601652007-11-22 20:49:04 +00001838 if (Val == 0) return true;
Bob Wilson21870412009-11-22 04:24:42 +00001839
Chris Lattnerf4601652007-11-22 20:49:04 +00001840 if (Lex.getCode() != tgtok::semi)
1841 return TokError("expected ';' after let expression");
1842 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001843
Chris Lattnerf4601652007-11-22 20:49:04 +00001844 return SetValue(CurRec, IdLoc, FieldName, BitList, Val);
1845}
1846
1847/// ParseBody - Read the body of a class or def. Return true on error, false on
1848/// success.
1849///
1850/// Body ::= ';'
1851/// Body ::= '{' BodyList '}'
1852/// BodyList BodyItem*
1853///
1854bool TGParser::ParseBody(Record *CurRec) {
1855 // If this is a null definition, just eat the semi and return.
1856 if (Lex.getCode() == tgtok::semi) {
1857 Lex.Lex();
1858 return false;
1859 }
Bob Wilson21870412009-11-22 04:24:42 +00001860
Chris Lattnerf4601652007-11-22 20:49:04 +00001861 if (Lex.getCode() != tgtok::l_brace)
1862 return TokError("Expected ';' or '{' to start body");
1863 // Eat the '{'.
1864 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001865
Chris Lattnerf4601652007-11-22 20:49:04 +00001866 while (Lex.getCode() != tgtok::r_brace)
1867 if (ParseBodyItem(CurRec))
1868 return true;
1869
1870 // Eat the '}'.
1871 Lex.Lex();
1872 return false;
1873}
1874
Sean Silva9cceede2013-01-09 04:49:14 +00001875/// \brief Apply the current let bindings to \a CurRec.
1876/// \returns true on error, false otherwise.
1877bool TGParser::ApplyLetStack(Record *CurRec) {
1878 for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
1879 for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
1880 if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name,
1881 LetStack[i][j].Bits, LetStack[i][j].Value))
1882 return true;
1883 return false;
1884}
1885
Chris Lattnerf4601652007-11-22 20:49:04 +00001886/// ParseObjectBody - Parse the body of a def or class. This consists of an
1887/// optional ClassList followed by a Body. CurRec is the current def or class
1888/// that is being parsed.
1889///
1890/// ObjectBody ::= BaseClassList Body
1891/// BaseClassList ::= /*empty*/
1892/// BaseClassList ::= ':' BaseClassListNE
1893/// BaseClassListNE ::= SubClassRef (',' SubClassRef)*
1894///
1895bool TGParser::ParseObjectBody(Record *CurRec) {
1896 // If there is a baseclass list, read it.
1897 if (Lex.getCode() == tgtok::colon) {
1898 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00001899
Chris Lattnerf4601652007-11-22 20:49:04 +00001900 // Read all of the subclasses.
1901 SubClassReference SubClass = ParseSubClassReference(CurRec, false);
1902 while (1) {
1903 // Check for error.
1904 if (SubClass.Rec == 0) return true;
Bob Wilson21870412009-11-22 04:24:42 +00001905
Chris Lattnerf4601652007-11-22 20:49:04 +00001906 // Add it.
1907 if (AddSubClass(CurRec, SubClass))
1908 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001909
Chris Lattnerf4601652007-11-22 20:49:04 +00001910 if (Lex.getCode() != tgtok::comma) break;
1911 Lex.Lex(); // eat ','.
1912 SubClass = ParseSubClassReference(CurRec, false);
1913 }
1914 }
1915
Sean Silva9cceede2013-01-09 04:49:14 +00001916 if (ApplyLetStack(CurRec))
1917 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001918
Chris Lattnerf4601652007-11-22 20:49:04 +00001919 return ParseBody(CurRec);
1920}
1921
Chris Lattnerf4601652007-11-22 20:49:04 +00001922/// ParseDef - Parse and return a top level or multiclass def, return the record
1923/// corresponding to it. This returns null on error.
1924///
1925/// DefInst ::= DEF ObjectName ObjectBody
1926///
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001927bool TGParser::ParseDef(MultiClass *CurMultiClass) {
Chris Lattner1e3a8a42009-06-21 03:39:35 +00001928 SMLoc DefLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00001929 assert(Lex.getCode() == tgtok::Def && "Unknown tok");
Bob Wilson21870412009-11-22 04:24:42 +00001930 Lex.Lex(); // Eat the 'def' token.
Chris Lattnerf4601652007-11-22 20:49:04 +00001931
1932 // Parse ObjectName and make a record for it.
Jordan Rosed1220092013-01-10 18:50:05 +00001933 Record *CurRec;
1934 Init *Name = ParseObjectName(CurMultiClass);
1935 if (Name)
1936 CurRec = new Record(Name, DefLoc, Records);
1937 else
1938 CurRec = new Record(GetNewAnonymousName(), DefLoc, Records,
1939 /*IsAnonymous=*/true);
Bob Wilson21870412009-11-22 04:24:42 +00001940
Jakob Stoklund Olesen72cba6c2012-05-24 22:17:36 +00001941 if (!CurMultiClass && Loops.empty()) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001942 // Top-level def definition.
Bob Wilson21870412009-11-22 04:24:42 +00001943
Chris Lattnerf4601652007-11-22 20:49:04 +00001944 // Ensure redefinition doesn't happen.
David Greene1d501392012-01-28 00:03:24 +00001945 if (Records.getDef(CurRec->getNameInitAsString())) {
David Greene2c49fbb2011-10-19 13:03:45 +00001946 Error(DefLoc, "def '" + CurRec->getNameInitAsString()
1947 + "' already defined");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001948 return true;
Chris Lattnerf4601652007-11-22 20:49:04 +00001949 }
1950 Records.addDef(CurRec);
Jakob Stoklund Olesen72cba6c2012-05-24 22:17:36 +00001951 } else if (CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00001952 // Otherwise, a def inside a multiclass, add it to the multiclass.
1953 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i)
David Greene91919cd2011-10-19 13:03:51 +00001954 if (CurMultiClass->DefPrototypes[i]->getNameInit()
1955 == CurRec->getNameInit()) {
1956 Error(DefLoc, "def '" + CurRec->getNameInitAsString() +
Chris Lattnerf4601652007-11-22 20:49:04 +00001957 "' already defined in this multiclass!");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001958 return true;
Chris Lattnerf4601652007-11-22 20:49:04 +00001959 }
1960 CurMultiClass->DefPrototypes.push_back(CurRec);
1961 }
Bob Wilson21870412009-11-22 04:24:42 +00001962
Chris Lattnerf4601652007-11-22 20:49:04 +00001963 if (ParseObjectBody(CurRec))
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001964 return true;
Bob Wilson21870412009-11-22 04:24:42 +00001965
Chris Lattnerf4601652007-11-22 20:49:04 +00001966 if (CurMultiClass == 0) // Def's in multiclasses aren't really defs.
David Greene0d886402011-08-10 18:27:46 +00001967 // See Record::setName(). This resolve step will see any new name
1968 // for the def that might have been created when resolving
1969 // inheritance, values and arguments above.
Chris Lattnerf4601652007-11-22 20:49:04 +00001970 CurRec->resolveReferences();
Bob Wilson21870412009-11-22 04:24:42 +00001971
Chris Lattnerf4601652007-11-22 20:49:04 +00001972 // If ObjectBody has template arguments, it's an error.
1973 assert(CurRec->getTemplateArgs().empty() && "How'd this get template args?");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001974
1975 if (CurMultiClass) {
1976 // Copy the template arguments for the multiclass into the def.
David Greenee22b3212011-10-19 13:02:42 +00001977 const std::vector<Init *> &TArgs =
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00001978 CurMultiClass->Rec.getTemplateArgs();
1979
1980 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
1981 const RecordVal *RV = CurMultiClass->Rec.getValue(TArgs[i]);
1982 assert(RV && "Template arg doesn't exist?");
1983 CurRec->addValue(*RV);
1984 }
1985 }
1986
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00001987 if (ProcessForeachDefs(CurRec, DefLoc)) {
David Greenecebb4ee2012-02-22 16:09:41 +00001988 Error(DefLoc,
1989 "Could not process loops for def" + CurRec->getNameInitAsString());
1990 return true;
1991 }
1992
1993 return false;
1994}
1995
1996/// ParseForeach - Parse a for statement. Return the record corresponding
1997/// to it. This returns true on error.
1998///
1999/// Foreach ::= FOREACH Declaration IN '{ ObjectList '}'
2000/// Foreach ::= FOREACH Declaration IN Object
2001///
2002bool TGParser::ParseForeach(MultiClass *CurMultiClass) {
2003 assert(Lex.getCode() == tgtok::Foreach && "Unknown tok");
2004 Lex.Lex(); // Eat the 'for' token.
2005
2006 // Make a temporary object to record items associated with the for
2007 // loop.
Jakob Stoklund Olesen8e5286e2012-05-24 22:17:33 +00002008 ListInit *ListValue = 0;
2009 VarInit *IterName = ParseForeachDeclaration(ListValue);
David Greenecebb4ee2012-02-22 16:09:41 +00002010 if (IterName == 0)
2011 return TokError("expected declaration in for");
2012
2013 if (Lex.getCode() != tgtok::In)
2014 return TokError("Unknown tok");
2015 Lex.Lex(); // Eat the in
2016
2017 // Create a loop object and remember it.
2018 Loops.push_back(ForeachLoop(IterName, ListValue));
2019
2020 if (Lex.getCode() != tgtok::l_brace) {
2021 // FOREACH Declaration IN Object
2022 if (ParseObject(CurMultiClass))
2023 return true;
2024 }
2025 else {
2026 SMLoc BraceLoc = Lex.getLoc();
2027 // Otherwise, this is a group foreach.
2028 Lex.Lex(); // eat the '{'.
2029
2030 // Parse the object list.
2031 if (ParseObjectList(CurMultiClass))
2032 return true;
2033
2034 if (Lex.getCode() != tgtok::r_brace) {
2035 TokError("expected '}' at end of foreach command");
2036 return Error(BraceLoc, "to match this '{'");
2037 }
2038 Lex.Lex(); // Eat the }
2039 }
2040
2041 // We've processed everything in this loop.
2042 Loops.pop_back();
2043
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002044 return false;
Chris Lattnerf4601652007-11-22 20:49:04 +00002045}
2046
Chris Lattnerf4601652007-11-22 20:49:04 +00002047/// ParseClass - Parse a tblgen class definition.
2048///
2049/// ClassInst ::= CLASS ID TemplateArgList? ObjectBody
2050///
2051bool TGParser::ParseClass() {
2052 assert(Lex.getCode() == tgtok::Class && "Unexpected token!");
2053 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002054
Chris Lattnerf4601652007-11-22 20:49:04 +00002055 if (Lex.getCode() != tgtok::Id)
2056 return TokError("expected class name after 'class' keyword");
Bob Wilson21870412009-11-22 04:24:42 +00002057
Chris Lattnerf4601652007-11-22 20:49:04 +00002058 Record *CurRec = Records.getClass(Lex.getCurStrVal());
2059 if (CurRec) {
2060 // If the body was previously defined, this is an error.
David Greenee3385652011-10-19 13:04:13 +00002061 if (CurRec->getValues().size() > 1 || // Account for NAME.
Chris Lattnerf4601652007-11-22 20:49:04 +00002062 !CurRec->getSuperClasses().empty() ||
2063 !CurRec->getTemplateArgs().empty())
David Greene69a23942011-10-19 13:03:58 +00002064 return TokError("Class '" + CurRec->getNameInitAsString()
2065 + "' already defined");
Chris Lattnerf4601652007-11-22 20:49:04 +00002066 } else {
2067 // If this is the first reference to this class, create and add it.
Chris Lattner9c6b60e2010-12-15 04:48:22 +00002068 CurRec = new Record(Lex.getCurStrVal(), Lex.getLoc(), Records);
Chris Lattnerf4601652007-11-22 20:49:04 +00002069 Records.addClass(CurRec);
2070 }
2071 Lex.Lex(); // eat the name.
Bob Wilson21870412009-11-22 04:24:42 +00002072
Chris Lattnerf4601652007-11-22 20:49:04 +00002073 // If there are template args, parse them.
2074 if (Lex.getCode() == tgtok::less)
2075 if (ParseTemplateArgList(CurRec))
2076 return true;
2077
2078 // Finally, parse the object body.
2079 return ParseObjectBody(CurRec);
2080}
2081
2082/// ParseLetList - Parse a non-empty list of assignment expressions into a list
2083/// of LetRecords.
2084///
2085/// LetList ::= LetItem (',' LetItem)*
2086/// LetItem ::= ID OptionalRangeList '=' Value
2087///
2088std::vector<LetRecord> TGParser::ParseLetList() {
2089 std::vector<LetRecord> Result;
Bob Wilson21870412009-11-22 04:24:42 +00002090
Chris Lattnerf4601652007-11-22 20:49:04 +00002091 while (1) {
2092 if (Lex.getCode() != tgtok::Id) {
2093 TokError("expected identifier in let definition");
2094 return std::vector<LetRecord>();
2095 }
2096 std::string Name = Lex.getCurStrVal();
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002097 SMLoc NameLoc = Lex.getLoc();
Bob Wilson21870412009-11-22 04:24:42 +00002098 Lex.Lex(); // Eat the identifier.
Chris Lattnerf4601652007-11-22 20:49:04 +00002099
2100 // Check for an optional RangeList.
2101 std::vector<unsigned> Bits;
Bob Wilson21870412009-11-22 04:24:42 +00002102 if (ParseOptionalRangeList(Bits))
Chris Lattnerf4601652007-11-22 20:49:04 +00002103 return std::vector<LetRecord>();
2104 std::reverse(Bits.begin(), Bits.end());
Bob Wilson21870412009-11-22 04:24:42 +00002105
Chris Lattnerf4601652007-11-22 20:49:04 +00002106 if (Lex.getCode() != tgtok::equal) {
2107 TokError("expected '=' in let expression");
2108 return std::vector<LetRecord>();
2109 }
2110 Lex.Lex(); // eat the '='.
Bob Wilson21870412009-11-22 04:24:42 +00002111
David Greene05bce0b2011-07-29 22:43:06 +00002112 Init *Val = ParseValue(0);
Chris Lattnerf4601652007-11-22 20:49:04 +00002113 if (Val == 0) return std::vector<LetRecord>();
Bob Wilson21870412009-11-22 04:24:42 +00002114
Chris Lattnerf4601652007-11-22 20:49:04 +00002115 // Now that we have everything, add the record.
2116 Result.push_back(LetRecord(Name, Bits, Val, NameLoc));
Bob Wilson21870412009-11-22 04:24:42 +00002117
Chris Lattnerf4601652007-11-22 20:49:04 +00002118 if (Lex.getCode() != tgtok::comma)
2119 return Result;
Bob Wilson21870412009-11-22 04:24:42 +00002120 Lex.Lex(); // eat the comma.
Chris Lattnerf4601652007-11-22 20:49:04 +00002121 }
2122}
2123
2124/// ParseTopLevelLet - Parse a 'let' at top level. This can be a couple of
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002125/// different related productions. This works inside multiclasses too.
Chris Lattnerf4601652007-11-22 20:49:04 +00002126///
2127/// Object ::= LET LetList IN '{' ObjectList '}'
2128/// Object ::= LET LetList IN Object
2129///
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002130bool TGParser::ParseTopLevelLet(MultiClass *CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002131 assert(Lex.getCode() == tgtok::Let && "Unexpected token");
2132 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002133
Chris Lattnerf4601652007-11-22 20:49:04 +00002134 // Add this entry to the let stack.
2135 std::vector<LetRecord> LetInfo = ParseLetList();
2136 if (LetInfo.empty()) return true;
2137 LetStack.push_back(LetInfo);
2138
2139 if (Lex.getCode() != tgtok::In)
2140 return TokError("expected 'in' at end of top-level 'let'");
2141 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002142
Chris Lattnerf4601652007-11-22 20:49:04 +00002143 // If this is a scalar let, just handle it now
2144 if (Lex.getCode() != tgtok::l_brace) {
2145 // LET LetList IN Object
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002146 if (ParseObject(CurMultiClass))
Chris Lattnerf4601652007-11-22 20:49:04 +00002147 return true;
2148 } else { // Object ::= LETCommand '{' ObjectList '}'
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002149 SMLoc BraceLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00002150 // Otherwise, this is a group let.
2151 Lex.Lex(); // eat the '{'.
Bob Wilson21870412009-11-22 04:24:42 +00002152
Chris Lattnerf4601652007-11-22 20:49:04 +00002153 // Parse the object list.
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002154 if (ParseObjectList(CurMultiClass))
Chris Lattnerf4601652007-11-22 20:49:04 +00002155 return true;
Bob Wilson21870412009-11-22 04:24:42 +00002156
Chris Lattnerf4601652007-11-22 20:49:04 +00002157 if (Lex.getCode() != tgtok::r_brace) {
2158 TokError("expected '}' at end of top level let command");
2159 return Error(BraceLoc, "to match this '{'");
2160 }
2161 Lex.Lex();
2162 }
Bob Wilson21870412009-11-22 04:24:42 +00002163
Chris Lattnerf4601652007-11-22 20:49:04 +00002164 // Outside this let scope, this let block is not active.
2165 LetStack.pop_back();
2166 return false;
2167}
2168
Chris Lattnerf4601652007-11-22 20:49:04 +00002169/// ParseMultiClass - Parse a multiclass definition.
2170///
Bob Wilson32558652009-04-28 19:41:44 +00002171/// MultiClassInst ::= MULTICLASS ID TemplateArgList?
Sean Silva9302dcc2013-01-09 02:11:55 +00002172/// ':' BaseMultiClassList '{' MultiClassObject+ '}'
2173/// MultiClassObject ::= DefInst
2174/// MultiClassObject ::= MultiClassInst
2175/// MultiClassObject ::= DefMInst
2176/// MultiClassObject ::= LETCommand '{' ObjectList '}'
2177/// MultiClassObject ::= LETCommand Object
Chris Lattnerf4601652007-11-22 20:49:04 +00002178///
2179bool TGParser::ParseMultiClass() {
2180 assert(Lex.getCode() == tgtok::MultiClass && "Unexpected token");
2181 Lex.Lex(); // Eat the multiclass token.
2182
2183 if (Lex.getCode() != tgtok::Id)
2184 return TokError("expected identifier after multiclass for name");
2185 std::string Name = Lex.getCurStrVal();
Bob Wilson21870412009-11-22 04:24:42 +00002186
Chris Lattnerf4601652007-11-22 20:49:04 +00002187 if (MultiClasses.count(Name))
2188 return TokError("multiclass '" + Name + "' already defined");
Bob Wilson21870412009-11-22 04:24:42 +00002189
Chris Lattner67db8832010-12-13 00:23:57 +00002190 CurMultiClass = MultiClasses[Name] = new MultiClass(Name,
2191 Lex.getLoc(), Records);
Chris Lattnerf4601652007-11-22 20:49:04 +00002192 Lex.Lex(); // Eat the identifier.
Bob Wilson21870412009-11-22 04:24:42 +00002193
Chris Lattnerf4601652007-11-22 20:49:04 +00002194 // If there are template args, parse them.
2195 if (Lex.getCode() == tgtok::less)
2196 if (ParseTemplateArgList(0))
2197 return true;
2198
David Greened34a73b2009-04-24 16:55:41 +00002199 bool inherits = false;
2200
David Greenede444af2009-04-22 16:42:54 +00002201 // If there are submulticlasses, parse them.
2202 if (Lex.getCode() == tgtok::colon) {
David Greened34a73b2009-04-24 16:55:41 +00002203 inherits = true;
2204
David Greenede444af2009-04-22 16:42:54 +00002205 Lex.Lex();
Bob Wilson32558652009-04-28 19:41:44 +00002206
David Greenede444af2009-04-22 16:42:54 +00002207 // Read all of the submulticlasses.
Bob Wilson32558652009-04-28 19:41:44 +00002208 SubMultiClassReference SubMultiClass =
2209 ParseSubMultiClassReference(CurMultiClass);
David Greenede444af2009-04-22 16:42:54 +00002210 while (1) {
2211 // Check for error.
2212 if (SubMultiClass.MC == 0) return true;
Bob Wilson32558652009-04-28 19:41:44 +00002213
David Greenede444af2009-04-22 16:42:54 +00002214 // Add it.
2215 if (AddSubMultiClass(CurMultiClass, SubMultiClass))
2216 return true;
Bob Wilson32558652009-04-28 19:41:44 +00002217
David Greenede444af2009-04-22 16:42:54 +00002218 if (Lex.getCode() != tgtok::comma) break;
2219 Lex.Lex(); // eat ','.
2220 SubMultiClass = ParseSubMultiClassReference(CurMultiClass);
2221 }
2222 }
2223
David Greened34a73b2009-04-24 16:55:41 +00002224 if (Lex.getCode() != tgtok::l_brace) {
2225 if (!inherits)
2226 return TokError("expected '{' in multiclass definition");
Bob Wilson21870412009-11-22 04:24:42 +00002227 else if (Lex.getCode() != tgtok::semi)
2228 return TokError("expected ';' in multiclass definition");
David Greened34a73b2009-04-24 16:55:41 +00002229 else
Bob Wilson21870412009-11-22 04:24:42 +00002230 Lex.Lex(); // eat the ';'.
2231 } else {
David Greened34a73b2009-04-24 16:55:41 +00002232 if (Lex.Lex() == tgtok::r_brace) // eat the '{'.
2233 return TokError("multiclass must contain at least one def");
Bob Wilson21870412009-11-22 04:24:42 +00002234
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002235 while (Lex.getCode() != tgtok::r_brace) {
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002236 switch (Lex.getCode()) {
2237 default:
David Greenea1b1b792011-10-07 18:25:05 +00002238 return TokError("expected 'let', 'def' or 'defm' in multiclass body");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002239 case tgtok::Let:
2240 case tgtok::Def:
2241 case tgtok::Defm:
David Greenecebb4ee2012-02-22 16:09:41 +00002242 case tgtok::Foreach:
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002243 if (ParseObject(CurMultiClass))
2244 return true;
2245 break;
2246 }
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002247 }
David Greened34a73b2009-04-24 16:55:41 +00002248 Lex.Lex(); // eat the '}'.
2249 }
Bob Wilson21870412009-11-22 04:24:42 +00002250
Chris Lattnerf4601652007-11-22 20:49:04 +00002251 CurMultiClass = 0;
2252 return false;
2253}
2254
David Greenee499a2d2011-10-05 22:42:07 +00002255Record *TGParser::
2256InstantiateMulticlassDef(MultiClass &MC,
2257 Record *DefProto,
David Greene7be867e2011-10-19 13:04:31 +00002258 Init *DefmPrefix,
Jordan Roseb50df4a2013-01-10 18:50:11 +00002259 SMRange DefmPrefixRange) {
David Greene7be867e2011-10-19 13:04:31 +00002260 // We need to preserve DefProto so it can be reused for later
2261 // instantiations, so create a new Record to inherit from it.
2262
David Greenee499a2d2011-10-05 22:42:07 +00002263 // Add in the defm name. If the defm prefix is empty, give each
2264 // instantiated def a unique name. Otherwise, if "#NAME#" exists in the
2265 // name, substitute the prefix for #NAME#. Otherwise, use the defm name
2266 // as a prefix.
David Greenee499a2d2011-10-05 22:42:07 +00002267
Jordan Rosed1220092013-01-10 18:50:05 +00002268 bool IsAnonymous = false;
2269 if (DefmPrefix == 0) {
David Greene7be867e2011-10-19 13:04:31 +00002270 DefmPrefix = StringInit::get(GetNewAnonymousName());
Jordan Rosed1220092013-01-10 18:50:05 +00002271 IsAnonymous = true;
2272 }
David Greene7be867e2011-10-19 13:04:31 +00002273
2274 Init *DefName = DefProto->getNameInit();
2275
Sean Silva6cfc8062012-10-10 20:24:43 +00002276 StringInit *DefNameString = dyn_cast<StringInit>(DefName);
David Greene7be867e2011-10-19 13:04:31 +00002277
David Greened3d1cad2011-10-19 13:04:43 +00002278 if (DefNameString != 0) {
2279 // We have a fully expanded string so there are no operators to
2280 // resolve. We should concatenate the given prefix and name.
David Greene7be867e2011-10-19 13:04:31 +00002281 DefName =
2282 BinOpInit::get(BinOpInit::STRCONCAT,
2283 UnOpInit::get(UnOpInit::CAST, DefmPrefix,
2284 StringRecTy::get())->Fold(DefProto, &MC),
2285 DefName, StringRecTy::get())->Fold(DefProto, &MC);
2286 }
David Greene7be867e2011-10-19 13:04:31 +00002287
Jakob Stoklund Olesen376a8a72012-08-22 23:33:58 +00002288 // Make a trail of SMLocs from the multiclass instantiations.
Jordan Roseb50df4a2013-01-10 18:50:11 +00002289 SmallVector<SMLoc, 4> Locs(1, DefmPrefixRange.Start);
Jakob Stoklund Olesen376a8a72012-08-22 23:33:58 +00002290 Locs.append(DefProto->getLoc().begin(), DefProto->getLoc().end());
Jordan Rosed1220092013-01-10 18:50:05 +00002291 Record *CurRec = new Record(DefName, Locs, Records, IsAnonymous);
David Greenee499a2d2011-10-05 22:42:07 +00002292
2293 SubClassReference Ref;
Jordan Roseb50df4a2013-01-10 18:50:11 +00002294 Ref.RefRange = DefmPrefixRange;
David Greenee499a2d2011-10-05 22:42:07 +00002295 Ref.Rec = DefProto;
2296 AddSubClass(CurRec, Ref);
2297
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002298 // Set the value for NAME. We don't resolve references to it 'til later,
2299 // though, so that uses in nested multiclass names don't get
2300 // confused.
Jordan Roseb50df4a2013-01-10 18:50:11 +00002301 if (SetValue(CurRec, Ref.RefRange.Start, "NAME", std::vector<unsigned>(),
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002302 DefmPrefix)) {
Jordan Roseb50df4a2013-01-10 18:50:11 +00002303 Error(DefmPrefixRange.Start, "Could not resolve "
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002304 + CurRec->getNameInitAsString() + ":NAME to '"
2305 + DefmPrefix->getAsUnquotedString() + "'");
2306 return 0;
2307 }
David Greenee5b252f2011-10-19 13:04:35 +00002308
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002309 // If the DefNameString didn't resolve, we probably have a reference to
2310 // NAME and need to replace it. We need to do at least this much greedily,
2311 // otherwise nested multiclasses will end up with incorrect NAME expansions.
2312 if (DefNameString == 0) {
David Greenee5b252f2011-10-19 13:04:35 +00002313 RecordVal *DefNameRV = CurRec->getValue("NAME");
2314 CurRec->resolveReferencesTo(DefNameRV);
2315 }
2316
2317 if (!CurMultiClass) {
Jim Grosbachcfbda4a2012-08-02 18:46:42 +00002318 // Now that we're at the top level, resolve all NAME references
2319 // in the resultant defs that weren't in the def names themselves.
2320 RecordVal *DefNameRV = CurRec->getValue("NAME");
2321 CurRec->resolveReferencesTo(DefNameRV);
2322
2323 // Now that NAME references are resolved and we're at the top level of
2324 // any multiclass expansions, add the record to the RecordKeeper. If we are
David Greenee5b252f2011-10-19 13:04:35 +00002325 // currently in a multiclass, it means this defm appears inside a
2326 // multiclass and its name won't be fully resolvable until we see
2327 // the top-level defm. Therefore, we don't add this to the
2328 // RecordKeeper at this point. If we did we could get duplicate
2329 // defs as more than one probably refers to NAME or some other
2330 // common internal placeholder.
2331
2332 // Ensure redefinition doesn't happen.
2333 if (Records.getDef(CurRec->getNameInitAsString())) {
Jordan Roseb50df4a2013-01-10 18:50:11 +00002334 Error(DefmPrefixRange.Start, "def '" + CurRec->getNameInitAsString() +
David Greenee5b252f2011-10-19 13:04:35 +00002335 "' already defined, instantiating defm with subdef '" +
2336 DefProto->getNameInitAsString() + "'");
2337 return 0;
2338 }
2339
2340 Records.addDef(CurRec);
2341 }
2342
David Greenee499a2d2011-10-05 22:42:07 +00002343 return CurRec;
2344}
2345
2346bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC,
2347 Record *CurRec,
2348 SMLoc DefmPrefixLoc,
2349 SMLoc SubClassLoc,
David Greenee22b3212011-10-19 13:02:42 +00002350 const std::vector<Init *> &TArgs,
David Greenee499a2d2011-10-05 22:42:07 +00002351 std::vector<Init *> &TemplateVals,
2352 bool DeleteArgs) {
2353 // Loop over all of the template arguments, setting them to the specified
2354 // value or leaving them as the default if necessary.
2355 for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
2356 // Check if a value is specified for this temp-arg.
2357 if (i < TemplateVals.size()) {
2358 // Set it now.
2359 if (SetValue(CurRec, DefmPrefixLoc, TArgs[i], std::vector<unsigned>(),
2360 TemplateVals[i]))
2361 return true;
2362
2363 // Resolve it next.
2364 CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i]));
2365
2366 if (DeleteArgs)
2367 // Now remove it.
2368 CurRec->removeValue(TArgs[i]);
2369
2370 } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) {
2371 return Error(SubClassLoc, "value not specified for template argument #"+
David Greenee22b3212011-10-19 13:02:42 +00002372 utostr(i) + " (" + TArgs[i]->getAsUnquotedString()
2373 + ") of multiclassclass '" + MC.Rec.getNameInitAsString()
2374 + "'");
David Greenee499a2d2011-10-05 22:42:07 +00002375 }
2376 }
2377 return false;
2378}
2379
2380bool TGParser::ResolveMulticlassDef(MultiClass &MC,
2381 Record *CurRec,
2382 Record *DefProto,
2383 SMLoc DefmPrefixLoc) {
2384 // If the mdef is inside a 'let' expression, add to each def.
Sean Silva9cceede2013-01-09 04:49:14 +00002385 if (ApplyLetStack(CurRec))
2386 return Error(DefmPrefixLoc, "when instantiating this defm");
David Greenee499a2d2011-10-05 22:42:07 +00002387
David Greenee499a2d2011-10-05 22:42:07 +00002388 // Don't create a top level definition for defm inside multiclasses,
2389 // instead, only update the prototypes and bind the template args
2390 // with the new created definition.
Sean Silva699b8702013-01-09 05:28:12 +00002391 if (!CurMultiClass)
2392 return false;
2393 for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size();
2394 i != e; ++i)
2395 if (CurMultiClass->DefPrototypes[i]->getNameInit()
2396 == CurRec->getNameInit())
2397 return Error(DefmPrefixLoc, "defm '" + CurRec->getNameInitAsString() +
2398 "' already defined in this multiclass!");
2399 CurMultiClass->DefPrototypes.push_back(CurRec);
David Greenee499a2d2011-10-05 22:42:07 +00002400
Sean Silva699b8702013-01-09 05:28:12 +00002401 // Copy the template arguments for the multiclass into the new def.
2402 const std::vector<Init *> &TA =
2403 CurMultiClass->Rec.getTemplateArgs();
David Greenee499a2d2011-10-05 22:42:07 +00002404
Sean Silva699b8702013-01-09 05:28:12 +00002405 for (unsigned i = 0, e = TA.size(); i != e; ++i) {
2406 const RecordVal *RV = CurMultiClass->Rec.getValue(TA[i]);
2407 assert(RV && "Template arg doesn't exist?");
2408 CurRec->addValue(*RV);
David Greenee499a2d2011-10-05 22:42:07 +00002409 }
2410
2411 return false;
2412}
2413
Chris Lattnerf4601652007-11-22 20:49:04 +00002414/// ParseDefm - Parse the instantiation of a multiclass.
2415///
2416/// DefMInst ::= DEFM ID ':' DefmSubClassRef ';'
2417///
Bruno Cardoso Lopes270562b2010-06-05 02:11:52 +00002418bool TGParser::ParseDefm(MultiClass *CurMultiClass) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002419 assert(Lex.getCode() == tgtok::Defm && "Unexpected token!");
Jordan Roseb50df4a2013-01-10 18:50:11 +00002420 SMLoc DefmLoc = Lex.getLoc();
David Greenea9e07dd2011-10-19 13:04:29 +00002421 Init *DefmPrefix = 0;
David Greenea9e07dd2011-10-19 13:04:29 +00002422
Craig Topper6a59f5a2013-01-07 05:09:33 +00002423 if (Lex.Lex() == tgtok::Id) { // eat the defm.
David Greenea9e07dd2011-10-19 13:04:29 +00002424 DefmPrefix = ParseObjectName(CurMultiClass);
Chris Lattnerdf72eae2010-10-05 22:51:56 +00002425 }
Mikhail Glushenkovc761f7d2010-10-23 07:32:37 +00002426
Jordan Roseb50df4a2013-01-10 18:50:11 +00002427 SMLoc DefmPrefixEndLoc = Lex.getLoc();
Chris Lattnerdf72eae2010-10-05 22:51:56 +00002428 if (Lex.getCode() != tgtok::colon)
Chris Lattnerf4601652007-11-22 20:49:04 +00002429 return TokError("expected ':' after defm identifier");
Bob Wilson21870412009-11-22 04:24:42 +00002430
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002431 // Keep track of the new generated record definitions.
2432 std::vector<Record*> NewRecDefs;
2433
2434 // This record also inherits from a regular class (non-multiclass)?
2435 bool InheritFromClass = false;
2436
Chris Lattnerf4601652007-11-22 20:49:04 +00002437 // eat the colon.
2438 Lex.Lex();
2439
Chris Lattner1e3a8a42009-06-21 03:39:35 +00002440 SMLoc SubClassLoc = Lex.getLoc();
Chris Lattnerf4601652007-11-22 20:49:04 +00002441 SubClassReference Ref = ParseSubClassReference(0, true);
David Greene56546132009-04-22 22:17:51 +00002442
2443 while (1) {
2444 if (Ref.Rec == 0) return true;
2445
2446 // To instantiate a multiclass, we need to first get the multiclass, then
2447 // instantiate each def contained in the multiclass with the SubClassRef
2448 // template parameters.
2449 MultiClass *MC = MultiClasses[Ref.Rec->getName()];
2450 assert(MC && "Didn't lookup multiclass correctly?");
David Greene05bce0b2011-07-29 22:43:06 +00002451 std::vector<Init*> &TemplateVals = Ref.TemplateArgs;
David Greene56546132009-04-22 22:17:51 +00002452
2453 // Verify that the correct number of template arguments were specified.
David Greenee22b3212011-10-19 13:02:42 +00002454 const std::vector<Init *> &TArgs = MC->Rec.getTemplateArgs();
David Greene56546132009-04-22 22:17:51 +00002455 if (TArgs.size() < TemplateVals.size())
2456 return Error(SubClassLoc,
2457 "more template args specified than multiclass expects");
2458
2459 // Loop over all the def's in the multiclass, instantiating each one.
2460 for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) {
2461 Record *DefProto = MC->DefPrototypes[i];
2462
Jordan Roseb50df4a2013-01-10 18:50:11 +00002463 Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix,
2464 SMRange(DefmLoc,
2465 DefmPrefixEndLoc));
Jim Grosbach94f2dc92011-12-02 18:33:03 +00002466 if (!CurRec)
2467 return true;
David Greene065f2592009-05-05 16:28:25 +00002468
Jordan Roseb50df4a2013-01-10 18:50:11 +00002469 if (ResolveMulticlassDefArgs(*MC, CurRec, DefmLoc, SubClassLoc,
David Greenee499a2d2011-10-05 22:42:07 +00002470 TArgs, TemplateVals, true/*Delete args*/))
2471 return Error(SubClassLoc, "could not instantiate def");
David Greene56546132009-04-22 22:17:51 +00002472
Jordan Roseb50df4a2013-01-10 18:50:11 +00002473 if (ResolveMulticlassDef(*MC, CurRec, DefProto, DefmLoc))
David Greenee499a2d2011-10-05 22:42:07 +00002474 return Error(SubClassLoc, "could not instantiate def");
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002475
2476 NewRecDefs.push_back(CurRec);
David Greene56546132009-04-22 22:17:51 +00002477 }
2478
David Greenee499a2d2011-10-05 22:42:07 +00002479
David Greene56546132009-04-22 22:17:51 +00002480 if (Lex.getCode() != tgtok::comma) break;
2481 Lex.Lex(); // eat ','.
2482
2483 SubClassLoc = Lex.getLoc();
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002484
2485 // A defm can inherit from regular classes (non-multiclass) as
2486 // long as they come in the end of the inheritance list.
2487 InheritFromClass = (Records.getClass(Lex.getCurStrVal()) != 0);
2488
2489 if (InheritFromClass)
2490 break;
2491
David Greene56546132009-04-22 22:17:51 +00002492 Ref = ParseSubClassReference(0, true);
2493 }
2494
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002495 if (InheritFromClass) {
2496 // Process all the classes to inherit as if they were part of a
2497 // regular 'def' and inherit all record values.
2498 SubClassReference SubClass = ParseSubClassReference(0, false);
2499 while (1) {
2500 // Check for error.
2501 if (SubClass.Rec == 0) return true;
2502
2503 // Get the expanded definition prototypes and teach them about
2504 // the record values the current class to inherit has
2505 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) {
2506 Record *CurRec = NewRecDefs[i];
2507
2508 // Add it.
2509 if (AddSubClass(CurRec, SubClass))
2510 return true;
2511
Sean Silva9cceede2013-01-09 04:49:14 +00002512 if (ApplyLetStack(CurRec))
2513 return true;
Bruno Cardoso Lopes6e0a99a2010-06-18 19:53:41 +00002514 }
2515
2516 if (Lex.getCode() != tgtok::comma) break;
2517 Lex.Lex(); // eat ','.
2518 SubClass = ParseSubClassReference(0, false);
2519 }
2520 }
2521
Bruno Cardoso Lopese5104ac2010-06-22 20:30:50 +00002522 if (!CurMultiClass)
2523 for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i)
David Greene0d886402011-08-10 18:27:46 +00002524 // See Record::setName(). This resolve step will see any new
2525 // name for the def that might have been created when resolving
2526 // inheritance, values and arguments above.
Bruno Cardoso Lopese5104ac2010-06-22 20:30:50 +00002527 NewRecDefs[i]->resolveReferences();
2528
Chris Lattnerf4601652007-11-22 20:49:04 +00002529 if (Lex.getCode() != tgtok::semi)
2530 return TokError("expected ';' at end of defm");
2531 Lex.Lex();
Bob Wilson21870412009-11-22 04:24:42 +00002532
Chris Lattnerf4601652007-11-22 20:49:04 +00002533 return false;
2534}
2535
2536/// ParseObject
2537/// Object ::= ClassInst
2538/// Object ::= DefInst
2539/// Object ::= MultiClassInst
2540/// Object ::= DefMInst
2541/// Object ::= LETCommand '{' ObjectList '}'
2542/// Object ::= LETCommand Object
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002543bool TGParser::ParseObject(MultiClass *MC) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002544 switch (Lex.getCode()) {
Chris Lattnerd6d9dd92010-10-31 19:27:15 +00002545 default:
2546 return TokError("Expected class, def, defm, multiclass or let definition");
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002547 case tgtok::Let: return ParseTopLevelLet(MC);
2548 case tgtok::Def: return ParseDef(MC);
David Greenecebb4ee2012-02-22 16:09:41 +00002549 case tgtok::Foreach: return ParseForeach(MC);
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002550 case tgtok::Defm: return ParseDefm(MC);
Chris Lattnerf4601652007-11-22 20:49:04 +00002551 case tgtok::Class: return ParseClass();
2552 case tgtok::MultiClass: return ParseMultiClass();
2553 }
2554}
2555
2556/// ParseObjectList
2557/// ObjectList :== Object*
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002558bool TGParser::ParseObjectList(MultiClass *MC) {
Chris Lattnerf4601652007-11-22 20:49:04 +00002559 while (isObjectStart(Lex.getCode())) {
Bruno Cardoso Lopesee65db32010-06-10 02:42:59 +00002560 if (ParseObject(MC))
Chris Lattnerf4601652007-11-22 20:49:04 +00002561 return true;
2562 }
2563 return false;
2564}
2565
Chris Lattnerf4601652007-11-22 20:49:04 +00002566bool TGParser::ParseFile() {
2567 Lex.Lex(); // Prime the lexer.
2568 if (ParseObjectList()) return true;
Bob Wilson21870412009-11-22 04:24:42 +00002569
Chris Lattnerf4601652007-11-22 20:49:04 +00002570 // If we have unread input at the end of the file, report it.
2571 if (Lex.getCode() == tgtok::Eof)
2572 return false;
Bob Wilson21870412009-11-22 04:24:42 +00002573
Chris Lattnerf4601652007-11-22 20:49:04 +00002574 return TokError("Unexpected input at top level");
2575}
2576