[llvm-commits] [llvm] r78427 - in /llvm/trunk: include/llvm/Target/Target.td utils/TableGen/AsmWriterEmitter.cpp

Chris Lattner sabre at nondot.org
Fri Aug 7 16:13:38 PDT 2009


Author: lattner
Date: Fri Aug  7 18:13:38 2009
New Revision: 78427

URL: http://llvm.org/viewvc/llvm-project?rev=78427&view=rev
Log:
fix the column output stuff in the asmwriter from being dynamic and
driven by TAI to being static, driven by tblgen.  This means that a
target doesn't get impacted by this stuff at all if it doesn't opt
into it.

Modified:
    llvm/trunk/include/llvm/Target/Target.td
    llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp

Modified: llvm/trunk/include/llvm/Target/Target.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/Target.td?rev=78427&r1=78426&r2=78427&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Target/Target.td (original)
+++ llvm/trunk/include/llvm/Target/Target.td Fri Aug  7 18:13:38 2009
@@ -465,6 +465,17 @@
   // will specify which alternative to use.  For example "{x|y|z}" with Variant
   // == 1, will expand to "y".
   int Variant = 0;
+  
+  
+  // FirstOperandColumn/OperandSpacing - If the assembler syntax uses a columnar
+  // layout, the asmwriter can actually generate output in this columns (in
+  // verbose-asm mode).  These two values indicate the width of the first column
+  // (the "opcode" area) and the width to reserve for subsequent operands.  When
+  // verbose asm mode is enabled, operands will be indented to respect this.
+  int FirstOperandColumn = -1;
+  
+  // OperandSpacing - Space between operand columns.
+  int OperandSpacing = -1;
 }
 def DefaultAsmWriter : AsmWriter;
 

Modified: llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp?rev=78427&r1=78426&r2=78427&view=diff

==============================================================================
--- llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/AsmWriterEmitter.cpp Fri Aug  7 18:13:38 2009
@@ -91,7 +91,7 @@
     std::vector<AsmWriterOperand> Operands;
     const CodeGenInstruction *CGI;
 
-    AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant);
+    AsmWriterInst(const CodeGenInstruction &CGI, Record *AsmWriter);
 
     /// MatchesAllButOneOp - If this instruction is exactly identical to the
     /// specified instruction except for one differing operand, return the
@@ -132,10 +132,19 @@
 /// ParseAsmString - Parse the specified Instruction's AsmString into this
 /// AsmWriterInst.
 ///
-AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
+AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, Record *AsmWriter) {
   this->CGI = &CGI;
+  
+  unsigned Variant       = AsmWriter->getValueAsInt("Variant");
+  int FirstOperandColumn = AsmWriter->getValueAsInt("FirstOperandColumn");
+  int OperandSpacing     = AsmWriter->getValueAsInt("OperandSpacing");
+  
   unsigned CurVariant = ~0U;  // ~0 if we are outside a {.|.|.} region, other #.
 
+  // This is the number of tabs we've seen if we're doing columnar layout.
+  unsigned CurColumn = 0;
+  
+  
   // NOTE: Any extensions to this code need to be mirrored in the 
   // AsmPrinter::printInlineAsm code that executes as compile time (assuming
   // that inline asm strings should also get the new feature)!
@@ -155,11 +164,19 @@
           case '\n':
             AddLiteralString("\\n");
             break;
-          case '\t': 
+          case '\t':
+            // If the asm writer is not using a columnar layout, \t is not
+            // magic.
+            if (FirstOperandColumn == -1 || OperandSpacing == -1) {
+              AddLiteralString("\\t");
+              break;
+            }
+              
+            // We recognize a tab as an operand delimeter.
+            unsigned DestColumn = FirstOperandColumn + 
+                                  CurColumn++ * OperandSpacing;
             Operands.push_back(
-              // We recognize a tab as an operand delimeter.  Either
-              // output column padding if enabled or emit a space.
-              AsmWriterOperand("PadToColumn(OperandColumn++);\n",
+              AsmWriterOperand("O.PadToColumn(" + utostr(DestColumn) + ",1);\n",
                                AsmWriterOperand::isLiteralStatementOperand));
             break;
           case '"':
@@ -181,11 +198,20 @@
         if (AsmString[DollarPos+1] == 'n') {
           AddLiteralString("\\n");
         } else if (AsmString[DollarPos+1] == 't') {
+          // If the asm writer is not using a columnar layout, \t is not
+          // magic.
+          if (FirstOperandColumn == -1 || OperandSpacing == -1) {
+            AddLiteralString("\\t");
+            break;
+          }
+            
+          // We recognize a tab as an operand delimeter.
+          unsigned DestColumn = FirstOperandColumn + 
+                                CurColumn++ * OperandSpacing;
           Operands.push_back(
-            // We recognize a tab as an operand delimeter.  Either
-            // output column padding if enabled or emit a space.
-            AsmWriterOperand("PadToColumn(OperandColumn++);\n",
+            AsmWriterOperand("O.PadToColumn(" + utostr(DestColumn) + ", 1);\n",
                              AsmWriterOperand::isLiteralStatementOperand));
+          break;
         } else if (std::string("${|}\\").find(AsmString[DollarPos+1]) 
                    != std::string::npos) {
           AddLiteralString(std::string(1, AsmString[DollarPos+1]));
@@ -532,7 +558,6 @@
   CodeGenTarget Target;
   Record *AsmWriter = Target.getAsmWriter();
   std::string ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
-  unsigned Variant = AsmWriter->getValueAsInt("Variant");
 
   O <<
   "/// printInstruction - This method is automatically generated by tablegen\n"
@@ -547,7 +572,7 @@
   for (CodeGenTarget::inst_iterator I = Target.inst_begin(),
          E = Target.inst_end(); I != E; ++I)
     if (!I->second.AsmString.empty())
-      Instructions.push_back(AsmWriterInst(I->second, Variant));
+      Instructions.push_back(AsmWriterInst(I->second, AsmWriter));
 
   // Get the instruction numbering.
   Target.getInstructionsByEnumValue(NumberedInstructions);
@@ -728,10 +753,6 @@
     << "  if (Bits == 0) return false;\n"
     << "  O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n\n";
 
-  // This variable may be unused, suppress build warnings.
-  O << "  unsigned OperandColumn = 1;\n";
-  O << "  (void) OperandColumn;\n\n";
-
   // Output the table driven operand information.
   BitsLeft = 32-AsmStrBits;
   for (unsigned i = 0, e = TableDrivenOperandPrinters.size(); i != e; ++i) {





More information about the llvm-commits mailing list