1 //===- Record.h - Classes to represent Table Records ------------*- C++ -*-===//
4 //===----------------------------------------------------------------------===//
25 //===----------------------------------------------------------------------===//
27 //===----------------------------------------------------------------------===//
32 virtual Init *convertValue( UnsetInit *UI) { return 0; }
33 virtual Init *convertValue( BitInit *BI) { return 0; }
34 virtual Init *convertValue( BitsInit *BI) { return 0; }
35 virtual Init *convertValue( IntInit *II) { return 0; }
36 virtual Init *convertValue(StringInit *SI) { return 0; }
37 virtual Init *convertValue( ListInit *LI) { return 0; }
38 virtual Init *convertValue( VarInit *VI) { return 0; }
39 virtual Init *convertValue(VarBitInit *VB) { return 0; }
40 virtual Init *convertValue( DefInit *DI) { return 0; }
42 virtual void print(std::ostream &OS) const = 0;
46 inline std::ostream &operator<<(std::ostream &OS, const RecTy &Ty) {
51 struct BitRecTy : public RecTy {
52 Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
53 Init *convertValue(BitInit *BI) { return (Init*)BI; }
54 Init *convertValue(BitsInit *BI);
55 Init *convertValue(IntInit *II);
56 Init *convertValue(VarInit *VI);
58 void print(std::ostream &OS) const { OS << "bit"; }
61 class BitsRecTy : public RecTy {
64 BitsRecTy(unsigned Sz) : Size(Sz) {}
66 unsigned getNumBits() const { return Size; }
68 Init *convertValue(UnsetInit *UI);
69 Init *convertValue(BitInit *UI);
70 Init *convertValue(BitsInit *BI);
71 Init *convertValue(IntInit *II);
72 Init *convertValue(VarInit *VI);
74 void print(std::ostream &OS) const { OS << "bits<" << Size << ">"; }
77 struct IntRecTy : public RecTy {
78 Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
79 Init *convertValue(IntInit *II) { return (Init*)II; }
80 Init *convertValue(BitsInit *BI);
81 Init *convertValue(VarInit *VI);
83 void print(std::ostream &OS) const { OS << "int"; }
86 struct StringRecTy : public RecTy {
87 Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
88 Init *convertValue(StringInit *SI) { return (Init*)SI; }
89 Init *convertValue(VarInit *VI);
90 void print(std::ostream &OS) const { OS << "string"; }
93 class ListRecTy : public RecTy {
96 ListRecTy(Record *C) : Class(C) {}
97 Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
98 Init *convertValue(ListInit *LI);
100 void print(std::ostream &OS) const;
103 class RecordRecTy : public RecTy {
106 RecordRecTy(Record *R) : Rec(R) {}
108 Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
109 Init *convertValue( DefInit *DI);
111 void print(std::ostream &OS) const;
114 //===----------------------------------------------------------------------===//
115 // Initializer Classes
116 //===----------------------------------------------------------------------===//
121 virtual bool isComplete() const = 0;
122 virtual void print(std::ostream &OS) const = 0;
125 virtual Init *convertInitializerTo(RecTy *Ty) = 0;
126 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits) {
130 virtual Init *resolveReferences(Record &R) { return this; }
133 inline std::ostream &operator<<(std::ostream &OS, const Init &I) {
134 I.print(OS); return OS;
137 struct UnsetInit : public Init {
138 virtual Init *convertInitializerTo(RecTy *Ty) {
139 return Ty->convertValue(this);
142 virtual bool isComplete() const { return false; }
143 virtual void print(std::ostream &OS) const { OS << "?"; }
146 class BitInit : public Init {
149 BitInit(bool V) : Value(V) {}
151 bool getValue() const { return Value; }
153 virtual Init *convertInitializerTo(RecTy *Ty) {
154 return Ty->convertValue(this);
157 virtual bool isComplete() const { return true; }
158 virtual void print(std::ostream &OS) const { OS << (Value ? "1" : "0"); }
161 class BitsInit : public Init {
162 std::vector<Init*> Bits;
164 BitsInit(unsigned Size) : Bits(Size) {}
166 unsigned getNumBits() const { return Bits.size(); }
168 Init *getBit(unsigned Bit) const {
169 assert(Bit < Bits.size() && "Bit index out of range!");
172 void setBit(unsigned Bit, Init *V) {
173 assert(Bit < Bits.size() && "Bit index out of range!");
177 virtual Init *convertInitializerTo(RecTy *Ty) {
178 return Ty->convertValue(this);
180 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
182 virtual bool isComplete() const {
183 for (unsigned i = 0; i != getNumBits(); ++i)
184 if (!getBit(i)->isComplete()) return false;
187 virtual void print(std::ostream &OS) const;
189 virtual Init *resolveReferences(Record &R);
191 // printXX - Print this bitstream with the specified format, returning true if
192 // it is not possible.
193 bool printInHex(std::ostream &OS) const;
194 bool printAsVariable(std::ostream &OS) const;
195 bool printAsUnset(std::ostream &OS) const;
198 class IntInit : public Init {
201 IntInit(int V) : Value(V) {}
203 int getValue() const { return Value; }
205 virtual Init *convertInitializerTo(RecTy *Ty) {
206 return Ty->convertValue(this);
208 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
210 virtual bool isComplete() const { return true; }
211 virtual void print(std::ostream &OS) const { OS << Value; }
214 class StringInit : public Init {
217 StringInit(const std::string &V) : Value(V) {}
219 virtual Init *convertInitializerTo(RecTy *Ty) {
220 return Ty->convertValue(this);
223 virtual bool isComplete() const { return true; }
224 virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; }
227 class ListInit : public Init {
228 std::vector<Record*> Records;
230 ListInit(std::vector<Record*> &Rs) {
234 unsigned getSize() const { return Records.size(); }
235 Record *getElement(unsigned i) const {
236 assert(i < Records.size() && "List element index out of range!");
240 virtual Init *convertInitializerTo(RecTy *Ty) {
241 return Ty->convertValue(this);
244 virtual bool isComplete() const { return true; }
245 virtual void print(std::ostream &OS) const;
248 class VarInit : public Init {
252 VarInit(const std::string &VN, RecTy *T) : VarName(VN), Ty(T) {}
254 virtual Init *convertInitializerTo(RecTy *Ty) {
255 return Ty->convertValue(this);
258 const std::string &getName() const { return VarName; }
259 RecTy *getType() const { return Ty; }
261 virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
263 virtual bool isComplete() const { return true; }
264 virtual void print(std::ostream &OS) const { OS << VarName; }
267 class VarBitInit : public Init {
271 VarBitInit(VarInit *V, unsigned B) : VI(V), Bit(B) {}
273 virtual Init *convertInitializerTo(RecTy *Ty) {
274 return Ty->convertValue(this);
277 VarInit *getVariable() const { return VI; }
278 unsigned getBitNum() const { return Bit; }
280 virtual bool isComplete() const { return true; }
281 virtual void print(std::ostream &OS) const {
282 VI->print(OS); OS << "{" << Bit << "}";
284 virtual Init *resolveReferences(Record &R);
287 class DefInit : public Init {
290 DefInit(Record *D) : Def(D) {}
292 virtual Init *convertInitializerTo(RecTy *Ty) {
293 return Ty->convertValue(this);
296 Record *getDef() const { return Def; }
298 //virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
300 virtual bool isComplete() const { return true; }
301 virtual void print(std::ostream &OS) const;
306 //===----------------------------------------------------------------------===//
307 // High-Level Classes
308 //===----------------------------------------------------------------------===//
316 RecordVal(const std::string &N, RecTy *T, unsigned P);
317 ~RecordVal() { /*delete Ty; delete Value; Bad for copy ctor!*/ }
319 const std::string &getName() const { return Name; }
321 unsigned getPrefix() const { return Prefix; }
322 RecTy *getType() const { return Ty; }
323 Init *getValue() const { return Value; }
325 bool setValue(Init *V) {
327 Value = V->convertInitializerTo(Ty);
335 void print(std::ostream &OS, bool PrintSem = true) const;
338 inline std::ostream &operator<<(std::ostream &OS, const RecordVal &RV) {
344 const std::string Name;
345 std::vector<std::string> TemplateArgs;
346 std::vector<RecordVal> Values;
347 std::vector<Record*> SuperClasses;
350 Record(const std::string &N) : Name(N) {}
353 const std::string &getName() const { return Name; }
354 const std::vector<std::string> &getTemplateArgs() const {
357 const std::vector<RecordVal> &getValues() const { return Values; }
358 const std::vector<Record*> &getSuperClasses() const { return SuperClasses; }
360 bool isTemplateArg(const std::string &Name) const {
361 for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i)
362 if (TemplateArgs[i] == Name) return true;
366 const RecordVal *getValue(const std::string &Name) const {
367 for (unsigned i = 0, e = Values.size(); i != e; ++i)
368 if (Values[i].getName() == Name) return &Values[i];
371 RecordVal *getValue(const std::string &Name) {
372 for (unsigned i = 0, e = Values.size(); i != e; ++i)
373 if (Values[i].getName() == Name) return &Values[i];
377 void addTemplateArg(const std::string &Name) {
378 assert(!isTemplateArg(Name) && "Template arg already defined!");
379 TemplateArgs.push_back(Name);
382 void addValue(const RecordVal &RV) {
383 assert(getValue(RV.getName()) == 0 && "Value already added!");
384 Values.push_back(RV);
387 bool isSubClassOf(Record *R) const {
388 for (unsigned i = 0, e = SuperClasses.size(); i != e; ++i)
389 if (SuperClasses[i] == R)
394 void addSuperClass(Record *R) {
395 assert(!isSubClassOf(R) && "Already subclassing record!");
396 SuperClasses.push_back(R);
399 // resolveReferences - If there are any field references that refer to fields
400 // that have been filled in, we can propagate the values now.
402 void resolveReferences();
407 std::ostream &operator<<(std::ostream &OS, const Record &R);
410 std::map<std::string, Record*> Classes, Defs;
413 for (std::map<std::string, Record*>::iterator I = Classes.begin(),
414 E = Classes.end(); I != E; ++I)
416 for (std::map<std::string, Record*>::iterator I = Defs.begin(),
417 E = Defs.end(); I != E; ++I)
421 const std::map<std::string, Record*> &getClasses() const { return Classes; }
422 const std::map<std::string, Record*> &getDefs() const { return Defs; }
424 Record *getClass(const std::string &Name) const {
425 std::map<std::string, Record*>::const_iterator I = Classes.find(Name);
426 return I == Classes.end() ? 0 : I->second;
428 Record *getDef(const std::string &Name) const {
429 std::map<std::string, Record*>::const_iterator I = Defs.find(Name);
430 return I == Defs.end() ? 0 : I->second;
432 void addClass(Record *R) {
433 assert(getClass(R->getName()) == 0 && "Class already exists!");
434 Classes.insert(std::make_pair(R->getName(), R));
436 void addDef(Record *R) {
437 assert(getDef(R->getName()) == 0 && "Def already exists!");
438 Defs.insert(std::make_pair(R->getName(), R));
444 std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK);
446 extern RecordKeeper Records;