[llvm-commits] CVS: llvm/utils/TableGen/InstrSelectorEmitter.cpp InstrSelectorEmitter.h

Chris Lattner lattner at cs.uiuc.edu
Thu Aug 7 16:04:02 PDT 2003


Changes in directory llvm/utils/TableGen:

InstrSelectorEmitter.cpp updated: 1.11 -> 1.12
InstrSelectorEmitter.h updated: 1.8 -> 1.9

---
Log message:

Implement type-inference/checking for non-terminal references


---
Diffs of the changes:

Index: llvm/utils/TableGen/InstrSelectorEmitter.cpp
diff -u llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.11 llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.12
--- llvm/utils/TableGen/InstrSelectorEmitter.cpp:1.11	Thu Aug  7 15:42:23 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.cpp	Thu Aug  7 16:02:56 2003
@@ -99,7 +99,7 @@
   Resolved = !AnyUnset;
 }
 
-void Pattern::error(const std::string &Msg) {
+void Pattern::error(const std::string &Msg) const {
   std::string M = "In ";
   switch (PTy) {
   case Nonterminal: M += "nonterminal "; break;
@@ -109,17 +109,19 @@
   throw M + TheRecord->getName() + ": " + Msg;  
 }
 
-static MVT::ValueType getIntrinsicType(Record *R) {
+/// getIntrinsicType - Check to see if the specified record has an intrinsic
+/// type which should be applied to it.  This infer the type of register
+/// references from the register file information, for example.
+///
+MVT::ValueType Pattern::getIntrinsicType(Record *R) const {
   // Check to see if this is a register or a register class...
-  if (R->isSubClassOf("RegisterClass")) {
+  if (R->isSubClassOf("RegisterClass"))
     return getValueType(R->getValueAsDef("RegType"));
-  } else if (R->isSubClassOf("Register")) {
+  else if (R->isSubClassOf("Nonterminal"))
+    return ISE.ReadNonterminal(R)->getTree()->getType();
+  else if (R->isSubClassOf("Register")) {
     std::cerr << "WARNING: Explicit registers not handled yet!\n";
     return MVT::Other;
-  } else if (R->isSubClassOf("Nonterminal")) {
-    //std::cerr << "Warning nonterminal type not handled yet:" << R->getName()
-    //          << "\n";
-    return MVT::Other;
   }
 
   throw "Error: Unknown value used: " + R->getName();
@@ -238,6 +240,15 @@
   return AnyUnset | N->getType() == MVT::Other;
 }
 
+/// InstantiateNonterminalsReferenced - If this pattern refers to any
+/// nonterminals which are not themselves completely resolved, clone the
+/// nonterminal and resolve it with the using context we provide.
+///
+void Pattern::InstantiateNonterminalsReferenced() {
+
+}
+
+
 std::ostream &operator<<(std::ostream &OS, const Pattern &P) {
   switch (P.getPatternType()) {
   case Pattern::Nonterminal: OS << "Nonterminal pattern "; break;
@@ -300,16 +311,23 @@
   DEBUG(std::cerr << "DONE!\n");
 }
 
+Pattern *InstrSelectorEmitter::ReadNonterminal(Record *R) {
+  Pattern *&P = Patterns[R];
+  if (P) return P;  // Don't reread it!
+
+  DagInit *DI = R->getValueAsDag("Pattern");
+  P = new Pattern(Pattern::Nonterminal, DI, R, *this);
+  DEBUG(std::cerr << "Parsed " << *P << "\n");
+  return P;
+}
+
+
 // ReadNonTerminals - Read in all nonterminals and incorporate them into our
 // pattern database.
 void InstrSelectorEmitter::ReadNonterminals() {
   std::vector<Record*> NTs = Records.getAllDerivedDefinitions("Nonterminal");
-  for (unsigned i = 0, e = NTs.size(); i != e; ++i) {
-    DagInit *DI = NTs[i]->getValueAsDag("Pattern");
-
-    Patterns[NTs[i]] = new Pattern(Pattern::Nonterminal, DI, NTs[i], *this);
-    DEBUG(std::cerr << "Parsed " << *Patterns[NTs[i]] << "\n");
-  }
+  for (unsigned i = 0, e = NTs.size(); i != e; ++i)
+    ReadNonterminal(NTs[i]);
 }
 
 
@@ -342,11 +360,12 @@
 
 // InstantiateNonterminals - Instantiate any unresolved nonterminals with
 // information from the context that they are used in.
+//
 void InstrSelectorEmitter::InstantiateNonterminals() {
   for (std::map<Record*, Pattern*>::iterator I = Patterns.begin(),
-         E = Patterns.end(); I != E; ++I) {
-
-  }
+         E = Patterns.end(); I != E; ++I)
+    if (I->second->isResolved())
+      I->second->InstantiateNonterminalsReferenced();
 }
 
 


Index: llvm/utils/TableGen/InstrSelectorEmitter.h
diff -u llvm/utils/TableGen/InstrSelectorEmitter.h:1.8 llvm/utils/TableGen/InstrSelectorEmitter.h:1.9
--- llvm/utils/TableGen/InstrSelectorEmitter.h:1.8	Thu Aug  7 15:42:23 2003
+++ llvm/utils/TableGen/InstrSelectorEmitter.h	Thu Aug  7 16:02:56 2003
@@ -162,10 +162,15 @@
 
   bool isResolved() const { return Resolved; }
 
+  /// InstantiateNonterminalsReferenced - If this pattern refers to any
+  /// nonterminals which are not themselves completely resolved, clone the
+  /// nonterminal and resolve it with the using context we provide.
+  void InstantiateNonterminalsReferenced();
 private:
+  MVT::ValueType getIntrinsicType(Record *R) const;
   TreePatternNode *ParseTreePattern(DagInit *DI);
   bool InferTypes(TreePatternNode *N, bool &MadeChange);
-  void error(const std::string &Msg);
+  void error(const std::string &Msg) const;
 };
 
 std::ostream &operator<<(std::ostream &OS, const Pattern &P);
@@ -192,6 +197,17 @@
 
   const CodeGenTarget &getTarget() const { return Target; }
   std::map<Record*, NodeType> &getNodeTypes() { return NodeTypes; }
+
+  /// getPattern - return the pattern corresponding to the specified record, or
+  /// null if there is none.
+  Pattern *getPattern(Record *R) const {
+    std::map<Record*, Pattern*>::const_iterator I = Patterns.find(R);
+    return I != Patterns.end() ? I->second : 0;
+  }
+
+  /// ReadNonterminal - This method parses the specified record as a
+  /// nonterminal, but only if it hasn't been read in already.
+  Pattern *ReadNonterminal(Record *R);
 
 private:
   // ReadNodeTypes - Read in all of the node types in the current RecordKeeper,





More information about the llvm-commits mailing list