Add initial support for a new 'dag' type


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7559 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/support/tools/TableGen/FileLexer.l b/support/tools/TableGen/FileLexer.l
index ad4bd77..8ab4006 100644
--- a/support/tools/TableGen/FileLexer.l
+++ b/support/tools/TableGen/FileLexer.l
@@ -154,6 +154,7 @@
 string         { return STRING; }
 list           { return LIST; }
 code           { return CODE; }
+dag            { return DAG; }
 
 class          { return CLASS; }
 def            { return DEF; }
diff --git a/support/tools/TableGen/FileParser.y b/support/tools/TableGen/FileParser.y
index 4025d4e..0c5b240 100644
--- a/support/tools/TableGen/FileParser.y
+++ b/support/tools/TableGen/FileParser.y
@@ -168,7 +168,7 @@
   std::vector<SubClassRefTy> *SubClassList;
 };
 
-%token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN
+%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD SET IN
 %token <IntVal>      INTVAL
 %token <StrVal>      ID STRVAL CODEFRAGMENT
 
@@ -209,6 +209,8 @@
     $$ = new ListRecTy($3);
   } | CODE {                          // code type
     $$ = new CodeRecTy();
+  } | DAG {                           // dag type
+    $$ = new DagRecTy();
   } | ClassID {                       // Record Type
     $$ = new RecordRecTy($1);
   };
diff --git a/support/tools/TableGen/Record.cpp b/support/tools/TableGen/Record.cpp
index 781fecf..968f367 100644
--- a/support/tools/TableGen/Record.cpp
+++ b/support/tools/TableGen/Record.cpp
@@ -146,6 +146,13 @@
   return 0;
 }
 
+Init *DagRecTy::convertValue(TypedInit *TI) {
+  if (TI->getType()->typeIsConvertibleTo(this))
+    return TI;
+  return 0;
+}
+
+
 void RecordRecTy::print(std::ostream &OS) const {
   OS << Rec->getName();
 }
diff --git a/support/tools/TableGen/Record.h b/support/tools/TableGen/Record.h
index f933d4f..4573af0 100644
--- a/support/tools/TableGen/Record.h
+++ b/support/tools/TableGen/Record.h
@@ -21,6 +21,7 @@
 class StringRecTy;
 class ListRecTy;
 class CodeRecTy;
+class DagRecTy;
 class RecordRecTy;
 
 // Init subclasses...
@@ -82,6 +83,7 @@
   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; }
 };
 
@@ -214,6 +216,21 @@
   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).
diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l
index ad4bd77..8ab4006 100644
--- a/utils/TableGen/FileLexer.l
+++ b/utils/TableGen/FileLexer.l
@@ -154,6 +154,7 @@
 string         { return STRING; }
 list           { return LIST; }
 code           { return CODE; }
+dag            { return DAG; }
 
 class          { return CLASS; }
 def            { return DEF; }
diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y
index 4025d4e..0c5b240 100644
--- a/utils/TableGen/FileParser.y
+++ b/utils/TableGen/FileParser.y
@@ -168,7 +168,7 @@
   std::vector<SubClassRefTy> *SubClassList;
 };
 
-%token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN
+%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD SET IN
 %token <IntVal>      INTVAL
 %token <StrVal>      ID STRVAL CODEFRAGMENT
 
@@ -209,6 +209,8 @@
     $$ = new ListRecTy($3);
   } | CODE {                          // code type
     $$ = new CodeRecTy();
+  } | DAG {                           // dag type
+    $$ = new DagRecTy();
   } | ClassID {                       // Record Type
     $$ = new RecordRecTy($1);
   };
diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp
index 781fecf..968f367 100644
--- a/utils/TableGen/Record.cpp
+++ b/utils/TableGen/Record.cpp
@@ -146,6 +146,13 @@
   return 0;
 }
 
+Init *DagRecTy::convertValue(TypedInit *TI) {
+  if (TI->getType()->typeIsConvertibleTo(this))
+    return TI;
+  return 0;
+}
+
+
 void RecordRecTy::print(std::ostream &OS) const {
   OS << Rec->getName();
 }
diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h
index f933d4f..4573af0 100644
--- a/utils/TableGen/Record.h
+++ b/utils/TableGen/Record.h
@@ -21,6 +21,7 @@
 class StringRecTy;
 class ListRecTy;
 class CodeRecTy;
+class DagRecTy;
 class RecordRecTy;
 
 // Init subclasses...
@@ -82,6 +83,7 @@
   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; }
 };
 
@@ -214,6 +216,21 @@
   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).