mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
llvm-mc: Add --show-inst option, for showing the MCInst inline with the assembly
output. llvm-svn: 95227
This commit is contained in:
parent
8f03e98627
commit
d997cd69cd
@ -269,11 +269,21 @@ namespace llvm {
|
||||
/// createAsmStreamer - Create a machine code streamer which will print out
|
||||
/// assembly for the native target, suitable for compiling with a native
|
||||
/// assembler.
|
||||
///
|
||||
/// \param InstPrint - If given, the instruction printer to use. If not given
|
||||
/// the MCInst representation will be printed.
|
||||
///
|
||||
/// \param CE - If given, a code emitter to use to show the instruction
|
||||
/// encoding inline with the assembly.
|
||||
///
|
||||
/// \param ShowInst - Whether to show the MCInst representation inline with
|
||||
/// the assembly.
|
||||
MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
|
||||
const MCAsmInfo &MAI, bool isLittleEndian,
|
||||
bool isVerboseAsm,
|
||||
MCInstPrinter *InstPrint = 0,
|
||||
MCCodeEmitter *CE = 0);
|
||||
MCCodeEmitter *CE = 0,
|
||||
bool ShowInst = false);
|
||||
|
||||
// FIXME: These two may end up getting rolled into a single
|
||||
// createObjectStreamer interface, which implements the assembler backend, and
|
||||
|
@ -29,20 +29,25 @@ namespace {
|
||||
class MCAsmStreamer : public MCStreamer {
|
||||
formatted_raw_ostream &OS;
|
||||
const MCAsmInfo &MAI;
|
||||
bool IsLittleEndian, IsVerboseAsm;
|
||||
MCInstPrinter *InstPrinter;
|
||||
MCCodeEmitter *Emitter;
|
||||
|
||||
SmallString<128> CommentToEmit;
|
||||
raw_svector_ostream CommentStream;
|
||||
|
||||
unsigned IsLittleEndian : 1;
|
||||
unsigned IsVerboseAsm : 1;
|
||||
unsigned ShowInst : 1;
|
||||
|
||||
public:
|
||||
MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
|
||||
const MCAsmInfo &mai,
|
||||
bool isLittleEndian, bool isVerboseAsm, MCInstPrinter *printer,
|
||||
MCCodeEmitter *emitter)
|
||||
: MCStreamer(Context), OS(os), MAI(mai), IsLittleEndian(isLittleEndian),
|
||||
IsVerboseAsm(isVerboseAsm), InstPrinter(printer), Emitter(emitter),
|
||||
CommentStream(CommentToEmit) {}
|
||||
MCCodeEmitter *emitter, bool showInst)
|
||||
: MCStreamer(Context), OS(os), MAI(mai), InstPrinter(printer),
|
||||
Emitter(emitter), CommentStream(CommentToEmit),
|
||||
IsLittleEndian(isLittleEndian), IsVerboseAsm(isVerboseAsm),
|
||||
ShowInst(showInst) {}
|
||||
~MCAsmStreamer() {}
|
||||
|
||||
bool isLittleEndian() const { return IsLittleEndian; }
|
||||
@ -527,13 +532,21 @@ void MCAsmStreamer::EmitDwarfFileDirective(unsigned FileNo, StringRef Filename){
|
||||
void MCAsmStreamer::EmitInstruction(const MCInst &Inst) {
|
||||
assert(CurSection && "Cannot emit contents before setting section!");
|
||||
|
||||
// Show the MCInst if enabled.
|
||||
if (ShowInst) {
|
||||
raw_ostream &OS = GetCommentOS();
|
||||
OS << "inst: ";
|
||||
Inst.print(OS, &MAI);
|
||||
OS << "\n";
|
||||
}
|
||||
|
||||
// Show the encoding in a comment if we have a code emitter.
|
||||
if (Emitter) {
|
||||
SmallString<256> Code;
|
||||
raw_svector_ostream VecOS(Code);
|
||||
Emitter->EncodeInstruction(Inst, VecOS);
|
||||
VecOS.flush();
|
||||
|
||||
|
||||
raw_ostream &OS = GetCommentOS();
|
||||
OS << "encoding: [";
|
||||
for (unsigned i = 0, e = Code.size(); i != e; ++i) {
|
||||
@ -543,29 +556,24 @@ void MCAsmStreamer::EmitInstruction(const MCInst &Inst) {
|
||||
}
|
||||
OS << "]\n";
|
||||
}
|
||||
|
||||
// If we have an AsmPrinter, use that to print.
|
||||
if (InstPrinter) {
|
||||
InstPrinter->printInst(&Inst);
|
||||
EmitEOL();
|
||||
return;
|
||||
}
|
||||
|
||||
// Otherwise fall back to a structural printing for now. Eventually we should
|
||||
// always have access to the target specific printer.
|
||||
Inst.print(OS, &MAI);
|
||||
// If we have an AsmPrinter, use that to print, otherwise dump the MCInst.
|
||||
if (InstPrinter)
|
||||
InstPrinter->printInst(&Inst);
|
||||
else
|
||||
Inst.print(OS, &MAI);
|
||||
EmitEOL();
|
||||
}
|
||||
|
||||
void MCAsmStreamer::Finish() {
|
||||
OS.flush();
|
||||
}
|
||||
|
||||
|
||||
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
|
||||
formatted_raw_ostream &OS,
|
||||
const MCAsmInfo &MAI, bool isLittleEndian,
|
||||
bool isVerboseAsm, MCInstPrinter *IP,
|
||||
MCCodeEmitter *CE) {
|
||||
MCCodeEmitter *CE, bool ShowInst) {
|
||||
return new MCAsmStreamer(Context, OS, MAI, isLittleEndian, isVerboseAsm,
|
||||
IP, CE);
|
||||
IP, CE, ShowInst);
|
||||
}
|
||||
|
@ -46,6 +46,9 @@ OutputFilename("o", cl::desc("Output filename"),
|
||||
static cl::opt<bool>
|
||||
ShowEncoding("show-encoding", cl::desc("Show instruction encodings"));
|
||||
|
||||
static cl::opt<bool>
|
||||
ShowInst("show-inst", cl::desc("Show internal instruction representation"));
|
||||
|
||||
static cl::opt<unsigned>
|
||||
OutputAsmVariant("output-asm-variant",
|
||||
cl::desc("Syntax variant to use for output printing"));
|
||||
@ -266,7 +269,8 @@ static int AssembleInput(const char *ProgName) {
|
||||
CE.reset(TheTarget->createCodeEmitter(*TM));
|
||||
Str.reset(createAsmStreamer(Ctx, *Out, *MAI,
|
||||
TM->getTargetData()->isLittleEndian(),
|
||||
/*asmverbose*/true, IP.get(), CE.get()));
|
||||
/*asmverbose*/true, IP.get(), CE.get(),
|
||||
ShowInst));
|
||||
} else {
|
||||
assert(FileType == OFT_ObjectFile && "Invalid file type!");
|
||||
CE.reset(TheTarget->createCodeEmitter(*TM));
|
||||
|
Loading…
Reference in New Issue
Block a user