1 //===- Record.h - Classes to represent Table Records ------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the main TableGen data structures, including the TableGen
11 // types, values, and high-level data structures.
13 //===----------------------------------------------------------------------===//
52 class VarListElementInit
;
58 //===----------------------------------------------------------------------===//
60 //===----------------------------------------------------------------------===//
65 virtual std::string
getAsString() const = 0;
66 void print(std::ostream
&OS
) const { OS
<< getAsString(); }
69 /// typeIsConvertibleTo - Return true if all values of 'this' type can be
70 /// converted to the specified type.
71 virtual bool typeIsConvertibleTo(const RecTy
*RHS
) const = 0;
73 public: // These methods should only be called from subclasses of Init
74 virtual Init
*convertValue( UnsetInit
*UI
) { return 0; }
75 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
76 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
77 virtual Init
*convertValue( IntInit
*II
) { return 0; }
78 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
79 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
80 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
81 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
82 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
83 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
84 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
85 virtual Init
*convertValue( TypedInit
*TI
) { return 0; }
86 virtual Init
*convertValue( VarInit
*VI
) {
87 return convertValue((TypedInit
*)VI
);
89 virtual Init
*convertValue( FieldInit
*FI
) {
90 return convertValue((TypedInit
*)FI
);
93 public: // These methods should only be called by subclasses of RecTy.
94 // baseClassOf - These virtual methods should be overloaded to return true iff
95 // all values of type 'RHS' can be converted to the 'this' type.
96 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
97 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
98 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
99 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
100 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
101 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
102 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
103 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
106 inline std::ostream
&operator<<(std::ostream
&OS
, const RecTy
&Ty
) {
112 /// BitRecTy - 'bit' - Represent a single bit
114 class BitRecTy
: public RecTy
{
116 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
117 virtual Init
*convertValue( BitInit
*BI
) { return (Init
*)BI
; }
118 virtual Init
*convertValue( BitsInit
*BI
);
119 virtual Init
*convertValue( IntInit
*II
);
120 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
121 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
122 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
123 virtual Init
*convertValue(VarBitInit
*VB
) { return (Init
*)VB
; }
124 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
125 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
126 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
127 virtual Init
*convertValue( TypedInit
*TI
);
128 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
129 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
131 std::string
getAsString() const { return "bit"; }
133 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
134 return RHS
->baseClassOf(this);
136 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return true; }
137 virtual bool baseClassOf(const BitsRecTy
*RHS
) const;
138 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
139 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
140 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
141 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
142 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
143 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
148 // BitsRecTy - 'bits<n>' - Represent a fixed number of bits
149 /// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
151 class BitsRecTy
: public RecTy
{
154 BitsRecTy(unsigned Sz
) : Size(Sz
) {}
156 unsigned getNumBits() const { return Size
; }
158 virtual Init
*convertValue( UnsetInit
*UI
);
159 virtual Init
*convertValue( BitInit
*UI
);
160 virtual Init
*convertValue( BitsInit
*BI
);
161 virtual Init
*convertValue( IntInit
*II
);
162 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
163 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
164 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
165 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
166 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
167 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
168 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
169 virtual Init
*convertValue( TypedInit
*TI
);
170 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
171 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
173 std::string
getAsString() const;
175 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
176 return RHS
->baseClassOf(this);
178 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return Size
== 1; }
179 virtual bool baseClassOf(const BitsRecTy
*RHS
) const {
180 return RHS
->Size
== Size
;
182 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
183 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
184 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
185 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
186 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
187 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
192 /// IntRecTy - 'int' - Represent an integer value of no particular size
194 class IntRecTy
: public RecTy
{
196 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
197 virtual Init
*convertValue( BitInit
*BI
);
198 virtual Init
*convertValue( BitsInit
*BI
);
199 virtual Init
*convertValue( IntInit
*II
) { return (Init
*)II
; }
200 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
201 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
202 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
203 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
204 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
205 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
206 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
207 virtual Init
*convertValue( TypedInit
*TI
);
208 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
209 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
211 std::string
getAsString() const { return "int"; }
213 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
214 return RHS
->baseClassOf(this);
217 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return true; }
218 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return true; }
219 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
220 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
221 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
222 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
223 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
224 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
228 /// StringRecTy - 'string' - Represent an string value
230 class StringRecTy
: public RecTy
{
232 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
233 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
234 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
235 virtual Init
*convertValue( IntInit
*II
) { return 0; }
236 virtual Init
*convertValue(StringInit
*SI
) { return (Init
*)SI
; }
237 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
238 virtual Init
*convertValue( BinOpInit
*BO
);
239 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
240 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
241 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
242 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
243 virtual Init
*convertValue( TypedInit
*TI
);
244 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
245 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
247 std::string
getAsString() const { return "string"; }
249 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
250 return RHS
->baseClassOf(this);
253 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
254 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
255 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
256 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return true; }
257 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
258 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
259 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
260 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
263 // ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
264 // the specified type.
265 /// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must
266 /// be of the specified type.
268 class ListRecTy
: public RecTy
{
271 ListRecTy(RecTy
*T
) : Ty(T
) {}
273 RecTy
*getElementType() const { return Ty
; }
275 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
276 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
277 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
278 virtual Init
*convertValue( IntInit
*II
) { return 0; }
279 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
280 virtual Init
*convertValue( ListInit
*LI
);
281 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
282 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
283 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
284 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
285 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
286 virtual Init
*convertValue( TypedInit
*TI
);
287 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
288 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
290 std::string
getAsString() const;
292 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
293 return RHS
->baseClassOf(this);
296 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
297 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
298 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
299 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
300 virtual bool baseClassOf(const ListRecTy
*RHS
) const {
301 return RHS
->getElementType()->typeIsConvertibleTo(Ty
);
303 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
304 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
305 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
308 /// CodeRecTy - 'code' - Represent an code fragment, function or method.
310 class CodeRecTy
: public RecTy
{
312 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
313 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
314 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
315 virtual Init
*convertValue( IntInit
*II
) { return 0; }
316 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
317 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
318 virtual Init
*convertValue( CodeInit
*CI
) { return (Init
*)CI
; }
319 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
320 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
321 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
322 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
323 virtual Init
*convertValue( TypedInit
*TI
);
324 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
325 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
327 std::string
getAsString() const { return "code"; }
329 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
330 return RHS
->baseClassOf(this);
332 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
333 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
334 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
335 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
336 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
337 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return true; }
338 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
339 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
342 /// DagRecTy - 'dag' - Represent a dag fragment
344 class DagRecTy
: public RecTy
{
346 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
347 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
348 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
349 virtual Init
*convertValue( IntInit
*II
) { return 0; }
350 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
351 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
352 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
353 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
354 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
355 virtual Init
*convertValue( BinOpInit
*BO
);
356 virtual Init
*convertValue( DagInit
*CI
) { return (Init
*)CI
; }
357 virtual Init
*convertValue( TypedInit
*TI
);
358 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
359 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
361 std::string
getAsString() const { return "dag"; }
363 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
364 return RHS
->baseClassOf(this);
367 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
368 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
369 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
370 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
371 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
372 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
373 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return true; }
374 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
378 /// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
381 class RecordRecTy
: public RecTy
{
384 RecordRecTy(Record
*R
) : Rec(R
) {}
386 Record
*getRecord() const { return Rec
; }
388 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
389 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
390 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
391 virtual Init
*convertValue( IntInit
*II
) { return 0; }
392 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
393 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
394 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
395 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
396 virtual Init
*convertValue( BinOpInit
*UI
) { return 0; }
397 virtual Init
*convertValue( DefInit
*DI
);
398 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
399 virtual Init
*convertValue( TypedInit
*VI
);
400 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
401 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
403 std::string
getAsString() const;
405 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
406 return RHS
->baseClassOf(this);
408 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
409 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
410 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
411 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
412 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
413 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
414 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
415 virtual bool baseClassOf(const RecordRecTy
*RHS
) const;
420 //===----------------------------------------------------------------------===//
421 // Initializer Classes
422 //===----------------------------------------------------------------------===//
427 /// isComplete - This virtual method should be overridden by values that may
428 /// not be completely specified yet.
429 virtual bool isComplete() const { return true; }
431 /// print - Print out this value.
432 void print(std::ostream
&OS
) const { OS
<< getAsString(); }
434 /// getAsString - Convert this value to a string form.
435 virtual std::string
getAsString() const = 0;
437 /// dump - Debugging method that may be called through a debugger, just
438 /// invokes print on cerr.
441 /// convertInitializerTo - This virtual function is a simple call-back
442 /// function that should be overridden to call the appropriate
443 /// RecTy::convertValue method.
445 virtual Init
*convertInitializerTo(RecTy
*Ty
) = 0;
447 /// convertInitializerBitRange - This method is used to implement the bitrange
448 /// selection operator. Given an initializer, it selects the specified bits
449 /// out, returning them as a new init of bits type. If it is not legal to use
450 /// the bit subscript operator on this initializer, return null.
452 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
) {
456 /// convertInitListSlice - This method is used to implement the list slice
457 /// selection operator. Given an initializer, it selects the specified list
458 /// elements, returning them as a new init of list type. If it is not legal
459 /// to take a slice of this, return null.
461 virtual Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
) {
465 /// getFieldType - This method is used to implement the FieldInit class.
466 /// Implementors of this method should return the type of the named field if
467 /// they are of record type.
469 virtual RecTy
*getFieldType(const std::string
&FieldName
) const { return 0; }
471 /// getFieldInit - This method complements getFieldType to return the
472 /// initializer for the specified field. If getFieldType returns non-null
473 /// this method should return non-null, otherwise it returns null.
475 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const {
479 /// resolveReferences - This method is used by classes that refer to other
480 /// variables which may not be defined at the time they expression is formed.
481 /// If a value is set for the variable later, this method will be called on
482 /// users of the value to allow the value to propagate out.
484 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
) {
489 inline std::ostream
&operator<<(std::ostream
&OS
, const Init
&I
) {
490 I
.print(OS
); return OS
;
494 /// UnsetInit - ? - Represents an uninitialized value
496 class UnsetInit
: public Init
{
498 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
499 return Ty
->convertValue(this);
502 virtual bool isComplete() const { return false; }
503 virtual std::string
getAsString() const { return "?"; }
507 /// BitInit - true/false - Represent a concrete initializer for a bit.
509 class BitInit
: public Init
{
512 BitInit(bool V
) : Value(V
) {}
514 bool getValue() const { return Value
; }
516 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
517 return Ty
->convertValue(this);
520 virtual std::string
getAsString() const { return Value
? "1" : "0"; }
523 /// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
524 /// It contains a vector of bits, whose size is determined by the type.
526 class BitsInit
: public Init
{
527 std::vector
<Init
*> Bits
;
529 BitsInit(unsigned Size
) : Bits(Size
) {}
531 unsigned getNumBits() const { return Bits
.size(); }
533 Init
*getBit(unsigned Bit
) const {
534 assert(Bit
< Bits
.size() && "Bit index out of range!");
537 void setBit(unsigned Bit
, Init
*V
) {
538 assert(Bit
< Bits
.size() && "Bit index out of range!");
539 assert(Bits
[Bit
] == 0 && "Bit already set!");
543 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
544 return Ty
->convertValue(this);
546 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
548 virtual bool isComplete() const {
549 for (unsigned i
= 0; i
!= getNumBits(); ++i
)
550 if (!getBit(i
)->isComplete()) return false;
553 virtual std::string
getAsString() const;
555 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
557 // printXX - Print this bitstream with the specified format, returning true if
558 // it is not possible.
559 bool printInHex(std::ostream
&OS
) const;
560 bool printAsVariable(std::ostream
&OS
) const;
561 bool printAsUnset(std::ostream
&OS
) const;
565 /// IntInit - 7 - Represent an initalization by a literal integer value.
567 class IntInit
: public Init
{
570 IntInit(int V
) : Value(V
) {}
572 int getValue() const { return Value
; }
574 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
575 return Ty
->convertValue(this);
577 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
579 virtual std::string
getAsString() const;
583 /// StringInit - "foo" - Represent an initialization by a string value.
585 class StringInit
: public Init
{
588 StringInit(const std::string
&V
) : Value(V
) {}
590 const std::string
&getValue() const { return Value
; }
592 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
593 return Ty
->convertValue(this);
596 virtual std::string
getAsString() const { return "\"" + Value
+ "\""; }
599 /// CodeInit - "[{...}]" - Represent a code fragment.
601 class CodeInit
: public Init
{
604 CodeInit(const std::string
&V
) : Value(V
) {}
606 const std::string
getValue() const { return Value
; }
608 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
609 return Ty
->convertValue(this);
612 virtual std::string
getAsString() const { return "[{" + Value
+ "}]"; }
615 /// ListInit - [AL, AH, CL] - Represent a list of defs
617 class ListInit
: public Init
{
618 std::vector
<Init
*> Values
;
620 ListInit(std::vector
<Init
*> &Vs
) {
624 unsigned getSize() const { return Values
.size(); }
625 Init
*getElement(unsigned i
) const {
626 assert(i
< Values
.size() && "List element index out of range!");
630 Record
*getElementAsRecord(unsigned i
) const;
632 Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
);
634 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
635 return Ty
->convertValue(this);
638 /// resolveReferences - This method is used by classes that refer to other
639 /// variables which may not be defined at the time they expression is formed.
640 /// If a value is set for the variable later, this method will be called on
641 /// users of the value to allow the value to propagate out.
643 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
645 virtual std::string
getAsString() const;
648 /// BinOpInit - !op (X, Y) - Combine two inits.
650 class BinOpInit
: public Init
{
652 enum BinaryOp
{ SHL
, SRA
, SRL
, STRCONCAT
, CONCAT
};
657 BinOpInit(BinaryOp opc
, Init
*lhs
, Init
*rhs
) : Opc(opc
), LHS(lhs
), RHS(rhs
) {
660 BinaryOp
getOpcode() const { return Opc
; }
661 Init
*getLHS() const { return LHS
; }
662 Init
*getRHS() const { return RHS
; }
664 // Fold - If possible, fold this to a simpler init. Return this if not
668 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
669 return Ty
->convertValue(this);
672 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
674 virtual std::string
getAsString() const;
679 /// TypedInit - This is the common super-class of types that have a specific,
682 class TypedInit
: public Init
{
685 TypedInit(RecTy
*T
) : Ty(T
) {}
687 RecTy
*getType() const { return Ty
; }
689 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
690 virtual Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
);
692 /// resolveBitReference - This method is used to implement
693 /// VarBitInit::resolveReferences. If the bit is able to be resolved, we
694 /// simply return the resolved value, otherwise we return null.
696 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
699 /// resolveListElementReference - This method is used to implement
700 /// VarListElementInit::resolveReferences. If the list element is resolvable
701 /// now, we return the resolved value, otherwise we return null.
702 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
706 /// VarInit - 'Opcode' - Represent a reference to an entire variable object.
708 class VarInit
: public TypedInit
{
711 VarInit(const std::string
&VN
, RecTy
*T
) : TypedInit(T
), VarName(VN
) {}
713 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
714 return Ty
->convertValue(this);
717 const std::string
&getName() const { return VarName
; }
719 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
721 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
724 virtual RecTy
*getFieldType(const std::string
&FieldName
) const;
725 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const;
727 /// resolveReferences - This method is used by classes that refer to other
728 /// variables which may not be defined at the time they expression is formed.
729 /// If a value is set for the variable later, this method will be called on
730 /// users of the value to allow the value to propagate out.
732 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
734 virtual std::string
getAsString() const { return VarName
; }
738 /// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
740 class VarBitInit
: public Init
{
744 VarBitInit(TypedInit
*T
, unsigned B
) : TI(T
), Bit(B
) {
745 assert(T
->getType() && dynamic_cast<BitsRecTy
*>(T
->getType()) &&
746 ((BitsRecTy
*)T
->getType())->getNumBits() > B
&&
747 "Illegal VarBitInit expression!");
750 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
751 return Ty
->convertValue(this);
754 TypedInit
*getVariable() const { return TI
; }
755 unsigned getBitNum() const { return Bit
; }
757 virtual std::string
getAsString() const;
758 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
761 /// VarListElementInit - List[4] - Represent access to one element of a var or
763 class VarListElementInit
: public TypedInit
{
767 VarListElementInit(TypedInit
*T
, unsigned E
)
768 : TypedInit(dynamic_cast<ListRecTy
*>(T
->getType())->getElementType()),
770 assert(T
->getType() && dynamic_cast<ListRecTy
*>(T
->getType()) &&
771 "Illegal VarBitInit expression!");
774 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
775 return Ty
->convertValue(this);
778 TypedInit
*getVariable() const { return TI
; }
779 unsigned getElementNum() const { return Element
; }
781 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
784 /// resolveListElementReference - This method is used to implement
785 /// VarListElementInit::resolveReferences. If the list element is resolvable
786 /// now, we return the resolved value, otherwise we return null.
787 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
790 virtual std::string
getAsString() const;
791 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
794 /// DefInit - AL - Represent a reference to a 'def' in the description
796 class DefInit
: public Init
{
799 DefInit(Record
*D
) : Def(D
) {}
801 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
802 return Ty
->convertValue(this);
805 Record
*getDef() const { return Def
; }
807 //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
809 virtual RecTy
*getFieldType(const std::string
&FieldName
) const;
810 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const;
812 virtual std::string
getAsString() const;
816 /// FieldInit - X.Y - Represent a reference to a subfield of a variable
818 class FieldInit
: public TypedInit
{
819 Init
*Rec
; // Record we are referring to
820 std::string FieldName
; // Field we are accessing
822 FieldInit(Init
*R
, const std::string
&FN
)
823 : TypedInit(R
->getFieldType(FN
)), Rec(R
), FieldName(FN
) {
824 assert(getType() && "FieldInit with non-record type!");
827 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
828 return Ty
->convertValue(this);
831 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
833 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
836 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
838 virtual std::string
getAsString() const {
839 return Rec
->getAsString() + "." + FieldName
;
843 /// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required
844 /// to have at least one value then a (possibly empty) list of arguments. Each
845 /// argument can have a name associated with it.
847 class DagInit
: public Init
{
849 std::vector
<Init
*> Args
;
850 std::vector
<std::string
> ArgNames
;
852 DagInit(Init
*V
, const std::vector
<std::pair
<Init
*, std::string
> > &args
)
854 Args
.reserve(args
.size());
855 ArgNames
.reserve(args
.size());
856 for (unsigned i
= 0, e
= args
.size(); i
!= e
; ++i
) {
857 Args
.push_back(args
[i
].first
);
858 ArgNames
.push_back(args
[i
].second
);
861 DagInit(Init
*V
, const std::vector
<Init
*> &args
,
862 const std::vector
<std::string
> &argNames
)
863 : Val(V
), Args(args
), ArgNames(argNames
) {
866 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
867 return Ty
->convertValue(this);
870 Init
*getOperator() const { return Val
; }
872 unsigned getNumArgs() const { return Args
.size(); }
873 Init
*getArg(unsigned Num
) const {
874 assert(Num
< Args
.size() && "Arg number out of range!");
877 const std::string
&getArgName(unsigned Num
) const {
878 assert(Num
< ArgNames
.size() && "Arg number out of range!");
879 return ArgNames
[Num
];
882 void setArg(unsigned Num
, Init
*I
) {
883 assert(Num
< Args
.size() && "Arg number out of range!");
887 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
889 virtual std::string
getAsString() const;
892 //===----------------------------------------------------------------------===//
893 // High-Level Classes
894 //===----------------------------------------------------------------------===//
902 RecordVal(const std::string
&N
, RecTy
*T
, unsigned P
);
904 const std::string
&getName() const { return Name
; }
906 unsigned getPrefix() const { return Prefix
; }
907 RecTy
*getType() const { return Ty
; }
908 Init
*getValue() const { return Value
; }
910 bool setValue(Init
*V
) {
912 Value
= V
->convertInitializerTo(Ty
);
920 void print(std::ostream
&OS
, bool PrintSem
= true) const;
923 inline std::ostream
&operator<<(std::ostream
&OS
, const RecordVal
&RV
) {
930 std::vector
<std::string
> TemplateArgs
;
931 std::vector
<RecordVal
> Values
;
932 std::vector
<Record
*> SuperClasses
;
935 Record(const std::string
&N
) : Name(N
) {}
938 const std::string
&getName() const { return Name
; }
939 void setName(const std::string
&Name
); // Also updates RecordKeeper.
940 const std::vector
<std::string
> &getTemplateArgs() const {
943 const std::vector
<RecordVal
> &getValues() const { return Values
; }
944 const std::vector
<Record
*> &getSuperClasses() const { return SuperClasses
; }
946 bool isTemplateArg(const std::string
&Name
) const {
947 for (unsigned i
= 0, e
= TemplateArgs
.size(); i
!= e
; ++i
)
948 if (TemplateArgs
[i
] == Name
) return true;
952 const RecordVal
*getValue(const std::string
&Name
) const {
953 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
954 if (Values
[i
].getName() == Name
) return &Values
[i
];
957 RecordVal
*getValue(const std::string
&Name
) {
958 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
959 if (Values
[i
].getName() == Name
) return &Values
[i
];
963 void addTemplateArg(const std::string
&Name
) {
964 assert(!isTemplateArg(Name
) && "Template arg already defined!");
965 TemplateArgs
.push_back(Name
);
968 void addValue(const RecordVal
&RV
) {
969 assert(getValue(RV
.getName()) == 0 && "Value already added!");
970 Values
.push_back(RV
);
973 void removeValue(const std::string
&Name
) {
974 assert(getValue(Name
) && "Cannot remove an entry that does not exist!");
975 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
976 if (Values
[i
].getName() == Name
) {
977 Values
.erase(Values
.begin()+i
);
980 assert(0 && "Name does not exist in record!");
983 bool isSubClassOf(Record
*R
) const {
984 for (unsigned i
= 0, e
= SuperClasses
.size(); i
!= e
; ++i
)
985 if (SuperClasses
[i
] == R
)
990 bool isSubClassOf(const std::string
&Name
) const {
991 for (unsigned i
= 0, e
= SuperClasses
.size(); i
!= e
; ++i
)
992 if (SuperClasses
[i
]->getName() == Name
)
997 void addSuperClass(Record
*R
) {
998 assert(!isSubClassOf(R
) && "Already subclassing record!");
999 SuperClasses
.push_back(R
);
1002 /// resolveReferences - If there are any field references that refer to fields
1003 /// that have been filled in, we can propagate the values now.
1005 void resolveReferences() { resolveReferencesTo(0); }
1007 /// resolveReferencesTo - If anything in this record refers to RV, replace the
1008 /// reference to RV with the RHS of RV. If RV is null, we resolve all
1009 /// possible references.
1010 void resolveReferencesTo(const RecordVal
*RV
);
1014 //===--------------------------------------------------------------------===//
1015 // High-level methods useful to tablegen back-ends
1018 /// getValueInit - Return the initializer for a value with the specified name,
1019 /// or throw an exception if the field does not exist.
1021 Init
*getValueInit(const std::string
&FieldName
) const;
1023 /// getValueAsString - This method looks up the specified field and returns
1024 /// its value as a string, throwing an exception if the field does not exist
1025 /// or if the value is not a string.
1027 std::string
getValueAsString(const std::string
&FieldName
) const;
1029 /// getValueAsBitsInit - This method looks up the specified field and returns
1030 /// its value as a BitsInit, throwing an exception if the field does not exist
1031 /// or if the value is not the right type.
1033 BitsInit
*getValueAsBitsInit(const std::string
&FieldName
) const;
1035 /// getValueAsListInit - This method looks up the specified field and returns
1036 /// its value as a ListInit, throwing an exception if the field does not exist
1037 /// or if the value is not the right type.
1039 ListInit
*getValueAsListInit(const std::string
&FieldName
) const;
1041 /// getValueAsListOfDefs - This method looks up the specified field and
1042 /// returns its value as a vector of records, throwing an exception if the
1043 /// field does not exist or if the value is not the right type.
1045 std::vector
<Record
*> getValueAsListOfDefs(const std::string
&FieldName
) const;
1047 /// getValueAsListOfInts - This method looks up the specified field and returns
1048 /// its value as a vector of integers, throwing an exception if the field does
1049 /// not exist or if the value is not the right type.
1051 std::vector
<int> getValueAsListOfInts(const std::string
&FieldName
) const;
1053 /// getValueAsDef - This method looks up the specified field and returns its
1054 /// value as a Record, throwing an exception if the field does not exist or if
1055 /// the value is not the right type.
1057 Record
*getValueAsDef(const std::string
&FieldName
) const;
1059 /// getValueAsBit - This method looks up the specified field and returns its
1060 /// value as a bit, throwing an exception if the field does not exist or if
1061 /// the value is not the right type.
1063 bool getValueAsBit(const std::string
&FieldName
) const;
1065 /// getValueAsInt - This method looks up the specified field and returns its
1066 /// value as an int, throwing an exception if the field does not exist or if
1067 /// the value is not the right type.
1069 int getValueAsInt(const std::string
&FieldName
) const;
1071 /// getValueAsDag - This method looks up the specified field and returns its
1072 /// value as an Dag, throwing an exception if the field does not exist or if
1073 /// the value is not the right type.
1075 DagInit
*getValueAsDag(const std::string
&FieldName
) const;
1077 /// getValueAsCode - This method looks up the specified field and returns
1078 /// its value as the string data in a CodeInit, throwing an exception if the
1079 /// field does not exist or if the value is not a code object.
1081 std::string
getValueAsCode(const std::string
&FieldName
) const;
1084 std::ostream
&operator<<(std::ostream
&OS
, const Record
&R
);
1086 class RecordKeeper
{
1087 std::map
<std::string
, Record
*> Classes
, Defs
;
1090 for (std::map
<std::string
, Record
*>::iterator I
= Classes
.begin(),
1091 E
= Classes
.end(); I
!= E
; ++I
)
1093 for (std::map
<std::string
, Record
*>::iterator I
= Defs
.begin(),
1094 E
= Defs
.end(); I
!= E
; ++I
)
1098 const std::map
<std::string
, Record
*> &getClasses() const { return Classes
; }
1099 const std::map
<std::string
, Record
*> &getDefs() const { return Defs
; }
1101 Record
*getClass(const std::string
&Name
) const {
1102 std::map
<std::string
, Record
*>::const_iterator I
= Classes
.find(Name
);
1103 return I
== Classes
.end() ? 0 : I
->second
;
1105 Record
*getDef(const std::string
&Name
) const {
1106 std::map
<std::string
, Record
*>::const_iterator I
= Defs
.find(Name
);
1107 return I
== Defs
.end() ? 0 : I
->second
;
1109 void addClass(Record
*R
) {
1110 assert(getClass(R
->getName()) == 0 && "Class already exists!");
1111 Classes
.insert(std::make_pair(R
->getName(), R
));
1113 void addDef(Record
*R
) {
1114 assert(getDef(R
->getName()) == 0 && "Def already exists!");
1115 Defs
.insert(std::make_pair(R
->getName(), R
));
1118 /// removeClass - Remove, but do not delete, the specified record.
1120 void removeClass(const std::string
&Name
) {
1121 assert(Classes
.count(Name
) && "Class does not exist!");
1122 Classes
.erase(Name
);
1124 /// removeDef - Remove, but do not delete, the specified record.
1126 void removeDef(const std::string
&Name
) {
1127 assert(Defs
.count(Name
) && "Def does not exist!");
1131 //===--------------------------------------------------------------------===//
1132 // High-level helper methods, useful for tablegen backends...
1134 /// getAllDerivedDefinitions - This method returns all concrete definitions
1135 /// that derive from the specified class name. If a class with the specified
1136 /// name does not exist, an exception is thrown.
1137 std::vector
<Record
*>
1138 getAllDerivedDefinitions(const std::string
&ClassName
) const;
1144 std::ostream
&operator<<(std::ostream
&OS
, const RecordKeeper
&RK
);
1146 extern RecordKeeper Records
;
1148 } // End llvm namespace