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

Chris Lattner lattner at cs.uiuc.edu
Sun Oct 3 13:19:15 PDT 2004



Changes in directory llvm/utils/TableGen:

AsmWriterEmitter.cpp updated: 1.7 -> 1.8
---
Log message:

Correctly parse variant notation


---
Diffs of the changes:  (+42 -6)

Index: llvm/utils/TableGen/AsmWriterEmitter.cpp
diff -u llvm/utils/TableGen/AsmWriterEmitter.cpp:1.7 llvm/utils/TableGen/AsmWriterEmitter.cpp:1.8
--- llvm/utils/TableGen/AsmWriterEmitter.cpp:1.7	Mon Aug 16 22:08:27 2004
+++ llvm/utils/TableGen/AsmWriterEmitter.cpp	Sun Oct  3 15:19:02 2004
@@ -30,24 +30,24 @@
   O << "namespace llvm {\n\n";
 
   CodeGenTarget Target;
-
   Record *AsmWriter = Target.getAsmWriter();
-
-  std::string AsmWriterClassName =
-    AsmWriter->getValueAsString("AsmWriterClassName");
+  std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
+  unsigned Variant = AsmWriter->getValueAsInt("Variant");
 
   O <<
   "/// printInstruction - This method is automatically generated by tablegen\n"
   "/// from the instruction set description.  This method returns true if the\n"
   "/// machine instruction was sufficiently described to print it, otherwise\n"
   "/// it returns false.\n"
-    "bool " << Target.getName() << AsmWriterClassName
+    "bool " << Target.getName() << ClassName
             << "::printInstruction(const MachineInstr *MI) {\n";
   O << "  switch (MI->getOpcode()) {\n"
        "  default: return false;\n";
 
   std::string Namespace = Target.inst_begin()->second.Namespace;
 
+  bool inVariant = false;  // True if we are inside a {.|.|.} region.
+
   for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
          E = Target.inst_end(); I != E; ++I)
     if (!I->second.AsmString.empty()) {
@@ -56,7 +56,8 @@
 
       std::string::size_type LastEmitted = 0;
       while (LastEmitted != AsmString.size()) {
-        std::string::size_type DollarPos = AsmString.find('$', LastEmitted);
+        std::string::size_type DollarPos =
+          AsmString.find_first_of("${|}", LastEmitted);
         if (DollarPos == std::string::npos) DollarPos = AsmString.size();
 
         // Emit a constant string fragment.
@@ -65,6 +66,41 @@
           O << " << \"" << std::string(AsmString.begin()+LastEmitted,
                                        AsmString.begin()+DollarPos) << "\"";
           LastEmitted = DollarPos;
+        } else if (AsmString[DollarPos] == '{') {
+          if (inVariant)
+            throw "Nested variants found for instruction '" + I->first + "'!";
+          LastEmitted = DollarPos+1;
+          inVariant = true;   // We are now inside of the variant!
+          for (unsigned i = 0; i != Variant; ++i) {
+            // Skip over all of the text for an irrelevant variant here.  The
+            // next variant starts at |, or there may not be text for this
+            // variant if we see a }.
+            std::string::size_type NP =
+              AsmString.find_first_of("|}", LastEmitted);
+            if (NP == std::string::npos)
+              throw "Incomplete variant for instruction '" + I->first + "'!";
+            LastEmitted = NP+1;
+            if (AsmString[NP] == '}') {
+              inVariant = false;        // No text for this variant.
+              break;
+            }
+          }
+        } else if (AsmString[DollarPos] == '|') {
+          if (!inVariant)
+            throw "'|' character found outside of a variant in instruction '"
+                  + I->first + "'!";
+          // Move to the end of variant list.
+          std::string::size_type NP = AsmString.find('}', LastEmitted);
+          if (NP == std::string::npos)
+            throw "Incomplete variant for instruction '" + I->first + "'!";
+          LastEmitted = NP+1;
+          inVariant = false;
+        } else if (AsmString[DollarPos] == '}') {
+          if (!inVariant)
+            throw "'}' character found outside of a variant in instruction '"
+                  + I->first + "'!";
+          LastEmitted = DollarPos+1;
+          inVariant = false;
         } else if (DollarPos+1 != AsmString.size() &&
                    AsmString[DollarPos+1] == '$') {
           O << " << '$'";         // "$$" -> $






More information about the llvm-commits mailing list