add a new MCInstPrinter::getOpcodeName interface, when it is
authorChris Lattner <sabre@nondot.org>
Thu, 11 Feb 2010 22:39:10 +0000 (22:39 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 11 Feb 2010 22:39:10 +0000 (22:39 +0000)
implemented, llvm-mc --show-inst now uses it to print the
instruction opcode as well as the number.

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

include/llvm/MC/MCInstPrinter.h
lib/MC/MCAsmStreamer.cpp
lib/MC/MCInstPrinter.cpp
lib/Target/X86/X86MCCodeEmitter.cpp

index 882951863283808cad609a5abe6457a3067b2df6..d2ddc5bb42b2460933e7ec42bfdd2f54fa435e71 100644 (file)
@@ -14,8 +14,8 @@ namespace llvm {
 class MCInst;
 class raw_ostream;
 class MCAsmInfo;
+class StringRef;
 
-  
 /// MCInstPrinter - This is an instance of a target assembly language printer
 /// that converts an MCInst to valid target assembly syntax.
 class MCInstPrinter {
@@ -40,6 +40,10 @@ public:
   /// printInst - Print the specified MCInst to the current raw_ostream.
   ///
   virtual void printInst(const MCInst *MI) = 0;
+  
+  /// getOpcodeName - Return the name of the specified opcode enum (e.g.
+  /// "MOV32ri") or empty if we can't resolve it.
+  virtual StringRef getOpcodeName(unsigned Opcode) const;
 };
   
 } // namespace llvm
index 2a8f168f9318be84443e053e847123924a48012e..6add1b4abaab6fea03c125c105aeba7d5058e716 100644 (file)
@@ -617,6 +617,12 @@ void MCAsmStreamer::EmitInstruction(const MCInst &Inst) {
     raw_ostream &OS = GetCommentOS();
     OS << "<MCInst #" << Inst.getOpcode();
     
+    StringRef InstName;
+    if (InstPrinter)
+      InstName = InstPrinter->getOpcodeName(Inst.getOpcode());
+    if (!InstName.empty())
+      OS << ' ' << InstName;
+    
     for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) {
       OS << "\n  ";
       Inst.getOperand(i).print(OS, &MAI);
index e90c03c0cf42612dbe79aec4bf05b7c543391835..92a71541f5ad460f7589d107ee1b3d4b3eb57b44 100644 (file)
@@ -8,7 +8,14 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/MC/MCInstPrinter.h"
+#include "llvm/ADT/StringRef.h"
 using namespace llvm;
 
 MCInstPrinter::~MCInstPrinter() {
 }
+
+/// getOpcodeName - Return the name of the specified opcode enum (e.g.
+/// "MOV32ri") or empty if we can't resolve it.
+StringRef MCInstPrinter::getOpcodeName(unsigned Opcode) const {
+  return "";
+}
index 15510e844cb705c3520024bd1f05191a220c1d9e..5d745d24bdfb42ae014b65b0dbc7f0b4455a4a06 100644 (file)
@@ -282,11 +282,11 @@ void X86MCCodeEmitter::EmitMemModRMByte(const MCInst &MI, unsigned Op,
 /// size, and 3) use of X86-64 extended registers.
 static unsigned DetermineREXPrefix(const MCInst &MI, unsigned TSFlags,
                                    const TargetInstrDesc &Desc) {
-  unsigned REX = 0;
+  // Pseudo instructions shouldn't get here.
+  assert((TSFlags & X86II::FormMask) != X86II::Pseudo &&
+         "Can't encode pseudo instrs");
   
-  // Pseudo instructions do not need REX prefix byte.
-  if ((TSFlags & X86II::FormMask) == X86II::Pseudo)
-    return 0;
+  unsigned REX = 0;
   if (TSFlags & X86II::REX_W)
     REX |= 1 << 3;