aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-27 08:17:51 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-27 08:17:51 +0000
commit4fac74950a1ff08b995b366bfb84369c1507faef (patch)
tree1d54abb8b491c26bcb40f4562e20faa4f43f43f8 /lib/MC
parent7168a7dc6dd3b6a502372f34c2ed4ed91c85c090 (diff)
downloadexternal_llvm-4fac74950a1ff08b995b366bfb84369c1507faef.zip
external_llvm-4fac74950a1ff08b995b366bfb84369c1507faef.tar.gz
external_llvm-4fac74950a1ff08b995b366bfb84369c1507faef.tar.bz2
llvm-mc/Mach-O: Add MCCodeEmitter support, for encoding instructions.
- No relocations yet, of course. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80235 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCMachOStreamer.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp
index ef5a99f..f5887db 100644
--- a/lib/MC/MCMachOStreamer.cpp
+++ b/lib/MC/MCMachOStreamer.cpp
@@ -11,9 +11,12 @@
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
@@ -42,6 +45,8 @@ class MCMachOStreamer : public MCStreamer {
private:
MCAssembler Assembler;
+ MCCodeEmitter *Emitter;
+
MCSectionData *CurSectionData;
DenseMap<const MCSection*, MCSectionData*> SectionMap;
@@ -68,8 +73,9 @@ private:
}
public:
- MCMachOStreamer(MCContext &Context, raw_ostream &_OS)
- : MCStreamer(Context), Assembler(_OS), CurSectionData(0) {}
+ MCMachOStreamer(MCContext &Context, raw_ostream &_OS, MCCodeEmitter *_Emitter)
+ : MCStreamer(Context), Assembler(_OS), Emitter(_Emitter),
+ CurSectionData(0) {}
~MCMachOStreamer() {}
const MCValue &AddValueSymbols(const MCValue &Value) {
@@ -302,13 +308,26 @@ void MCMachOStreamer::EmitValueToOffset(const MCValue &Offset,
}
void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
- llvm_unreachable("FIXME: Not yet implemented!");
+ // Scan for values.
+ for (unsigned i = 0; i != Inst.getNumOperands(); ++i)
+ if (Inst.getOperand(i).isMCValue())
+ AddValueSymbols(Inst.getOperand(i).getMCValue());
+
+ if (!Emitter)
+ llvm_unreachable("no code emitter available!");
+
+ // FIXME: Relocations!
+ SmallString<256> Code;
+ raw_svector_ostream VecOS(Code);
+ Emitter->EncodeInstruction(Inst, VecOS);
+ EmitBytes(VecOS.str());
}
void MCMachOStreamer::Finish() {
Assembler.Finish();
}
-MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS) {
- return new MCMachOStreamer(Context, OS);
+MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS,
+ MCCodeEmitter *CE) {
+ return new MCMachOStreamer(Context, OS, CE);
}