Fix some column padding bugs, reorganize things as suggested by Chris
authorDavid Greene <greened@obbligato.org>
Wed, 5 Aug 2009 21:00:52 +0000 (21:00 +0000)
committerDavid Greene <greened@obbligato.org>
Wed, 5 Aug 2009 21:00:52 +0000 (21:00 +0000)
and eliminate complexity.  Yay!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78243 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
utils/TableGen/AsmWriterEmitter.cpp

index 847c945266474b8b91d9ebd160c44d567b04d736..0ab780b0ab079d968410ad6d209df0a7c103e699 100644 (file)
@@ -327,6 +327,12 @@ namespace llvm {
     void EmitComments(const MCInst &MI) const;
 
   protected:
+    /// getOperandColumn - Return the output column number (zero-based)
+    /// for operand % "operand."  If TargetAsmInfo has FirstOperandColumn
+    /// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
+    /// is disabled.
+    unsigned getOperandColumn(int operand) const;
+
     /// PadToColumn - This gets called every time a tab is emitted.  If
     /// column padding is turned on, we replace the tab with the
     /// appropriate amount of padding.  If not, we replace the tab with a
index e24302b84efd8a812e934b79bb1dafdd6c17f217..b5c1796e393fbfc68873076a592ebfea4422abea 100644 (file)
@@ -361,8 +361,11 @@ namespace llvm {
     const char *getCommentString() const {
       return CommentString;
     }
-    unsigned getOperandColumn(int operand) const {
-      return FirstOperandColumn + (MaxOperandLength+1)*(operand-1);
+    unsigned getFirstOperandColumn() const {
+      return FirstOperandColumn;
+    }
+    unsigned getMaxOperandLength() const {
+      return MaxOperandLength;
     }
     const char *getGlobalPrefix() const {
       return GlobalPrefix;
index 3102bdae017c1df0a64e7504b085e9156d5e7477..ec62822e627d0dfde9da81cd00f657b33310ad92 100644 (file)
@@ -782,6 +782,20 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
     }
   O << '\n';
 }
+
+/// getOperandColumn - Return the output column number (zero-based)
+/// for operand % "operand."  If TargetAsmInfo has FirstOperandColumn
+/// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
+/// is disabled.
+unsigned AsmPrinter::getOperandColumn(int operand) const {
+  if (TAI->getFirstOperandColumn() > 0 && TAI->getMaxOperandLength() > 0) {
+    return TAI->getFirstOperandColumn()
+      + (TAI->getMaxOperandLength()+1)*(operand-1);
+  }
+  else {
+    return 0;
+  }
+}
     
 /// PadToColumn - This gets called every time a tab is emitted.  If
 /// column padding is turned on, we replace the tab with the
@@ -789,8 +803,8 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
 /// space, except for the first operand so that initial operands are
 /// always lined up by tabs.
 void AsmPrinter::PadToColumn(unsigned Operand) const {
-  if (TAI->getOperandColumn(Operand) > 0) {
-    O.PadToColumn(TAI->getOperandColumn(Operand), 1);
+  if (getOperandColumn(Operand) > 0) {
+    O.PadToColumn(getOperandColumn(Operand), 1);
   }
   else {
     if (Operand == 1) {
index 5f1d32576815fd30690004ad7465760815ede27b..de4ec226fc1d15b1ecddbaaa139339910e5efbc2 100644 (file)
@@ -148,8 +148,6 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
 
     // Emit a constant string fragment.
 
-    // TODO: Recognize an operand separator to determine when to pad
-    // to the next operator.
     if (DollarPos != LastEmitted) {
       if (CurVariant == Variant || CurVariant == ~0U) {
         for (; LastEmitted != DollarPos; ++LastEmitted)
@@ -727,30 +725,10 @@ void AsmWriterEmitter::run(raw_ostream &O) {
 
   O << "  // Emit the opcode for the instruction.\n"
     << "  unsigned Bits = OpInfo[MI->getOpcode()];\n"
-    << "  if (Bits == 0) return false;\n\n";
-  
-  O << "  unsigned OperandColumn = 1;\n\n"
-    << "  if (TAI->getOperandColumn(1) > 0) {\n"
-    << "    // Don't emit trailing whitespace, let the column padding do it.  This\n"
-    << "    // guarantees that a stray long opcode + tab won't upset the alignment.\n"
-    << "    // We need to handle this special case here because sometimes the initial\n"
-    << "    // mnemonic string includes a tab or space and sometimes it doesn't.\n"
-    << "    unsigned OpLength = std::strlen(AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "));\n"
-    << "    if (OpLength > 0 &&\n"
-    << "        ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
-    << "         (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t')) {\n"
-    << "      do {\n"
-    << "        --OpLength;\n"
-    << "      } while ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
-    << "               (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t');\n"
-    << "      for (unsigned Idx = 0; Idx < OpLength; ++Idx)\n"
-    << "        O << (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[Idx];\n"
-    << "      O.PadToColumn(TAI->getOperandColumn(OperandColumn++), 1);\n"
-    << "    }\n"
-    << "  } else {\n"
-    << "    O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n"
-    << "  }\n\n";
-  
+    << "  if (Bits == 0) return false;\n"
+    << "  O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n\n";
+
+  O << "  unsigned OperandColumn = 1;\n\n";
 
   // Output the table driven operand information.
   BitsLeft = 32-AsmStrBits;