blob: c6005c522160fa8f0ff4a595326472d8c9de899f [file] [log] [blame]
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001//===- Record.h - Classes to represent Table Records ------------*- C++ -*-===//
Misha Brukman650ba8e2005-04-22 00:00:37 +00002//
John Criswelld3032032003-10-20 20:20:30 +00003// 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.
Misha Brukman650ba8e2005-04-22 00:00:37 +00007//
John Criswelld3032032003-10-20 20:20:30 +00008//===----------------------------------------------------------------------===//
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00009//
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>
Bill Wendling9bfb1e12006-12-07 22:21:48 +000021#include <ostream>
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000022#include <cassert>
23
Brian Gaeke960707c2003-11-11 22:41:34 +000024namespace llvm {
25
Chris Lattneref943742005-04-19 03:36:21 +000026// RecTy subclasses.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000027class BitRecTy;
28class BitsRecTy;
29class IntRecTy;
30class StringRecTy;
31class ListRecTy;
32class CodeRecTy;
33class DagRecTy;
34class RecordRecTy;
35
Chris Lattneref943742005-04-19 03:36:21 +000036// Init subclasses.
Chris Lattner7dfc2d22004-10-27 16:14:51 +000037struct Init;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000038class UnsetInit;
39class BitInit;
40class BitsInit;
41class IntInit;
42class StringInit;
43class CodeInit;
44class ListInit;
Chris Lattner51ffbf12006-03-31 21:53:49 +000045class BinOpInit;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000046class DefInit;
47class DagInit;
48class TypedInit;
49class VarInit;
50class FieldInit;
51class VarBitInit;
Chris Lattner577fc3f2004-07-27 01:01:21 +000052class VarListElementInit;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000053
Chris Lattneref943742005-04-19 03:36:21 +000054// Other classes.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000055class Record;
Chris Lattneref943742005-04-19 03:36:21 +000056class RecordVal;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000057
58//===----------------------------------------------------------------------===//
59// Type Classes
60//===----------------------------------------------------------------------===//
61
62struct RecTy {
63 virtual ~RecTy() {}
64
Chris Lattner8b9ecda2007-11-20 22:25:16 +000065 virtual std::string getAsString() const = 0;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000066 virtual void print(std::ostream &OS) const = 0;
67 void dump() const;
68
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;
72
73public: // 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; }
Chris Lattner51ffbf12006-03-31 21:53:49 +000080 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +000081 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);
88 }
89 virtual Init *convertValue( FieldInit *FI) {
90 return convertValue((TypedInit*)FI);
91 }
92
93public: // 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; }
104};
105
106inline std::ostream &operator<<(std::ostream &OS, const RecTy &Ty) {
107 Ty.print(OS);
108 return OS;
109}
110
111
112/// BitRecTy - 'bit' - Represent a single bit
113///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000114class BitRecTy : public RecTy {
115public:
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000116 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; }
Reid Spencer97c59802006-08-28 00:12:25 +0000126 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000127 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);}
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000130
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000131 std::string getAsString() const { return "bit"; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000132 void print(std::ostream &OS) const { OS << "bit"; }
133
134 bool typeIsConvertibleTo(const RecTy *RHS) const {
135 return RHS->baseClassOf(this);
136 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000137 virtual bool baseClassOf(const BitRecTy *RHS) const { return true; }
138 virtual bool baseClassOf(const BitsRecTy *RHS) const;
139 virtual bool baseClassOf(const IntRecTy *RHS) const { return true; }
140 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
141 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
142 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
143 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
144 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
145
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000146};
147
148
Misha Brukmanb4f20ea2004-04-15 15:30:15 +0000149// BitsRecTy - 'bits<n>' - Represent a fixed number of bits
150/// BitsRecTy - 'bits&lt;n&gt;' - Represent a fixed number of bits
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000151///
152class BitsRecTy : public RecTy {
153 unsigned Size;
154public:
155 BitsRecTy(unsigned Sz) : Size(Sz) {}
156
157 unsigned getNumBits() const { return Size; }
158
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000159 virtual Init *convertValue( UnsetInit *UI);
160 virtual Init *convertValue( BitInit *UI);
161 virtual Init *convertValue( BitsInit *BI);
162 virtual Init *convertValue( IntInit *II);
163 virtual Init *convertValue(StringInit *SI) { return 0; }
164 virtual Init *convertValue( ListInit *LI) { return 0; }
165 virtual Init *convertValue( CodeInit *CI) { return 0; }
166 virtual Init *convertValue(VarBitInit *VB) { return 0; }
167 virtual Init *convertValue( DefInit *DI) { return 0; }
168 virtual Init *convertValue( DagInit *DI) { return 0; }
Reid Spencer97c59802006-08-28 00:12:25 +0000169 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000170 virtual Init *convertValue( TypedInit *TI);
171 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
172 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
173
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000174 std::string getAsString() const;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000175 void print(std::ostream &OS) const { OS << "bits<" << Size << ">"; }
176
177 bool typeIsConvertibleTo(const RecTy *RHS) const {
178 return RHS->baseClassOf(this);
179 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000180 virtual bool baseClassOf(const BitRecTy *RHS) const { return Size == 1; }
181 virtual bool baseClassOf(const BitsRecTy *RHS) const {
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000182 return RHS->Size == Size;
183 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000184 virtual bool baseClassOf(const IntRecTy *RHS) const { return true; }
185 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
186 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
187 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
188 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
189 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
190
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000191};
192
193
194/// IntRecTy - 'int' - Represent an integer value of no particular size
195///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000196class IntRecTy : public RecTy {
197public:
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000198 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
199 virtual Init *convertValue( BitInit *BI);
200 virtual Init *convertValue( BitsInit *BI);
201 virtual Init *convertValue( IntInit *II) { return (Init*)II; }
202 virtual Init *convertValue(StringInit *SI) { return 0; }
203 virtual Init *convertValue( ListInit *LI) { return 0; }
204 virtual Init *convertValue( CodeInit *CI) { return 0; }
205 virtual Init *convertValue(VarBitInit *VB) { return 0; }
206 virtual Init *convertValue( DefInit *DI) { return 0; }
207 virtual Init *convertValue( DagInit *DI) { return 0; }
Reid Spencer97c59802006-08-28 00:12:25 +0000208 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000209 virtual Init *convertValue( TypedInit *TI);
210 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
211 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
212
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000213 std::string getAsString() const { return "int"; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000214 void print(std::ostream &OS) const { OS << "int"; }
215
216 bool typeIsConvertibleTo(const RecTy *RHS) const {
217 return RHS->baseClassOf(this);
218 }
219
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000220 virtual bool baseClassOf(const BitRecTy *RHS) const { return true; }
221 virtual bool baseClassOf(const BitsRecTy *RHS) const { return true; }
222 virtual bool baseClassOf(const IntRecTy *RHS) const { return true; }
223 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
224 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
225 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
226 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
227 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
228
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000229};
230
231/// StringRecTy - 'string' - Represent an string value
232///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000233class StringRecTy : public RecTy {
234public:
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000235 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
236 virtual Init *convertValue( BitInit *BI) { return 0; }
237 virtual Init *convertValue( BitsInit *BI) { return 0; }
238 virtual Init *convertValue( IntInit *II) { return 0; }
239 virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
240 virtual Init *convertValue( ListInit *LI) { return 0; }
Chris Lattner51ffbf12006-03-31 21:53:49 +0000241 virtual Init *convertValue( BinOpInit *BO);
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000242 virtual Init *convertValue( CodeInit *CI) { return 0; }
243 virtual Init *convertValue(VarBitInit *VB) { return 0; }
244 virtual Init *convertValue( DefInit *DI) { return 0; }
245 virtual Init *convertValue( DagInit *DI) { return 0; }
246 virtual Init *convertValue( TypedInit *TI);
247 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
248 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
249
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000250 std::string getAsString() const { return "string"; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000251 void print(std::ostream &OS) const { OS << "string"; }
252
253 bool typeIsConvertibleTo(const RecTy *RHS) const {
254 return RHS->baseClassOf(this);
255 }
256
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000257 virtual bool baseClassOf(const BitRecTy *RHS) const { return false; }
258 virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; }
259 virtual bool baseClassOf(const IntRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000260 virtual bool baseClassOf(const StringRecTy *RHS) const { return true; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000261 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
262 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
263 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
264 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000265};
266
Misha Brukmanb4f20ea2004-04-15 15:30:15 +0000267// ListRecTy - 'list<Ty>' - Represent a list of values, all of which must be of
268// the specified type.
269/// ListRecTy - 'list&lt;Ty&gt;' - Represent a list of values, all of which must
270/// be of the specified type.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000271///
272class ListRecTy : public RecTy {
273 RecTy *Ty;
274public:
275 ListRecTy(RecTy *T) : Ty(T) {}
276
277 RecTy *getElementType() const { return Ty; }
278
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000279 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
280 virtual Init *convertValue( BitInit *BI) { return 0; }
281 virtual Init *convertValue( BitsInit *BI) { return 0; }
282 virtual Init *convertValue( IntInit *II) { return 0; }
283 virtual Init *convertValue(StringInit *SI) { return 0; }
284 virtual Init *convertValue( ListInit *LI);
285 virtual Init *convertValue( CodeInit *CI) { return 0; }
286 virtual Init *convertValue(VarBitInit *VB) { return 0; }
287 virtual Init *convertValue( DefInit *DI) { return 0; }
288 virtual Init *convertValue( DagInit *DI) { return 0; }
Reid Spencer97c59802006-08-28 00:12:25 +0000289 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000290 virtual Init *convertValue( TypedInit *TI);
291 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
292 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
Misha Brukman650ba8e2005-04-22 00:00:37 +0000293
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000294 std::string getAsString() const;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000295 void print(std::ostream &OS) const;
296
297 bool typeIsConvertibleTo(const RecTy *RHS) const {
298 return RHS->baseClassOf(this);
299 }
300
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000301 virtual bool baseClassOf(const BitRecTy *RHS) const { return false; }
302 virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; }
303 virtual bool baseClassOf(const IntRecTy *RHS) const { return false; }
304 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
305 virtual bool baseClassOf(const ListRecTy *RHS) const {
Misha Brukman650ba8e2005-04-22 00:00:37 +0000306 return RHS->getElementType()->typeIsConvertibleTo(Ty);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000307 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000308 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
309 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
310 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000311};
312
313/// CodeRecTy - 'code' - Represent an code fragment, function or method.
314///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000315class CodeRecTy : public RecTy {
316public:
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000317 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
318 virtual Init *convertValue( BitInit *BI) { return 0; }
319 virtual Init *convertValue( BitsInit *BI) { return 0; }
320 virtual Init *convertValue( IntInit *II) { return 0; }
321 virtual Init *convertValue(StringInit *SI) { return 0; }
322 virtual Init *convertValue( ListInit *LI) { return 0; }
323 virtual Init *convertValue( CodeInit *CI) { return (Init*)CI; }
324 virtual Init *convertValue(VarBitInit *VB) { return 0; }
325 virtual Init *convertValue( DefInit *DI) { return 0; }
326 virtual Init *convertValue( DagInit *DI) { return 0; }
Reid Spencer97c59802006-08-28 00:12:25 +0000327 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000328 virtual Init *convertValue( TypedInit *TI);
329 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
330 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
331
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000332 std::string getAsString() const { return "code"; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000333 void print(std::ostream &OS) const { OS << "code"; }
334
335 bool typeIsConvertibleTo(const RecTy *RHS) const {
336 return RHS->baseClassOf(this);
337 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000338 virtual bool baseClassOf(const BitRecTy *RHS) const { return false; }
339 virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; }
340 virtual bool baseClassOf(const IntRecTy *RHS) const { return false; }
341 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
342 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
343 virtual bool baseClassOf(const CodeRecTy *RHS) const { return true; }
344 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
345 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000346};
347
348/// DagRecTy - 'dag' - Represent a dag fragment
349///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000350class DagRecTy : public RecTy {
351public:
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000352 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
353 virtual Init *convertValue( BitInit *BI) { return 0; }
354 virtual Init *convertValue( BitsInit *BI) { return 0; }
355 virtual Init *convertValue( IntInit *II) { return 0; }
356 virtual Init *convertValue(StringInit *SI) { return 0; }
357 virtual Init *convertValue( ListInit *LI) { return 0; }
358 virtual Init *convertValue( CodeInit *CI) { return 0; }
359 virtual Init *convertValue(VarBitInit *VB) { return 0; }
360 virtual Init *convertValue( DefInit *DI) { return 0; }
Evan Chenga32dee22007-05-15 01:23:24 +0000361 virtual Init *convertValue( BinOpInit *BO);
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000362 virtual Init *convertValue( DagInit *CI) { return (Init*)CI; }
363 virtual Init *convertValue( TypedInit *TI);
364 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
365 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000366
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000367 std::string getAsString() const { return "dag"; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000368 void print(std::ostream &OS) const { OS << "dag"; }
369
370 bool typeIsConvertibleTo(const RecTy *RHS) const {
371 return RHS->baseClassOf(this);
372 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000373
374 virtual bool baseClassOf(const BitRecTy *RHS) const { return false; }
375 virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; }
376 virtual bool baseClassOf(const IntRecTy *RHS) const { return false; }
377 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
378 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
379 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
380 virtual bool baseClassOf(const DagRecTy *RHS) const { return true; }
381 virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000382};
383
384
Misha Brukmanb4f20ea2004-04-15 15:30:15 +0000385/// RecordRecTy - '[classname]' - Represent an instance of a class, such as:
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000386/// (R32 X = EAX).
387///
388class RecordRecTy : public RecTy {
389 Record *Rec;
390public:
391 RecordRecTy(Record *R) : Rec(R) {}
392
393 Record *getRecord() const { return Rec; }
394
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000395 virtual Init *convertValue( UnsetInit *UI) { return (Init*)UI; }
396 virtual Init *convertValue( BitInit *BI) { return 0; }
397 virtual Init *convertValue( BitsInit *BI) { return 0; }
398 virtual Init *convertValue( IntInit *II) { return 0; }
399 virtual Init *convertValue(StringInit *SI) { return 0; }
400 virtual Init *convertValue( ListInit *LI) { return 0; }
401 virtual Init *convertValue( CodeInit *CI) { return 0; }
402 virtual Init *convertValue(VarBitInit *VB) { return 0; }
Reid Spencer97c59802006-08-28 00:12:25 +0000403 virtual Init *convertValue( BinOpInit *UI) { return 0; }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000404 virtual Init *convertValue( DefInit *DI);
405 virtual Init *convertValue( DagInit *DI) { return 0; }
Misha Brukman650ba8e2005-04-22 00:00:37 +0000406 virtual Init *convertValue( TypedInit *VI);
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000407 virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
408 virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000409
Chris Lattner8b9ecda2007-11-20 22:25:16 +0000410 std::string getAsString() const;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000411 void print(std::ostream &OS) const;
412
413 bool typeIsConvertibleTo(const RecTy *RHS) const {
414 return RHS->baseClassOf(this);
415 }
Reid Spencer1c48c2d2004-12-06 23:42:37 +0000416 virtual bool baseClassOf(const BitRecTy *RHS) const { return false; }
417 virtual bool baseClassOf(const BitsRecTy *RHS) const { return false; }
418 virtual bool baseClassOf(const IntRecTy *RHS) const { return false; }
419 virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
420 virtual bool baseClassOf(const ListRecTy *RHS) const { return false; }
421 virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; }
422 virtual bool baseClassOf(const DagRecTy *RHS) const { return false; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000423 virtual bool baseClassOf(const RecordRecTy *RHS) const;
424};
425
426
427
428//===----------------------------------------------------------------------===//
429// Initializer Classes
430//===----------------------------------------------------------------------===//
431
432struct Init {
433 virtual ~Init() {}
434
435 /// isComplete - This virtual method should be overridden by values that may
436 /// not be completely specified yet.
437 virtual bool isComplete() const { return true; }
438
439 /// print - Print out this value.
440 virtual void print(std::ostream &OS) const = 0;
441
442 /// dump - Debugging method that may be called through a debugger, just
443 /// invokes print on cerr.
444 void dump() const;
445
446 /// convertInitializerTo - This virtual function is a simple call-back
447 /// function that should be overridden to call the appropriate
448 /// RecTy::convertValue method.
449 ///
450 virtual Init *convertInitializerTo(RecTy *Ty) = 0;
451
452 /// convertInitializerBitRange - This method is used to implement the bitrange
453 /// selection operator. Given an initializer, it selects the specified bits
454 /// out, returning them as a new init of bits type. If it is not legal to use
455 /// the bit subscript operator on this initializer, return null.
456 ///
457 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits) {
458 return 0;
459 }
460
Chris Lattner8bf9e062004-07-26 23:21:34 +0000461 /// convertInitListSlice - This method is used to implement the list slice
462 /// selection operator. Given an initializer, it selects the specified list
463 /// elements, returning them as a new init of list type. If it is not legal
464 /// to take a slice of this, return null.
465 ///
466 virtual Init *convertInitListSlice(const std::vector<unsigned> &Elements) {
467 return 0;
468 }
469
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000470 /// getFieldType - This method is used to implement the FieldInit class.
471 /// Implementors of this method should return the type of the named field if
472 /// they are of record type.
473 ///
474 virtual RecTy *getFieldType(const std::string &FieldName) const { return 0; }
475
476 /// getFieldInit - This method complements getFieldType to return the
477 /// initializer for the specified field. If getFieldType returns non-null
478 /// this method should return non-null, otherwise it returns null.
479 ///
480 virtual Init *getFieldInit(Record &R, const std::string &FieldName) const {
481 return 0;
482 }
Misha Brukman650ba8e2005-04-22 00:00:37 +0000483
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000484 /// resolveReferences - This method is used by classes that refer to other
485 /// variables which may not be defined at the time they expression is formed.
486 /// If a value is set for the variable later, this method will be called on
487 /// users of the value to allow the value to propagate out.
488 ///
Chris Lattneref943742005-04-19 03:36:21 +0000489 virtual Init *resolveReferences(Record &R, const RecordVal *RV) {
490 return this;
491 }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000492};
493
494inline std::ostream &operator<<(std::ostream &OS, const Init &I) {
495 I.print(OS); return OS;
496}
497
498
499/// UnsetInit - ? - Represents an uninitialized value
500///
Chris Lattner7dfc2d22004-10-27 16:14:51 +0000501class UnsetInit : public Init {
502public:
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000503 virtual Init *convertInitializerTo(RecTy *Ty) {
504 return Ty->convertValue(this);
505 }
506
507 virtual bool isComplete() const { return false; }
508 virtual void print(std::ostream &OS) const { OS << "?"; }
509};
510
511
512/// BitInit - true/false - Represent a concrete initializer for a bit.
513///
514class BitInit : public Init {
515 bool Value;
516public:
517 BitInit(bool V) : Value(V) {}
518
519 bool getValue() const { return Value; }
520
521 virtual Init *convertInitializerTo(RecTy *Ty) {
522 return Ty->convertValue(this);
523 }
524
525 virtual void print(std::ostream &OS) const { OS << (Value ? "1" : "0"); }
526};
527
528/// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value.
529/// It contains a vector of bits, whose size is determined by the type.
530///
531class BitsInit : public Init {
532 std::vector<Init*> Bits;
533public:
534 BitsInit(unsigned Size) : Bits(Size) {}
535
536 unsigned getNumBits() const { return Bits.size(); }
537
538 Init *getBit(unsigned Bit) const {
539 assert(Bit < Bits.size() && "Bit index out of range!");
540 return Bits[Bit];
541 }
542 void setBit(unsigned Bit, Init *V) {
543 assert(Bit < Bits.size() && "Bit index out of range!");
544 assert(Bits[Bit] == 0 && "Bit already set!");
545 Bits[Bit] = V;
546 }
547
548 virtual Init *convertInitializerTo(RecTy *Ty) {
549 return Ty->convertValue(this);
550 }
551 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
552
553 virtual bool isComplete() const {
554 for (unsigned i = 0; i != getNumBits(); ++i)
555 if (!getBit(i)->isComplete()) return false;
556 return true;
557 }
558 virtual void print(std::ostream &OS) const;
559
Chris Lattneref943742005-04-19 03:36:21 +0000560 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000561
562 // printXX - Print this bitstream with the specified format, returning true if
563 // it is not possible.
564 bool printInHex(std::ostream &OS) const;
565 bool printAsVariable(std::ostream &OS) const;
566 bool printAsUnset(std::ostream &OS) const;
567};
568
569
570/// IntInit - 7 - Represent an initalization by a literal integer value.
571///
572class IntInit : public Init {
573 int Value;
574public:
575 IntInit(int V) : Value(V) {}
576
577 int getValue() const { return Value; }
578
579 virtual Init *convertInitializerTo(RecTy *Ty) {
580 return Ty->convertValue(this);
581 }
582 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
583
584 virtual void print(std::ostream &OS) const { OS << Value; }
585};
586
587
588/// StringInit - "foo" - Represent an initialization by a string value.
589///
590class StringInit : public Init {
591 std::string Value;
592public:
593 StringInit(const std::string &V) : Value(V) {}
594
595 const std::string &getValue() const { return Value; }
596
597 virtual Init *convertInitializerTo(RecTy *Ty) {
598 return Ty->convertValue(this);
599 }
600
601 virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; }
602};
603
604/// CodeInit - "[{...}]" - Represent a code fragment.
605///
606class CodeInit : public Init {
607 std::string Value;
608public:
609 CodeInit(const std::string &V) : Value(V) {}
610
611 const std::string getValue() const { return Value; }
612
613 virtual Init *convertInitializerTo(RecTy *Ty) {
614 return Ty->convertValue(this);
615 }
616
617 virtual void print(std::ostream &OS) const { OS << "[{" << Value << "}]"; }
618};
619
620/// ListInit - [AL, AH, CL] - Represent a list of defs
621///
622class ListInit : public Init {
623 std::vector<Init*> Values;
624public:
625 ListInit(std::vector<Init*> &Vs) {
626 Values.swap(Vs);
627 }
628
629 unsigned getSize() const { return Values.size(); }
630 Init *getElement(unsigned i) const {
631 assert(i < Values.size() && "List element index out of range!");
632 return Values[i];
633 }
634
Chris Lattnercbebe462007-02-27 22:08:27 +0000635 Record *getElementAsRecord(unsigned i) const;
636
Chris Lattner8bf9e062004-07-26 23:21:34 +0000637 Init *convertInitListSlice(const std::vector<unsigned> &Elements);
638
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000639 virtual Init *convertInitializerTo(RecTy *Ty) {
640 return Ty->convertValue(this);
641 }
642
Chris Lattner577fc3f2004-07-27 01:01:21 +0000643 /// resolveReferences - This method is used by classes that refer to other
644 /// variables which may not be defined at the time they expression is formed.
645 /// If a value is set for the variable later, this method will be called on
646 /// users of the value to allow the value to propagate out.
647 ///
Chris Lattneref943742005-04-19 03:36:21 +0000648 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattner577fc3f2004-07-27 01:01:21 +0000649
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000650 virtual void print(std::ostream &OS) const;
651};
652
Chris Lattner51ffbf12006-03-31 21:53:49 +0000653/// BinOpInit - !op (X, Y) - Combine two inits.
654///
655class BinOpInit : public Init {
656public:
Evan Chenga32dee22007-05-15 01:23:24 +0000657 enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT };
Chris Lattner51ffbf12006-03-31 21:53:49 +0000658private:
659 BinaryOp Opc;
660 Init *LHS, *RHS;
661public:
662 BinOpInit(BinaryOp opc, Init *lhs, Init *rhs) : Opc(opc), LHS(lhs), RHS(rhs) {
663 }
664
665 BinaryOp getOpcode() const { return Opc; }
666 Init *getLHS() const { return LHS; }
667 Init *getRHS() const { return RHS; }
668
669 // Fold - If possible, fold this to a simpler init. Return this if not
670 // possible to fold.
671 Init *Fold();
672
673 virtual Init *convertInitializerTo(RecTy *Ty) {
674 return Ty->convertValue(this);
675 }
676
677 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
678
679 virtual void print(std::ostream &OS) const;
680};
681
682
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000683
684/// TypedInit - This is the common super-class of types that have a specific,
685/// explicit, type.
686///
687class TypedInit : public Init {
688 RecTy *Ty;
Misha Brukman650ba8e2005-04-22 00:00:37 +0000689public:
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000690 TypedInit(RecTy *T) : Ty(T) {}
691
692 RecTy *getType() const { return Ty; }
693
Chris Lattner577fc3f2004-07-27 01:01:21 +0000694 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
695 virtual Init *convertInitListSlice(const std::vector<unsigned> &Elements);
696
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000697 /// resolveBitReference - This method is used to implement
698 /// VarBitInit::resolveReferences. If the bit is able to be resolved, we
Chris Lattner577fc3f2004-07-27 01:01:21 +0000699 /// simply return the resolved value, otherwise we return null.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000700 ///
Chris Lattneref943742005-04-19 03:36:21 +0000701 virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
702 unsigned Bit) = 0;
Chris Lattner577fc3f2004-07-27 01:01:21 +0000703
704 /// resolveListElementReference - This method is used to implement
705 /// VarListElementInit::resolveReferences. If the list element is resolvable
706 /// now, we return the resolved value, otherwise we return null.
Chris Lattneref943742005-04-19 03:36:21 +0000707 virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
708 unsigned Elt) = 0;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000709};
710
711/// VarInit - 'Opcode' - Represent a reference to an entire variable object.
712///
713class VarInit : public TypedInit {
714 std::string VarName;
715public:
716 VarInit(const std::string &VN, RecTy *T) : TypedInit(T), VarName(VN) {}
Misha Brukman650ba8e2005-04-22 00:00:37 +0000717
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000718 virtual Init *convertInitializerTo(RecTy *Ty) {
719 return Ty->convertValue(this);
720 }
721
722 const std::string &getName() const { return VarName; }
723
Chris Lattneref943742005-04-19 03:36:21 +0000724 virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
725 unsigned Bit);
726 virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
727 unsigned Elt);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000728
729 virtual RecTy *getFieldType(const std::string &FieldName) const;
730 virtual Init *getFieldInit(Record &R, const std::string &FieldName) const;
731
732 /// resolveReferences - This method is used by classes that refer to other
733 /// variables which may not be defined at the time they expression is formed.
734 /// If a value is set for the variable later, this method will be called on
735 /// users of the value to allow the value to propagate out.
736 ///
Chris Lattneref943742005-04-19 03:36:21 +0000737 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Misha Brukman650ba8e2005-04-22 00:00:37 +0000738
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000739 virtual void print(std::ostream &OS) const { OS << VarName; }
740};
741
742
743/// VarBitInit - Opcode{0} - Represent access to one bit of a variable or field.
744///
745class VarBitInit : public Init {
746 TypedInit *TI;
747 unsigned Bit;
748public:
749 VarBitInit(TypedInit *T, unsigned B) : TI(T), Bit(B) {
750 assert(T->getType() && dynamic_cast<BitsRecTy*>(T->getType()) &&
751 ((BitsRecTy*)T->getType())->getNumBits() > B &&
752 "Illegal VarBitInit expression!");
753 }
754
755 virtual Init *convertInitializerTo(RecTy *Ty) {
756 return Ty->convertValue(this);
757 }
758
759 TypedInit *getVariable() const { return TI; }
760 unsigned getBitNum() const { return Bit; }
Misha Brukman650ba8e2005-04-22 00:00:37 +0000761
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000762 virtual void print(std::ostream &OS) const {
763 TI->print(OS); OS << "{" << Bit << "}";
764 }
Chris Lattneref943742005-04-19 03:36:21 +0000765 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000766};
767
Misha Brukman650ba8e2005-04-22 00:00:37 +0000768/// VarListElementInit - List[4] - Represent access to one element of a var or
Chris Lattner577fc3f2004-07-27 01:01:21 +0000769/// field.
770class VarListElementInit : public TypedInit {
771 TypedInit *TI;
772 unsigned Element;
773public:
774 VarListElementInit(TypedInit *T, unsigned E)
775 : TypedInit(dynamic_cast<ListRecTy*>(T->getType())->getElementType()),
776 TI(T), Element(E) {
777 assert(T->getType() && dynamic_cast<ListRecTy*>(T->getType()) &&
778 "Illegal VarBitInit expression!");
779 }
780
781 virtual Init *convertInitializerTo(RecTy *Ty) {
782 return Ty->convertValue(this);
783 }
784
785 TypedInit *getVariable() const { return TI; }
786 unsigned getElementNum() const { return Element; }
787
Chris Lattneref943742005-04-19 03:36:21 +0000788 virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
789 unsigned Bit);
Chris Lattner577fc3f2004-07-27 01:01:21 +0000790
791 /// resolveListElementReference - This method is used to implement
792 /// VarListElementInit::resolveReferences. If the list element is resolvable
793 /// now, we return the resolved value, otherwise we return null.
Chris Lattneref943742005-04-19 03:36:21 +0000794 virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
795 unsigned Elt);
Chris Lattner577fc3f2004-07-27 01:01:21 +0000796
797 virtual void print(std::ostream &OS) const {
798 TI->print(OS); OS << "[" << Element << "]";
799 }
Chris Lattneref943742005-04-19 03:36:21 +0000800 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattner577fc3f2004-07-27 01:01:21 +0000801};
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000802
803/// DefInit - AL - Represent a reference to a 'def' in the description
804///
805class DefInit : public Init {
806 Record *Def;
807public:
808 DefInit(Record *D) : Def(D) {}
Misha Brukman650ba8e2005-04-22 00:00:37 +0000809
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000810 virtual Init *convertInitializerTo(RecTy *Ty) {
811 return Ty->convertValue(this);
812 }
813
814 Record *getDef() const { return Def; }
815
816 //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
817
818 virtual RecTy *getFieldType(const std::string &FieldName) const;
819 virtual Init *getFieldInit(Record &R, const std::string &FieldName) const;
Misha Brukman650ba8e2005-04-22 00:00:37 +0000820
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000821 virtual void print(std::ostream &OS) const;
822};
823
824
825/// FieldInit - X.Y - Represent a reference to a subfield of a variable
826///
827class FieldInit : public TypedInit {
828 Init *Rec; // Record we are referring to
829 std::string FieldName; // Field we are accessing
830public:
831 FieldInit(Init *R, const std::string &FN)
832 : TypedInit(R->getFieldType(FN)), Rec(R), FieldName(FN) {
833 assert(getType() && "FieldInit with non-record type!");
834 }
835
836 virtual Init *convertInitializerTo(RecTy *Ty) {
837 return Ty->convertValue(this);
838 }
839
Chris Lattneref943742005-04-19 03:36:21 +0000840 virtual Init *resolveBitReference(Record &R, const RecordVal *RV,
841 unsigned Bit);
842 virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
843 unsigned Elt);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000844
Chris Lattneref943742005-04-19 03:36:21 +0000845 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000846
847 virtual void print(std::ostream &OS) const {
848 Rec->print(OS); OS << "." << FieldName;
849 }
850};
851
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000852/// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required
853/// to have at least one value then a (possibly empty) list of arguments. Each
854/// argument can have a name associated with it.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000855///
856class DagInit : public Init {
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000857 Init *Val;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000858 std::vector<Init*> Args;
859 std::vector<std::string> ArgNames;
860public:
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000861 DagInit(Init *V, const std::vector<std::pair<Init*, std::string> > &args)
862 : Val(V) {
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000863 Args.reserve(args.size());
864 ArgNames.reserve(args.size());
865 for (unsigned i = 0, e = args.size(); i != e; ++i) {
866 Args.push_back(args[i].first);
867 ArgNames.push_back(args[i].second);
868 }
869 }
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000870 DagInit(Init *V, const std::vector<Init*> &args,
Chris Lattner0d3ef402006-01-31 06:02:35 +0000871 const std::vector<std::string> &argNames)
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000872 : Val(V), Args(args), ArgNames(argNames) {
Chris Lattner0d3ef402006-01-31 06:02:35 +0000873 }
874
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000875 virtual Init *convertInitializerTo(RecTy *Ty) {
876 return Ty->convertValue(this);
877 }
878
Chris Lattnerb59cf3c2006-03-30 22:50:40 +0000879 Init *getOperator() const { return Val; }
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000880
881 unsigned getNumArgs() const { return Args.size(); }
882 Init *getArg(unsigned Num) const {
883 assert(Num < Args.size() && "Arg number out of range!");
884 return Args[Num];
885 }
886 const std::string &getArgName(unsigned Num) const {
887 assert(Num < ArgNames.size() && "Arg number out of range!");
888 return ArgNames[Num];
889 }
890
891 void setArg(unsigned Num, Init *I) {
892 assert(Num < Args.size() && "Arg number out of range!");
893 Args[Num] = I;
894 }
Chris Lattner0d3ef402006-01-31 06:02:35 +0000895
896 virtual Init *resolveReferences(Record &R, const RecordVal *RV);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000897
898 virtual void print(std::ostream &OS) const;
899};
900
901//===----------------------------------------------------------------------===//
902// High-Level Classes
903//===----------------------------------------------------------------------===//
904
905class RecordVal {
906 std::string Name;
907 RecTy *Ty;
908 unsigned Prefix;
909 Init *Value;
910public:
911 RecordVal(const std::string &N, RecTy *T, unsigned P);
912
913 const std::string &getName() const { return Name; }
914
915 unsigned getPrefix() const { return Prefix; }
916 RecTy *getType() const { return Ty; }
917 Init *getValue() const { return Value; }
918
919 bool setValue(Init *V) {
920 if (V) {
921 Value = V->convertInitializerTo(Ty);
922 return Value == 0;
923 }
924 Value = 0;
925 return false;
926 }
927
928 void dump() const;
929 void print(std::ostream &OS, bool PrintSem = true) const;
930};
931
932inline std::ostream &operator<<(std::ostream &OS, const RecordVal &RV) {
933 RV.print(OS << " ");
934 return OS;
935}
936
Chris Lattner87a10612004-10-23 04:58:50 +0000937class Record {
Chris Lattnerf9b2edb2005-08-19 17:58:49 +0000938 std::string Name;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000939 std::vector<std::string> TemplateArgs;
940 std::vector<RecordVal> Values;
941 std::vector<Record*> SuperClasses;
942public:
943
944 Record(const std::string &N) : Name(N) {}
945 ~Record() {}
946
947 const std::string &getName() const { return Name; }
Chris Lattnerac284252005-08-19 17:58:11 +0000948 void setName(const std::string &Name); // Also updates RecordKeeper.
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000949 const std::vector<std::string> &getTemplateArgs() const {
950 return TemplateArgs;
951 }
952 const std::vector<RecordVal> &getValues() const { return Values; }
953 const std::vector<Record*> &getSuperClasses() const { return SuperClasses; }
954
955 bool isTemplateArg(const std::string &Name) const {
956 for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
957 if (TemplateArgs[i] == Name) return true;
958 return false;
959 }
960
961 const RecordVal *getValue(const std::string &Name) const {
962 for (unsigned i = 0, e = Values.size(); i != e; ++i)
963 if (Values[i].getName() == Name) return &Values[i];
964 return 0;
965 }
966 RecordVal *getValue(const std::string &Name) {
967 for (unsigned i = 0, e = Values.size(); i != e; ++i)
968 if (Values[i].getName() == Name) return &Values[i];
969 return 0;
970 }
971
972 void addTemplateArg(const std::string &Name) {
973 assert(!isTemplateArg(Name) && "Template arg already defined!");
974 TemplateArgs.push_back(Name);
975 }
976
977 void addValue(const RecordVal &RV) {
978 assert(getValue(RV.getName()) == 0 && "Value already added!");
979 Values.push_back(RV);
980 }
981
982 void removeValue(const std::string &Name) {
983 assert(getValue(Name) && "Cannot remove an entry that does not exist!");
984 for (unsigned i = 0, e = Values.size(); i != e; ++i)
985 if (Values[i].getName() == Name) {
986 Values.erase(Values.begin()+i);
987 return;
988 }
989 assert(0 && "Name does not exist in record!");
990 }
991
992 bool isSubClassOf(Record *R) const {
993 for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
994 if (SuperClasses[i] == R)
Jeff Cohen88e7b722005-04-22 04:13:13 +0000995 return true;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +0000996 return false;
997 }
998
999 bool isSubClassOf(const std::string &Name) const {
1000 for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
1001 if (SuperClasses[i]->getName() == Name)
1002 return true;
1003 return false;
1004 }
1005
1006 void addSuperClass(Record *R) {
1007 assert(!isSubClassOf(R) && "Already subclassing record!");
1008 SuperClasses.push_back(R);
1009 }
1010
Chris Lattneref943742005-04-19 03:36:21 +00001011 /// resolveReferences - If there are any field references that refer to fields
1012 /// that have been filled in, we can propagate the values now.
1013 ///
1014 void resolveReferences() { resolveReferencesTo(0); }
1015
1016 /// resolveReferencesTo - If anything in this record refers to RV, replace the
1017 /// reference to RV with the RHS of RV. If RV is null, we resolve all
1018 /// possible references.
1019 void resolveReferencesTo(const RecordVal *RV);
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001020
1021 void dump() const;
1022
1023 //===--------------------------------------------------------------------===//
1024 // High-level methods useful to tablegen back-ends
1025 //
1026
1027 /// getValueInit - Return the initializer for a value with the specified name,
1028 /// or throw an exception if the field does not exist.
1029 ///
1030 Init *getValueInit(const std::string &FieldName) const;
1031
1032 /// getValueAsString - This method looks up the specified field and returns
1033 /// its value as a string, throwing an exception if the field does not exist
1034 /// or if the value is not a string.
1035 ///
1036 std::string getValueAsString(const std::string &FieldName) const;
1037
1038 /// getValueAsBitsInit - This method looks up the specified field and returns
1039 /// its value as a BitsInit, throwing an exception if the field does not exist
1040 /// or if the value is not the right type.
1041 ///
1042 BitsInit *getValueAsBitsInit(const std::string &FieldName) const;
1043
1044 /// getValueAsListInit - This method looks up the specified field and returns
1045 /// its value as a ListInit, throwing an exception if the field does not exist
1046 /// or if the value is not the right type.
1047 ///
1048 ListInit *getValueAsListInit(const std::string &FieldName) const;
1049
Chris Lattner7ad0bed2005-10-28 22:49:02 +00001050 /// getValueAsListOfDefs - This method looks up the specified field and
Anton Korobeynikova468a112007-11-11 11:19:37 +00001051 /// returns its value as a vector of records, throwing an exception if the
Chris Lattner7ad0bed2005-10-28 22:49:02 +00001052 /// field does not exist or if the value is not the right type.
Jim Laskeyb04feb62005-10-28 21:46:31 +00001053 ///
Chris Lattner7ad0bed2005-10-28 22:49:02 +00001054 std::vector<Record*> getValueAsListOfDefs(const std::string &FieldName) const;
Jim Laskeyb04feb62005-10-28 21:46:31 +00001055
Anton Korobeynikova468a112007-11-11 11:19:37 +00001056 /// getValueAsListOfInts - This method looks up the specified field and returns
1057 /// its value as a vector of integers, throwing an exception if the field does
1058 /// not exist or if the value is not the right type.
1059 ///
1060 std::vector<int> getValueAsListOfInts(const std::string &FieldName) const;
1061
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001062 /// getValueAsDef - This method looks up the specified field and returns its
1063 /// value as a Record, throwing an exception if the field does not exist or if
1064 /// the value is not the right type.
1065 ///
1066 Record *getValueAsDef(const std::string &FieldName) const;
1067
1068 /// getValueAsBit - This method looks up the specified field and returns its
1069 /// value as a bit, throwing an exception if the field does not exist or if
1070 /// the value is not the right type.
1071 ///
1072 bool getValueAsBit(const std::string &FieldName) const;
1073
1074 /// getValueAsInt - This method looks up the specified field and returns its
1075 /// value as an int, throwing an exception if the field does not exist or if
1076 /// the value is not the right type.
1077 ///
1078 int getValueAsInt(const std::string &FieldName) const;
1079
1080 /// getValueAsDag - This method looks up the specified field and returns its
1081 /// value as an Dag, throwing an exception if the field does not exist or if
1082 /// the value is not the right type.
1083 ///
1084 DagInit *getValueAsDag(const std::string &FieldName) const;
Chris Lattnerae939eb2005-09-13 21:44:28 +00001085
1086 /// getValueAsCode - This method looks up the specified field and returns
1087 /// its value as the string data in a CodeInit, throwing an exception if the
1088 /// field does not exist or if the value is not a code object.
1089 ///
1090 std::string getValueAsCode(const std::string &FieldName) const;
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001091};
1092
1093std::ostream &operator<<(std::ostream &OS, const Record &R);
1094
1095class RecordKeeper {
1096 std::map<std::string, Record*> Classes, Defs;
1097public:
1098 ~RecordKeeper() {
1099 for (std::map<std::string, Record*>::iterator I = Classes.begin(),
Jeff Cohen88e7b722005-04-22 04:13:13 +00001100 E = Classes.end(); I != E; ++I)
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001101 delete I->second;
1102 for (std::map<std::string, Record*>::iterator I = Defs.begin(),
Jeff Cohen88e7b722005-04-22 04:13:13 +00001103 E = Defs.end(); I != E; ++I)
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001104 delete I->second;
1105 }
Misha Brukman650ba8e2005-04-22 00:00:37 +00001106
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001107 const std::map<std::string, Record*> &getClasses() const { return Classes; }
1108 const std::map<std::string, Record*> &getDefs() const { return Defs; }
1109
1110 Record *getClass(const std::string &Name) const {
1111 std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
1112 return I == Classes.end() ? 0 : I->second;
1113 }
1114 Record *getDef(const std::string &Name) const {
1115 std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
1116 return I == Defs.end() ? 0 : I->second;
1117 }
1118 void addClass(Record *R) {
1119 assert(getClass(R->getName()) == 0 && "Class already exists!");
1120 Classes.insert(std::make_pair(R->getName(), R));
1121 }
1122 void addDef(Record *R) {
1123 assert(getDef(R->getName()) == 0 && "Def already exists!");
1124 Defs.insert(std::make_pair(R->getName(), R));
1125 }
1126
Chris Lattnerac284252005-08-19 17:58:11 +00001127 /// removeClass - Remove, but do not delete, the specified record.
1128 ///
1129 void removeClass(const std::string &Name) {
1130 assert(Classes.count(Name) && "Class does not exist!");
1131 Classes.erase(Name);
1132 }
1133 /// removeDef - Remove, but do not delete, the specified record.
1134 ///
1135 void removeDef(const std::string &Name) {
1136 assert(Defs.count(Name) && "Def does not exist!");
1137 Defs.erase(Name);
1138 }
1139
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001140 //===--------------------------------------------------------------------===//
1141 // High-level helper methods, useful for tablegen backends...
1142
1143 /// getAllDerivedDefinitions - This method returns all concrete definitions
1144 /// that derive from the specified class name. If a class with the specified
1145 /// name does not exist, an exception is thrown.
1146 std::vector<Record*>
1147 getAllDerivedDefinitions(const std::string &ClassName) const;
1148
1149
1150 void dump() const;
1151};
1152
1153std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
1154
1155extern RecordKeeper Records;
1156
Brian Gaeke960707c2003-11-11 22:41:34 +00001157} // End llvm namespace
1158
Chris Lattnerf5bd1b72003-10-05 19:27:59 +00001159#endif