Add infrastructure to allow post instruction printing action triggers.
authorDavid Greene <greened@obbligato.org>
Mon, 13 Jul 2009 20:25:48 +0000 (20:25 +0000)
committerDavid Greene <greened@obbligato.org>
Mon, 13 Jul 2009 20:25:48 +0000 (20:25 +0000)
We'll eventually use this to print comments in asm files and do other
fun things.

This adds interfaces to the AsmPrinter and changes TableGen to invoke
the postInstructionAction when appropriate.  It also add parameters to
TargetAsmInfo to control comment layout.

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

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

index ef609e4efefe1a79468beabeee095c15f8ed9dca..0129711346cfebf79b09c9c5b20f8ce7891fd396 100644 (file)
@@ -34,6 +34,7 @@ namespace llvm {
   class MachineConstantPoolEntry;
   class MachineConstantPoolValue;
   class MachineModuleInfo;
+  class MCInst;
   class DwarfWriter;
   class Mangler;
   class Section;
@@ -64,7 +65,7 @@ namespace llvm {
     
     /// DW - If available, this is a pointer to the current dwarf writer.
     DwarfWriter *DW;
-    
+
   public:
     /// Output stream on which we're printing assembly code.
     ///
@@ -332,6 +333,17 @@ namespace llvm {
     /// debug tables.
     void printDeclare(const MachineInstr *MI) const;
 
+    /// postInstructionAction - Handling printing of items after the
+    /// instruction iteself has been printed (e.g. comments)
+    void postInstructionAction(const MachineInstr &MI) const {
+      postInstructionActionImpl(MI);
+      EmitComments(MI);
+    }
+    void postInstructionAction(const MCInst &MI) const {
+      postInstructionActionImpl(MI);
+      EmitComments(MI);
+    }
+    
   protected:
     /// EmitZeros - Emit a block of zeros.
     ///
@@ -396,7 +408,7 @@ namespace llvm {
 
     /// printOffset - This is just convenient handler for printing offsets.
     void printOffset(int64_t Offset) const;
-
   private:
     const GlobalValue *findGlobalValue(const Constant* CV);
     void EmitLLVMUsedList(Constant *List);
@@ -408,6 +420,14 @@ namespace llvm {
     void EmitGlobalConstantFP(const ConstantFP* CFP, unsigned AddrSpace);
     void EmitGlobalConstantLargeInt(const ConstantInt* CI, unsigned AddrSpace);
     GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C);
+
+    /// EmitComments - Pretty-print comments for instructions
+    void EmitComments(const MachineInstr &MI) const;
+    /// EmitComments - Pretty-print comments for instructions
+    void EmitComments(const MCInst &MI) const;
+
+    virtual void postInstructionActionImpl(const MachineInstr &MI) const {}
+    virtual void postInstructionActionImpl(const MCInst &MI) const {}
   };
 }
 
index 670b0996cc3508caf139200604988da012072ffc..d031d746578df93776f4c7f086d5cb5ab6766575 100644 (file)
@@ -214,6 +214,10 @@ namespace llvm {
     /// measure inline asm instructions.
     char SeparatorChar;                   // Defaults to ';'
 
+    /// CommentColumn - This indicates the comment num (zero-based) at
+    /// which asm comments should be printed.
+    unsigned CommentColumn;               // Defaults to 60
+
     /// CommentString - This indicates the comment character used by the
     /// assembler.
     const char *CommentString;            // Defaults to "#"
@@ -693,6 +697,9 @@ namespace llvm {
     char getSeparatorChar() const {
       return SeparatorChar;
     }
+    const unsigned getCommentColumn() const {
+      return CommentColumn;
+    }
     const char *getCommentString() const {
       return CommentString;
     }
index ea27490fa14daf31063ee039c702242b0c41c97f..c1cb97ccf721a9c784c16cd408ff07397c5bccc9 100644 (file)
@@ -24,6 +24,7 @@
 #include "llvm/Analysis/DebugInfo.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Target/TargetAsmInfo.h"
@@ -1748,3 +1749,15 @@ GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) {
   cerr << "no GCMetadataPrinter registered for GC: " << Name << "\n";
   llvm_unreachable();
 }
+
+/// EmitComments - Pretty-print comments for instructions
+void AsmPrinter::EmitComments(const MachineInstr &MI) const
+{
+  // No comments in MachineInstr yet
+}
+
+/// EmitComments - Pretty-print comments for instructions
+void AsmPrinter::EmitComments(const MCInst &MI) const
+{
+  // No comments in MCInst yet
+}
index 4fbe1ae55e42db0018cdb11b2d4b2f82acc50739..3df09bc60a5db984787770bdd08938ff682c80c3 100644 (file)
@@ -43,6 +43,7 @@ TargetAsmInfo::TargetAsmInfo(const TargetMachine &tm)
   MaxInstLength = 4;
   PCSymbol = "$";
   SeparatorChar = ';';
+  CommentColumn = 60;
   CommentString = "#";
   GlobalPrefix = "";
   PrivateGlobalPrefix = ".";
index f34feef0c28d64df01f2abf77c1625570f29e0c3..92ad96ec948992d073c43cc98a25518823f1d1fa 100644 (file)
@@ -259,8 +259,6 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
       LastEmitted = VarEnd;
     }
   }
-
-  AddLiteralString("\\n");
 }
 
 /// MatchesAllButOneOp - If this instruction is exactly identical to the
