Finish implementation of the type inference engine.
Start working on reading in nonterminals


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7671 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/support/tools/TableGen/InstrSelectorEmitter.cpp b/support/tools/TableGen/InstrSelectorEmitter.cpp
index a2bd08c..dbc1b66 100644
--- a/support/tools/TableGen/InstrSelectorEmitter.cpp
+++ b/support/tools/TableGen/InstrSelectorEmitter.cpp
@@ -82,11 +82,13 @@
       return getValueType(R->getValueAsDef("RegType"));
     } else if (SuperClasses[i]->getName() == "Register") {
       std::cerr << "WARNING: Explicit registers not handled yet!\n";
+      return MVT::Other;
     } else if (SuperClasses[i]->getName() == "Nonterminal") {
+      //std::cerr << "Warning nonterminal type not handled yet:" << R->getName()
+      //          << "\n";
+      return MVT::Other;
     }
-  //throw "Error: Unknown value used: " + R->getName();
-
-  return MVT::Other;
+  throw "Error: Unknown value used: " + R->getName();
 }
 
 // Parse the specified DagInit into a TreePattern which we can use.
@@ -159,13 +161,15 @@
 
     switch (NT.ArgTypes[i]) {
     case NodeType::Arg0:
-      MadeChange |=UpdateNodeType(Children[i], Children[0]->getType(), RecName);
+      MadeChange |= UpdateNodeType(Children[i], Children[0]->getType(),RecName);
       break;
     case NodeType::Val:
       if (Children[i]->getType() == MVT::isVoid)
         throw "In pattern for " + RecName + " should not get a void node!";
       break;
-    case NodeType::Ptr: // FIXME
+    case NodeType::Ptr:
+      MadeChange |= UpdateNodeType(Children[i],Target.getPointerType(),RecName);
+      break;
     default: assert(0 && "Invalid argument ArgType!");
     }
   }
@@ -179,8 +183,14 @@
     MadeChange |= UpdateNodeType(N, Children[0]->getType(), RecName);
     break;
 
-  case NodeType::Ptr:   // FIXME: get from target
+  case NodeType::Ptr:
+    MadeChange |= UpdateNodeType(N, Target.getPointerType(), RecName);
+    break;
   case NodeType::Val:
+    if (N->getType() == MVT::isVoid)
+      throw "In pattern for " + RecName + " should not get a void node!";
+    break;
+  default:
     assert(0 && "Unhandled type constraint!");
     break;
   }
@@ -210,6 +220,19 @@
   return Pattern;
 }
 
+// ProcessNonTerminals - Read in all nonterminals and incorporate them into
+// our pattern database.
+void InstrSelectorEmitter::ProcessNonTerminals() {
+  std::vector<Record*> NTs = Records.getAllDerivedDefinitions("Nonterminal");
+  for (unsigned i = 0, e = NTs.size(); i != e; ++i) {
+    DagInit *DI = NTs[i]->getValueAsDag("Pattern");
+
+    TreePatternNode *Pattern = ReadAndCheckPattern(DI, NTs[i]->getName());
+
+    DEBUG(std::cerr << "Parsed nonterm pattern " << NTs[i]->getName() << "\t= "
+          << *Pattern << "\n");
+  }
+}
 
 
 /// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
@@ -222,7 +245,6 @@
     if (DagInit *DI = dynamic_cast<DagInit*>(Inst->getValueInit("Pattern"))) {
       TreePatternNode *Pattern = ReadAndCheckPattern(DI, Inst->getName());
 
-
       DEBUG(std::cerr << "Parsed inst pattern " << Inst->getName() << "\t= "
                       << *Pattern << "\n");
     }
@@ -235,6 +257,7 @@
   ProcessNodeTypes();
   
   // Read in all of the nonterminals...
+  //ProcessNonTerminals();
 
   // Read all of the instruction patterns in...
   ProcessInstructionPatterns();
diff --git a/support/tools/TableGen/InstrSelectorEmitter.h b/support/tools/TableGen/InstrSelectorEmitter.h
index dc16fb2..108aeee 100644
--- a/support/tools/TableGen/InstrSelectorEmitter.h
+++ b/support/tools/TableGen/InstrSelectorEmitter.h
@@ -9,7 +9,7 @@
 #define INSTRSELECTOR_EMITTER_H
 
 #include "TableGenBackend.h"
-#include "llvm/CodeGen/ValueTypes.h"
+#include "CodeGenWrappers.h"
 #include <vector>
 #include <map>
 class DagInit;
