aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-27 00:51:57 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-27 00:51:57 +0000
commit4a0abd80f18f9c2a10bf5b14cd6731d51972a426 (patch)
treeaa5e672bdfb25a08c7310a64502a34a753511554 /lib/MC
parent81e400092f55c2eba157172bfc0dd0df8317638d (diff)
downloadexternal_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.cpp31
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);
}