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 //===----------------------------------------------------------------------===//
18 #include "TGSourceMgr.h"
19 #include "llvm/Support/DataTypes.h"
53 class VarListElementInit
;
60 //===----------------------------------------------------------------------===//
62 //===----------------------------------------------------------------------===//
67 virtual std::string
getAsString() const = 0;
68 void print(std::ostream
&OS
) const { OS
<< getAsString(); }
71 /// typeIsConvertibleTo - Return true if all values of 'this' type can be
72 /// converted to the specified type.
73 virtual bool typeIsConvertibleTo(const RecTy
*RHS
) const = 0;
75 public: // These methods should only be called from subclasses of Init
76 virtual Init
*convertValue( UnsetInit
*UI
) { return 0; }
77 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
78 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
79 virtual Init
*convertValue( IntInit
*II
) { return 0; }
80 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
81 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
82 virtual Init
*convertValue( UnOpInit
*UI
) {
83 return convertValue((TypedInit
*)UI
);
85 virtual Init
*convertValue( BinOpInit
*UI
) {
86 return convertValue((TypedInit
*)UI
);
88 virtual Init
*convertValue( TernOpInit
*UI
) {
89 return convertValue((TypedInit
*)UI
);
91 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
92 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
93 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
94 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
95 virtual Init
*convertValue( TypedInit
*TI
) { return 0; }
96 virtual Init
*convertValue( VarInit
*VI
) {
97 return convertValue((TypedInit
*)VI
);
99 virtual Init
*convertValue( FieldInit
*FI
) {
100 return convertValue((TypedInit
*)FI
);
103 public: // These methods should only be called by subclasses of RecTy.
104 // baseClassOf - These virtual methods should be overloaded to return true iff
105 // all values of type 'RHS' can be converted to the 'this' type.
106 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
107 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
108 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
109 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
110 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
111 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
112 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
113 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
116 inline std::ostream
&operator<<(std::ostream
&OS
, const RecTy
&Ty
) {
122 /// BitRecTy - 'bit' - Represent a single bit
124 class BitRecTy
: public RecTy
{
126 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
127 virtual Init
*convertValue( BitInit
*BI
) { return (Init
*)BI
; }
128 virtual Init
*convertValue( BitsInit
*BI
);
129 virtual Init
*convertValue( IntInit
*II
);
130 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
131 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
132 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
133 virtual Init
*convertValue(VarBitInit
*VB
) { return (Init
*)VB
; }
134 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
135 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
136 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
137 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
138 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
139 virtual Init
*convertValue( TypedInit
*TI
);
140 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
141 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
143 std::string
getAsString() const { return "bit"; }
145 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
146 return RHS
->baseClassOf(this);
148 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return true; }
149 virtual bool baseClassOf(const BitsRecTy
*RHS
) const;
150 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
151 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
152 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
153 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
154 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
155 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
160 // BitsRecTy - 'bits<n>' - Represent a fixed number of bits
161 /// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
163 class BitsRecTy
: public RecTy
{
166 explicit BitsRecTy(unsigned Sz
) : Size(Sz
) {}
168 unsigned getNumBits() const { return Size
; }
170 virtual Init
*convertValue( UnsetInit
*UI
);
171 virtual Init
*convertValue( BitInit
*UI
);
172 virtual Init
*convertValue( BitsInit
*BI
);
173 virtual Init
*convertValue( IntInit
*II
);
174 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
175 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
176 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
177 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
178 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
179 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
180 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
181 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
182 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
183 virtual Init
*convertValue( TypedInit
*TI
);
184 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
185 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
187 std::string
getAsString() const;
189 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
190 return RHS
->baseClassOf(this);
192 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return Size
== 1; }
193 virtual bool baseClassOf(const BitsRecTy
*RHS
) const {
194 return RHS
->Size
== Size
;
196 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
197 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
198 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
199 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
200 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
201 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
206 /// IntRecTy - 'int' - Represent an integer value of no particular size
208 class IntRecTy
: public RecTy
{
210 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
211 virtual Init
*convertValue( BitInit
*BI
);
212 virtual Init
*convertValue( BitsInit
*BI
);
213 virtual Init
*convertValue( IntInit
*II
) { return (Init
*)II
; }
214 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
215 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
216 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
217 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
218 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
219 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
220 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
221 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
222 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
223 virtual Init
*convertValue( TypedInit
*TI
);
224 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
225 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
227 std::string
getAsString() const { return "int"; }
229 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
230 return RHS
->baseClassOf(this);
233 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return true; }
234 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return true; }
235 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return true; }
236 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
237 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
238 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
239 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
240 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
244 /// StringRecTy - 'string' - Represent an string value
246 class StringRecTy
: public RecTy
{
248 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
249 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
250 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
251 virtual Init
*convertValue( IntInit
*II
) { return 0; }
252 virtual Init
*convertValue(StringInit
*SI
) { return (Init
*)SI
; }
253 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
254 virtual Init
*convertValue( UnOpInit
*BO
);
255 virtual Init
*convertValue( BinOpInit
*BO
);
256 virtual Init
*convertValue( TernOpInit
*BO
) { return RecTy::convertValue(BO
);}
258 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
259 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
260 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
261 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
262 virtual Init
*convertValue( TypedInit
*TI
);
263 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
264 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
266 std::string
getAsString() const { return "string"; }
268 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
269 return RHS
->baseClassOf(this);
272 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
273 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
274 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
275 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return true; }
276 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
277 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
278 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
279 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
282 // ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
283 // the specified type.
284 /// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must
285 /// be of the specified type.
287 class ListRecTy
: public RecTy
{
290 explicit ListRecTy(RecTy
*T
) : Ty(T
) {}
292 RecTy
*getElementType() const { return Ty
; }
294 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
295 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
296 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
297 virtual Init
*convertValue( IntInit
*II
) { return 0; }
298 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
299 virtual Init
*convertValue( ListInit
*LI
);
300 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
301 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
302 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
303 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
304 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
305 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
306 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
307 virtual Init
*convertValue( TypedInit
*TI
);
308 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
309 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
311 std::string
getAsString() const;
313 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
314 return RHS
->baseClassOf(this);
317 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
318 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
319 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
320 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
321 virtual bool baseClassOf(const ListRecTy
*RHS
) const {
322 return RHS
->getElementType()->typeIsConvertibleTo(Ty
);
324 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
325 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
326 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
329 /// CodeRecTy - 'code' - Represent an code fragment, function or method.
331 class CodeRecTy
: public RecTy
{
333 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
334 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
335 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
336 virtual Init
*convertValue( IntInit
*II
) { return 0; }
337 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
338 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
339 virtual Init
*convertValue( CodeInit
*CI
) { return (Init
*)CI
; }
340 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
341 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
342 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
343 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
344 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
345 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
346 virtual Init
*convertValue( TypedInit
*TI
);
347 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
348 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
350 std::string
getAsString() const { return "code"; }
352 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
353 return RHS
->baseClassOf(this);
355 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
356 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
357 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
358 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
359 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
360 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return true; }
361 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
362 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
365 /// DagRecTy - 'dag' - Represent a dag fragment
367 class DagRecTy
: public RecTy
{
369 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
370 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
371 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
372 virtual Init
*convertValue( IntInit
*II
) { return 0; }
373 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
374 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
375 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
376 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
377 virtual Init
*convertValue( DefInit
*DI
) { return 0; }
378 virtual Init
*convertValue( UnOpInit
*BO
);
379 virtual Init
*convertValue( BinOpInit
*BO
);
380 virtual Init
*convertValue( TernOpInit
*BO
) { return RecTy::convertValue(BO
);}
381 virtual Init
*convertValue( DagInit
*CI
) { return (Init
*)CI
; }
382 virtual Init
*convertValue( TypedInit
*TI
);
383 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
384 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
386 std::string
getAsString() const { return "dag"; }
388 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
389 return RHS
->baseClassOf(this);
392 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
393 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
394 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
395 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
396 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
397 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
398 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return true; }
399 virtual bool baseClassOf(const RecordRecTy
*RHS
) const { return false; }
403 /// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
406 class RecordRecTy
: public RecTy
{
409 explicit RecordRecTy(Record
*R
) : Rec(R
) {}
411 Record
*getRecord() const { return Rec
; }
413 virtual Init
*convertValue( UnsetInit
*UI
) { return (Init
*)UI
; }
414 virtual Init
*convertValue( BitInit
*BI
) { return 0; }
415 virtual Init
*convertValue( BitsInit
*BI
) { return 0; }
416 virtual Init
*convertValue( IntInit
*II
) { return 0; }
417 virtual Init
*convertValue(StringInit
*SI
) { return 0; }
418 virtual Init
*convertValue( ListInit
*LI
) { return 0; }
419 virtual Init
*convertValue( CodeInit
*CI
) { return 0; }
420 virtual Init
*convertValue(VarBitInit
*VB
) { return 0; }
421 virtual Init
*convertValue( UnOpInit
*UI
) { return RecTy::convertValue(UI
);}
422 virtual Init
*convertValue( BinOpInit
*UI
) { return RecTy::convertValue(UI
);}
423 virtual Init
*convertValue( TernOpInit
*UI
) { return RecTy::convertValue(UI
);}
424 virtual Init
*convertValue( DefInit
*DI
);
425 virtual Init
*convertValue( DagInit
*DI
) { return 0; }
426 virtual Init
*convertValue( TypedInit
*VI
);
427 virtual Init
*convertValue( VarInit
*VI
) { return RecTy::convertValue(VI
);}
428 virtual Init
*convertValue( FieldInit
*FI
) { return RecTy::convertValue(FI
);}
430 std::string
getAsString() const;
432 bool typeIsConvertibleTo(const RecTy
*RHS
) const {
433 return RHS
->baseClassOf(this);
435 virtual bool baseClassOf(const BitRecTy
*RHS
) const { return false; }
436 virtual bool baseClassOf(const BitsRecTy
*RHS
) const { return false; }
437 virtual bool baseClassOf(const IntRecTy
*RHS
) const { return false; }
438 virtual bool baseClassOf(const StringRecTy
*RHS
) const { return false; }
439 virtual bool baseClassOf(const ListRecTy
*RHS
) const { return false; }
440 virtual bool baseClassOf(const CodeRecTy
*RHS
) const { return false; }
441 virtual bool baseClassOf(const DagRecTy
*RHS
) const { return false; }
442 virtual bool baseClassOf(const RecordRecTy
*RHS
) const;
447 //===----------------------------------------------------------------------===//
448 // Initializer Classes
449 //===----------------------------------------------------------------------===//
454 /// isComplete - This virtual method should be overridden by values that may
455 /// not be completely specified yet.
456 virtual bool isComplete() const { return true; }
458 /// print - Print out this value.
459 void print(std::ostream
&OS
) const { OS
<< getAsString(); }
461 /// getAsString - Convert this value to a string form.
462 virtual std::string
getAsString() const = 0;
464 /// dump - Debugging method that may be called through a debugger, just
465 /// invokes print on cerr.
468 /// convertInitializerTo - This virtual function is a simple call-back
469 /// function that should be overridden to call the appropriate
470 /// RecTy::convertValue method.
472 virtual Init
*convertInitializerTo(RecTy
*Ty
) = 0;
474 /// convertInitializerBitRange - This method is used to implement the bitrange
475 /// selection operator. Given an initializer, it selects the specified bits
476 /// out, returning them as a new init of bits type. If it is not legal to use
477 /// the bit subscript operator on this initializer, return null.
479 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
) {
483 /// convertInitListSlice - This method is used to implement the list slice
484 /// selection operator. Given an initializer, it selects the specified list
485 /// elements, returning them as a new init of list type. If it is not legal
486 /// to take a slice of this, return null.
488 virtual Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
) {
492 /// getFieldType - This method is used to implement the FieldInit class.
493 /// Implementors of this method should return the type of the named field if
494 /// they are of record type.
496 virtual RecTy
*getFieldType(const std::string
&FieldName
) const { return 0; }
498 /// getFieldInit - This method complements getFieldType to return the
499 /// initializer for the specified field. If getFieldType returns non-null
500 /// this method should return non-null, otherwise it returns null.
502 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const {
506 /// resolveReferences - This method is used by classes that refer to other
507 /// variables which may not be defined at the time they expression is formed.
508 /// If a value is set for the variable later, this method will be called on
509 /// users of the value to allow the value to propagate out.
511 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
) {
516 inline std::ostream
&operator<<(std::ostream
&OS
, const Init
&I
) {
517 I
.print(OS
); return OS
;
520 /// TypedInit - This is the common super-class of types that have a specific,
523 class TypedInit
: public Init
{
526 explicit TypedInit(RecTy
*T
) : Ty(T
) {}
528 RecTy
*getType() const { return Ty
; }
530 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
531 virtual Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
);
533 /// resolveBitReference - This method is used to implement
534 /// VarBitInit::resolveReferences. If the bit is able to be resolved, we
535 /// simply return the resolved value, otherwise we return null.
537 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
540 /// resolveListElementReference - This method is used to implement
541 /// VarListElementInit::resolveReferences. If the list element is resolvable
542 /// now, we return the resolved value, otherwise we return null.
543 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
548 /// UnsetInit - ? - Represents an uninitialized value
550 class UnsetInit
: public Init
{
552 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
553 return Ty
->convertValue(this);
556 virtual bool isComplete() const { return false; }
557 virtual std::string
getAsString() const { return "?"; }
561 /// BitInit - true/false - Represent a concrete initializer for a bit.
563 class BitInit
: public Init
{
566 explicit BitInit(bool V
) : Value(V
) {}
568 bool getValue() const { return Value
; }
570 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
571 return Ty
->convertValue(this);
574 virtual std::string
getAsString() const { return Value
? "1" : "0"; }
577 /// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
578 /// It contains a vector of bits, whose size is determined by the type.
580 class BitsInit
: public Init
{
581 std::vector
<Init
*> Bits
;
583 explicit BitsInit(unsigned Size
) : Bits(Size
) {}
585 unsigned getNumBits() const { return Bits
.size(); }
587 Init
*getBit(unsigned Bit
) const {
588 assert(Bit
< Bits
.size() && "Bit index out of range!");
591 void setBit(unsigned Bit
, Init
*V
) {
592 assert(Bit
< Bits
.size() && "Bit index out of range!");
593 assert(Bits
[Bit
] == 0 && "Bit already set!");
597 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
598 return Ty
->convertValue(this);
600 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
602 virtual bool isComplete() const {
603 for (unsigned i
= 0; i
!= getNumBits(); ++i
)
604 if (!getBit(i
)->isComplete()) return false;
607 virtual std::string
getAsString() const;
609 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
611 // printXX - Print this bitstream with the specified format, returning true if
612 // it is not possible.
613 bool printInHex(std::ostream
&OS
) const;
614 bool printAsVariable(std::ostream
&OS
) const;
615 bool printAsUnset(std::ostream
&OS
) const;
619 /// IntInit - 7 - Represent an initalization by a literal integer value.
621 class IntInit
: public Init
{
624 explicit IntInit(int64_t V
) : Value(V
) {}
626 int64_t getValue() const { return Value
; }
628 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
629 return Ty
->convertValue(this);
631 virtual Init
*convertInitializerBitRange(const std::vector
<unsigned> &Bits
);
633 virtual std::string
getAsString() const;
637 /// StringInit - "foo" - Represent an initialization by a string value.
639 class StringInit
: public TypedInit
{
642 explicit StringInit(const std::string
&V
)
643 : TypedInit(new StringRecTy
), Value(V
) {}
645 const std::string
&getValue() const { return Value
; }
647 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
648 return Ty
->convertValue(this);
651 virtual std::string
getAsString() const { return "\"" + Value
+ "\""; }
653 /// resolveBitReference - This method is used to implement
654 /// VarBitInit::resolveReferences. If the bit is able to be resolved, we
655 /// simply return the resolved value, otherwise we return null.
657 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
659 assert(0 && "Illegal bit reference off string");
663 /// resolveListElementReference - This method is used to implement
664 /// VarListElementInit::resolveReferences. If the list element is resolvable
665 /// now, we return the resolved value, otherwise we return null.
666 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
668 assert(0 && "Illegal element reference off string");
673 /// CodeInit - "[{...}]" - Represent a code fragment.
675 class CodeInit
: public Init
{
678 explicit CodeInit(const std::string
&V
) : Value(V
) {}
680 const std::string
getValue() const { return Value
; }
682 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
683 return Ty
->convertValue(this);
686 virtual std::string
getAsString() const { return "[{" + Value
+ "}]"; }
689 /// ListInit - [AL, AH, CL] - Represent a list of defs
691 class ListInit
: public Init
{
692 std::vector
<Init
*> Values
;
694 typedef std::vector
<Init
*>::iterator iterator
;
695 typedef std::vector
<Init
*>::const_iterator const_iterator
;
697 explicit ListInit(std::vector
<Init
*> &Vs
) {
700 explicit ListInit(iterator Start
, iterator End
)
701 : Values(Start
, End
) {}
703 unsigned getSize() const { return Values
.size(); }
704 Init
*getElement(unsigned i
) const {
705 assert(i
< Values
.size() && "List element index out of range!");
709 Record
*getElementAsRecord(unsigned i
) const;
711 Init
*convertInitListSlice(const std::vector
<unsigned> &Elements
);
713 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
714 return Ty
->convertValue(this);
717 /// resolveReferences - This method is used by classes that refer to other
718 /// variables which may not be defined at the time they expression is formed.
719 /// If a value is set for the variable later, this method will be called on
720 /// users of the value to allow the value to propagate out.
722 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
724 virtual std::string
getAsString() const;
726 inline iterator
begin() { return Values
.begin(); }
727 inline const_iterator
begin() const { return Values
.begin(); }
728 inline iterator
end () { return Values
.end(); }
729 inline const_iterator
end () const { return Values
.end(); }
731 inline size_t size () const { return Values
.size(); }
732 inline bool empty() const { return Values
.empty(); }
736 /// OpInit - Base class for operators
738 class OpInit
: public TypedInit
{
740 OpInit(RecTy
*Type
) : TypedInit(Type
) {}
742 // Clone - Clone this operator, replacing arguments with the new list
743 virtual OpInit
*clone(std::vector
<Init
*> &Operands
) = 0;
745 virtual int getNumOperands(void) const = 0;
746 virtual Init
*getOperand(int i
) = 0;
748 // Fold - If possible, fold this to a simpler init. Return this if not
750 virtual Init
*Fold(Record
*CurRec
, MultiClass
*CurMultiClass
) = 0;
752 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
753 return Ty
->convertValue(this);
756 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
758 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
763 /// UnOpInit - !op (X) - Transform an init.
765 class UnOpInit
: public OpInit
{
767 enum UnaryOp
{ CAST
, CAR
, CDR
, LNULL
};
772 UnOpInit(UnaryOp opc
, Init
*lhs
, RecTy
*Type
) :
773 OpInit(Type
), Opc(opc
), LHS(lhs
) {
776 // Clone - Clone this operator, replacing arguments with the new list
777 virtual OpInit
*clone(std::vector
<Init
*> &Operands
) {
778 assert(Operands
.size() == 1 &&
779 "Wrong number of operands for unary operation");
780 return new UnOpInit(getOpcode(), *Operands
.begin(), getType());
783 int getNumOperands(void) const { return 1; }
784 Init
*getOperand(int i
) {
785 assert(i
== 0 && "Invalid operand id for unary operator");
789 UnaryOp
getOpcode() const { return Opc
; }
790 Init
*getOperand() const { return LHS
; }
792 // Fold - If possible, fold this to a simpler init. Return this if not
794 Init
*Fold(Record
*CurRec
, MultiClass
*CurMultiClass
);
796 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
798 virtual std::string
getAsString() const;
801 /// BinOpInit - !op (X, Y) - Combine two inits.
803 class BinOpInit
: public OpInit
{
805 enum BinaryOp
{ SHL
, SRA
, SRL
, STRCONCAT
, CONCAT
, NAMECONCAT
};
810 BinOpInit(BinaryOp opc
, Init
*lhs
, Init
*rhs
, RecTy
*Type
) :
811 OpInit(Type
), Opc(opc
), LHS(lhs
), RHS(rhs
) {
814 // Clone - Clone this operator, replacing arguments with the new list
815 virtual OpInit
*clone(std::vector
<Init
*> &Operands
) {
816 assert(Operands
.size() == 2 &&
817 "Wrong number of operands for binary operation");
818 return new BinOpInit(getOpcode(), Operands
[0], Operands
[1], getType());
821 int getNumOperands(void) const { return 2; }
822 Init
*getOperand(int i
) {
823 assert((i
== 0 || i
== 1) && "Invalid operand id for binary operator");
832 BinaryOp
getOpcode() const { return Opc
; }
833 Init
*getLHS() const { return LHS
; }
834 Init
*getRHS() const { return RHS
; }
836 // Fold - If possible, fold this to a simpler init. Return this if not
838 Init
*Fold(Record
*CurRec
, MultiClass
*CurMultiClass
);
840 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
842 virtual std::string
getAsString() const;
845 /// TernOpInit - !op (X, Y, Z) - Combine two inits.
847 class TernOpInit
: public OpInit
{
849 enum TernaryOp
{ SUBST
, FOREACH
, IF
};
852 Init
*LHS
, *MHS
, *RHS
;
854 TernOpInit(TernaryOp opc
, Init
*lhs
, Init
*mhs
, Init
*rhs
, RecTy
*Type
) :
855 OpInit(Type
), Opc(opc
), LHS(lhs
), MHS(mhs
), RHS(rhs
) {
858 // Clone - Clone this operator, replacing arguments with the new list
859 virtual OpInit
*clone(std::vector
<Init
*> &Operands
) {
860 assert(Operands
.size() == 3 &&
861 "Wrong number of operands for ternary operation");
862 return new TernOpInit(getOpcode(), Operands
[0], Operands
[1], Operands
[2],
866 int getNumOperands(void) const { return 3; }
867 Init
*getOperand(int i
) {
868 assert((i
== 0 || i
== 1 || i
== 2) &&
869 "Invalid operand id for ternary operator");
881 TernaryOp
getOpcode() const { return Opc
; }
882 Init
*getLHS() const { return LHS
; }
883 Init
*getMHS() const { return MHS
; }
884 Init
*getRHS() const { return RHS
; }
886 // Fold - If possible, fold this to a simpler init. Return this if not
888 Init
*Fold(Record
*CurRec
, MultiClass
*CurMultiClass
);
890 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
892 virtual std::string
getAsString() const;
896 /// VarInit - 'Opcode' - Represent a reference to an entire variable object.
898 class VarInit
: public TypedInit
{
901 explicit VarInit(const std::string
&VN
, RecTy
*T
)
902 : TypedInit(T
), VarName(VN
) {}
904 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
905 return Ty
->convertValue(this);
908 const std::string
&getName() const { return VarName
; }
910 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
912 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
915 virtual RecTy
*getFieldType(const std::string
&FieldName
) const;
916 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const;
918 /// resolveReferences - This method is used by classes that refer to other
919 /// variables which may not be defined at the time they expression is formed.
920 /// If a value is set for the variable later, this method will be called on
921 /// users of the value to allow the value to propagate out.
923 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
925 virtual std::string
getAsString() const { return VarName
; }
929 /// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
931 class VarBitInit
: public Init
{
935 VarBitInit(TypedInit
*T
, unsigned B
) : TI(T
), Bit(B
) {
936 assert(T
->getType() && dynamic_cast<BitsRecTy
*>(T
->getType()) &&
937 ((BitsRecTy
*)T
->getType())->getNumBits() > B
&&
938 "Illegal VarBitInit expression!");
941 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
942 return Ty
->convertValue(this);
945 TypedInit
*getVariable() const { return TI
; }
946 unsigned getBitNum() const { return Bit
; }
948 virtual std::string
getAsString() const;
949 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
952 /// VarListElementInit - List[4] - Represent access to one element of a var or
954 class VarListElementInit
: public TypedInit
{
958 VarListElementInit(TypedInit
*T
, unsigned E
)
959 : TypedInit(dynamic_cast<ListRecTy
*>(T
->getType())->getElementType()),
961 assert(T
->getType() && dynamic_cast<ListRecTy
*>(T
->getType()) &&
962 "Illegal VarBitInit expression!");
965 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
966 return Ty
->convertValue(this);
969 TypedInit
*getVariable() const { return TI
; }
970 unsigned getElementNum() const { return Element
; }
972 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
975 /// resolveListElementReference - This method is used to implement
976 /// VarListElementInit::resolveReferences. If the list element is resolvable
977 /// now, we return the resolved value, otherwise we return null.
978 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
981 virtual std::string
getAsString() const;
982 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
985 /// DefInit - AL - Represent a reference to a 'def' in the description
987 class DefInit
: public TypedInit
{
990 explicit DefInit(Record
*D
) : TypedInit(new RecordRecTy(D
)), Def(D
) {}
992 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
993 return Ty
->convertValue(this);
996 Record
*getDef() const { return Def
; }
998 //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
1000 virtual RecTy
*getFieldType(const std::string
&FieldName
) const;
1001 virtual Init
*getFieldInit(Record
&R
, const std::string
&FieldName
) const;
1003 virtual std::string
getAsString() const;
1005 /// resolveBitReference - This method is used to implement
1006 /// VarBitInit::resolveReferences. If the bit is able to be resolved, we
1007 /// simply return the resolved value, otherwise we return null.
1009 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
1011 assert(0 && "Illegal bit reference off def");
1015 /// resolveListElementReference - This method is used to implement
1016 /// VarListElementInit::resolveReferences. If the list element is resolvable
1017 /// now, we return the resolved value, otherwise we return null.
1018 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
1020 assert(0 && "Illegal element reference off def");
1026 /// FieldInit - X.Y - Represent a reference to a subfield of a variable
1028 class FieldInit
: public TypedInit
{
1029 Init
*Rec
; // Record we are referring to
1030 std::string FieldName
; // Field we are accessing
1032 FieldInit(Init
*R
, const std::string
&FN
)
1033 : TypedInit(R
->getFieldType(FN
)), Rec(R
), FieldName(FN
) {
1034 assert(getType() && "FieldInit with non-record type!");
1037 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
1038 return Ty
->convertValue(this);
1041 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
1043 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
1046 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
1048 virtual std::string
getAsString() const {
1049 return Rec
->getAsString() + "." + FieldName
;
1053 /// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required
1054 /// to have at least one value then a (possibly empty) list of arguments. Each
1055 /// argument can have a name associated with it.
1057 class DagInit
: public TypedInit
{
1059 std::string ValName
;
1060 std::vector
<Init
*> Args
;
1061 std::vector
<std::string
> ArgNames
;
1063 DagInit(Init
*V
, std::string VN
,
1064 const std::vector
<std::pair
<Init
*, std::string
> > &args
)
1065 : TypedInit(new DagRecTy
), Val(V
), ValName(VN
) {
1066 Args
.reserve(args
.size());
1067 ArgNames
.reserve(args
.size());
1068 for (unsigned i
= 0, e
= args
.size(); i
!= e
; ++i
) {
1069 Args
.push_back(args
[i
].first
);
1070 ArgNames
.push_back(args
[i
].second
);
1073 DagInit(Init
*V
, std::string VN
, const std::vector
<Init
*> &args
,
1074 const std::vector
<std::string
> &argNames
)
1075 : TypedInit(new DagRecTy
), Val(V
), ValName(VN
), Args(args
), ArgNames(argNames
) {
1078 virtual Init
*convertInitializerTo(RecTy
*Ty
) {
1079 return Ty
->convertValue(this);
1082 Init
*getOperator() const { return Val
; }
1084 const std::string
&getName() const { return ValName
; }
1086 unsigned getNumArgs() const { return Args
.size(); }
1087 Init
*getArg(unsigned Num
) const {
1088 assert(Num
< Args
.size() && "Arg number out of range!");
1091 const std::string
&getArgName(unsigned Num
) const {
1092 assert(Num
< ArgNames
.size() && "Arg number out of range!");
1093 return ArgNames
[Num
];
1096 void setArg(unsigned Num
, Init
*I
) {
1097 assert(Num
< Args
.size() && "Arg number out of range!");
1101 virtual Init
*resolveReferences(Record
&R
, const RecordVal
*RV
);
1103 virtual std::string
getAsString() const;
1105 typedef std::vector
<Init
*>::iterator arg_iterator
;
1106 typedef std::vector
<Init
*>::const_iterator const_arg_iterator
;
1107 typedef std::vector
<std::string
>::iterator name_iterator
;
1108 typedef std::vector
<std::string
>::const_iterator const_name_iterator
;
1110 inline arg_iterator
arg_begin() { return Args
.begin(); }
1111 inline const_arg_iterator
arg_begin() const { return Args
.begin(); }
1112 inline arg_iterator
arg_end () { return Args
.end(); }
1113 inline const_arg_iterator
arg_end () const { return Args
.end(); }
1115 inline size_t arg_size () const { return Args
.size(); }
1116 inline bool arg_empty() const { return Args
.empty(); }
1118 inline name_iterator
name_begin() { return ArgNames
.begin(); }
1119 inline const_name_iterator
name_begin() const { return ArgNames
.begin(); }
1120 inline name_iterator
name_end () { return ArgNames
.end(); }
1121 inline const_name_iterator
name_end () const { return ArgNames
.end(); }
1123 inline size_t name_size () const { return ArgNames
.size(); }
1124 inline bool name_empty() const { return ArgNames
.empty(); }
1126 virtual Init
*resolveBitReference(Record
&R
, const RecordVal
*RV
,
1128 assert(0 && "Illegal bit reference off dag");
1132 virtual Init
*resolveListElementReference(Record
&R
, const RecordVal
*RV
,
1134 assert(0 && "Illegal element reference off dag");
1140 //===----------------------------------------------------------------------===//
1141 // High-Level Classes
1142 //===----------------------------------------------------------------------===//
1150 RecordVal(const std::string
&N
, RecTy
*T
, unsigned P
);
1152 const std::string
&getName() const { return Name
; }
1154 unsigned getPrefix() const { return Prefix
; }
1155 RecTy
*getType() const { return Ty
; }
1156 Init
*getValue() const { return Value
; }
1158 bool setValue(Init
*V
) {
1160 Value
= V
->convertInitializerTo(Ty
);
1168 void print(std::ostream
&OS
, bool PrintSem
= true) const;
1171 inline std::ostream
&operator<<(std::ostream
&OS
, const RecordVal
&RV
) {
1172 RV
.print(OS
<< " ");
1179 std::vector
<std::string
> TemplateArgs
;
1180 std::vector
<RecordVal
> Values
;
1181 std::vector
<Record
*> SuperClasses
;
1184 explicit Record(const std::string
&N
, TGLoc loc
) : Name(N
), Loc(loc
) {}
1187 const std::string
&getName() const { return Name
; }
1188 void setName(const std::string
&Name
); // Also updates RecordKeeper.
1190 TGLoc
getLoc() const { return Loc
; }
1192 const std::vector
<std::string
> &getTemplateArgs() const {
1193 return TemplateArgs
;
1195 const std::vector
<RecordVal
> &getValues() const { return Values
; }
1196 const std::vector
<Record
*> &getSuperClasses() const { return SuperClasses
; }
1198 bool isTemplateArg(const std::string
&Name
) const {
1199 for (unsigned i
= 0, e
= TemplateArgs
.size(); i
!= e
; ++i
)
1200 if (TemplateArgs
[i
] == Name
) return true;
1204 const RecordVal
*getValue(const std::string
&Name
) const {
1205 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
1206 if (Values
[i
].getName() == Name
) return &Values
[i
];
1209 RecordVal
*getValue(const std::string
&Name
) {
1210 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
1211 if (Values
[i
].getName() == Name
) return &Values
[i
];
1215 void addTemplateArg(const std::string
&Name
) {
1216 assert(!isTemplateArg(Name
) && "Template arg already defined!");
1217 TemplateArgs
.push_back(Name
);
1220 void addValue(const RecordVal
&RV
) {
1221 assert(getValue(RV
.getName()) == 0 && "Value already added!");
1222 Values
.push_back(RV
);
1225 void removeValue(const std::string
&Name
) {
1226 assert(getValue(Name
) && "Cannot remove an entry that does not exist!");
1227 for (unsigned i
= 0, e
= Values
.size(); i
!= e
; ++i
)
1228 if (Values
[i
].getName() == Name
) {
1229 Values
.erase(Values
.begin()+i
);
1232 assert(0 && "Name does not exist in record!");
1235 bool isSubClassOf(const Record
*R
) const {
1236 for (unsigned i
= 0, e
= SuperClasses
.size(); i
!= e
; ++i
)
1237 if (SuperClasses
[i
] == R
)
1242 bool isSubClassOf(const std::string
&Name
) const {
1243 for (unsigned i
= 0, e
= SuperClasses
.size(); i
!= e
; ++i
)
1244 if (SuperClasses
[i
]->getName() == Name
)
1249 void addSuperClass(Record
*R
) {
1250 assert(!isSubClassOf(R
) && "Already subclassing record!");
1251 SuperClasses
.push_back(R
);
1254 /// resolveReferences - If there are any field references that refer to fields
1255 /// that have been filled in, we can propagate the values now.
1257 void resolveReferences() { resolveReferencesTo(0); }
1259 /// resolveReferencesTo - If anything in this record refers to RV, replace the
1260 /// reference to RV with the RHS of RV. If RV is null, we resolve all
1261 /// possible references.
1262 void resolveReferencesTo(const RecordVal
*RV
);
1266 //===--------------------------------------------------------------------===//
1267 // High-level methods useful to tablegen back-ends
1270 /// getValueInit - Return the initializer for a value with the specified name,
1271 /// or throw an exception if the field does not exist.
1273 Init
*getValueInit(const std::string
&FieldName
) const;
1275 /// getValueAsString - This method looks up the specified field and returns
1276 /// its value as a string, throwing an exception if the field does not exist
1277 /// or if the value is not a string.
1279 std::string
getValueAsString(const std::string
&FieldName
) const;
1281 /// getValueAsBitsInit - This method looks up the specified field and returns
1282 /// its value as a BitsInit, throwing an exception if the field does not exist
1283 /// or if the value is not the right type.
1285 BitsInit
*getValueAsBitsInit(const std::string
&FieldName
) const;
1287 /// getValueAsListInit - This method looks up the specified field and returns
1288 /// its value as a ListInit, throwing an exception if the field does not exist
1289 /// or if the value is not the right type.
1291 ListInit
*getValueAsListInit(const std::string
&FieldName
) const;
1293 /// getValueAsListOfDefs - This method looks up the specified field and
1294 /// returns its value as a vector of records, throwing an exception if the
1295 /// field does not exist or if the value is not the right type.
1297 std::vector
<Record
*> getValueAsListOfDefs(const std::string
&FieldName
) const;
1299 /// getValueAsListOfInts - This method looks up the specified field and returns
1300 /// its value as a vector of integers, throwing an exception if the field does
1301 /// not exist or if the value is not the right type.
1303 std::vector
<int64_t> getValueAsListOfInts(const std::string
&FieldName
) const;
1305 /// getValueAsDef - This method looks up the specified field and returns its
1306 /// value as a Record, throwing an exception if the field does not exist or if
1307 /// the value is not the right type.
1309 Record
*getValueAsDef(const std::string
&FieldName
) const;
1311 /// getValueAsBit - This method looks up the specified field and returns its
1312 /// value as a bit, throwing an exception if the field does not exist or if
1313 /// the value is not the right type.
1315 bool getValueAsBit(const std::string
&FieldName
) const;
1317 /// getValueAsInt - This method looks up the specified field and returns its
1318 /// value as an int64_t, throwing an exception if the field does not exist or
1319 /// if the value is not the right type.
1321 int64_t getValueAsInt(const std::string
&FieldName
) const;
1323 /// getValueAsDag - This method looks up the specified field and returns its
1324 /// value as an Dag, throwing an exception if the field does not exist or if
1325 /// the value is not the right type.
1327 DagInit
*getValueAsDag(const std::string
&FieldName
) const;
1329 /// getValueAsCode - This method looks up the specified field and returns
1330 /// its value as the string data in a CodeInit, throwing an exception if the
1331 /// field does not exist or if the value is not a code object.
1333 std::string
getValueAsCode(const std::string
&FieldName
) const;
1336 std::ostream
&operator<<(std::ostream
&OS
, const Record
&R
);
1339 Record Rec
; // Placeholder for template args and Name.
1340 typedef std::vector
<Record
*> RecordVector
;
1341 RecordVector DefPrototypes
;
1345 MultiClass(const std::string
&Name
, TGLoc Loc
) : Rec(Name
, Loc
) {}
1348 class RecordKeeper
{
1349 std::map
<std::string
, Record
*> Classes
, Defs
;
1352 for (std::map
<std::string
, Record
*>::iterator I
= Classes
.begin(),
1353 E
= Classes
.end(); I
!= E
; ++I
)
1355 for (std::map
<std::string
, Record
*>::iterator I
= Defs
.begin(),
1356 E
= Defs
.end(); I
!= E
; ++I
)
1360 const std::map
<std::string
, Record
*> &getClasses() const { return Classes
; }
1361 const std::map
<std::string
, Record
*> &getDefs() const { return Defs
; }
1363 Record
*getClass(const std::string
&Name
) const {
1364 std::map
<std::string
, Record
*>::const_iterator I
= Classes
.find(Name
);
1365 return I
== Classes
.end() ? 0 : I
->second
;
1367 Record
*getDef(const std::string
&Name
) const {
1368 std::map
<std::string
, Record
*>::const_iterator I
= Defs
.find(Name
);
1369 return I
== Defs
.end() ? 0 : I
->second
;
1371 void addClass(Record
*R
) {
1372 assert(getClass(R
->getName()) == 0 && "Class already exists!");
1373 Classes
.insert(std::make_pair(R
->getName(), R
));
1375 void addDef(Record
*R
) {
1376 assert(getDef(R
->getName()) == 0 && "Def already exists!");
1377 Defs
.insert(std::make_pair(R
->getName(), R
));
1380 /// removeClass - Remove, but do not delete, the specified record.
1382 void removeClass(const std::string
&Name
) {
1383 assert(Classes
.count(Name
) && "Class does not exist!");
1384 Classes
.erase(Name
);
1386 /// removeDef - Remove, but do not delete, the specified record.
1388 void removeDef(const std::string
&Name
) {
1389 assert(Defs
.count(Name
) && "Def does not exist!");
1393 //===--------------------------------------------------------------------===//
1394 // High-level helper methods, useful for tablegen backends...
1396 /// getAllDerivedDefinitions - This method returns all concrete definitions
1397 /// that derive from the specified class name. If a class with the specified
1398 /// name does not exist, an exception is thrown.
1399 std::vector
<Record
*>
1400 getAllDerivedDefinitions(const std::string
&ClassName
) const;
1406 /// LessRecord - Sorting predicate to sort record pointers by name.
1409 bool operator()(const Record
*Rec1
, const Record
*Rec2
) const {
1410 return Rec1
->getName() < Rec2
->getName();
1414 /// LessRecordFieldName - Sorting predicate to sort record pointers by their
1417 struct LessRecordFieldName
{
1418 bool operator()(const Record
*Rec1
, const Record
*Rec2
) const {
1419 return Rec1
->getValueAsString("Name") < Rec2
->getValueAsString("Name");
1426 std::string Message
;
1428 TGError(TGLoc loc
, const std::string
&message
) : Loc(loc
), Message(message
) {}
1430 TGLoc
getLoc() const { return Loc
; }
1431 const std::string
&getMessage() const { return Message
; }
1435 std::ostream
&operator<<(std::ostream
&OS
, const RecordKeeper
&RK
);
1437 extern RecordKeeper Records
;
1439 void PrintError(TGLoc ErrorLoc
, const std::string
&Msg
);
1442 } // End llvm namespace