Add ability for MCInstPrinters to add comments for instructions.
authorChris Lattner <sabre@nondot.org>
Wed, 10 Feb 2010 00:10:18 +0000 (00:10 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 10 Feb 2010 00:10:18 +0000 (00:10 +0000)
Enhance the x86 backend to show the hex values of immediates in
comments when they are large.  For example:

        movl    $1072693248, 4(%esp)    ## imm = 0x3FF00000

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

include/llvm/MC/MCFixup.h
include/llvm/MC/MCInstPrinter.h
lib/MC/MCAsmStreamer.cpp
lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp

index da8e92efe13bdfe3ed69366d0871c2db522cd25c..3c2edfbf3e385e5864ed7beb4ea0f6508d3c40dd 100644 (file)
@@ -16,7 +16,7 @@ namespace llvm {
 
 // Private constants, do not use.
 //
-// This is currently layed out so that the MCFixup fields can be efficiently
+// This is currently laid out so that the MCFixup fields can be efficiently
 // accessed, while keeping the offset field large enought that the assembler
 // backend can reasonably use the MCFixup representation for an entire fragment
 // (splitting any overly large fragments).
index d62a9dae7c540e838af0a7d980f830700d5ca9b4..882951863283808cad609a5abe6457a3067b2df6 100644 (file)
@@ -20,12 +20,22 @@ class MCAsmInfo;
 /// that converts an MCInst to valid target assembly syntax.
 class MCInstPrinter {
 protected:
+  /// O - The main stream to emit instruction text to.
   raw_ostream &O;
+  
+  /// CommentStream - a stream that comments can be emitted to if desired.
+  /// Each comment must end with a newline.  This will be null if verbose
+  /// assembly emission is disable.
+  raw_ostream *CommentStream;
   const MCAsmInfo &MAI;
 public:
-  MCInstPrinter(raw_ostream &o, const MCAsmInfo &mai) : O(o), MAI(mai) {}
+  MCInstPrinter(raw_ostream &o, const MCAsmInfo &mai)
+    : O(o), CommentStream(0), MAI(mai) {}
   
   virtual ~MCInstPrinter();
+
+  /// setCommentStream - Specify a stream to emit comments to.
+  void setCommentStream(raw_ostream &OS) { CommentStream = &OS; }
   
   /// printInst - Print the specified MCInst to the current raw_ostream.
   ///
index 0abd485ac1873af709fd6fd334aba35bf723646b..b63427ac187c502f4f60d53b208c3688ceedd64a 100644 (file)
@@ -48,7 +48,10 @@ public:
     : MCStreamer(Context), OS(os), MAI(mai), InstPrinter(printer),
       Emitter(emitter), CommentStream(CommentToEmit),
       IsLittleEndian(isLittleEndian), IsVerboseAsm(isVerboseAsm),
-      ShowFixups(showFixups), ShowInst(showInst) {}
+      ShowFixups(showFixups), ShowInst(showInst) {
+    if (InstPrinter && IsVerboseAsm)
+      InstPrinter->setCommentStream(CommentStream);
+  }
   ~MCAsmStreamer() {}
 
   bool isLittleEndian() const { return IsLittleEndian; }
index 81b0e8ffb790d374ddd936a0b3da2100e2326fed..38ccbf9d501efc942400b3098a69da7c9a1f8e97 100644 (file)
@@ -18,6 +18,7 @@
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/Format.h"
 #include "llvm/Support/FormattedStream.h"
 #include "X86GenInstrNames.inc"
 using namespace llvm;
@@ -65,6 +66,10 @@ void X86ATTInstPrinter::printOperand(const MCInst *MI, unsigned OpNo) {
     O << '%' << getRegisterName(Op.getReg());
   } else if (Op.isImm()) {
     O << '$' << Op.getImm();
+    
+    if (CommentStream && (Op.getImm() > 255 || Op.getImm() < -256))
+      *CommentStream << format("imm = 0x%X\n", Op.getImm());
+    
   } else {
     assert(Op.isExpr() && "unknown operand kind in printOperand");
     O << '$' << *Op.getExpr();