For PR387:
[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 was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source 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 <string>
19 #include <vector>
20 #include <map>
21 #include <iostream>
22 #include <cassert>
23
24 namespace llvm {
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 DefInit;
46 class DagInit;
47 class TypedInit;
48 class VarInit;
49 class FieldInit;
50 class VarBitInit;
51 class VarListElementInit;
52
53 // Other classes...
54 class Record;
55
56 //===----------------------------------------------------------------------===//
57 //  Type Classes
58 //===----------------------------------------------------------------------===//
59
60 struct RecTy {
61   virtual ~RecTy() {}
62
63   virtual void print(std::ostream &OS) const = 0;
64   void dump() const;
65
66   /// typeIsConvertibleTo - Return true if all values of 'this' type can be
67   /// converted to the specified type.
68   virtual bool typeIsConvertibleTo(const RecTy *RHS) const = 0;
69
70 public:   // These methods should only be called from subclasses of Init
71   virtual Init *convertValue( UnsetInit *UI) { return 0; }
72   virtual Init *convertValue(   BitInit *BI) { return 0; }
73   virtual Init *convertValue(  BitsInit *BI) { return 0; }
74   virtual Init *convertValue(   IntInit *II) { return 0; }
75   virtual Init *convertValue(StringInit *SI) { return 0; }
76   virtual Init *convertValue(  ListInit *LI) { return 0; }
77   virtual Init *convertValue(  CodeInit *CI) { return 0; }
78   virtual Init *convertValue(VarBitInit *VB) { return 0; }
79   virtual Init *convertValue(   DefInit *DI) { return 0; }
80   virtual Init *convertValue(   DagInit *DI) { return 0; }
81   virtual Init *convertValue( TypedInit *TI) { return 0; }
82   virtual Init *convertValue(   VarInit *VI) {
83     return convertValue((TypedInit*)VI);
84   }
85   virtual Init *convertValue( FieldInit *FI) {
86     return convertValue((TypedInit*)FI);
87   }
88
89 public:   // These methods should only be called by subclasses of RecTy.
90   // baseClassOf - These virtual methods should be overloaded to return true iff
91   // all values of type 'RHS' can be converted to the 'this' type.
92   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
93   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
94   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
95   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
96   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
97   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
98   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
99   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
100 };
101
102 inline std::ostream &operator<<(std::ostream &OS, const RecTy &Ty) {
103   Ty.print(OS);
104   return OS;
105 }
106
107
108 /// BitRecTy - 'bit' - Represent a single bit
109 ///
110 class BitRecTy : public RecTy {
111 public:
112   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
113   virtual Init *convertValue(   BitInit *BI) { return (Init*)BI; }
114   virtual Init *convertValue(  BitsInit *BI);
115   virtual Init *convertValue(   IntInit *II);
116   virtual Init *convertValue(StringInit *SI) { return 0; }
117   virtual Init *convertValue(  ListInit *LI) { return 0; }
118   virtual Init *convertValue(  CodeInit *CI) { return 0; }
119   virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
120   virtual Init *convertValue(   DefInit *DI) { return 0; }
121   virtual Init *convertValue(   DagInit *DI) { return 0; }
122   virtual Init *convertValue( TypedInit *TI);
123   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
124   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
125
126   void print(std::ostream &OS) const { OS << "bit"; }
127
128   bool typeIsConvertibleTo(const RecTy *RHS) const {
129     return RHS->baseClassOf(this);
130   }
131   virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
132   virtual bool baseClassOf(const BitsRecTy   *RHS) const;
133   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
134   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
135   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
136   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
137   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
138   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
139
140 };
141
142
143 // BitsRecTy - 'bits<n>' - Represent a fixed number of bits
144 /// BitsRecTy - 'bits&lt;n&gt;' - Represent a fixed number of bits
145 ///
146 class BitsRecTy : public RecTy {
147   unsigned Size;
148 public:
149   BitsRecTy(unsigned Sz) : Size(Sz) {}
150
151   unsigned getNumBits() const { return Size; }
152
153   virtual Init *convertValue( UnsetInit *UI);
154   virtual Init *convertValue(   BitInit *UI);
155   virtual Init *convertValue(  BitsInit *BI);
156   virtual Init *convertValue(   IntInit *II);
157   virtual Init *convertValue(StringInit *SI) { return 0; }
158   virtual Init *convertValue(  ListInit *LI) { return 0; }
159   virtual Init *convertValue(  CodeInit *CI) { return 0; }
160   virtual Init *convertValue(VarBitInit *VB) { return 0; }
161   virtual Init *convertValue(   DefInit *DI) { return 0; }
162   virtual Init *convertValue(   DagInit *DI) { return 0; }
163   virtual Init *convertValue( TypedInit *TI);
164   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
165   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
166
167
168   void print(std::ostream &OS) const { OS << "bits<" << Size << ">"; }
169
170   bool typeIsConvertibleTo(const RecTy *RHS) const {
171     return RHS->baseClassOf(this);
172   }
173   virtual bool baseClassOf(const BitRecTy    *RHS) const { return Size == 1; }
174   virtual bool baseClassOf(const BitsRecTy   *RHS) const {
175     return RHS->Size == Size;
176   }
177   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
178   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
179   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
180   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
181   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
182   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
183
184 };
185
186
187 /// IntRecTy - 'int' - Represent an integer value of no particular size
188 ///
189 class IntRecTy : public RecTy {
190 public:
191   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
192   virtual Init *convertValue(   BitInit *BI);
193   virtual Init *convertValue(  BitsInit *BI);
194   virtual Init *convertValue(   IntInit *II) { return (Init*)II; }
195   virtual Init *convertValue(StringInit *SI) { return 0; }
196   virtual Init *convertValue(  ListInit *LI) { return 0; }
197   virtual Init *convertValue(  CodeInit *CI) { return 0; }
198   virtual Init *convertValue(VarBitInit *VB) { return 0; }
199   virtual Init *convertValue(   DefInit *DI) { return 0; }
200   virtual Init *convertValue(   DagInit *DI) { return 0; }
201   virtual Init *convertValue( TypedInit *TI);
202   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
203   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
204
205
206   void print(std::ostream &OS) const { OS << "int"; }
207
208   bool typeIsConvertibleTo(const RecTy *RHS) const {
209     return RHS->baseClassOf(this);
210   }
211
212   virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }
213   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return true; }
214   virtual bool baseClassOf(const IntRecTy    *RHS) const { return true; }
215   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
216   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
217   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
218   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
219   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
220
221 };
222
223 /// StringRecTy - 'string' - Represent an string value
224 ///
225 class StringRecTy : public RecTy {
226 public:
227   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
228   virtual Init *convertValue(   BitInit *BI) { return 0; }
229   virtual Init *convertValue(  BitsInit *BI) { return 0; }
230   virtual Init *convertValue(   IntInit *II) { return 0; }
231   virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
232   virtual Init *convertValue(  ListInit *LI) { return 0; }
233   virtual Init *convertValue(  CodeInit *CI) { return 0; }
234   virtual Init *convertValue(VarBitInit *VB) { return 0; }
235   virtual Init *convertValue(   DefInit *DI) { return 0; }
236   virtual Init *convertValue(   DagInit *DI) { return 0; }
237   virtual Init *convertValue( TypedInit *TI);
238   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
239   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
240
241   void print(std::ostream &OS) const { OS << "string"; }
242
243   bool typeIsConvertibleTo(const RecTy *RHS) const {
244     return RHS->baseClassOf(this);
245   }
246
247   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
248   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
249   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
250   virtual bool baseClassOf(const StringRecTy *RHS) const { return true; }
251   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
252   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
253   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
254   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
255 };
256
257 // ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
258 // the specified type.
259 /// ListRecTy - 'list&lt;Ty&gt;' - Represent a list of values, all of which must
260 /// be of the specified type.
261 ///
262 class ListRecTy : public RecTy {
263   RecTy *Ty;
264 public:
265   ListRecTy(RecTy *T) : Ty(T) {}
266
267   RecTy *getElementType() const { return Ty; }
268
269   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
270   virtual Init *convertValue(   BitInit *BI) { return 0; }
271   virtual Init *convertValue(  BitsInit *BI) { return 0; }
272   virtual Init *convertValue(   IntInit *II) { return 0; }
273   virtual Init *convertValue(StringInit *SI) { return 0; }
274   virtual Init *convertValue(  ListInit *LI);
275   virtual Init *convertValue(  CodeInit *CI) { return 0; }
276   virtual Init *convertValue(VarBitInit *VB) { return 0; }
277   virtual Init *convertValue(   DefInit *DI) { return 0; }
278   virtual Init *convertValue(   DagInit *DI) { return 0; }
279   virtual Init *convertValue( TypedInit *TI);
280   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
281   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
282   
283   void print(std::ostream &OS) const;
284
285   bool typeIsConvertibleTo(const RecTy *RHS) const {
286     return RHS->baseClassOf(this);
287   }
288
289   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
290   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
291   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
292   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
293   virtual bool baseClassOf(const ListRecTy   *RHS) const {
294     return RHS->getElementType()->typeIsConvertibleTo(Ty); 
295   }
296   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
297   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
298   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
299 };
300
301 /// CodeRecTy - 'code' - Represent an code fragment, function or method.
302 ///
303 class CodeRecTy : public RecTy {
304 public:
305   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
306   virtual Init *convertValue(   BitInit *BI) { return 0; }
307   virtual Init *convertValue(  BitsInit *BI) { return 0; }
308   virtual Init *convertValue(   IntInit *II) { return 0; }
309   virtual Init *convertValue(StringInit *SI) { return 0; }
310   virtual Init *convertValue(  ListInit *LI) { return 0; }
311   virtual Init *convertValue(  CodeInit *CI) { return (Init*)CI; }
312   virtual Init *convertValue(VarBitInit *VB) { return 0; }
313   virtual Init *convertValue(   DefInit *DI) { return 0; }
314   virtual Init *convertValue(   DagInit *DI) { return 0; }
315   virtual Init *convertValue( TypedInit *TI);
316   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
317   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
318
319
320   void print(std::ostream &OS) const { OS << "code"; }
321
322   bool typeIsConvertibleTo(const RecTy *RHS) const {
323     return RHS->baseClassOf(this);
324   }
325   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
326   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
327   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
328   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
329   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
330   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return true; }
331   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
332   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
333 };
334
335 /// DagRecTy - 'dag' - Represent a dag fragment
336 ///
337 class DagRecTy : public RecTy {
338 public:
339   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
340   virtual Init *convertValue(   BitInit *BI) { return 0; }
341   virtual Init *convertValue(  BitsInit *BI) { return 0; }
342   virtual Init *convertValue(   IntInit *II) { return 0; }
343   virtual Init *convertValue(StringInit *SI) { return 0; }
344   virtual Init *convertValue(  ListInit *LI) { return 0; }
345   virtual Init *convertValue(  CodeInit *CI) { return 0; }
346   virtual Init *convertValue(VarBitInit *VB) { return 0; }
347   virtual Init *convertValue(   DefInit *DI) { return 0; }
348   virtual Init *convertValue(   DagInit *CI) { return (Init*)CI; }
349   virtual Init *convertValue( TypedInit *TI);
350   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
351   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
352
353   void print(std::ostream &OS) const { OS << "dag"; }
354
355   bool typeIsConvertibleTo(const RecTy *RHS) const {
356     return RHS->baseClassOf(this);
357   }
358
359   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
360   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
361   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
362   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
363   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
364   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
365   virtual bool baseClassOf(const DagRecTy    *RHS) const { return true; }
366   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
367 };
368
369
370 /// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
371 /// (R32 X = EAX).
372 ///
373 class RecordRecTy : public RecTy {
374   Record *Rec;
375 public:
376   RecordRecTy(Record *R) : Rec(R) {}
377
378   Record *getRecord() const { return Rec; }
379
380   virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
381   virtual Init *convertValue(   BitInit *BI) { return 0; }
382   virtual Init *convertValue(  BitsInit *BI) { return 0; }
383   virtual Init *convertValue(   IntInit *II) { return 0; }
384   virtual Init *convertValue(StringInit *SI) { return 0; }
385   virtual Init *convertValue(  ListInit *LI) { return 0; }
386   virtual Init *convertValue(  CodeInit *CI) { return 0; }
387   virtual Init *convertValue(VarBitInit *VB) { return 0; }
388   virtual Init *convertValue(   DefInit *DI);
389   virtual Init *convertValue(   DagInit *DI) { return 0; }
390   virtual Init *convertValue( TypedInit *VI); 
391   virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}
392   virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
393
394   void print(std::ostream &OS) const;
395
396   bool typeIsConvertibleTo(const RecTy *RHS) const {
397     return RHS->baseClassOf(this);
398   }
399   virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }
400   virtual bool baseClassOf(const BitsRecTy   *RHS) const { return false; }
401   virtual bool baseClassOf(const IntRecTy    *RHS) const { return false; }
402   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
403   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
404   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
405   virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
406   virtual bool baseClassOf(const RecordRecTy *RHS) const;
407 };
408
409
410
411 //===----------------------------------------------------------------------===//
412 //  Initializer Classes
413 //===----------------------------------------------------------------------===//
414
415 struct Init {
416   virtual ~Init() {}
417
418   /// isComplete - This virtual method should be overridden by values that may
419   /// not be completely specified yet.
420   virtual bool isComplete() const { return true; }
421
422   /// print - Print out this value.
423   virtual void print(std::ostream &OS) const = 0;
424
425   /// dump - Debugging method that may be called through a debugger, just
426   /// invokes print on cerr.
427   void dump() const;
428
429   /// convertInitializerTo - This virtual function is a simple call-back
430   /// function that should be overridden to call the appropriate
431   /// RecTy::convertValue method.
432   ///
433   virtual Init *convertInitializerTo(RecTy *Ty) = 0;
434
435   /// convertInitializerBitRange - This method is used to implement the bitrange
436   /// selection operator.  Given an initializer, it selects the specified bits
437   /// out, returning them as a new init of bits type.  If it is not legal to use
438   /// the bit subscript operator on this initializer, return null.
439   ///
440   virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits) {
441     return 0;
442   }
443
444   /// convertInitListSlice - This method is used to implement the list slice
445   /// selection operator.  Given an initializer, it selects the specified list
446   /// elements, returning them as a new init of list type.  If it is not legal
447   /// to take a slice of this, return null.
448   ///
449   virtual Init *convertInitListSlice(const std::vector<unsigned> &Elements) {
450     return 0;
451   }
452
453   /// getFieldType - This method is used to implement the FieldInit class.
454   /// Implementors of this method should return the type of the named field if
455   /// they are of record type.
456   ///
457   virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
458
459   /// getFieldInit - This method complements getFieldType to return the
460   /// initializer for the specified field.  If getFieldType returns non-null
461   /// this method should return non-null, otherwise it returns null.
462   ///
463   virtual Init *getFieldInit(Record &R, const std::string &FieldName) const {
464     return 0;
465   }
466
467   /// resolveReferences - This method is used by classes that refer to other
468   /// variables which may not be defined at the time they expression is formed.
469   /// If a value is set for the variable later, this method will be called on
470   /// users of the value to allow the value to propagate out.
471   ///
472   virtual Init *resolveReferences(Record &R) { return this; }
473 };
474
475 inline std::ostream &operator<<(std::ostream &OS, const Init &I) {
476   I.print(OS); return OS;
477 }
478
479
480 /// UnsetInit - ? - Represents an uninitialized value
481 ///
482 class UnsetInit : public Init {
483 public:
484   virtual Init *convertInitializerTo(RecTy *Ty) {
485     return Ty->convertValue(this);
486   }
487
488   virtual bool isComplete() const { return false; }
489   virtual void print(std::ostream &OS) const { OS << "?"; }
490 };
491
492
493 /// BitInit - true/false - Represent a concrete initializer for a bit.
494 ///
495 class BitInit : public Init {
496   bool Value;
497 public:
498   BitInit(bool V) : Value(V) {}
499
500   bool getValue() const { return Value; }
501
502   virtual Init *convertInitializerTo(RecTy *Ty) {
503     return Ty->convertValue(this);
504   }
505
506   virtual void print(std::ostream &OS) const { OS << (Value ? "1" : "0"); }
507 };
508
509 /// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
510 /// It contains a vector of bits, whose size is determined by the type.
511 ///
512 class BitsInit : public Init {
513   std::vector<Init*> Bits;
514 public:
515   BitsInit(unsigned Size) : Bits(Size) {}
516
517   unsigned getNumBits() const { return Bits.size(); }
518
519   Init *getBit(unsigned Bit) const {
520     assert(Bit < Bits.size() && "Bit index out of range!");
521     return Bits[Bit];
522   }
523   void setBit(unsigned Bit, Init *V) {
524     assert(Bit < Bits.size() && "Bit index out of range!");
525     assert(Bits[Bit] == 0 && "Bit already set!");
526     Bits[Bit] = V;
527   }
528
529   virtual Init *convertInitializerTo(RecTy *Ty) {
530     return Ty->convertValue(this);
531   }
532   virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
533
534   virtual bool isComplete() const {
535     for (unsigned i = 0; i != getNumBits(); ++i)
536       if (!getBit(i)->isComplete()) return false;
537     return true;
538   }
539   virtual void print(std::ostream &OS) const;
540
541   virtual Init *resolveReferences(Record &R);
542
543   // printXX - Print this bitstream with the specified format, returning true if
544   // it is not possible.
545   bool printInHex(std::ostream &OS) const;
546   bool printAsVariable(std::ostream &OS) const;
547   bool printAsUnset(std::ostream &OS) const;
548 };
549
550
551 /// IntInit - 7 - Represent an initalization by a literal integer value.
552 ///
553 class IntInit : public Init {
554   int Value;
555 public:
556   IntInit(int V) : Value(V) {}
557
558   int getValue() const { return Value; }
559
560   virtual Init *convertInitializerTo(RecTy *Ty) {
561     return Ty->convertValue(this);
562   }
563   virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
564
565   virtual void print(std::ostream &OS) const { OS << Value; }
566 };
567
568
569 /// StringInit - "foo" - Represent an initialization by a string value.
570 ///
571 class StringInit : public Init {
572   std::string Value;
573 public:
574   StringInit(const std::string &V) : Value(V) {}
575
576   const std::string &getValue() const { return Value; }
577
578   virtual Init *convertInitializerTo(RecTy *Ty) {
579     return Ty->convertValue(this);
580   }
581
582   virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; }
583 };
584
585 /// CodeInit - "[{...}]" - Represent a code fragment.
586 ///
587 class CodeInit : public Init {
588   std::string Value;
589 public:
590   CodeInit(const std::string &V) : Value(V) {}
591
592   const std::string getValue() const { return Value; }
593
594   virtual Init *convertInitializerTo(RecTy *Ty) {
595     return Ty->convertValue(this);
596   }
597
598   virtual void print(std::ostream &OS) const { OS << "[{" << Value << "}]"; }
599 };
600
601 /// ListInit - [AL, AH, CL] - Represent a list of defs
602 ///
603 class ListInit : public Init {
604   std::vector<Init*> Values;
605 public:
606   ListInit(std::vector<Init*> &Vs) {
607     Values.swap(Vs);
608   }
609
610   unsigned getSize() const { return Values.size(); }
611   Init *getElement(unsigned i) const {
612     assert(i < Values.size() && "List element index out of range!");
613     return Values[i];
614   }
615
616   Init *convertInitListSlice(const std::vector<unsigned> &Elements);
617
618   virtual Init *convertInitializerTo(RecTy *Ty) {
619     return Ty->convertValue(this);
620   }
621
622   /// resolveReferences - This method is used by classes that refer to other
623   /// variables which may not be defined at the time they expression is formed.
624   /// If a value is set for the variable later, this method will be called on
625   /// users of the value to allow the value to propagate out.
626   ///
627   virtual Init *resolveReferences(Record &R);
628
629   virtual void print(std::ostream &OS) const;
630 };
631
632
633 /// TypedInit - This is the common super-class of types that have a specific,
634 /// explicit, type.
635 ///
636 class TypedInit : public Init {
637   RecTy *Ty;
638 public:  
639   TypedInit(RecTy *T) : Ty(T) {}
640
641   RecTy *getType() const { return Ty; }
642
643   virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
644   virtual Init *convertInitListSlice(const std::vector<unsigned> &Elements);
645
646   /// resolveBitReference - This method is used to implement
647   /// VarBitInit::resolveReferences.  If the bit is able to be resolved, we
648   /// simply return the resolved value, otherwise we return null.
649   ///
650   virtual Init *resolveBitReference(Record &R, unsigned Bit) = 0;
651
652   /// resolveListElementReference - This method is used to implement
653   /// VarListElementInit::resolveReferences.  If the list element is resolvable
654   /// now, we return the resolved value, otherwise we return null.
655   virtual Init *resolveListElementReference(Record &R, unsigned Elt) = 0;
656 };
657
658 /// VarInit - 'Opcode' - Represent a reference to an entire variable object.
659 ///
660 class VarInit : public TypedInit {
661   std::string VarName;
662 public:
663   VarInit(const std::string &VN, RecTy *T) : TypedInit(T), VarName(VN) {}
664   
665   virtual Init *convertInitializerTo(RecTy *Ty) {
666     return Ty->convertValue(this);
667   }
668
669   const std::string &getName() const { return VarName; }
670
671   virtual Init *resolveBitReference(Record &R, unsigned Bit);
672   virtual Init *resolveListElementReference(Record &R, unsigned Elt);
673
674   virtual RecTy *getFieldType(const std::string &FieldName) const;
675   virtual Init *getFieldInit(Record &R, const std::string &FieldName) const;
676
677   /// resolveReferences - This method is used by classes that refer to other
678   /// variables which may not be defined at the time they expression is formed.
679   /// If a value is set for the variable later, this method will be called on
680   /// users of the value to allow the value to propagate out.
681   ///
682   virtual Init *resolveReferences(Record &R);
683   
684   virtual void print(std::ostream &OS) const { OS << VarName; }
685 };
686
687
688 /// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
689 ///
690 class VarBitInit : public Init {
691   TypedInit *TI;
692   unsigned Bit;
693 public:
694   VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) {
695     assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) &&
696            ((BitsRecTy*)T->getType())->getNumBits() > B &&
697            "Illegal VarBitInit expression!");
698   }
699
700   virtual Init *convertInitializerTo(RecTy *Ty) {
701     return Ty->convertValue(this);
702   }
703
704   TypedInit *getVariable() const { return TI; }
705   unsigned getBitNum() const { return Bit; }
706   
707   virtual void print(std::ostream &OS) const {
708     TI->print(OS); OS << "{" << Bit << "}";
709   }
710   virtual Init *resolveReferences(Record &R);
711 };
712
713 /// VarListElementInit - List[4] - Represent access to one element of a var or 
714 /// field.
715 class VarListElementInit : public TypedInit {
716   TypedInit *TI;
717   unsigned Element;
718 public:
719   VarListElementInit(TypedInit *T, unsigned E)
720     : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()),
721                 TI(T), Element(E) {
722     assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) &&
723            "Illegal VarBitInit expression!");
724   }
725
726   virtual Init *convertInitializerTo(RecTy *Ty) {
727     return Ty->convertValue(this);
728   }
729
730   TypedInit *getVariable() const { return TI; }
731   unsigned getElementNum() const { return Element; }
732
733   virtual Init *resolveBitReference(Record &R, unsigned Bit);
734
735   /// resolveListElementReference - This method is used to implement
736   /// VarListElementInit::resolveReferences.  If the list element is resolvable
737   /// now, we return the resolved value, otherwise we return null.
738   virtual Init *resolveListElementReference(Record &R, unsigned Elt);
739
740   virtual void print(std::ostream &OS) const {
741     TI->print(OS); OS << "[" << Element << "]";
742   }
743   virtual Init *resolveReferences(Record &R);
744 };
745
746 /// DefInit - AL - Represent a reference to a 'def' in the description
747 ///
748 class DefInit : public Init {
749   Record *Def;
750 public:
751   DefInit(Record *D) : Def(D) {}
752   
753   virtual Init *convertInitializerTo(RecTy *Ty) {
754     return Ty->convertValue(this);
755   }
756
757   Record *getDef() const { return Def; }
758
759   //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
760
761   virtual RecTy *getFieldType(const std::string &FieldName) const;
762   virtual Init *getFieldInit(Record &R, const std::string &FieldName) const;
763   
764   virtual void print(std::ostream &OS) const;
765 };
766
767
768 /// FieldInit - X.Y - Represent a reference to a subfield of a variable
769 ///
770 class FieldInit : public TypedInit {
771   Init *Rec;                // Record we are referring to
772   std::string FieldName;    // Field we are accessing
773 public:
774   FieldInit(Init *R, const std::string &FN)
775     : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) {
776     assert(getType() && "FieldInit with non-record type!");
777   }
778
779   virtual Init *convertInitializerTo(RecTy *Ty) {
780     return Ty->convertValue(this);
781   }
782
783   virtual Init *resolveBitReference(Record &R, unsigned Bit);
784   virtual Init *resolveListElementReference(Record &R, unsigned Elt);
785
786   virtual Init *resolveReferences(Record &R);
787
788   virtual void print(std::ostream &OS) const {
789     Rec->print(OS); OS << "." << FieldName;
790   }
791 };
792
793 /// DagInit - (def a, b) - Represent a DAG tree value.  DAG inits are required
794 /// to have Records for their first value, after that, any legal Init is
795 /// possible.
796 ///
797 class DagInit : public Init {
798   Record *NodeTypeDef;
799   std::vector<Init*> Args;
800   std::vector<std::string> ArgNames;
801 public:
802   DagInit(Record *D, const std::vector<std::pair<Init*, std::string> > &args)
803     : NodeTypeDef(D) {
804     Args.reserve(args.size());
805     ArgNames.reserve(args.size());
806     for (unsigned i = 0, e = args.size(); i != e; ++i) {
807       Args.push_back(args[i].first);
808       ArgNames.push_back(args[i].second);
809     }
810   }
811   
812   virtual Init *convertInitializerTo(RecTy *Ty) {
813     return Ty->convertValue(this);
814   }
815
816   Record *getNodeType() const { return NodeTypeDef; }
817
818   unsigned getNumArgs() const { return Args.size(); }
819   Init *getArg(unsigned Num) const {
820     assert(Num < Args.size() && "Arg number out of range!");
821     return Args[Num];
822   }
823   const std::string &getArgName(unsigned Num) const {
824     assert(Num < ArgNames.size() && "Arg number out of range!");
825     return ArgNames[Num];
826   }
827
828   void setArg(unsigned Num, Init *I) {
829     assert(Num < Args.size() && "Arg number out of range!");
830     Args[Num] = I;
831   }
832
833   virtual void print(std::ostream &OS) const;
834 };
835
836 //===----------------------------------------------------------------------===//
837 //  High-Level Classes
838 //===----------------------------------------------------------------------===//
839
840 class RecordVal {
841   std::string Name;
842   RecTy *Ty;
843   unsigned Prefix;
844   Init *Value;
845 public:
846   RecordVal(const std::string &N, RecTy *T, unsigned P);
847
848   const std::string &getName() const { return Name; }
849
850   unsigned getPrefix() const { return Prefix; }
851   RecTy *getType() const { return Ty; }
852   Init *getValue() const { return Value; }
853
854   bool setValue(Init *V) {
855     if (V) {
856       Value = V->convertInitializerTo(Ty);
857       return Value == 0;
858     }
859     Value = 0;
860     return false;
861   }
862
863   void dump() const;
864   void print(std::ostream &OS, bool PrintSem = true) const;
865 };
866
867 inline std::ostream &operator<<(std::ostream &OS, const RecordVal &RV) {
868   RV.print(OS << "  ");
869   return OS;
870 }
871
872 class Record {
873   const std::string Name;
874   std::vector<std::string> TemplateArgs;
875   std::vector<RecordVal> Values;
876   std::vector<Record*> SuperClasses;
877 public:
878
879   Record(const std::string &N) : Name(N) {}
880   ~Record() {}
881
882   const std::string &getName() const { return Name; }
883   const std::vector<std::string> &getTemplateArgs() const {
884     return TemplateArgs;
885   }
886   const std::vector<RecordVal> &getValues() const { return Values; }
887   const std::vector<Record*>   &getSuperClasses() const { return SuperClasses; }
888
889   bool isTemplateArg(const std::string &Name) const {
890     for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
891       if (TemplateArgs[i] == Name) return true;
892     return false;
893   }
894
895   const RecordVal *getValue(const std::string &Name) const {
896     for (unsigned i = 0, e = Values.size(); i != e; ++i)
897       if (Values[i].getName() == Name) return &Values[i];
898     return 0;
899   }
900   RecordVal *getValue(const std::string &Name) {
901     for (unsigned i = 0, e = Values.size(); i != e; ++i)
902       if (Values[i].getName() == Name) return &Values[i];
903     return 0;
904   }
905
906   void addTemplateArg(const std::string &Name) {
907     assert(!isTemplateArg(Name) && "Template arg already defined!");
908     TemplateArgs.push_back(Name);
909   }
910
911   void addValue(const RecordVal &RV) {
912     assert(getValue(RV.getName()) == 0 && "Value already added!");
913     Values.push_back(RV);
914   }
915
916   void removeValue(const std::string &Name) {
917     assert(getValue(Name) && "Cannot remove an entry that does not exist!");
918     for (unsigned i = 0, e = Values.size(); i != e; ++i)
919       if (Values[i].getName() == Name) {
920         Values.erase(Values.begin()+i);
921         return;
922       }
923     assert(0 && "Name does not exist in record!");
924   }
925
926   bool isSubClassOf(Record *R) const {
927     for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
928       if (SuperClasses[i] == R)
929         return true;
930     return false;
931   }
932
933   bool isSubClassOf(const std::string &Name) const {
934     for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
935       if (SuperClasses[i]->getName() == Name)
936         return true;
937     return false;
938   }
939
940   void addSuperClass(Record *R) {
941     assert(!isSubClassOf(R) && "Already subclassing record!");
942     SuperClasses.push_back(R);
943   }
944
945   // resolveReferences - If there are any field references that refer to fields
946   // that have been filled in, we can propagate the values now.
947   //
948   void resolveReferences();
949
950   void dump() const;
951
952   //===--------------------------------------------------------------------===//
953   // High-level methods useful to tablegen back-ends
954   //
955
956   /// getValueInit - Return the initializer for a value with the specified name,
957   /// or throw an exception if the field does not exist.
958   ///
959   Init *getValueInit(const std::string &FieldName) const;
960
961   /// getValueAsString - This method looks up the specified field and returns
962   /// its value as a string, throwing an exception if the field does not exist
963   /// or if the value is not a string.
964   ///
965   std::string getValueAsString(const std::string &FieldName) const;
966
967   /// getValueAsBitsInit - This method looks up the specified field and returns
968   /// its value as a BitsInit, throwing an exception if the field does not exist
969   /// or if the value is not the right type.
970   ///
971   BitsInit *getValueAsBitsInit(const std::string &FieldName) const;
972
973   /// getValueAsListInit - This method looks up the specified field and returns
974   /// its value as a ListInit, throwing an exception if the field does not exist
975   /// or if the value is not the right type.
976   ///
977   ListInit *getValueAsListInit(const std::string &FieldName) const;
978
979   /// getValueAsDef - This method looks up the specified field and returns its
980   /// value as a Record, throwing an exception if the field does not exist or if
981   /// the value is not the right type.
982   ///
983   Record *getValueAsDef(const std::string &FieldName) const;
984
985   /// getValueAsBit - This method looks up the specified field and returns its
986   /// value as a bit, throwing an exception if the field does not exist or if
987   /// the value is not the right type.
988   ///
989   bool getValueAsBit(const std::string &FieldName) const;
990
991   /// getValueAsInt - This method looks up the specified field and returns its
992   /// value as an int, throwing an exception if the field does not exist or if
993   /// the value is not the right type.
994   ///
995   int getValueAsInt(const std::string &FieldName) const;
996
997   /// getValueAsDag - This method looks up the specified field and returns its
998   /// value as an Dag, throwing an exception if the field does not exist or if
999   /// the value is not the right type.
1000   ///
1001   DagInit *getValueAsDag(const std::string &FieldName) const;
1002 };
1003
1004 std::ostream &operator<<(std::ostream &OS, const Record &R);
1005
1006 class RecordKeeper {
1007   std::map<std::string, Record*> Classes, Defs;
1008 public:
1009   ~RecordKeeper() {
1010     for (std::map<std::string, Record*>::iterator I = Classes.begin(),
1011            E = Classes.end(); I != E; ++I)
1012       delete I->second;
1013     for (std::map<std::string, Record*>::iterator I = Defs.begin(),
1014            E = Defs.end(); I != E; ++I)
1015       delete I->second;
1016   }
1017   
1018   const std::map<std::string, Record*> &getClasses() const { return Classes; }
1019   const std::map<std::string, Record*> &getDefs() const { return Defs; }
1020
1021   Record *getClass(const std::string &Name) const {
1022     std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1023     return I == Classes.end() ? 0 : I->second;
1024   }
1025   Record *getDef(const std::string &Name) const {
1026     std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1027     return I == Defs.end() ? 0 : I->second;
1028   }
1029   void addClass(Record *R) {
1030     assert(getClass(R->getName()) == 0 && "Class already exists!");
1031     Classes.insert(std::make_pair(R->getName(), R));
1032   }
1033   void addDef(Record *R) {
1034     assert(getDef(R->getName()) == 0 && "Def already exists!");
1035     Defs.insert(std::make_pair(R->getName(), R));
1036   }
1037
1038   //===--------------------------------------------------------------------===//
1039   // High-level helper methods, useful for tablegen backends...
1040
1041   /// getAllDerivedDefinitions - This method returns all concrete definitions
1042   /// that derive from the specified class name.  If a class with the specified
1043   /// name does not exist, an exception is thrown.
1044   std::vector<Record*>
1045   getAllDerivedDefinitions(const std::string &ClassName) const;
1046
1047
1048   void dump() const;
1049 };
1050
1051 std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
1052
1053 extern RecordKeeper Records;
1054
1055 } // End llvm namespace
1056
1057 #endif