@@ -357,7 +355,6 @@ static void EmitInstructions(std::vector<AsmWriterInst> &Insts,
     }
     O << "\n";
   }
-
   O << "    break;\n";
 }
 
@@ -385,8 +382,12 @@ FindUniqueOperandCommands(std::vector<std::string> &UniqueOperandCommands,
     Command = "    " + Inst->Operands[0].getCode() + "\n";
 
     // If this is the last operand, emit a return.
-    if (Inst->Operands.size() == 1)
+    if (Inst->Operands.size() == 1) {
+      Command += "    postInstructionAction(*MI);\n";
+      // Print the final newline
+      Command += "    O << \"\\n\";\n";
       Command += "    return true;\n";
+    }
     
     // Check to see if we already have 'Command' in UniqueOperandCommands.
     // If not, add it.
@@ -452,8 +453,12 @@ FindUniqueOperandCommands(std::vector<std::string> &UniqueOperandCommands,
       std::string Command = "    " + FirstInst->Operands[Op].getCode() + "\n";
       
       // If this is the last operand, emit a return after the code.
-      if (FirstInst->Operands.size() == Op+1)
+      if (FirstInst->Operands.size() == Op+1) {
+        Command += "    postInstructionAction(*MI);\n";
+        // Print the final newline
+        Command += "    O << \"\\n\";\n";
         Command += "    return true;\n";
+      }
       
       UniqueOperandCommands[CommandIdx] += Command;
       InstOpsUsed[CommandIdx]++;
@@ -564,10 +569,11 @@ void AsmWriterEmitter::run(raw_ostream &O) {
     // For the first operand check, add a default value for instructions with
     // just opcode strings to use.
     if (isFirst) {
-      UniqueOperandCommands.push_back("    return true;\n");
+      // Do the post instruction processing and print the final newline
+      UniqueOperandCommands.push_back("    postInstructionAction(*MI);\n    O << \"\\n\";\n    return true;\n");
       isFirst = false;
     }
-    
+
     std::vector<unsigned> InstIdxs;
     std::vector<unsigned> NumInstOpsHandled;
     FindUniqueOperandCommands(UniqueOperandCommands, InstIdxs,
@@ -739,6 +745,9 @@ void AsmWriterEmitter::run(raw_ostream &O) {
       EmitInstructions(Instructions, O);
 
     O << "  }\n";
+    O << "  postInstructionAction(*MI);\n";
+    // Print the final newline
+    O << "  O << \"\\n\";\n";
     O << "  return true;\n";
   }