Unconstify Inits
[oota-llvm.git] / utils / TableGen / Record.h
1
2 //===- Record.h - Classes to represent Table Records ------------*- C++ -*-===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This file defines the main TableGen data structures, including the TableGen
12 // types, values, and high-level data structures.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #ifndef RECORD_H
17 #define RECORD_H
18
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/FoldingSet.h"
21 #include "llvm/Support/Allocator.h"
22 #include "llvm/Support/SourceMgr.h"
23 #include "llvm/Support/DataTypes.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <map>
26
27 namespace llvm {
28 class raw_ostream;
29
30 // RecTy subclasses.
31 class BitRecTy;
32 class BitsRecTy;
33 class IntRecTy;
34 class StringRecTy;
35 class ListRecTy;
36 class CodeRecTy;
37 class DagRecTy;
38 class RecordRecTy;
39
40 // Init subclasses.
41 class Init;
42 class UnsetInit;
43 class BitInit;
44 class BitsInit;
45 class IntInit;
46 class StringInit;
47 class CodeInit;
48 class ListInit;
49 class UnOpInit;
50 class BinOpInit;
51 class TernOpInit;
52 class DefInit;
53 class DagInit;
54 class TypedInit;
55 class VarInit;
56 class FieldInit;
57 class VarBitInit;
58 class VarListElementInit;
59
60 // Other classes.
61 class Record;
62 class RecordVal;
63 struct MultiClass;
64 class RecordKeeper;
65
66 //===----------------------------------------------------------------------===//
67 //  Type Classes
68 //===----------------------------------------------------------------------===//
69
70 class RecTy {
71   ListRecTy *ListTy;
72 public:
73   RecTy() : ListTy(0) {}
74   virtual ~RecTy() {}
75
76   virtual std::string getAsString() const = 0;
77   void print(raw_ostream &OS) const { OS << getAsString(); }
78   void dump() const;
79
80   /// typeIsConvertibleTo - Return true if all values of 'this' type can be
81   /// converted to the specified type.
82   virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0;
83
84   /// getListTy - Returns the type representing list<this>.
85   ListRecTy *getListTy();
86
87 public:   // These methods should only be called from subclasses of Init
88   virtual Init *convertValue( UnsetInit *UI) { return 0; }
89   virtual Init *convertValue(   BitInit *BI) { return 0; }
90   virtual Init *convertValue(  BitsInit *BI) { return 0; }
91   virtual Init *convertValue(   IntInit *II) { return 0; }
92   virtual Init *convertValue(StringInit *SI) { return 0; }
93   virtual Init *convertValue(  ListInit *LI) { return 0; }
94   virtual Init *convertValue( UnOpInit *UI) {
95     return convertValue((TypedInit*)UI);
96   }
97   virtual Init *convertValue( BinOpInit *UI) {
98     return convertValue((TypedInit*)UI);
99   }
100   virtual Init *convertValue( TernOpInit *UI) {
101     return convertValue((TypedInit*)UI);
102   }
103   virtual Init *convertValue(  CodeInit *CI) { return 0; }
104   virtual Init *convertValue(VarBitInit *VB) { return 0; }
105   virtual Init *convertValue(   DefInit *DI) { return 0; }
106   virtual Init *convertValue(   DagInit *DI) { return 0; }
107   virtual Init *convertValue( TypedInit *TI) { return 0; }
108   virtual Init *convertValue(   VarInit *VI) {
109     return convertValue((TypedInit*)VI);
110   }
111   virtual Init *convertValue( FieldInit *FI) {
112     return convertValue((TypedInit*)FI);
113   }
114
115 public:   // These methods should only be called by subclasses of RecTy.
116   // baseClassOf - These virtual methods should be overloaded to return true iff
117   // all values of type 'RHS' can be converted to the 'this' type.
118   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
119   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
120   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
121   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
122   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
123   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
124   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
125   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
126 };
127
128 inline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) {
129   Ty.print(OS);
130   return OS;
131 }
132
133
134 /// BitRecTy - 'bit' - Represent a single bit
135 ///
136 class BitRecTy : public RecTy {
137   static BitRecTy Shared;
138   BitRecTy() {}
139 public:
140   static BitRecTy *get() { return &Shared; }
141
142   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
143   virtual Init *convertValue(   BitInit *BI) { return (Init*)BI; }
144   virtual Init *convertValue(  BitsInit *BI);
145   virtual Init *convertValue(   IntInit *II);
146   virtual Init *convertValue(StringInit *SI) { return 0; }
147   virtual Init *convertValue(  ListInit *LI) { return 0; }
148   virtual Init *convertValue(  CodeInit *CI) { return 0; }
149   virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
150   virtual Init *convertValue(   DefInit *DI) { return 0; }
151   virtual Init *convertValue(   DagInit *DI) { return 0; }
152   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
153   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
154   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
155   virtual Init *convertValue( TypedInit *TI);
156   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
157   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
158
159   std::string getAsString() const { return "bit"; }
160
161   bool typeIsConvertibleTo(const RecTy *RHS) const {
162     return RHS->baseClassOf(this);
163   }
164   virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
165   virtual bool baseClassOf(const BitsRecTy   *RHS) const;
166   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
167   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
168   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
169   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
170   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
171   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
172
173 };
174
175
176 // BitsRecTy - 'bits<n>' - Represent a fixed number of bits
177 /// BitsRecTy - 'bits&lt;n&gt;' - Represent a fixed number of bits
178 ///
179 class BitsRecTy : public RecTy {
180   unsigned Size;
181   explicit BitsRecTy(unsigned Sz) : Size(Sz) {}
182 public:
183   static BitsRecTy *get(unsigned Sz);
184
185   unsigned getNumBits() const { return Size; }
186
187   virtual Init *convertValue( UnsetInit *UI);
188   virtual Init *convertValue(   BitInit *UI);
189   virtual Init *convertValue(  BitsInit *BI);
190   virtual Init *convertValue(   IntInit *II);
191   virtual Init *convertValue(StringInit *SI) { return 0; }
192   virtual Init *convertValue(  ListInit *LI) { return 0; }
193   virtual Init *convertValue(  CodeInit *CI) { return 0; }
194   virtual Init *convertValue(VarBitInit *VB) { return 0; }
195   virtual Init *convertValue(   DefInit *DI) { return 0; }
196   virtual Init *convertValue(   DagInit *DI) { return 0; }
197   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
198   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
199   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
200   virtual Init *convertValue( TypedInit *TI);
201   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
202   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
203
204   std::string getAsString() const;
205
206   bool typeIsConvertibleTo(const RecTy *RHS) const {
207     return RHS->baseClassOf(this);
208   }
209   virtual bool baseClassOf(const BitRecTy    *RHS) const { return Size == 1; }
210   virtual bool baseClassOf(const BitsRecTy   *RHS) const {
211     return RHS->Size == Size;
212   }
213   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
214   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
215   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
216   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
217   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
218   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
219
220 };
221
222
223 /// IntRecTy - 'int' - Represent an integer value of no particular size
224 ///
225 class IntRecTy : public RecTy {
226   static IntRecTy Shared;
227   IntRecTy() {}
228 public:
229   static IntRecTy *get() { return &Shared; }
230
231   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
232   virtual Init *convertValue(   BitInit *BI);
233   virtual Init *convertValue(  BitsInit *BI);
234   virtual Init *convertValue(   IntInit *II) { return (Init*)II; }
235   virtual Init *convertValue(StringInit *SI) { return 0; }
236   virtual Init *convertValue(  ListInit *LI) { return 0; }
237   virtual Init *convertValue(  CodeInit *CI) { return 0; }
238   virtual Init *convertValue(VarBitInit *VB) { return 0; }
239   virtual Init *convertValue(   DefInit *DI) { return 0; }
240   virtual Init *convertValue(   DagInit *DI) { return 0; }
241   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
242   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
243   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
244   virtual Init *convertValue( TypedInit *TI);
245   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
246   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
247
248   std::string getAsString() const { return "int"; }
249
250   bool typeIsConvertibleTo(const RecTy *RHS) const {
251     return RHS->baseClassOf(this);
252   }
253
254   virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
255   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return true; }
256   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
257   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
258   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
259   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
260   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
261   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
262
263 };
264
265 /// StringRecTy - 'string' - Represent an string value
266 ///
267 class StringRecTy : public RecTy {
268   static StringRecTy Shared;
269   StringRecTy() {}
270 public:
271   static StringRecTy *get() { return &Shared; }
272
273   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
274   virtual Init *convertValue(   BitInit *BI) { return 0; }
275   virtual Init *convertValue(  BitsInit *BI) { return 0; }
276   virtual Init *convertValue(   IntInit *II) { return 0; }
277   virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
278   virtual Init *convertValue(  ListInit *LI) { return 0; }
279   virtual Init *convertValue( UnOpInit *BO);
280   virtual Init *convertValue( BinOpInit *BO);
281   virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
282
283   virtual Init *convertValue(  CodeInit *CI) { return 0; }
284   virtual Init *convertValue(VarBitInit *VB) { return 0; }
285   virtual Init *convertValue(   DefInit *DI) { return 0; }
286   virtual Init *convertValue(   DagInit *DI) { return 0; }
287   virtual Init *convertValue( TypedInit *TI);
288   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
289   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
290
291   std::string getAsString() const { return "string"; }
292
293   bool typeIsConvertibleTo(const RecTy *RHS) const {
294     return RHS->baseClassOf(this);
295   }
296
297   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
298   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
299   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
300   virtual bool baseClassOf(const StringRecTy *RHS) const { return true; }
301   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
302   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
303   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
304   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
305 };
306
307 // ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
308 // the specified type.
309 /// ListRecTy - 'list&lt;Ty&gt;' - Represent a list of values, all of which must
310 /// be of the specified type.
311 ///
312 class ListRecTy : public RecTy {
313   RecTy *Ty;
314   explicit ListRecTy(RecTy *T) : Ty(T) {}
315   friend ListRecTy *RecTy::getListTy();
316 public:
317   static ListRecTy *get(RecTy *T) { return T->getListTy(); }
318   RecTy *getElementType() const { return Ty; }
319
320   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
321   virtual Init *convertValue(   BitInit *BI) { return 0; }
322   virtual Init *convertValue(  BitsInit *BI) { return 0; }
323   virtual Init *convertValue(   IntInit *II) { return 0; }
324   virtual Init *convertValue(StringInit *SI) { return 0; }
325   virtual Init *convertValue(  ListInit *LI);
326   virtual Init *convertValue(  CodeInit *CI) { return 0; }
327   virtual Init *convertValue(VarBitInit *VB) { return 0; }
328   virtual Init *convertValue(   DefInit *DI) { return 0; }
329   virtual Init *convertValue(   DagInit *DI) { return 0; }
330   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
331   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
332   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
333   virtual Init *convertValue( TypedInit *TI);
334   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
335   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
336
337   std::string getAsString() const;
338
339   bool typeIsConvertibleTo(const RecTy *RHS) const {
340     return RHS->baseClassOf(this);
341   }
342
343   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
344   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
345   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
346   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
347   virtual bool baseClassOf(const ListRecTy   *RHS) const {
348     return RHS->getElementType()->typeIsConvertibleTo(Ty);
349   }
350   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
351   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
352   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
353 };
354
355 /// CodeRecTy - 'code' - Represent an code fragment, function or method.
356 ///
357 class CodeRecTy : public RecTy {
358   static CodeRecTy Shared;
359   CodeRecTy() {}
360 public:
361   static CodeRecTy *get() { return &Shared; }
362
363   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
364   virtual Init *convertValue(   BitInit *BI) { return 0; }
365   virtual Init *convertValue(  BitsInit *BI) { return 0; }
366   virtual Init *convertValue(   IntInit *II) { return 0; }
367   virtual Init *convertValue(StringInit *SI) { return 0; }
368   virtual Init *convertValue(  ListInit *LI) { return 0; }
369   virtual Init *convertValue(  CodeInit *CI) { return (Init*)CI; }
370   virtual Init *convertValue(VarBitInit *VB) { return 0; }
371   virtual Init *convertValue(   DefInit *DI) { return 0; }
372   virtual Init *convertValue(   DagInit *DI) { return 0; }
373   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
374   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
375   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
376   virtual Init *convertValue( TypedInit *TI);
377   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
378   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
379
380   std::string getAsString() const { return "code"; }
381
382   bool typeIsConvertibleTo(const RecTy *RHS) const {
383     return RHS->baseClassOf(this);
384   }
385   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
386   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
387   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
388   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
389   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
390   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return true; }
391   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
392   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
393 };
394
395 /// DagRecTy - 'dag' - Represent a dag fragment
396 ///
397 class DagRecTy : public RecTy {
398   static DagRecTy Shared;
399   DagRecTy() {}
400 public:
401   static DagRecTy *get() { return &Shared; }
402
403   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
404   virtual Init *convertValue(   BitInit *BI) { return 0; }
405   virtual Init *convertValue(  BitsInit *BI) { return 0; }
406   virtual Init *convertValue(   IntInit *II) { return 0; }
407   virtual Init *convertValue(StringInit *SI) { return 0; }
408   virtual Init *convertValue(  ListInit *LI) { return 0; }
409   virtual Init *convertValue(  CodeInit *CI) { return 0; }
410   virtual Init *convertValue(VarBitInit *VB) { return 0; }
411   virtual Init *convertValue(   DefInit *DI) { return 0; }
412   virtual Init *convertValue( UnOpInit *BO);
413   virtual Init *convertValue( BinOpInit *BO);
414   virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
415   virtual Init *convertValue(   DagInit *CI) { return (Init*)CI; }
416   virtual Init *convertValue( TypedInit *TI);
417   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
418   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
419
420   std::string getAsString() const { return "dag"; }
421
422   bool typeIsConvertibleTo(const RecTy *RHS) const {
423     return RHS->baseClassOf(this);
424   }
425
426   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
427   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
428   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
429   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
430   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
431   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
432   virtual bool baseClassOf(const DagRecTy    *RHS) const { return true; }
433   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
434 };
435
436
437 /// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
438 /// (R32 X = EAX).
439 ///
440 class RecordRecTy : public RecTy {
441   Record *Rec;
442   explicit RecordRecTy(Record *R) : Rec(R) {}
443   friend class Record;
444 public:
445   static RecordRecTy *get(Record *R);
446
447   Record *getRecord() const { return Rec; }
448
449   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
450   virtual Init *convertValue(   BitInit *BI) { return 0; }
451   virtual Init *convertValue(  BitsInit *BI) { return 0; }
452   virtual Init *convertValue(   IntInit *II) { return 0; }
453   virtual Init *convertValue(StringInit *SI) { return 0; }
454   virtual Init *convertValue(  ListInit *LI) { return 0; }
455   virtual Init *convertValue(  CodeInit *CI) { return 0; }
456   virtual Init *convertValue(VarBitInit *VB) { return 0; }
457   virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
458   virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
459   virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
460   virtual Init *convertValue(   DefInit *DI);
461   virtual Init *convertValue(   DagInit *DI) { return 0; }
462   virtual Init *convertValue( TypedInit *VI);
463   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
464   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
465
466   std::string getAsString() const;
467
468   bool typeIsConvertibleTo(const RecTy *RHS) const {
469     return RHS->baseClassOf(this);
470   }
471   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
472   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
473   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
474   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
475   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
476   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
477   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
478   virtual bool baseClassOf(const RecordRecTy *RHS) const;
479 };
480
481 /// resolveTypes - Find a common type that T1 and T2 convert to.
482 /// Return 0 if no such type exists.
483 ///
484 RecTy *resolveTypes(RecTy *T1, RecTy *T2);
485
486 //===----------------------------------------------------------------------===//
487 //  Initializer Classes
488 //===----------------------------------------------------------------------===//
489
490 class Init {
491   Init(const Init &);  // Do not define.
492   Init &operator=(const Init &);  // Do not define.
493
494 protected:
495   Init(void) {}
496
497 public:
498   virtual ~Init() {}
499
500   /// isComplete - This virtual method should be overridden by values that may
501   /// not be completely specified yet.
502   virtual bool isComplete() const { return true; }
503
504   /// print - Print out this value.
505   void print(raw_ostream &OS) const { OS << getAsString(); }
506
507   /// getAsString - Convert this value to a string form.
508   virtual std::string getAsString() const = 0;
509
510   /// dump - Debugging method that may be called through a debugger, just
511   /// invokes print on stderr.
512   void dump() const;
513
514   /// convertInitializerTo - This virtual function is a simple call-back
515   /// function that should be overridden to call the appropriate
516   /// RecTy::convertValue method.
517   ///
518   virtual Init *convertInitializerTo(RecTy *Ty) const = 0;
519
520   /// convertInitializerBitRange - This method is used to implement the bitrange
521   /// selection operator.  Given an initializer, it selects the specified bits
522   /// out, returning them as a new init of bits type.  If it is not legal to use
523   /// the bit subscript operator on this initializer, return null.
524   ///
525   virtual Init *
526   convertInitializerBitRange(const std::vector<unsigned> &Bits) const {
527     return 0;
528   }
529
530   /// convertInitListSlice - This method is used to implement the list slice
531   /// selection operator.  Given an initializer, it selects the specified list
532   /// elements, returning them as a new init of list type.  If it is not legal
533   /// to take a slice of this, return null.
534   ///
535   virtual Init *
536   convertInitListSlice(const std::vector<unsigned> &Elements) const {
537     return 0;
538   }
539
540   /// getFieldType - This method is used to implement the FieldInit class.
541   /// Implementors of this method should return the type of the named field if
542   /// they are of record type.
543   ///
544   virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
545
546   /// getFieldInit - This method complements getFieldType to return the
547   /// initializer for the specified field.  If getFieldType returns non-null
548   /// this method should return non-null, otherwise it returns null.
549   ///
550   virtual Init *getFieldInit(Record &R, const RecordVal *RV,
551                              const std::string &FieldName) const {
552     return 0;
553   }
554
555   /// resolveReferences - This method is used by classes that refer to other
556   /// variables which may not be defined at the time the expression is formed.
557   /// If a value is set for the variable later, this method will be called on
558   /// users of the value to allow the value to propagate out.
559   ///
560   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const {
561     return const_cast<Init *>(this);
562   }
563 };
564
565 inline raw_ostream &operator<<(raw_ostream &OS, const Init &I) {
566   I.print(OS); return OS;
567 }
568
569 /// TypedInit - This is the common super-class of types that have a specific,
570 /// explicit, type.
571 ///
572 class TypedInit : public Init {
573   RecTy *Ty;
574
575   TypedInit(const TypedInit &Other);  // Do not define.
576   TypedInit &operator=(const TypedInit &Other);  // Do not define.
577
578 protected:
579   explicit TypedInit(RecTy *T) : Ty(T) {}
580
581 public:
582   RecTy *getType() const { return Ty; }
583
584   virtual Init *
585   convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
586   virtual Init *
587   convertInitListSlice(const std::vector<unsigned> &Elements) const;
588
589   /// getFieldType - This method is used to implement the FieldInit class.
590   /// Implementors of this method should return the type of the named field if
591   /// they are of record type.
592   ///
593   virtual RecTy *getFieldType(const std::string &FieldName) const;
594
595   /// resolveBitReference - This method is used to implement
596   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
597   /// simply return the resolved value, otherwise we return null.
598   ///
599   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
600                                     unsigned Bit) const = 0;
601
602   /// resolveListElementReference - This method is used to implement
603   /// VarListElementInit::resolveReferences.  If the list element is resolvable
604   /// now, we return the resolved value, otherwise we return null.
605   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
606                                             unsigned Elt) const = 0;
607 };
608
609
610 /// UnsetInit - ? - Represents an uninitialized value
611 ///
612 class UnsetInit : public Init {
613   UnsetInit() : Init() {}
614   UnsetInit(const UnsetInit &);  // Do not define.
615   UnsetInit &operator=(const UnsetInit &Other);  // Do not define.
616
617 public:
618   static UnsetInit *get();
619
620   virtual Init *convertInitializerTo(RecTy *Ty) const {
621     return Ty->convertValue(const_cast<UnsetInit *>(this));
622   }
623
624   virtual bool isComplete() const { return false; }
625   virtual std::string getAsString() const { return "?"; }
626 };
627
628
629 /// BitInit - true/false - Represent a concrete initializer for a bit.
630 ///
631 class BitInit : public Init {
632   bool Value;
633
634   explicit BitInit(bool V) : Value(V) {}
635   BitInit(const BitInit &Other);  // Do not define.
636   BitInit &operator=(BitInit &Other);  // Do not define.
637
638 public:
639   static BitInit *get(bool V);
640
641   bool getValue() const { return Value; }
642
643   virtual Init *convertInitializerTo(RecTy *Ty) const {
644     return Ty->convertValue(const_cast<BitInit *>(this));
645   }
646
647   virtual std::string getAsString() const { return Value ? "1" : "0"; }
648 };
649
650 /// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
651 /// It contains a vector of bits, whose size is determined by the type.
652 ///
653 class BitsInit : public Init, public FoldingSetNode {
654   std::vector<Init*> Bits;
655
656   BitsInit(ArrayRef<Init *> Range) : Bits(Range.begin(), Range.end()) {}
657
658   BitsInit(const BitsInit &Other);  // Do not define.
659   BitsInit &operator=(const BitsInit &Other);  // Do not define.
660
661 public:
662   static BitsInit *get(ArrayRef<Init *> Range);
663
664   void Profile(FoldingSetNodeID &ID) const;
665
666   unsigned getNumBits() const { return Bits.size(); }
667
668   Init *getBit(unsigned Bit) const {
669     assert(Bit < Bits.size() && "Bit index out of range!");
670     return Bits[Bit];
671   }
672
673   virtual Init *convertInitializerTo(RecTy *Ty) const {
674     return Ty->convertValue(const_cast<BitsInit *>(this));
675   }
676   virtual Init *
677   convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
678
679   virtual bool isComplete() const {
680     for (unsigned i = 0; i != getNumBits(); ++i)
681       if (!getBit(i)->isComplete()) return false;
682     return true;
683   }
684   bool allInComplete() const {
685     for (unsigned i = 0; i != getNumBits(); ++i)
686       if (getBit(i)->isComplete()) return false;
687     return true;
688   }
689   virtual std::string getAsString() const;
690
691   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
692 };
693
694
695 /// IntInit - 7 - Represent an initalization by a literal integer value.
696 ///
697 class IntInit : public TypedInit {
698   int64_t Value;
699
700   explicit IntInit(int64_t V) : TypedInit(IntRecTy::get()), Value(V) {}
701
702   IntInit(const IntInit &Other);  // Do not define.
703   IntInit &operator=(const IntInit &Other);  // Do note define.
704
705 public:
706   static IntInit *get(int64_t V);
707
708   int64_t getValue() const { return Value; }
709
710   virtual Init *convertInitializerTo(RecTy *Ty) const {
711     return Ty->convertValue(const_cast<IntInit *>(this));
712   }
713   virtual Init *
714   convertInitializerBitRange(const std::vector<unsigned> &Bits) const;
715
716   virtual std::string getAsString() const;
717
718   /// resolveBitReference - This method is used to implement
719   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
720   /// simply return the resolved value, otherwise we return null.
721   ///
722   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
723                                     unsigned Bit) const {
724     assert(0 && "Illegal bit reference off int");
725     return 0;
726   }
727
728   /// resolveListElementReference - This method is used to implement
729   /// VarListElementInit::resolveReferences.  If the list element is resolvable
730   /// now, we return the resolved value, otherwise we return null.
731   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
732                                             unsigned Elt) const {
733     assert(0 && "Illegal element reference off int");
734     return 0;
735   }
736 };
737
738
739 /// StringInit - "foo" - Represent an initialization by a string value.
740 ///
741 class StringInit : public TypedInit {
742   std::string Value;
743
744   explicit StringInit(const std::string &V)
745     : TypedInit(StringRecTy::get()), Value(V) {}
746
747   StringInit(const StringInit &Other);  // Do not define.
748   StringInit &operator=(const StringInit &Other);  // Do not define.
749
750 public:
751   static StringInit *get(const std::string &V);
752
753   const std::string &getValue() const { return Value; }
754
755   virtual Init *convertInitializerTo(RecTy *Ty) const {
756     return Ty->convertValue(const_cast<StringInit *>(this));
757   }
758
759   virtual std::string getAsString() const { return "\"" + Value + "\""; }
760
761   /// resolveBitReference - This method is used to implement
762   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
763   /// simply return the resolved value, otherwise we return null.
764   ///
765   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
766                                     unsigned Bit) const {
767     assert(0 && "Illegal bit reference off string");
768     return 0;
769   }
770
771   /// resolveListElementReference - This method is used to implement
772   /// VarListElementInit::resolveReferences.  If the list element is resolvable
773   /// now, we return the resolved value, otherwise we return null.
774   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
775                                             unsigned Elt) const {
776     assert(0 && "Illegal element reference off string");
777     return 0;
778   }
779 };
780
781 /// CodeInit - "[{...}]" - Represent a code fragment.
782 ///
783 class CodeInit : public Init {
784   std::string Value;
785
786   explicit CodeInit(const std::string &V) : Value(V) {}
787
788   CodeInit(const CodeInit &Other);  // Do not define.
789   CodeInit &operator=(const CodeInit &Other);  // Do not define.
790
791 public:
792   static CodeInit *get(const std::string &V);
793
794   const std::string &getValue() const { return Value; }
795
796   virtual Init *convertInitializerTo(RecTy *Ty) const {
797     return Ty->convertValue(const_cast<CodeInit *>(this));
798   }
799
800   virtual std::string getAsString() const { return "[{" + Value + "}]"; }
801 };
802
803 /// ListInit - [AL, AH, CL] - Represent a list of defs
804 ///
805 class ListInit : public TypedInit, public FoldingSetNode {
806   std::vector<Init*> Values;
807 public:
808   typedef std::vector<Init*>::const_iterator const_iterator;
809
810 private:
811   explicit ListInit(ArrayRef<Init *> Range, RecTy *EltTy)
812       : TypedInit(ListRecTy::get(EltTy)), Values(Range.begin(), Range.end()) {}
813
814   ListInit(const ListInit &Other);  // Do not define.
815   ListInit &operator=(const ListInit &Other);  // Do not define.
816
817 public:
818   static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy);
819
820   void Profile(FoldingSetNodeID &ID) const;
821
822   unsigned getSize() const { return Values.size(); }
823   Init *getElement(unsigned i) const {
824     assert(i < Values.size() && "List element index out of range!");
825     return Values[i];
826   }
827
828   Record *getElementAsRecord(unsigned i) const;
829
830   Init *convertInitListSlice(const std::vector<unsigned> &Elements) const;
831
832   virtual Init *convertInitializerTo(RecTy *Ty) const {
833     return Ty->convertValue(const_cast<ListInit *>(this));
834   }
835
836   /// resolveReferences - This method is used by classes that refer to other
837   /// variables which may not be defined at the time they expression is formed.
838   /// If a value is set for the variable later, this method will be called on
839   /// users of the value to allow the value to propagate out.
840   ///
841   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
842
843   virtual std::string getAsString() const;
844
845   ArrayRef<Init*> getValues() const { return Values; }
846
847   inline const_iterator begin() const { return Values.begin(); }
848   inline const_iterator end  () const { return Values.end();   }
849
850   inline size_t         size () const { return Values.size();  }
851   inline bool           empty() const { return Values.empty(); }
852
853   /// resolveBitReference - This method is used to implement
854   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
855   /// simply return the resolved value, otherwise we return null.
856   ///
857   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
858                                     unsigned Bit) const {
859     assert(0 && "Illegal bit reference off list");
860     return 0;
861   }
862
863   /// resolveListElementReference - This method is used to implement
864   /// VarListElementInit::resolveReferences.  If the list element is resolvable
865   /// now, we return the resolved value, otherwise we return null.
866   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
867                                             unsigned Elt) const;
868 };
869
870
871 /// OpInit - Base class for operators
872 ///
873 class OpInit : public TypedInit {
874   OpInit(const OpInit &Other);  // Do not define.
875   OpInit &operator=(OpInit &Other);  // Do not define.
876
877 protected:
878   explicit OpInit(RecTy *Type) : TypedInit(Type) {}
879
880 public:
881   // Clone - Clone this operator, replacing arguments with the new list
882   virtual OpInit *clone(std::vector<Init *> &Operands) const = 0;
883
884   virtual int getNumOperands() const = 0;
885   virtual Init *getOperand(int i) const = 0;
886
887   // Fold - If possible, fold this to a simpler init.  Return this if not
888   // possible to fold.
889   virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const = 0;
890
891   virtual Init *convertInitializerTo(RecTy *Ty) const {
892     return Ty->convertValue(const_cast<OpInit *>(this));
893   }
894
895   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
896                                     unsigned Bit) const;
897   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
898                                             unsigned Elt) const;
899 };
900
901
902 /// UnOpInit - !op (X) - Transform an init.
903 ///
904 class UnOpInit : public OpInit {
905 public:
906   enum UnaryOp { CAST, HEAD, TAIL, EMPTY };
907 private:
908   UnaryOp Opc;
909   Init *LHS;
910
911   UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type)
912       : OpInit(Type), Opc(opc), LHS(lhs) {}
913
914   UnOpInit(const UnOpInit &Other);  // Do not define.
915   UnOpInit &operator=(const UnOpInit &Other);  // Do not define.
916
917 public:
918   static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
919
920   // Clone - Clone this operator, replacing arguments with the new list
921   virtual OpInit *clone(std::vector<Init *> &Operands) const {
922     assert(Operands.size() == 1 &&
923            "Wrong number of operands for unary operation");
924     return UnOpInit::get(getOpcode(), *Operands.begin(), getType());
925   }
926
927   int getNumOperands() const { return 1; }
928   Init *getOperand(int i) const {
929     assert(i == 0 && "Invalid operand id for unary operator");
930     return getOperand();
931   }
932
933   UnaryOp getOpcode() const { return Opc; }
934   Init *getOperand() const { return LHS; }
935
936   // Fold - If possible, fold this to a simpler init.  Return this if not
937   // possible to fold.
938   Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
939
940   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
941
942   virtual std::string getAsString() const;
943 };
944
945 /// BinOpInit - !op (X, Y) - Combine two inits.
946 ///
947 class BinOpInit : public OpInit {
948 public:
949   enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, EQ };
950 private:
951   BinaryOp Opc;
952   Init *LHS, *RHS;
953
954   BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
955       OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {}
956
957   BinOpInit(const BinOpInit &Other);  // Do not define.
958   BinOpInit &operator=(const BinOpInit &Other);  // Do not define.
959
960 public:
961   static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
962                         RecTy *Type);
963
964   // Clone - Clone this operator, replacing arguments with the new list
965   virtual OpInit *clone(std::vector<Init *> &Operands) const {
966     assert(Operands.size() == 2 &&
967            "Wrong number of operands for binary operation");
968     return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());
969   }
970
971   int getNumOperands() const { return 2; }
972   Init *getOperand(int i) const {
973     assert((i == 0 || i == 1) && "Invalid operand id for binary operator");
974     if (i == 0) {
975       return getLHS();
976     } else {
977       return getRHS();
978     }
979   }
980
981   BinaryOp getOpcode() const { return Opc; }
982   Init *getLHS() const { return LHS; }
983   Init *getRHS() const { return RHS; }
984
985   // Fold - If possible, fold this to a simpler init.  Return this if not
986   // possible to fold.
987   Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
988
989   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
990
991   virtual std::string getAsString() const;
992 };
993
994 /// TernOpInit - !op (X, Y, Z) - Combine two inits.
995 ///
996 class TernOpInit : public OpInit {
997 public:
998   enum TernaryOp { SUBST, FOREACH, IF };
999 private:
1000   TernaryOp Opc;
1001   Init *LHS, *MHS, *RHS;
1002
1003   TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
1004              RecTy *Type) :
1005       OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {}
1006
1007   TernOpInit(const TernOpInit &Other);  // Do not define.
1008   TernOpInit &operator=(const TernOpInit &Other);  // Do not define.
1009
1010 public:
1011   static TernOpInit *get(TernaryOp opc, Init *lhs,
1012                          Init *mhs, Init *rhs,
1013                          RecTy *Type);
1014
1015   // Clone - Clone this operator, replacing arguments with the new list
1016   virtual OpInit *clone(std::vector<Init *> &Operands) const {
1017     assert(Operands.size() == 3 &&
1018            "Wrong number of operands for ternary operation");
1019     return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2],
1020                            getType());
1021   }
1022
1023   int getNumOperands() const { return 3; }
1024   Init *getOperand(int i) const {
1025     assert((i == 0 || i == 1 || i == 2) &&
1026            "Invalid operand id for ternary operator");
1027     if (i == 0) {
1028       return getLHS();
1029     } else if (i == 1) {
1030       return getMHS();
1031     } else {
1032       return getRHS();
1033     }
1034   }
1035
1036   TernaryOp getOpcode() const { return Opc; }
1037   Init *getLHS() const { return LHS; }
1038   Init *getMHS() const { return MHS; }
1039   Init *getRHS() const { return RHS; }
1040
1041   // Fold - If possible, fold this to a simpler init.  Return this if not
1042   // possible to fold.
1043   Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;
1044
1045   virtual bool isComplete() const { return false; }
1046
1047   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1048
1049   virtual std::string getAsString() const;
1050 };
1051
1052
1053 /// VarInit - 'Opcode' - Represent a reference to an entire variable object.
1054 ///
1055 class VarInit : public TypedInit {
1056   std::string VarName;
1057
1058   explicit VarInit(const std::string &VN, RecTy *T)
1059       : TypedInit(T), VarName(VN) {}
1060
1061   VarInit(const VarInit &Other);  // Do not define.
1062   VarInit &operator=(const VarInit &Other);  // Do not define.
1063
1064 public:
1065   static VarInit *get(const std::string &VN, RecTy *T);
1066   static VarInit *get(Init *VN, RecTy *T);
1067
1068   virtual Init *convertInitializerTo(RecTy *Ty) const {
1069     return Ty->convertValue(const_cast<VarInit *>(this));
1070   }
1071
1072   const std::string &getName() const { return VarName; }
1073
1074   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
1075                                     unsigned Bit) const;
1076   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
1077                                             unsigned Elt) const;
1078
1079   virtual RecTy *getFieldType(const std::string &FieldName) const;
1080   virtual Init *getFieldInit(Record &R, const RecordVal *RV,
1081                              const std::string &FieldName) const;
1082
1083   /// resolveReferences - This method is used by classes that refer to other
1084   /// variables which may not be defined at the time they expression is formed.
1085   /// If a value is set for the variable later, this method will be called on
1086   /// users of the value to allow the value to propagate out.
1087   ///
1088   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1089
1090   virtual std::string getAsString() const { return VarName; }
1091 };
1092
1093
1094 /// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
1095 ///
1096 class VarBitInit : public Init {
1097   TypedInit *TI;
1098   unsigned Bit;
1099
1100   VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) {
1101     assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) &&
1102            ((BitsRecTy*)T->getType())->getNumBits() > B &&
1103            "Illegal VarBitInit expression!");
1104   }
1105
1106   VarBitInit(const VarBitInit &Other);  // Do not define.
1107   VarBitInit &operator=(const VarBitInit &Other);  // Do not define.
1108
1109 public:
1110   static VarBitInit *get(TypedInit *T, unsigned B);
1111
1112   virtual Init *convertInitializerTo(RecTy *Ty) const {
1113     return Ty->convertValue(const_cast<VarBitInit *>(this));
1114   }
1115
1116   TypedInit *getVariable() const { return TI; }
1117   unsigned getBitNum() const { return Bit; }
1118
1119   virtual std::string getAsString() const;
1120   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1121 };
1122
1123 /// VarListElementInit - List[4] - Represent access to one element of a var or
1124 /// field.
1125 class VarListElementInit : public TypedInit {
1126   TypedInit *TI;
1127   unsigned Element;
1128
1129   VarListElementInit(TypedInit *T, unsigned E)
1130       : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()),
1131           TI(T), Element(E) {
1132     assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) &&
1133            "Illegal VarBitInit expression!");
1134   }
1135
1136   VarListElementInit(const VarListElementInit &Other);  // Do not define.
1137   VarListElementInit &operator=(const VarListElementInit &Other);  // Do
1138                                                                    // not
1139                                                                    // define.
1140
1141 public:
1142   static VarListElementInit *get(TypedInit *T, unsigned E);
1143
1144   virtual Init *convertInitializerTo(RecTy *Ty) const {
1145     return Ty->convertValue(const_cast<VarListElementInit *>(this));
1146   }
1147
1148   TypedInit *getVariable() const { return TI; }
1149   unsigned getElementNum() const { return Element; }
1150
1151   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
1152                                     unsigned Bit) const;
1153
1154   /// resolveListElementReference - This method is used to implement
1155   /// VarListElementInit::resolveReferences.  If the list element is resolvable
1156   /// now, we return the resolved value, otherwise we return null.
1157   virtual Init *resolveListElementReference(Record &R,
1158                                             const RecordVal *RV,
1159                                             unsigned Elt) const;
1160
1161   virtual std::string getAsString() const;
1162   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1163 };
1164
1165 /// DefInit - AL - Represent a reference to a 'def' in the description
1166 ///
1167 class DefInit : public TypedInit {
1168   Record *Def;
1169
1170   DefInit(Record *D, RecordRecTy *T) : TypedInit(T), Def(D) {}
1171   friend class Record;
1172
1173   DefInit(const DefInit &Other);  // Do not define.
1174   DefInit &operator=(const DefInit &Other);  // Do not define.
1175
1176 public:
1177   static DefInit *get(Record*);
1178
1179   virtual Init *convertInitializerTo(RecTy *Ty) const {
1180     return Ty->convertValue(const_cast<DefInit *>(this));
1181   }
1182
1183   Record *getDef() const { return Def; }
1184
1185   //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
1186
1187   virtual RecTy *getFieldType(const std::string &FieldName) const;
1188   virtual Init *getFieldInit(Record &R, const RecordVal *RV,
1189                              const std::string &FieldName) const;
1190
1191   virtual std::string getAsString() const;
1192
1193   /// resolveBitReference - This method is used to implement
1194   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
1195   /// simply return the resolved value, otherwise we return null.
1196   ///
1197   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
1198                                     unsigned Bit) const {
1199     assert(0 && "Illegal bit reference off def");
1200     return 0;
1201   }
1202
1203   /// resolveListElementReference - This method is used to implement
1204   /// VarListElementInit::resolveReferences.  If the list element is resolvable
1205   /// now, we return the resolved value, otherwise we return null.
1206   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
1207                                             unsigned Elt) const {
1208     assert(0 && "Illegal element reference off def");
1209     return 0;
1210   }
1211 };
1212
1213
1214 /// FieldInit - X.Y - Represent a reference to a subfield of a variable
1215 ///
1216 class FieldInit : public TypedInit {
1217   Init *Rec;                // Record we are referring to
1218   std::string FieldName;    // Field we are accessing
1219
1220   FieldInit(Init *R, const std::string &FN)
1221       : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) {
1222     assert(getType() && "FieldInit with non-record type!");
1223   }
1224
1225   FieldInit(const FieldInit &Other);  // Do not define.
1226   FieldInit &operator=(const FieldInit &Other);  // Do not define.
1227
1228 public:
1229   static FieldInit *get(Init *R, const std::string &FN);
1230   static FieldInit *get(Init *R, const Init *FN);
1231
1232   virtual Init *convertInitializerTo(RecTy *Ty) const {
1233     return Ty->convertValue(const_cast<FieldInit *>(this));
1234   }
1235
1236   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
1237                                     unsigned Bit) const;
1238   virtual Init *resolveListElementReference(Record &R,
1239                                             const RecordVal *RV,
1240                                             unsigned Elt) const;
1241
1242   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1243
1244   virtual std::string getAsString() const {
1245     return Rec->getAsString() + "." + FieldName;
1246   }
1247 };
1248
1249 /// DagInit - (v a, b) - Represent a DAG tree value.  DAG inits are required
1250 /// to have at least one value then a (possibly empty) list of arguments.  Each
1251 /// argument can have a name associated with it.
1252 ///
1253 class DagInit : public TypedInit, public FoldingSetNode {
1254   Init *Val;
1255   std::string ValName;
1256   std::vector<Init*> Args;
1257   std::vector<std::string> ArgNames;
1258
1259   DagInit(Init *V, const std::string &VN,
1260           ArrayRef<Init *> ArgRange,
1261           ArrayRef<std::string> NameRange)
1262       : TypedInit(DagRecTy::get()), Val(V), ValName(VN),
1263           Args(ArgRange.begin(), ArgRange.end()),
1264           ArgNames(NameRange.begin(), NameRange.end()) {}
1265
1266   DagInit(const DagInit &Other);  // Do not define.
1267   DagInit &operator=(const DagInit &Other);  // Do not define.
1268
1269 public:
1270   static DagInit *get(Init *V, const std::string &VN,
1271                       ArrayRef<Init *> ArgRange,
1272                       ArrayRef<std::string> NameRange);
1273   static DagInit *get(Init *V, const std::string &VN,
1274                       const std::vector<
1275                         std::pair<Init*, std::string> > &args);
1276
1277   void Profile(FoldingSetNodeID &ID) const;
1278
1279   virtual Init *convertInitializerTo(RecTy *Ty) const {
1280     return Ty->convertValue(const_cast<DagInit *>(this));
1281   }
1282
1283   Init *getOperator() const { return Val; }
1284
1285   const std::string &getName() const { return ValName; }
1286
1287   unsigned getNumArgs() const { return Args.size(); }
1288   Init *getArg(unsigned Num) const {
1289     assert(Num < Args.size() && "Arg number out of range!");
1290     return Args[Num];
1291   }
1292   const std::string &getArgName(unsigned Num) const {
1293     assert(Num < ArgNames.size() && "Arg number out of range!");
1294     return ArgNames[Num];
1295   }
1296
1297   virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;
1298
1299   virtual std::string getAsString() const;
1300
1301   typedef std::vector<Init*>::const_iterator       const_arg_iterator;
1302   typedef std::vector<std::string>::const_iterator const_name_iterator;
1303
1304   inline const_arg_iterator  arg_begin() const { return Args.begin(); }
1305   inline const_arg_iterator  arg_end  () const { return Args.end();   }
1306
1307   inline size_t              arg_size () const { return Args.size();  }
1308   inline bool                arg_empty() const { return Args.empty(); }
1309
1310   inline const_name_iterator name_begin() const { return ArgNames.begin(); }
1311   inline const_name_iterator name_end  () const { return ArgNames.end();   }
1312
1313   inline size_t              name_size () const { return ArgNames.size();  }
1314   inline bool                name_empty() const { return ArgNames.empty(); }
1315
1316   virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
1317                                     unsigned Bit) const {
1318     assert(0 && "Illegal bit reference off dag");
1319     return 0;
1320   }
1321
1322   virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
1323                                             unsigned Elt) const {
1324     assert(0 && "Illegal element reference off dag");
1325     return 0;
1326   }
1327 };
1328
1329 //===----------------------------------------------------------------------===//
1330 //  High-Level Classes
1331 //===----------------------------------------------------------------------===//
1332
1333 class RecordVal {
1334   std::string Name;
1335   RecTy *Ty;
1336   unsigned Prefix;
1337   Init *Value;
1338 public:
1339   RecordVal(const std::string &N, RecTy *T, unsigned P);
1340
1341   const std::string &getName() const { return Name; }
1342
1343   unsigned getPrefix() const { return Prefix; }
1344   RecTy *getType() const { return Ty; }
1345   Init *getValue() const { return Value; }
1346
1347   bool setValue(Init *V) {
1348     if (V) {
1349       Value = V->convertInitializerTo(Ty);
1350       return Value == 0;
1351     }
1352     Value = 0;
1353     return false;
1354   }
1355
1356   void dump() const;
1357   void print(raw_ostream &OS, bool PrintSem = true) const;
1358 };
1359
1360 inline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) {
1361   RV.print(OS << "  ");
1362   return OS;
1363 }
1364
1365 class Record {
1366   static unsigned LastID;
1367
1368   // Unique record ID.
1369   unsigned ID;
1370   std::string Name;
1371   SMLoc Loc;
1372   std::vector<std::string> TemplateArgs;
1373   std::vector<RecordVal> Values;
1374   std::vector<Record*> SuperClasses;
1375
1376   // Tracks Record instances. Not owned by Record.
1377   RecordKeeper &TrackedRecords;
1378
1379   DefInit *TheInit;
1380
1381 public:
1382
1383   // Constructs a record.
1384   explicit Record(const std::string &N, SMLoc loc, RecordKeeper &records) :
1385     ID(LastID++), Name(N), Loc(loc), TrackedRecords(records), TheInit(0) {}
1386   ~Record() {}
1387
1388
1389   static unsigned getNewUID() { return LastID++; }
1390
1391
1392   unsigned getID() const { return ID; }
1393
1394   const std::string &getName() const { return Name; }
1395   void setName(const std::string &Name);  // Also updates RecordKeeper.
1396
1397   SMLoc getLoc() const { return Loc; }
1398
1399   /// get the corresponding DefInit.
1400   DefInit *getDefInit();
1401
1402   const std::vector<std::string> &getTemplateArgs() const {
1403     return TemplateArgs;
1404   }
1405   const std::vector<RecordVal> &getValues() const { return Values; }
1406   const std::vector<Record*>   &getSuperClasses() const { return SuperClasses; }
1407
1408   bool isTemplateArg(StringRef Name) const {
1409     for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
1410       if (TemplateArgs[i] == Name) return true;
1411     return false;
1412   }
1413
1414   const RecordVal *getValue(StringRef Name) const {
1415     for (unsigned i = 0, e = Values.size(); i != e; ++i)
1416       if (Values[i].getName() == Name) return &Values[i];
1417     return 0;
1418   }
1419   RecordVal *getValue(StringRef Name) {
1420     for (unsigned i = 0, e = Values.size(); i != e; ++i)
1421       if (Values[i].getName() == Name) return &Values[i];
1422     return 0;
1423   }
1424
1425   void addTemplateArg(StringRef Name) {
1426     assert(!isTemplateArg(Name) && "Template arg already defined!");
1427     TemplateArgs.push_back(Name);
1428   }
1429
1430   void addValue(const RecordVal &RV) {
1431     assert(getValue(RV.getName()) == 0 && "Value already added!");
1432     Values.push_back(RV);
1433   }
1434
1435   void removeValue(StringRef Name) {
1436     for (unsigned i = 0, e = Values.size(); i != e; ++i)
1437       if (Values[i].getName() == Name) {
1438         Values.erase(Values.begin()+i);
1439         return;
1440       }
1441     assert(0 && "Cannot remove an entry that does not exist!");
1442   }
1443
1444   bool isSubClassOf(const Record *R) const {
1445     for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1446       if (SuperClasses[i] == R)
1447         return true;
1448     return false;
1449   }
1450
1451   bool isSubClassOf(StringRef Name) const {
1452     for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1453       if (SuperClasses[i]->getName() == Name)
1454         return true;
1455     return false;
1456   }
1457
1458   void addSuperClass(Record *R) {
1459     assert(!isSubClassOf(R) && "Already subclassing record!");
1460     SuperClasses.push_back(R);
1461   }
1462
1463   /// resolveReferences - If there are any field references that refer to fields
1464   /// that have been filled in, we can propagate the values now.
1465   ///
1466   void resolveReferences() { resolveReferencesTo(0); }
1467
1468   /// resolveReferencesTo - If anything in this record refers to RV, replace the
1469   /// reference to RV with the RHS of RV.  If RV is null, we resolve all
1470   /// possible references.
1471   void resolveReferencesTo(const RecordVal *RV);
1472
1473   RecordKeeper &getRecords() const {
1474     return TrackedRecords;
1475   }
1476
1477   void dump() const;
1478
1479   //===--------------------------------------------------------------------===//
1480   // High-level methods useful to tablegen back-ends
1481   //
1482
1483   /// getValueInit - Return the initializer for a value with the specified name,
1484   /// or throw an exception if the field does not exist.
1485   ///
1486   Init *getValueInit(StringRef FieldName) const;
1487
1488   /// getValueAsString - This method looks up the specified field and returns
1489   /// its value as a string, throwing an exception if the field does not exist
1490   /// or if the value is not a string.
1491   ///
1492   std::string getValueAsString(StringRef FieldName) const;
1493
1494   /// getValueAsBitsInit - This method looks up the specified field and returns
1495   /// its value as a BitsInit, throwing an exception if the field does not exist
1496   /// or if the value is not the right type.
1497   ///
1498   BitsInit *getValueAsBitsInit(StringRef FieldName) const;
1499
1500   /// getValueAsListInit - This method looks up the specified field and returns
1501   /// its value as a ListInit, throwing an exception if the field does not exist
1502   /// or if the value is not the right type.
1503   ///
1504   ListInit *getValueAsListInit(StringRef FieldName) const;
1505
1506   /// getValueAsListOfDefs - This method looks up the specified field and
1507   /// returns its value as a vector of records, throwing an exception if the
1508   /// field does not exist or if the value is not the right type.
1509   ///
1510   std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const;
1511
1512   /// getValueAsListOfInts - This method looks up the specified field and
1513   /// returns its value as a vector of integers, throwing an exception if the
1514   /// field does not exist or if the value is not the right type.
1515   ///
1516   std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
1517
1518   /// getValueAsListOfStrings - This method looks up the specified field and
1519   /// returns its value as a vector of strings, throwing an exception if the
1520   /// field does not exist or if the value is not the right type.
1521   ///
1522   std::vector<std::string> getValueAsListOfStrings(StringRef FieldName) const;
1523
1524   /// getValueAsDef - This method looks up the specified field and returns its
1525   /// value as a Record, throwing an exception if the field does not exist or if
1526   /// the value is not the right type.
1527   ///
1528   Record *getValueAsDef(StringRef FieldName) const;
1529
1530   /// getValueAsBit - This method looks up the specified field and returns its
1531   /// value as a bit, throwing an exception if the field does not exist or if
1532   /// the value is not the right type.
1533   ///
1534   bool getValueAsBit(StringRef FieldName) const;
1535
1536   /// getValueAsInt - This method looks up the specified field and returns its
1537   /// value as an int64_t, throwing an exception if the field does not exist or
1538   /// if the value is not the right type.
1539   ///
1540   int64_t getValueAsInt(StringRef FieldName) const;
1541
1542   /// getValueAsDag - This method looks up the specified field and returns its
1543   /// value as an Dag, throwing an exception if the field does not exist or if
1544   /// the value is not the right type.
1545   ///
1546   DagInit *getValueAsDag(StringRef FieldName) const;
1547
1548   /// getValueAsCode - This method looks up the specified field and returns
1549   /// its value as the string data in a CodeInit, throwing an exception if the
1550   /// field does not exist or if the value is not a code object.
1551   ///
1552   std::string getValueAsCode(StringRef FieldName) const;
1553 };
1554
1555 raw_ostream &operator<<(raw_ostream &OS, const Record &R);
1556
1557 struct MultiClass {
1558   Record Rec;  // Placeholder for template args and Name.
1559   typedef std::vector<Record*> RecordVector;
1560   RecordVector DefPrototypes;
1561
1562   void dump() const;
1563
1564   MultiClass(const std::string &Name, SMLoc Loc, RecordKeeper &Records) : 
1565     Rec(Name, Loc, Records) {}
1566 };
1567
1568 class RecordKeeper {
1569   std::map<std::string, Record*> Classes, Defs;
1570 public:
1571   ~RecordKeeper() {
1572     for (std::map<std::string, Record*>::iterator I = Classes.begin(),
1573            E = Classes.end(); I != E; ++I)
1574       delete I->second;
1575     for (std::map<std::string, Record*>::iterator I = Defs.begin(),
1576            E = Defs.end(); I != E; ++I)
1577       delete I->second;
1578   }
1579
1580   const std::map<std::string, Record*> &getClasses() const { return Classes; }
1581   const std::map<std::string, Record*> &getDefs() const { return Defs; }
1582
1583   Record *getClass(const std::string &Name) const {
1584     std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1585     return I == Classes.end() ? 0 : I->second;
1586   }
1587   Record *getDef(const std::string &Name) const {
1588     std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1589     return I == Defs.end() ? 0 : I->second;
1590   }
1591   void addClass(Record *R) {
1592     assert(getClass(R->getName()) == 0 && "Class already exists!");
1593     Classes.insert(std::make_pair(R->getName(), R));
1594   }
1595   void addDef(Record *R) {
1596     assert(getDef(R->getName()) == 0 && "Def already exists!");
1597     Defs.insert(std::make_pair(R->getName(), R));
1598   }
1599
1600   /// removeClass - Remove, but do not delete, the specified record.
1601   ///
1602   void removeClass(const std::string &Name) {
1603     assert(Classes.count(Name) && "Class does not exist!");
1604     Classes.erase(Name);
1605   }
1606   /// removeDef - Remove, but do not delete, the specified record.
1607   ///
1608   void removeDef(const std::string &Name) {
1609     assert(Defs.count(Name) && "Def does not exist!");
1610     Defs.erase(Name);
1611   }
1612
1613   //===--------------------------------------------------------------------===//
1614   // High-level helper methods, useful for tablegen backends...
1615
1616   /// getAllDerivedDefinitions - This method returns all concrete definitions
1617   /// that derive from the specified class name.  If a class with the specified
1618   /// name does not exist, an exception is thrown.
1619   std::vector<Record*>
1620   getAllDerivedDefinitions(const std::string &ClassName) const;
1621
1622   void dump() const;
1623 };
1624
1625 /// LessRecord - Sorting predicate to sort record pointers by name.
1626 ///
1627 struct LessRecord {
1628   bool operator()(const Record *Rec1, const Record *Rec2) const {
1629     return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;
1630   }
1631 };
1632
1633 /// LessRecordFieldName - Sorting predicate to sort record pointers by their
1634 /// name field.
1635 ///
1636 struct LessRecordFieldName {
1637   bool operator()(const Record *Rec1, const Record *Rec2) const {
1638     return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
1639   }
1640 };
1641
1642 raw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
1643
1644 } // End llvm namespace
1645
1646 #endif