mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-24 21:05:23 +00:00
Add support for stored annotations to MCInst, and provide facilities for MC-based InstPrinters to print them out. Enhance the ARM and X86 InstPrinter's to do so in verbose mode.
llvm-svn: 139820
This commit is contained in:
parent
b36a98d18f
commit
84d4e5d0e2
@ -129,6 +129,7 @@ public:
|
|||||||
class MCInst {
|
class MCInst {
|
||||||
unsigned Opcode;
|
unsigned Opcode;
|
||||||
SmallVector<MCOperand, 8> Operands;
|
SmallVector<MCOperand, 8> Operands;
|
||||||
|
SmallVector<std::string, 1> Annotations;
|
||||||
public:
|
public:
|
||||||
MCInst() : Opcode(0) {}
|
MCInst() : Opcode(0) {}
|
||||||
|
|
||||||
@ -144,7 +145,15 @@ public:
|
|||||||
Operands.push_back(Op);
|
Operands.push_back(Op);
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() { Operands.clear(); }
|
void addAnnotation(const std::string &Annot) {
|
||||||
|
Annotations.push_back(Annot);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
Operands.clear();
|
||||||
|
Annotations.clear();
|
||||||
|
}
|
||||||
|
|
||||||
size_t size() { return Operands.size(); }
|
size_t size() { return Operands.size(); }
|
||||||
|
|
||||||
typedef SmallVector<MCOperand, 8>::iterator iterator;
|
typedef SmallVector<MCOperand, 8>::iterator iterator;
|
||||||
@ -154,6 +163,9 @@ public:
|
|||||||
return Operands.insert(I, Op);
|
return Operands.insert(I, Op);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t getNumAnnotations() const { return Annotations.size(); }
|
||||||
|
std::string getAnnotation(size_t i) const { return Annotations[i]; }
|
||||||
|
|
||||||
void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
|
void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
|
||||||
void dump() const;
|
void dump() const;
|
||||||
|
|
||||||
|
@ -41,6 +41,10 @@ public:
|
|||||||
///
|
///
|
||||||
virtual void printInst(const MCInst *MI, raw_ostream &OS) = 0;
|
virtual void printInst(const MCInst *MI, raw_ostream &OS) = 0;
|
||||||
|
|
||||||
|
/// printAnnotations - Print the annotation comments attached to specified
|
||||||
|
/// MCInst to the specified raw_ostream.
|
||||||
|
void printAnnotations(const MCInst *MI, raw_ostream &OS);
|
||||||
|
|
||||||
/// getOpcodeName - Return the name of the specified opcode enum (e.g.
|
/// getOpcodeName - Return the name of the specified opcode enum (e.g.
|
||||||
/// "MOV32ri") or empty if we can't resolve it.
|
/// "MOV32ri") or empty if we can't resolve it.
|
||||||
virtual StringRef getOpcodeName(unsigned Opcode) const;
|
virtual StringRef getOpcodeName(unsigned Opcode) const;
|
||||||
|
@ -41,6 +41,16 @@ void MCInst::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
|
|||||||
OS << " ";
|
OS << " ";
|
||||||
getOperand(i).print(OS, MAI);
|
getOperand(i).print(OS, MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getNumAnnotations()) {
|
||||||
|
OS << " # Annots: ";
|
||||||
|
for (unsigned i = 0, e = getNumAnnotations(); i != e; ++i) {
|
||||||
|
OS << " \"";
|
||||||
|
OS << getAnnotation(i);
|
||||||
|
OS << '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
OS << ">";
|
OS << ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +67,17 @@ void MCInst::dump_pretty(raw_ostream &OS, const MCAsmInfo *MAI,
|
|||||||
OS << Separator;
|
OS << Separator;
|
||||||
getOperand(i).print(OS, MAI);
|
getOperand(i).print(OS, MAI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getNumAnnotations()) {
|
||||||
|
OS << " # Annots: ";
|
||||||
|
for (unsigned i = 0, e = getNumAnnotations(); i != e; ++i) {
|
||||||
|
OS << Separator;
|
||||||
|
OS << '"';
|
||||||
|
OS << getAnnotation(i);
|
||||||
|
OS << '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
OS << ">";
|
OS << ">";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,10 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/MC/MCInstPrinter.h"
|
#include "llvm/MC/MCInstPrinter.h"
|
||||||
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
|
#include "llvm/MC/MCInst.h"
|
||||||
#include "llvm/ADT/StringRef.h"
|
#include "llvm/ADT/StringRef.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
MCInstPrinter::~MCInstPrinter() {
|
MCInstPrinter::~MCInstPrinter() {
|
||||||
@ -23,3 +26,9 @@ StringRef MCInstPrinter::getOpcodeName(unsigned Opcode) const {
|
|||||||
void MCInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
|
void MCInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const {
|
||||||
assert(0 && "Target should implement this");
|
assert(0 && "Target should implement this");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MCInstPrinter::printAnnotations(const MCInst *MI, raw_ostream &OS) {
|
||||||
|
for (unsigned i = 0, e = MI->getNumAnnotations(); i != e; ++i) {
|
||||||
|
OS << MI->getAnnotation(i) << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -71,6 +71,9 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
|
|
||||||
O << ", " << getRegisterName(MO2.getReg());
|
O << ", " << getRegisterName(MO2.getReg());
|
||||||
assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
|
assert(ARM_AM::getSORegOffset(MO3.getImm()) == 0);
|
||||||
|
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,10 +90,14 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
O << '\t' << getRegisterName(Dst.getReg())
|
O << '\t' << getRegisterName(Dst.getReg())
|
||||||
<< ", " << getRegisterName(MO1.getReg());
|
<< ", " << getRegisterName(MO1.getReg());
|
||||||
|
|
||||||
if (ARM_AM::getSORegShOp(MO2.getImm()) == ARM_AM::rrx)
|
if (ARM_AM::getSORegShOp(MO2.getImm()) == ARM_AM::rrx) {
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
O << ", #" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
|
O << ", #" << translateShiftImm(ARM_AM::getSORegOffset(MO2.getImm()));
|
||||||
|
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,6 +111,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
O << ".w";
|
O << ".w";
|
||||||
O << '\t';
|
O << '\t';
|
||||||
printRegisterList(MI, 4, O);
|
printRegisterList(MI, 4, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Opcode == ARM::STR_PRE_IMM && MI->getOperand(2).getReg() == ARM::SP &&
|
if (Opcode == ARM::STR_PRE_IMM && MI->getOperand(2).getReg() == ARM::SP &&
|
||||||
@ -111,6 +119,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
O << '\t' << "push";
|
O << '\t' << "push";
|
||||||
printPredicateOperand(MI, 4, O);
|
printPredicateOperand(MI, 4, O);
|
||||||
O << "\t{" << getRegisterName(MI->getOperand(1).getReg()) << "}";
|
O << "\t{" << getRegisterName(MI->getOperand(1).getReg()) << "}";
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,6 +132,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
O << ".w";
|
O << ".w";
|
||||||
O << '\t';
|
O << '\t';
|
||||||
printRegisterList(MI, 4, O);
|
printRegisterList(MI, 4, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Opcode == ARM::LDR_POST_IMM && MI->getOperand(2).getReg() == ARM::SP &&
|
if (Opcode == ARM::LDR_POST_IMM && MI->getOperand(2).getReg() == ARM::SP &&
|
||||||
@ -130,6 +140,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
O << '\t' << "pop";
|
O << '\t' << "pop";
|
||||||
printPredicateOperand(MI, 5, O);
|
printPredicateOperand(MI, 5, O);
|
||||||
O << "\t{" << getRegisterName(MI->getOperand(0).getReg()) << "}";
|
O << "\t{" << getRegisterName(MI->getOperand(0).getReg()) << "}";
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,6 +152,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
printPredicateOperand(MI, 2, O);
|
printPredicateOperand(MI, 2, O);
|
||||||
O << '\t';
|
O << '\t';
|
||||||
printRegisterList(MI, 4, O);
|
printRegisterList(MI, 4, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +163,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
printPredicateOperand(MI, 2, O);
|
printPredicateOperand(MI, 2, O);
|
||||||
O << '\t';
|
O << '\t';
|
||||||
printRegisterList(MI, 4, O);
|
printRegisterList(MI, 4, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,6 +182,7 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
if (Writeback) O << "!";
|
if (Writeback) O << "!";
|
||||||
O << ", ";
|
O << ", ";
|
||||||
printRegisterList(MI, 3, O);
|
printRegisterList(MI, 3, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,10 +191,12 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
|
|||||||
MI->getOperand(1).getReg() == ARM::R8) {
|
MI->getOperand(1).getReg() == ARM::R8) {
|
||||||
O << "\tnop";
|
O << "\tnop";
|
||||||
printPredicateOperand(MI, 2, O);
|
printPredicateOperand(MI, 2, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printInstruction(MI, O);
|
printInstruction(MI, O);
|
||||||
|
if (CommentStream) printAnnotations(MI, *CommentStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
|
void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
|
||||||
|
@ -45,9 +45,11 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, raw_ostream &OS) {
|
|||||||
printInstruction(MI, OS);
|
printInstruction(MI, OS);
|
||||||
|
|
||||||
// If verbose assembly is enabled, we can print some informative comments.
|
// If verbose assembly is enabled, we can print some informative comments.
|
||||||
if (CommentStream)
|
if (CommentStream) {
|
||||||
|
printAnnotations(MI, *CommentStream);
|
||||||
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StringRef X86ATTInstPrinter::getOpcodeName(unsigned Opcode) const {
|
StringRef X86ATTInstPrinter::getOpcodeName(unsigned Opcode) const {
|
||||||
return getInstructionName(Opcode);
|
return getInstructionName(Opcode);
|
||||||
|
@ -36,9 +36,11 @@ void X86IntelInstPrinter::printInst(const MCInst *MI, raw_ostream &OS) {
|
|||||||
printInstruction(MI, OS);
|
printInstruction(MI, OS);
|
||||||
|
|
||||||
// If verbose assembly is enabled, we can print some informative comments.
|
// If verbose assembly is enabled, we can print some informative comments.
|
||||||
if (CommentStream)
|
if (CommentStream) {
|
||||||
|
printAnnotations(MI, *CommentStream);
|
||||||
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
StringRef X86IntelInstPrinter::getOpcodeName(unsigned Opcode) const {
|
StringRef X86IntelInstPrinter::getOpcodeName(unsigned Opcode) const {
|
||||||
return getInstructionName(Opcode);
|
return getInstructionName(Opcode);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user