Improve LSR's dead-phi detection to handle use-def cycles
[oota-llvm.git] / utils / TableGen / Record.h
index 5e88e50d3e40e4cb6f0850c99cbb30fca10728ff..83d358ad2ce746ed47cf96dba7e3ba6a09d72ba9 100644 (file)
@@ -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.
 //
 //===----------------------------------------------------------------------===//
 //
@@ -62,7 +62,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 +128,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);
@@ -169,8 +170,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 +208,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 +244,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);
@@ -288,7 +287,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 +324,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 +358,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);
@@ -402,7 +400,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 +429,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 +500,7 @@ public:
   }
 
   virtual bool isComplete() const { return false; }
-  virtual void print(std::ostream &OS) const { OS << "?"; }
+  virtual std::string getAsString() const { return "?"; }
 };
 
 
@@ -508,7 +509,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 +517,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 +526,7 @@ public:
 class BitsInit : public Init {
   std::vector<Init*> Bits;
 public:
-  BitsInit(unsigned Size) : Bits(Size) {}
+  explicit BitsInit(unsigned Size) : Bits(Size) {}
 
   unsigned getNumBits() const { return Bits.size(); }
 
@@ -549,7 +550,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);
 
@@ -566,7 +567,7 @@ public:
 class IntInit : public Init {
   int Value;
 public:
-  IntInit(int V) : Value(V) {}
+  explicit IntInit(int V) : Value(V) {}
 
   int getValue() const { return Value; }
 
@@ -575,7 +576,7 @@ public:
   }
   virtual Init *convertInitializerBitRange(const std::vector<unsigned> &Bits);
 
-  virtual void print(std::ostream &OS) const { OS << Value; }
+  virtual std::string getAsString() const;
 };
 
 
@@ -584,7 +585,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 +593,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 +601,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 +609,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 +617,7 @@ public:
 class ListInit : public Init {
   std::vector<Init*> Values;
 public:
-  ListInit(std::vector<Init*> &Vs) {
+  explicit ListInit(std::vector<Init*> &Vs) {
     Values.swap(Vs);
   }
 
@@ -641,7 +642,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<Init*>::iterator       iterator;
+  typedef std::vector<Init*>::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 +682,7 @@ public:
   
   virtual Init *resolveReferences(Record &R, const RecordVal *RV);
   
-  virtual void print(std::ostream &OS) const;
+  virtual std::string getAsString() const;
 };
 
 
@@ -681,7 +693,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 +719,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 +743,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 +766,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 +799,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 +808,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 +821,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 +847,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 +898,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<Init*>::iterator             arg_iterator;
+  typedef std::vector<Init*>::const_iterator       const_arg_iterator;
+  typedef std::vector<std::string>::iterator       name_iterator;
+  typedef std::vector<std::string>::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(); }
+
 };
 
 //===----------------------------------------------------------------------===//