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
This commit is contained in:
Daniel Dunbar 2009-08-27 08:17:51 +00:00
parent 7168a7dc6d
commit 4fac74950a
3 changed files with 28 additions and 7 deletions

View File

@ -251,7 +251,8 @@ namespace llvm {
/// createMachOStream - Create a machine code streamer which will generative /// createMachOStream - Create a machine code streamer which will generative
/// Mach-O format object files. /// Mach-O format object files.
MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS); MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS,
MCCodeEmitter *CE = 0);
/// createELFStreamer - Create a machine code streamer which will generative /// createELFStreamer - Create a machine code streamer which will generative
/// ELF format object files. /// ELF format object files.

View File

@ -11,9 +11,12 @@
#include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h" #include "llvm/MC/MCContext.h"
#include "llvm/MC/MCCodeEmitter.h"
#include "llvm/MC/MCInst.h"
#include "llvm/MC/MCSection.h" #include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm; using namespace llvm;
namespace { namespace {
@ -42,6 +45,8 @@ class MCMachOStreamer : public MCStreamer {
private: private:
MCAssembler Assembler; MCAssembler Assembler;
MCCodeEmitter *Emitter;
MCSectionData *CurSectionData; MCSectionData *CurSectionData;
DenseMap<const MCSection*, MCSectionData*> SectionMap; DenseMap<const MCSection*, MCSectionData*> SectionMap;
@ -68,8 +73,9 @@ private:
} }
public: public:
MCMachOStreamer(MCContext &Context, raw_ostream &_OS) MCMachOStreamer(MCContext &Context, raw_ostream &_OS, MCCodeEmitter *_Emitter)
: MCStreamer(Context), Assembler(_OS), CurSectionData(0) {} : MCStreamer(Context), Assembler(_OS), Emitter(_Emitter),
CurSectionData(0) {}
~MCMachOStreamer() {} ~MCMachOStreamer() {}
const MCValue &AddValueSymbols(const MCValue &Value) { const MCValue &AddValueSymbols(const MCValue &Value) {
@ -302,13 +308,26 @@ void MCMachOStreamer::EmitValueToOffset(const MCValue &Offset,
} }
void MCMachOStreamer::EmitInstruction(const MCInst &Inst) { 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() { void MCMachOStreamer::Finish() {
Assembler.Finish(); Assembler.Finish();
} }
MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS) { MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS,
return new MCMachOStreamer(Context, OS); MCCodeEmitter *CE) {
return new MCMachOStreamer(Context, OS, CE);
} }

View File

@ -252,7 +252,8 @@ static int AssembleInput(const char *ProgName) {
Str.reset(createAsmStreamer(Ctx, *Out, *TAI, AP.get(), CE.get())); Str.reset(createAsmStreamer(Ctx, *Out, *TAI, AP.get(), CE.get()));
} else { } else {
assert(FileType == OFT_ObjectFile && "Invalid file type!"); assert(FileType == OFT_ObjectFile && "Invalid file type!");
Str.reset(createMachOStreamer(Ctx, *Out)); CE.reset(TheTarget->createCodeEmitter(*TM));
Str.reset(createMachOStreamer(Ctx, *Out, CE.get()));
} }
AsmParser Parser(SrcMgr, Ctx, *Str.get()); AsmParser Parser(SrcMgr, Ctx, *Str.get());