X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FRecord.h;h=87a49ee2f8448c2fc89481cb3fd4460acf5d53ca;hb=20072af3b0b22d90afbce769409f4ed822520366;hp=5e88e50d3e40e4cb6f0850c99cbb30fca10728ff;hpb=af1b61debd9cb6570ed815a27cd94897f0dca3cf;p=oota-llvm.git diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index 5e88e50d3e4..87a49ee2f84 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -15,6 +15,7 @@ #ifndef RECORD_H #define RECORD_H +#include "llvm/Support/DataTypes.h" #include #include #include @@ -62,7 +63,8 @@ class RecordVal; struct RecTy { virtual ~RecTy() {} - virtual void print(std::ostream &OS) const = 0; + virtual std::string getAsString() const = 0; + void print(std::ostream &OS) const { OS << getAsString(); } void dump() const; /// typeIsConvertibleTo - Return true if all values of 'this' type can be @@ -127,7 +129,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - void print(std::ostream &OS) const { OS << "bit"; } + std::string getAsString() const { return "bit"; } bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -150,7 +152,7 @@ public: class BitsRecTy : public RecTy { unsigned Size; public: - BitsRecTy(unsigned Sz) : Size(Sz) {} + explicit BitsRecTy(unsigned Sz) : Size(Sz) {} unsigned getNumBits() const { return Size; } @@ -169,8 +171,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - - void print(std::ostream &OS) const { OS << "bits<" << Size << ">"; } + std::string getAsString() const; bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -208,8 +209,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - - void print(std::ostream &OS) const { OS << "int"; } + std::string getAsString() const { return "int"; } bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -245,7 +245,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - void print(std::ostream &OS) const { OS << "string"; } + std::string getAsString() const { return "string"; } bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -269,7 +269,7 @@ public: class ListRecTy : public RecTy { RecTy *Ty; public: - ListRecTy(RecTy *T) : Ty(T) {} + explicit ListRecTy(RecTy *T) : Ty(T) {} RecTy *getElementType() const { return Ty; } @@ -288,7 +288,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - void print(std::ostream &OS) const; + std::string getAsString() const; bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -325,8 +325,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - - void print(std::ostream &OS) const { OS << "code"; } + std::string getAsString() const { return "code"; } bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -360,7 +359,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - void print(std::ostream &OS) const { OS << "dag"; } + std::string getAsString() const { return "dag"; } bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -383,7 +382,7 @@ public: class RecordRecTy : public RecTy { Record *Rec; public: - RecordRecTy(Record *R) : Rec(R) {} + explicit RecordRecTy(Record *R) : Rec(R) {} Record *getRecord() const { return Rec; } @@ -402,7 +401,7 @@ public: virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);} virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);} - void print(std::ostream &OS) const; + std::string getAsString() const; bool typeIsConvertibleTo(const RecTy *RHS) const { return RHS->baseClassOf(this); @@ -431,7 +430,10 @@ struct Init { virtual bool isComplete() const { return true; } /// print - Print out this value. - virtual void print(std::ostream &OS) const = 0; + void print(std::ostream &OS) const { OS << getAsString(); } + + /// getAsString - Convert this value to a string form. + virtual std::string getAsString() const = 0; /// dump - Debugging method that may be called through a debugger, just /// invokes print on cerr. @@ -499,7 +501,7 @@ public: } virtual bool isComplete() const { return false; } - virtual void print(std::ostream &OS) const { OS << "?"; } + virtual std::string getAsString() const { return "?"; } }; @@ -508,7 +510,7 @@ public: class BitInit : public Init { bool Value; public: - BitInit(bool V) : Value(V) {} + explicit BitInit(bool V) : Value(V) {} bool getValue() const { return Value; } @@ -516,7 +518,7 @@ public: return Ty->convertValue(this); } - virtual void print(std::ostream &OS) const { OS << (Value ? "1" : "0"); } + virtual std::string getAsString() const { return Value ? "1" : "0"; } }; /// BitsInit - { a, b, c } - Represents an initializer for a BitsRecTy value. @@ -525,7 +527,7 @@ public: class BitsInit : public Init { std::vector Bits; public: - BitsInit(unsigned Size) : Bits(Size) {} + explicit BitsInit(unsigned Size) : Bits(Size) {} unsigned getNumBits() const { return Bits.size(); } @@ -549,7 +551,7 @@ public: if (!getBit(i)->isComplete()) return false; return true; } - virtual void print(std::ostream &OS) const; + virtual std::string getAsString() const; virtual Init *resolveReferences(Record &R, const RecordVal *RV); @@ -564,18 +566,18 @@ public: /// IntInit - 7 - Represent an initalization by a literal integer value. /// class IntInit : public Init { - int Value; + int64_t Value; public: - IntInit(int V) : Value(V) {} + explicit IntInit(int64_t V) : Value(V) {} - int getValue() const { return Value; } + int64_t getValue() const { return Value; } virtual Init *convertInitializerTo(RecTy *Ty) { return Ty->convertValue(this); } virtual Init *convertInitializerBitRange(const std::vector &Bits); - virtual void print(std::ostream &OS) const { OS << Value; } + virtual std::string getAsString() const; }; @@ -584,7 +586,7 @@ public: class StringInit : public Init { std::string Value; public: - StringInit(const std::string &V) : Value(V) {} + explicit StringInit(const std::string &V) : Value(V) {} const std::string &getValue() const { return Value; } @@ -592,7 +594,7 @@ public: return Ty->convertValue(this); } - virtual void print(std::ostream &OS) const { OS << "\"" << Value << "\""; } + virtual std::string getAsString() const { return "\"" + Value + "\""; } }; /// CodeInit - "[{...}]" - Represent a code fragment. @@ -600,7 +602,7 @@ public: class CodeInit : public Init { std::string Value; public: - CodeInit(const std::string &V) : Value(V) {} + explicit CodeInit(const std::string &V) : Value(V) {} const std::string getValue() const { return Value; } @@ -608,7 +610,7 @@ public: return Ty->convertValue(this); } - virtual void print(std::ostream &OS) const { OS << "[{" << Value << "}]"; } + virtual std::string getAsString() const { return "[{" + Value + "}]"; } }; /// ListInit - [AL, AH, CL] - Represent a list of defs @@ -616,7 +618,7 @@ public: class ListInit : public Init { std::vector Values; public: - ListInit(std::vector &Vs) { + explicit ListInit(std::vector &Vs) { Values.swap(Vs); } @@ -641,7 +643,18 @@ public: /// virtual Init *resolveReferences(Record &R, const RecordVal *RV); - virtual void print(std::ostream &OS) const; + virtual std::string getAsString() const; + + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; + + inline iterator begin() { return Values.begin(); } + inline const_iterator begin() const { return Values.begin(); } + inline iterator end () { return Values.end(); } + inline const_iterator end () const { return Values.end(); } + + inline size_t size () const { return Values.size(); } + inline bool empty() const { return Values.empty(); } }; /// BinOpInit - !op (X, Y) - Combine two inits. @@ -670,7 +683,7 @@ public: virtual Init *resolveReferences(Record &R, const RecordVal *RV); - virtual void print(std::ostream &OS) const; + virtual std::string getAsString() const; }; @@ -681,7 +694,7 @@ public: class TypedInit : public Init { RecTy *Ty; public: - TypedInit(RecTy *T) : Ty(T) {} + explicit TypedInit(RecTy *T) : Ty(T) {} RecTy *getType() const { return Ty; } @@ -707,7 +720,8 @@ public: class VarInit : public TypedInit { std::string VarName; public: - VarInit(const std::string &VN, RecTy *T) : TypedInit(T), VarName(VN) {} + explicit VarInit(const std::string &VN, RecTy *T) + : TypedInit(T), VarName(VN) {} virtual Init *convertInitializerTo(RecTy *Ty) { return Ty->convertValue(this); @@ -730,7 +744,7 @@ public: /// virtual Init *resolveReferences(Record &R, const RecordVal *RV); - virtual void print(std::ostream &OS) const { OS << VarName; } + virtual std::string getAsString() const { return VarName; } }; @@ -753,9 +767,7 @@ public: TypedInit *getVariable() const { return TI; } unsigned getBitNum() const { return Bit; } - virtual void print(std::ostream &OS) const { - TI->print(OS); OS << "{" << Bit << "}"; - } + virtual std::string getAsString() const; virtual Init *resolveReferences(Record &R, const RecordVal *RV); }; @@ -788,9 +800,7 @@ public: virtual Init *resolveListElementReference(Record &R, const RecordVal *RV, unsigned Elt); - virtual void print(std::ostream &OS) const { - TI->print(OS); OS << "[" << Element << "]"; - } + virtual std::string getAsString() const; virtual Init *resolveReferences(Record &R, const RecordVal *RV); }; @@ -799,7 +809,7 @@ public: class DefInit : public Init { Record *Def; public: - DefInit(Record *D) : Def(D) {} + explicit DefInit(Record *D) : Def(D) {} virtual Init *convertInitializerTo(RecTy *Ty) { return Ty->convertValue(this); @@ -812,7 +822,7 @@ public: virtual RecTy *getFieldType(const std::string &FieldName) const; virtual Init *getFieldInit(Record &R, const std::string &FieldName) const; - virtual void print(std::ostream &OS) const; + virtual std::string getAsString() const; }; @@ -838,8 +848,8 @@ public: virtual Init *resolveReferences(Record &R, const RecordVal *RV); - virtual void print(std::ostream &OS) const { - Rec->print(OS); OS << "." << FieldName; + virtual std::string getAsString() const { + return Rec->getAsString() + "." + FieldName; } }; @@ -889,7 +899,29 @@ public: virtual Init *resolveReferences(Record &R, const RecordVal *RV); - virtual void print(std::ostream &OS) const; + virtual std::string getAsString() const; + + typedef std::vector::iterator arg_iterator; + typedef std::vector::const_iterator const_arg_iterator; + typedef std::vector::iterator name_iterator; + typedef std::vector::const_iterator const_name_iterator; + + inline arg_iterator arg_begin() { return Args.begin(); } + inline const_arg_iterator arg_begin() const { return Args.begin(); } + inline arg_iterator arg_end () { return Args.end(); } + inline const_arg_iterator arg_end () const { return Args.end(); } + + inline size_t arg_size () const { return Args.size(); } + inline bool arg_empty() const { return Args.empty(); } + + inline name_iterator name_begin() { return ArgNames.begin(); } + inline const_name_iterator name_begin() const { return ArgNames.begin(); } + inline name_iterator name_end () { return ArgNames.end(); } + inline const_name_iterator name_end () const { return ArgNames.end(); } + + inline size_t name_size () const { return ArgNames.size(); } + inline bool name_empty() const { return ArgNames.empty(); } + }; //===----------------------------------------------------------------------===// @@ -935,7 +967,7 @@ class Record { std::vector SuperClasses; public: - Record(const std::string &N) : Name(N) {} + explicit Record(const std::string &N) : Name(N) {} ~Record() {} const std::string &getName() const { return Name; } @@ -1051,7 +1083,7 @@ public: /// its value as a vector of integers, throwing an exception if the field does /// not exist or if the value is not the right type. /// - std::vector getValueAsListOfInts(const std::string &FieldName) const; + std::vector getValueAsListOfInts(const std::string &FieldName) const; /// getValueAsDef - This method looks up the specified field and returns its /// value as a Record, throwing an exception if the field does not exist or if @@ -1066,10 +1098,10 @@ public: bool getValueAsBit(const std::string &FieldName) const; /// getValueAsInt - This method looks up the specified field and returns its - /// value as an int, throwing an exception if the field does not exist or if - /// the value is not the right type. + /// value as an int64_t, throwing an exception if the field does not exist or + /// if the value is not the right type. /// - int getValueAsInt(const std::string &FieldName) const; + int64_t getValueAsInt(const std::string &FieldName) const; /// getValueAsDag - This method looks up the specified field and returns its /// value as an Dag, throwing an exception if the field does not exist or if @@ -1144,6 +1176,24 @@ public: void dump() const; }; +/// LessRecord - Sorting predicate to sort record pointers by name. +/// +struct LessRecord { + bool operator()(const Record *Rec1, const Record *Rec2) const { + return Rec1->getName() < Rec2->getName(); + } +}; + +/// LessRecordFieldName - Sorting predicate to sort record pointers by their +/// name field. +/// +struct LessRecordFieldName { + bool operator()(const Record *Rec1, const Record *Rec2) const { + return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name"); + } +}; + + std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK); extern RecordKeeper Records;