diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-10 00:10:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-10 00:10:18 +0000 |
commit | 482bf69bfe033b5730f316d92d7503d4a99bd6b9 (patch) | |
tree | c6a5d6f11cc29dcea5ef56aa62268002bf718506 | |
parent | 509be1fe5ec243bfe9553bf2abaa53e239b34d69 (diff) | |
download | bcm5719-llvm-482bf69bfe033b5730f316d92d7503d4a99bd6b9.tar.gz bcm5719-llvm-482bf69bfe033b5730f316d92d7503d4a99bd6b9.zip |
Add ability for MCInstPrinters to add comments for instructions.
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
llvm-svn: 95728
-rw-r--r-- | llvm/include/llvm/MC/MCFixup.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCInstPrinter.h | 12 | ||||
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp | 5 |
4 files changed, 21 insertions, 3 deletions
diff --git a/llvm/include/llvm/MC/MCFixup.h b/llvm/include/llvm/MC/MCFixup.h index da8e92efe13..3c2edfbf3e3 100644 --- a/llvm/include/llvm/MC/MCFixup.h +++ b/llvm/include/llvm/MC/MCFixup.h @@ -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). diff --git a/llvm/include/llvm/MC/MCInstPrinter.h b/llvm/include/llvm/MC/MCInstPrinter.h index d62a9dae7c5..88295186328 100644 --- a/llvm/include/llvm/MC/MCInstPrinter.h +++ b/llvm/include/llvm/MC/MCInstPrinter.h @@ -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. /// diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 0abd485ac18..b63427ac187 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -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; } diff --git a/llvm/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp b/llvm/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp index 81b0e8ffb79..38ccbf9d501 100644 --- a/llvm/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp +++ b/llvm/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp @@ -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(); |