@@ -82,6 +82,7 @@
 
 class InstrSelectorEmitter : public TableGenBackend {
   RecordKeeper &Records;
+  CodeGenTarget Target;
 
   std::map<Record*, NodeType> NodeTypes;
 public:
@@ -96,6 +97,10 @@
   // structure.
   void ProcessNodeTypes();
 
+  // ProcessNonTerminals - Read in all nonterminals and incorporate them into
+  // our pattern database.
+  void ProcessNonTerminals();
+
   // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
   // process those with a useful Pattern field.
   void ProcessInstructionPatterns();
diff --git a/utils/TableGen/InstrSelectorEmitter.cpp b/utils/TableGen/InstrSelectorEmitter.cpp
index a2bd08c..dbc1b66 100644
--- a/utils/TableGen/InstrSelectorEmitter.cpp
+++ b/utils/TableGen/InstrSelectorEmitter.cpp
@@ -82,11 +82,13 @@
       return getValueType(R->getValueAsDef("RegType"));
     } else if (SuperClasses[i]->getName() == "Register") {
       std::cerr << "WARNING: Explicit registers not handled yet!\n";
+      return MVT::Other;
     } else if (SuperClasses[i]->getName() == "Nonterminal") {
+      //std::cerr << "Warning nonterminal type not handled yet:" << R->getName()
+      //          << "\n";
+      return MVT::Other;
     }
-  //throw "Error: Unknown value used: " + R->getName();
-
-  return MVT::Other;
+  throw "Error: Unknown value used: " + R->getName();
 }
 
 // Parse the specified DagInit into a TreePattern which we can use.
@@ -159,13 +161,15 @@
 
     switch (NT.ArgTypes[i]) {
     case NodeType::Arg0:
-      MadeChange |=UpdateNodeType(Children[i], Children[0]->getType(), RecName);
+      MadeChange |= UpdateNodeType(Children[i], Children[0]->getType(),RecName);
       break;
     case NodeType::Val:
       if (Children[i]->getType() == MVT::isVoid)
         throw "In pattern for " + RecName + " should not get a void node!";
       break;
-    case NodeType::Ptr: // FIXME
+    case NodeType::Ptr:
+      MadeChange |= UpdateNodeType(Children[i],Target.getPointerType(),RecName);
+      break;
     default: assert(0 && "Invalid argument ArgType!");
     }
   }
@@ -179,8 +183,14 @@
     MadeChange |= UpdateNodeType(N, Children[0]->getType(), RecName);
     break;
 
-  case NodeType::Ptr:   // FIXME: get from target
+  case NodeType::Ptr:
+    MadeChange |= UpdateNodeType(N, Target.getPointerType(), RecName);
+    break;
   case NodeType::Val:
+    if (N->getType() == MVT::isVoid)
+      throw "In pattern for " + RecName + " should not get a void node!";
+    break;
+  default:
     assert(0 && "Unhandled type constraint!");
     break;
   }
@@ -210,6 +220,19 @@
   return Pattern;
 }
 
+// ProcessNonTerminals - Read in all nonterminals and incorporate them into
+// our pattern database.
+void InstrSelectorEmitter::ProcessNonTerminals() {
+  std::vector<Record*> NTs = Records.getAllDerivedDefinitions("Nonterminal");
+  for (unsigned i = 0, e = NTs.size(); i != e; ++i) {
+    DagInit *DI = NTs[i]->getValueAsDag("Pattern");
+
+    TreePatternNode *Pattern = ReadAndCheckPattern(DI, NTs[i]->getName());
+
+    DEBUG(std::cerr << "Parsed nonterm pattern " << NTs[i]->getName() << "\t= "
+          << *Pattern << "\n");
+  }
+}
 
 
 /// ProcessInstructionPatterns - Read in all subclasses of Instruction, and
@@ -222,7 +245,6 @@
     if (DagInit *DI = dynamic_cast<DagInit*>(Inst->getValueInit("Pattern"))) {
       TreePatternNode *Pattern = ReadAndCheckPattern(DI, Inst->getName());
 
-
       DEBUG(std::cerr << "Parsed inst pattern " << Inst->getName() << "\t= "
                       << *Pattern << "\n");
     }
@@ -235,6 +257,7 @@
   ProcessNodeTypes();
   
   // Read in all of the nonterminals...
+  //ProcessNonTerminals();
 
   // Read all of the instruction patterns in...
   ProcessInstructionPatterns();
diff --git a/utils/TableGen/InstrSelectorEmitter.h b/utils/TableGen/InstrSelectorEmitter.h
index dc16fb2..108aeee 100644
--- a/utils/TableGen/InstrSelectorEmitter.h
+++ b/utils/TableGen/InstrSelectorEmitter.h
@@ -9,7 +9,7 @@
 #define INSTRSELECTOR_EMITTER_H
 
 #include "TableGenBackend.h"
-#include "llvm/CodeGen/ValueTypes.h"
+#include "CodeGenWrappers.h"
 #include <vector>
 #include <map>
 class DagInit;
@@ -82,6 +82,7 @@
 
 class InstrSelectorEmitter : public TableGenBackend {
   RecordKeeper &Records;
+  CodeGenTarget Target;
 
   std::map<Record*, NodeType> NodeTypes;
 public:
@@ -96,6 +97,10 @@
   // structure.
   void ProcessNodeTypes();
 
+  // ProcessNonTerminals - Read in all nonterminals and incorporate them into
+  // our pattern database.
+  void ProcessNonTerminals();
+
   // ProcessInstructionPatterns - Read in all subclasses of Instruction, and
   // process those with a useful Pattern field.
   void ProcessInstructionPatterns();