diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-08-27 00:51:57 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-27 00:51:57 +0000 |
commit | 4a0abd80f18f9c2a10bf5b14cd6731d51972a426 (patch) | |
tree | aa5e672bdfb25a08c7310a64502a34a753511554 /lib/MC | |
parent | 81e400092f55c2eba157172bfc0dd0df8317638d (diff) | |
download | external_llvm-4a0abd80f18f9c2a10bf5b14cd6731d51972a426.zip external_llvm-4a0abd80f18f9c2a10bf5b14cd6731d51972a426.tar.gz external_llvm-4a0abd80f18f9c2a10bf5b14cd6731d51972a426.tar.bz2 |
Sketch TargetRegistry support for MCCodeEmitter abstract interface.
- Of course, nothing actually can provide this interface yet.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80188 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 76d6ee6..9ea9b43 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -8,7 +8,9 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/MCStreamer.h" +#include "llvm/ADT/SmallString.h" #include "llvm/CodeGen/AsmPrinter.h" +#include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCSectionMachO.h" @@ -17,6 +19,7 @@ #include "llvm/MC/MCAsmInfo.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -26,10 +29,12 @@ class MCAsmStreamer : public MCStreamer { raw_ostream &OS; const MCAsmInfo &MAI; AsmPrinter *Printer; + MCCodeEmitter *Emitter; public: MCAsmStreamer(MCContext &Context, raw_ostream &_OS, const MCAsmInfo &tai, - AsmPrinter *_AsmPrinter) - : MCStreamer(Context), OS(_OS), MAI(tai), Printer(_AsmPrinter) {} + AsmPrinter *_Printer, MCCodeEmitter *_Emitter) + : MCStreamer(Context), OS(_OS), MAI(tai), Printer(_Printer), + Emitter(_Emitter) {} ~MCAsmStreamer() {} /// @name MCStreamer Interface @@ -290,6 +295,23 @@ static raw_ostream &operator<<(raw_ostream &OS, const MCOperand &Op) { void MCAsmStreamer::EmitInstruction(const MCInst &Inst) { assert(CurSection && "Cannot emit contents before setting section!"); + // Show the encoding if we have a code emitter. + if (Emitter) { + SmallString<256> Code; + raw_svector_ostream VecOS(Code); + Emitter->EncodeInstruction(Inst, VecOS); + VecOS.flush(); + + OS.indent(20); + OS << " # encoding: ["; + for (unsigned i = 0, e = Code.size(); i != e; ++i) { + if (i + 1 != e) + OS << ','; + OS << format("%#04x", Code[i]); + } + OS << "]\n"; + } + // If we have an AsmPrinter, use that to print. if (Printer) { Printer->printMCInst(&Inst); @@ -314,6 +336,7 @@ void MCAsmStreamer::Finish() { } MCStreamer *llvm::createAsmStreamer(MCContext &Context, raw_ostream &OS, - const MCAsmInfo &MAI, AsmPrinter *AP) { - return new MCAsmStreamer(Context, OS, MAI, AP); + const MCAsmInfo &MAI, AsmPrinter *AP, + MCCodeEmitter *CE) { + return new MCAsmStreamer(Context, OS, MAI, AP, CE); } |