Ick, add the RIGHT accessor
[oota-llvm.git] / utils / TableGen / Record.h
index f933d4ff52693785a9e13cdb94c5f14b342b3b77..b26e13ec8c3c5f605260041e74b11298c7a8fdea 100644 (file)
@@ -21,6 +21,7 @@ class IntRecTy;
 class StringRecTy;
 class ListRecTy;
 class CodeRecTy;
+class DagRecTy;
 class RecordRecTy;
 
 // Init subclasses...
@@ -33,6 +34,7 @@ class StringInit;
 class CodeInit;
 class ListInit;
 class DefInit;
+class DagInit;
 class TypedInit;
 class VarInit;
 class FieldInit;
@@ -65,6 +67,7 @@ public:   // These methods should only be called from subclasses of Init
   virtual Init *convertValue(  CodeInit *CI) { return 0; }
   virtual Init *convertValue(VarBitInit *VB) { return 0; }
   virtual Init *convertValue(   DefInit *DI) { return 0; }
+  virtual Init *convertValue(   DagInit *DI) { return 0; }
   virtual Init *convertValue( TypedInit *TI) { return 0; }
   virtual Init *convertValue(   VarInit *VI) {
     return convertValue((TypedInit*)VI);
@@ -82,6 +85,7 @@ public:   // These methods should only be called by subclasses of RecTy.
   virtual bool baseClassOf(const StringRecTy *RHS) const { return false; }
   virtual bool baseClassOf(const ListRecTy   *RHS) const { return false; }
   virtual bool baseClassOf(const CodeRecTy   *RHS) const { return false; }
+  virtual bool baseClassOf(const DagRecTy    *RHS) const { return false; }
   virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; }
 };
 
@@ -205,6 +209,7 @@ public:
 struct CodeRecTy : public RecTy {
   Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
   Init *convertValue( CodeInit *CI) { return (Init*)CI; }
+  Init *convertValue(TypedInit *TI);
 
   void print(std::ostream &OS) const { OS << "code"; }
 
@@ -214,6 +219,21 @@ struct CodeRecTy : public RecTy {
   virtual bool baseClassOf(const CodeRecTy *RHS) const { return true; }
 };
 
+/// DagRecTy - 'dag' - Represent a dag fragment
+///
+struct DagRecTy : public RecTy {
+  Init *convertValue(UnsetInit *UI) { return (Init*)UI; }
+  Init *convertValue( DagInit *CI) { return (Init*)CI; }
+  Init *convertValue(TypedInit *TI);
+
+  void print(std::ostream &OS) const { OS << "dag"; }
+
+  bool typeIsConvertibleTo(const RecTy *RHS) const {
+    return RHS->baseClassOf(this);
+  }
+  virtual bool baseClassOf(const DagRecTy *RHS) const { return true; }
+};
+
 
 /// RecordRecTy - '<classname>' - Represent an instance of a class, such as:
 /// (R32 X = EAX).
@@ -564,6 +584,27 @@ public:
   }
 };
 
+/// DagInit - (def a, b) - Represent a DAG tree value.  DAG inits are required
+/// to have Records for their first value, after that, any legal Init is
+/// possible.
+///
+class DagInit : public Init {
+  Record *NodeTypeDef;
+  std::vector<Init*> Args;
+public:
+  DagInit(Record *D, std::vector<Init*> &a) : NodeTypeDef(D) {
+    Args.swap(a);  // DESTRUCTIVELY take the arguments
+  }
+  
+  virtual Init *convertInitializerTo(RecTy *Ty) {
+    return Ty->convertValue(this);
+  }
+
+  Record *getNodeType() const { return NodeTypeDef; }
+  const std::vector<Init*> &getArgs() const { return Args; }
+
+  virtual void print(std::ostream &OS) const;
+};
 
 //===----------------------------------------------------------------------===//
 //  High-Level Classes