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