Construct the MCStreamer before constructing the MCTargetStreamer.

This has a few advantages:
* Only targets that use a MCTargetStreamer have to worry about it.
* There is never a MCTargetStreamer without a MCStreamer, so we can use a
  reference.
* A MCTargetStreamer can talk to the MCStreamer in its constructor.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200129 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-01-26 06:06:37 +00:00
parent 4d130cbd77
commit aa75693ea4
26 changed files with 137 additions and 118 deletions

View File

@@ -29,15 +29,14 @@ class raw_ostream;
class MCELFStreamer : public MCObjectStreamer { class MCELFStreamer : public MCObjectStreamer {
public: public:
MCELFStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *Emitter) MCCodeEmitter *Emitter)
: MCObjectStreamer(Context, TargetStreamer, TAB, OS, Emitter), : MCObjectStreamer(Context, TAB, OS, Emitter),
SeenIdent(false) {} SeenIdent(false) {}
MCELFStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *Emitter, MCCodeEmitter *Emitter, MCAssembler *Assembler)
MCAssembler *Assembler) : MCObjectStreamer(Context, TAB, OS, Emitter, Assembler),
: MCObjectStreamer(Context, TargetStreamer, TAB, OS, Emitter, Assembler),
SeenIdent(false) {} SeenIdent(false) {}
virtual ~MCELFStreamer(); virtual ~MCELFStreamer();

View File

@@ -40,12 +40,10 @@ class MCObjectStreamer : public MCStreamer {
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame); virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame);
protected: protected:
MCObjectStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &_OS,
MCAsmBackend &TAB, raw_ostream &_OS,
MCCodeEmitter *_Emitter); MCCodeEmitter *_Emitter);
MCObjectStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &_OS,
MCAsmBackend &TAB, raw_ostream &_OS, MCCodeEmitter *_Emitter, MCCodeEmitter *_Emitter, MCAssembler *_Assembler);
MCAssembler *_Assembler);
~MCObjectStreamer(); ~MCObjectStreamer();
public: public:

View File

@@ -67,11 +67,11 @@ typedef std::pair<const MCSection *, const MCExpr *> MCSectionSubPair;
/// be treated differently. Callers should always talk to a FooTargetStreamer. /// be treated differently. Callers should always talk to a FooTargetStreamer.
class MCTargetStreamer { class MCTargetStreamer {
protected: protected:
MCStreamer *Streamer; MCStreamer &Streamer;
public: public:
MCTargetStreamer(MCStreamer &S);
virtual ~MCTargetStreamer(); virtual ~MCTargetStreamer();
void setStreamer(MCStreamer *S) { Streamer = S; }
// Allow a target to add behavior to the EmitLabel of MCStreamer. // Allow a target to add behavior to the EmitLabel of MCStreamer.
virtual void emitLabel(MCSymbol *Symbol); virtual void emitLabel(MCSymbol *Symbol);
@@ -82,6 +82,8 @@ public:
class ARMTargetStreamer : public MCTargetStreamer { class ARMTargetStreamer : public MCTargetStreamer {
virtual void anchor(); virtual void anchor();
public: public:
ARMTargetStreamer(MCStreamer &S);
virtual void emitFnStart() = 0; virtual void emitFnStart() = 0;
virtual void emitFnEnd() = 0; virtual void emitFnEnd() = 0;
virtual void emitCantUnwind() = 0; virtual void emitCantUnwind() = 0;
@@ -147,7 +149,7 @@ class MCStreamer {
SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack;
protected: protected:
MCStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer); MCStreamer(MCContext &Ctx);
const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A, const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A,
const MCSymbol *B); const MCSymbol *B);
@@ -170,6 +172,10 @@ protected:
public: public:
virtual ~MCStreamer(); virtual ~MCStreamer();
void setTargetStreamer(MCTargetStreamer *TS) {
TargetStreamer.reset(TS);
}
/// State management /// State management
/// ///
virtual void reset(); virtual void reset();
@@ -708,9 +714,9 @@ MCStreamer *createNullStreamer(MCContext &Ctx);
/// ///
/// \param ShowInst - Whether to show the MCInst representation inline with /// \param ShowInst - Whether to show the MCInst representation inline with
/// the assembly. /// the assembly.
MCStreamer *createAsmStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
formatted_raw_ostream &OS, bool isVerboseAsm, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useLoc, bool useCFI, bool useDwarfDirectory, bool useDwarfDirectory,
MCInstPrinter *InstPrint = 0, MCInstPrinter *InstPrint = 0,
MCCodeEmitter *CE = 0, MCAsmBackend *TAB = 0, MCCodeEmitter *CE = 0, MCAsmBackend *TAB = 0,
bool ShowInst = false); bool ShowInst = false);
@@ -733,9 +739,8 @@ MCStreamer *createWinCOFFStreamer(MCContext &Ctx, MCAsmBackend &TAB,
/// createELFStreamer - Create a machine code streamer which will generate /// createELFStreamer - Create a machine code streamer which will generate
/// ELF format object files. /// ELF format object files.
MCStreamer *createELFStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer, MCStreamer *createELFStreamer(MCContext &Ctx, MCAsmBackend &TAB,
MCAsmBackend &TAB, raw_ostream &OS, raw_ostream &OS, MCCodeEmitter *CE, bool RelaxAll,
MCCodeEmitter *CE, bool RelaxAll,
bool NoExecStack); bool NoExecStack);
/// createPureStreamer - Create a machine code streamer which will generate /// createPureStreamer - Create a machine code streamer which will generate

View File

@@ -46,13 +46,11 @@ namespace llvm {
class MCRelocationInfo; class MCRelocationInfo;
class MCTargetAsmParser; class MCTargetAsmParser;
class TargetMachine; class TargetMachine;
class MCTargetStreamer;
class TargetOptions; class TargetOptions;
class raw_ostream; class raw_ostream;
class formatted_raw_ostream; class formatted_raw_ostream;
MCStreamer *createAsmStreamer(MCContext &Ctx, MCStreamer *createAsmStreamer(MCContext &Ctx,
MCTargetStreamer *TargetStreamer,
formatted_raw_ostream &OS, bool isVerboseAsm, formatted_raw_ostream &OS, bool isVerboseAsm,
bool useLoc, bool useCFI, bool useLoc, bool useCFI,
bool useDwarfDirectory, bool useDwarfDirectory,
@@ -443,7 +441,7 @@ namespace llvm {
return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI, return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI,
useDwarfDirectory, InstPrint, CE, TAB, useDwarfDirectory, InstPrint, CE, TAB,
ShowInst); ShowInst);
return llvm::createAsmStreamer(Ctx, 0, OS, isVerboseAsm, useLoc, useCFI, return llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
useDwarfDirectory, InstPrint, CE, TAB, useDwarfDirectory, InstPrint, CE, TAB,
ShowInst); ShowInst);
} }

View File

@@ -623,7 +623,7 @@ namespace {
return Symbols.end(); return Symbols.end();
} }
RecordStreamer(MCContext &Context) : MCStreamer(Context, 0) {} RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
virtual void EmitInstruction(const MCInst &Inst) { virtual void EmitInstruction(const MCInst &Inst) {
// Scan for values. // Scan for values.

View File

@@ -66,11 +66,11 @@ private:
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame); virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame);
public: public:
MCAsmStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
formatted_raw_ostream &os, bool isVerboseAsm, bool useLoc, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useCFI, bool useDwarfDirectory, MCInstPrinter *printer, bool useDwarfDirectory, MCInstPrinter *printer,
MCCodeEmitter *emitter, MCAsmBackend *asmbackend, bool showInst) MCCodeEmitter *emitter, MCAsmBackend *asmbackend, bool showInst)
: MCStreamer(Context, TargetStreamer), OS(os), MAI(Context.getAsmInfo()), : MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),
InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend), InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend),
CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm), CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm),
ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI), ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI),
@@ -1381,12 +1381,11 @@ void MCAsmStreamer::FinishImpl() {
} }
MCStreamer *llvm::createAsmStreamer(MCContext &Context, MCStreamer *llvm::createAsmStreamer(MCContext &Context,
MCTargetStreamer *TargetStreamer,
formatted_raw_ostream &OS, formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc, bool useCFI, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useDwarfDirectory, MCInstPrinter *IP, bool useDwarfDirectory, MCInstPrinter *IP,
MCCodeEmitter *CE, MCAsmBackend *MAB, MCCodeEmitter *CE, MCAsmBackend *MAB,
bool ShowInst) { bool ShowInst) {
return new MCAsmStreamer(Context, TargetStreamer, OS, isVerboseAsm, useLoc, return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc,
useCFI, useDwarfDirectory, IP, CE, MAB, ShowInst); useCFI, useDwarfDirectory, IP, CE, MAB, ShowInst);
} }

View File

@@ -543,12 +543,10 @@ void MCELFStreamer::FinishImpl() {
this->MCObjectStreamer::FinishImpl(); this->MCObjectStreamer::FinishImpl();
} }
MCStreamer *llvm::createELFStreamer(MCContext &Context, MCStreamer *llvm::createELFStreamer(MCContext &Context, MCAsmBackend &MAB,
MCTargetStreamer *Streamer, raw_ostream &OS, MCCodeEmitter *CE,
MCAsmBackend &MAB, raw_ostream &OS, bool RelaxAll, bool NoExecStack) {
MCCodeEmitter *CE, bool RelaxAll, MCELFStreamer *S = new MCELFStreamer(Context, MAB, OS, CE);
bool NoExecStack) {
MCELFStreamer *S = new MCELFStreamer(Context, Streamer, MAB, OS, CE);
if (RelaxAll) if (RelaxAll)
S->getAssembler().setRelaxAll(true); S->getAssembler().setRelaxAll(true);
if (NoExecStack) if (NoExecStack)

View File

@@ -38,7 +38,7 @@ private:
public: public:
MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB, raw_ostream &OS, MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB, raw_ostream &OS,
MCCodeEmitter *Emitter) MCCodeEmitter *Emitter)
: MCObjectStreamer(Context, 0, MAB, OS, Emitter) {} : MCObjectStreamer(Context, MAB, OS, Emitter) {}
/// @name MCStreamer Interface /// @name MCStreamer Interface
/// @{ /// @{

View File

@@ -19,7 +19,7 @@ namespace {
class MCNullStreamer : public MCStreamer { class MCNullStreamer : public MCStreamer {
public: public:
MCNullStreamer(MCContext &Context) : MCStreamer(Context, 0) {} MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
/// @name MCStreamer Interface /// @name MCStreamer Interface
/// @{ /// @{

View File

@@ -22,22 +22,17 @@
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
using namespace llvm; using namespace llvm;
MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
MCTargetStreamer *TargetStreamer, raw_ostream &OS, MCCodeEmitter *Emitter_)
MCAsmBackend &TAB, raw_ostream &OS, : MCStreamer(Context),
MCCodeEmitter *Emitter_)
: MCStreamer(Context, TargetStreamer),
Assembler(new MCAssembler(Context, TAB, *Emitter_, Assembler(new MCAssembler(Context, TAB, *Emitter_,
*TAB.createObjectWriter(OS), OS)), *TAB.createObjectWriter(OS), OS)),
CurSectionData(0) {} CurSectionData(0) {}
MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
MCTargetStreamer *TargetStreamer, raw_ostream &OS, MCCodeEmitter *Emitter_,
MCAsmBackend &TAB, raw_ostream &OS,
MCCodeEmitter *Emitter_,
MCAssembler *_Assembler) MCAssembler *_Assembler)
: MCStreamer(Context, TargetStreamer), Assembler(_Assembler), : MCStreamer(Context), Assembler(_Assembler), CurSectionData(0) {}
CurSectionData(0) {}
MCObjectStreamer::~MCObjectStreamer() { MCObjectStreamer::~MCObjectStreamer() {
delete &Assembler->getBackend(); delete &Assembler->getBackend();

View File

@@ -29,7 +29,7 @@ private:
public: public:
MCPureStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, MCPureStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCCodeEmitter *Emitter) MCCodeEmitter *Emitter)
: MCObjectStreamer(Context, 0, TAB, OS, Emitter) {} : MCObjectStreamer(Context, TAB, OS, Emitter) {}
/// @name MCStreamer Interface /// @name MCStreamer Interface
/// @{ /// @{

View File

@@ -25,14 +25,17 @@ using namespace llvm;
// Pin the vtables to this file. // Pin the vtables to this file.
MCTargetStreamer::~MCTargetStreamer() {} MCTargetStreamer::~MCTargetStreamer() {}
MCTargetStreamer::MCTargetStreamer(MCStreamer &S) : Streamer(S) {
S.setTargetStreamer(this);
}
void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {} void MCTargetStreamer::emitLabel(MCSymbol *Symbol) {}
MCStreamer::MCStreamer(MCContext &Ctx, MCTargetStreamer *TargetStreamer) MCStreamer::MCStreamer(MCContext &Ctx)
: Context(Ctx), TargetStreamer(TargetStreamer), EmitEHFrame(true), : Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
EmitDebugFrame(false), CurrentW64UnwindInfo(0), LastSymbol(0) { CurrentW64UnwindInfo(0), LastSymbol(0) {
SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>()); SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
if (TargetStreamer)
TargetStreamer->setStreamer(this);
} }
MCStreamer::~MCStreamer() { MCStreamer::~MCStreamer() {

View File

@@ -99,7 +99,7 @@ private:
WinCOFFStreamer::WinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB, WinCOFFStreamer::WinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB,
MCCodeEmitter &CE, raw_ostream &OS) MCCodeEmitter &CE, raw_ostream &OS)
: MCObjectStreamer(Context, 0, MAB, OS, &CE), CurSymbol(NULL) {} : MCObjectStreamer(Context, MAB, OS, &CE), CurSymbol(NULL) {}
void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size, void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment, bool External) { unsigned ByteAlignment, bool External) {

View File

@@ -57,7 +57,7 @@ class AArch64ELFStreamer : public MCELFStreamer {
public: public:
AArch64ELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, AArch64ELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCCodeEmitter *Emitter) MCCodeEmitter *Emitter)
: MCELFStreamer(Context, 0, TAB, OS, Emitter), MappingSymbolCounter(0), : MCELFStreamer(Context, TAB, OS, Emitter), MappingSymbolCounter(0),
LastEMS(EMS_None) {} LastEMS(EMS_None) {}
~AArch64ELFStreamer() {} ~AArch64ELFStreamer() {}

View File

@@ -105,6 +105,7 @@ static unsigned GetArchDefaultCPUArch(unsigned ID) {
} }
void ARMTargetStreamer::anchor() {} void ARMTargetStreamer::anchor() {}
ARMTargetStreamer::ARMTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
namespace { namespace {
@@ -139,14 +140,16 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {
virtual void finishAttributeSection(); virtual void finishAttributeSection();
public: public:
ARMTargetAsmStreamer(formatted_raw_ostream &OS, MCInstPrinter &InstPrinter, ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS,
bool VerboseAsm); MCInstPrinter &InstPrinter, bool VerboseAsm);
}; };
ARMTargetAsmStreamer::ARMTargetAsmStreamer(formatted_raw_ostream &OS, ARMTargetAsmStreamer::ARMTargetAsmStreamer(MCStreamer &S,
formatted_raw_ostream &OS,
MCInstPrinter &InstPrinter, MCInstPrinter &InstPrinter,
bool VerboseAsm) bool VerboseAsm)
: OS(OS), InstPrinter(InstPrinter), IsVerboseAsm(VerboseAsm) {} : ARMTargetStreamer(S), OS(OS), InstPrinter(InstPrinter),
IsVerboseAsm(VerboseAsm) {}
void ARMTargetAsmStreamer::emitFnStart() { OS << "\t.fnstart\n"; } void ARMTargetAsmStreamer::emitFnStart() { OS << "\t.fnstart\n"; }
void ARMTargetAsmStreamer::emitFnEnd() { OS << "\t.fnend\n"; } void ARMTargetAsmStreamer::emitFnEnd() { OS << "\t.fnend\n"; }
void ARMTargetAsmStreamer::emitCantUnwind() { OS << "\t.cantunwind\n"; } void ARMTargetAsmStreamer::emitCantUnwind() { OS << "\t.cantunwind\n"; }
@@ -397,10 +400,9 @@ private:
size_t calculateContentSize() const; size_t calculateContentSize() const;
public: public:
ARMTargetELFStreamer() ARMTargetELFStreamer(MCStreamer &S)
: ARMTargetStreamer(), CurrentVendor("aeabi"), FPU(ARM::INVALID_FPU), : ARMTargetStreamer(S), CurrentVendor("aeabi"), FPU(ARM::INVALID_FPU),
Arch(ARM::INVALID_ARCH), AttributeSection(0) { Arch(ARM::INVALID_ARCH), AttributeSection(0) {}
}
}; };
/// Extend the generic ELFStreamer class so that it can emit mapping symbols at /// Extend the generic ELFStreamer class so that it can emit mapping symbols at
@@ -419,11 +421,10 @@ class ARMELFStreamer : public MCELFStreamer {
public: public:
friend class ARMTargetELFStreamer; friend class ARMTargetELFStreamer;
ARMELFStreamer(MCContext &Context, MCTargetStreamer *TargetStreamer, ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *Emitter, MCCodeEmitter *Emitter, bool IsThumb)
bool IsThumb) : MCELFStreamer(Context, TAB, OS, Emitter), IsThumb(IsThumb),
: MCELFStreamer(Context, TargetStreamer, TAB, OS, Emitter), MappingSymbolCounter(0), LastEMS(EMS_None) {
IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None) {
Reset(); Reset();
} }
@@ -627,8 +628,7 @@ private:
} // end anonymous namespace } // end anonymous namespace
ARMELFStreamer &ARMTargetELFStreamer::getStreamer() { ARMELFStreamer &ARMTargetELFStreamer::getStreamer() {
ARMELFStreamer *S = static_cast<ARMELFStreamer *>(Streamer); return static_cast<ARMELFStreamer &>(Streamer);
return *S;
} }
void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); } void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); }
@@ -1237,21 +1237,19 @@ MCStreamer *createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool useDwarfDirectory, bool useDwarfDirectory,
MCInstPrinter *InstPrint, MCCodeEmitter *CE, MCInstPrinter *InstPrint, MCCodeEmitter *CE,
MCAsmBackend *TAB, bool ShowInst) { MCAsmBackend *TAB, bool ShowInst) {
ARMTargetAsmStreamer *S = new ARMTargetAsmStreamer(OS, *InstPrint, MCStreamer *S =
isVerboseAsm); llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, new ARMTargetAsmStreamer(*S, OS, *InstPrint, isVerboseAsm);
useDwarfDirectory, InstPrint, CE, TAB, return S;
ShowInst);
} }
MCELFStreamer* createARMELFStreamer(MCContext &Context, MCAsmBackend &TAB, MCELFStreamer* createARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
raw_ostream &OS, MCCodeEmitter *Emitter, raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack, bool RelaxAll, bool NoExecStack,
bool IsThumb) { bool IsThumb) {
ARMTargetELFStreamer *TS = new ARMTargetELFStreamer(); ARMELFStreamer *S = new ARMELFStreamer(Context, TAB, OS, Emitter, IsThumb);
ARMELFStreamer *S = new ARMTargetELFStreamer(*S);
new ARMELFStreamer(Context, TS, TAB, OS, Emitter, IsThumb);
// FIXME: This should eventually end up somewhere else where more // FIXME: This should eventually end up somewhere else where more
// intelligent flag decisions can be made. For now we are just maintaining // intelligent flag decisions can be made. For now we are just maintaining
// the status quo for ARM and setting EF_ARM_EABI_VER5 as the default. // the status quo for ARM and setting EF_ARM_EABI_VER5 as the default.

View File

@@ -131,8 +131,10 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
MCContext &Context, MCAsmBackend &MAB, MCContext &Context, MCAsmBackend &MAB,
raw_ostream &OS, MCCodeEmitter *Emitter, raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack) { bool RelaxAll, bool NoExecStack) {
MipsTargetELFStreamer *S = new MipsTargetELFStreamer(); MCStreamer *S =
return createELFStreamer(Context, S, MAB, OS, Emitter, RelaxAll, NoExecStack); createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack);
new MipsTargetELFStreamer(*S);
return S;
} }
static MCStreamer * static MCStreamer *
@@ -140,11 +142,11 @@ createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc, bool useCFI, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useDwarfDirectory, MCInstPrinter *InstPrint, bool useDwarfDirectory, MCInstPrinter *InstPrint,
MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
MipsTargetAsmStreamer *S = new MipsTargetAsmStreamer(OS); MCStreamer *S =
llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
useDwarfDirectory, InstPrint, CE, TAB, new MipsTargetAsmStreamer(*S, OS);
ShowInst); return S;
} }
extern "C" void LLVMInitializeMipsTargetMC() { extern "C" void LLVMInitializeMipsTargetMC() {

View File

@@ -27,8 +27,11 @@ static cl::opt<bool> PrintHackDirectives("print-hack-directives",
// Pin vtable to this file. // Pin vtable to this file.
void MipsTargetStreamer::anchor() {} void MipsTargetStreamer::anchor() {}
MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS) MipsTargetStreamer::MipsTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
: OS(OS) {}
MipsTargetAsmStreamer::MipsTargetAsmStreamer(MCStreamer &S,
formatted_raw_ostream &OS)
: MipsTargetStreamer(S), OS(OS) {}
void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) { void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) {
if (!PrintHackDirectives) if (!PrintHackDirectives)
@@ -93,7 +96,8 @@ void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
} }
// This part is for ELF object output. // This part is for ELF object output.
MipsTargetELFStreamer::MipsTargetELFStreamer() : MicroMipsEnabled(false) {} MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S)
: MipsTargetStreamer(S), MicroMipsEnabled(false) {}
void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) { void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
if (!isMicroMipsEnabled()) if (!isMicroMipsEnabled())
@@ -110,7 +114,7 @@ void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
} }
MCELFStreamer &MipsTargetELFStreamer::getStreamer() { MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
return static_cast<MCELFStreamer &>(*Streamer); return static_cast<MCELFStreamer &>(Streamer);
} }
void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) { void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {

View File

@@ -18,6 +18,7 @@ class MipsTargetStreamer : public MCTargetStreamer {
virtual void anchor(); virtual void anchor();
public: public:
MipsTargetStreamer(MCStreamer &S);
virtual void emitMipsHackELFFlags(unsigned Flags) = 0; virtual void emitMipsHackELFFlags(unsigned Flags) = 0;
virtual void emitDirectiveSetMicroMips() = 0; virtual void emitDirectiveSetMicroMips() = 0;
virtual void emitDirectiveSetNoMicroMips() = 0; virtual void emitDirectiveSetNoMicroMips() = 0;
@@ -42,7 +43,7 @@ class MipsTargetAsmStreamer : public MipsTargetStreamer {
formatted_raw_ostream &OS; formatted_raw_ostream &OS;
public: public:
MipsTargetAsmStreamer(formatted_raw_ostream &OS); MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
virtual void emitMipsHackELFFlags(unsigned Flags); virtual void emitMipsHackELFFlags(unsigned Flags);
virtual void emitDirectiveSetMicroMips(); virtual void emitDirectiveSetMicroMips();
virtual void emitDirectiveSetNoMicroMips(); virtual void emitDirectiveSetNoMicroMips();
@@ -69,7 +70,7 @@ class MipsTargetELFStreamer : public MipsTargetStreamer {
public: public:
bool isMicroMipsEnabled() const { return MicroMipsEnabled; } bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
MCELFStreamer &getStreamer(); MCELFStreamer &getStreamer();
MipsTargetELFStreamer(); MipsTargetELFStreamer(MCStreamer &S);
virtual void emitLabel(MCSymbol *Symbol) LLVM_OVERRIDE; virtual void emitLabel(MCSymbol *Symbol) LLVM_OVERRIDE;

View File

@@ -39,6 +39,7 @@ using namespace llvm;
// Pin the vtable to this file. // Pin the vtable to this file.
PPCTargetStreamer::~PPCTargetStreamer() {} PPCTargetStreamer::~PPCTargetStreamer() {}
PPCTargetStreamer::PPCTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
static MCInstrInfo *createPPCMCInstrInfo() { static MCInstrInfo *createPPCMCInstrInfo() {
MCInstrInfo *X = new MCInstrInfo(); MCInstrInfo *X = new MCInstrInfo();
@@ -112,7 +113,8 @@ class PPCTargetAsmStreamer : public PPCTargetStreamer {
formatted_raw_ostream &OS; formatted_raw_ostream &OS;
public: public:
PPCTargetAsmStreamer(formatted_raw_ostream &OS) : OS(OS) {} PPCTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS)
: PPCTargetStreamer(S), OS(OS) {}
virtual void emitTCEntry(const MCSymbol &S) { virtual void emitTCEntry(const MCSymbol &S) {
OS << "\t.tc "; OS << "\t.tc ";
OS << S.getName(); OS << S.getName();
@@ -126,9 +128,11 @@ public:
}; };
class PPCTargetELFStreamer : public PPCTargetStreamer { class PPCTargetELFStreamer : public PPCTargetStreamer {
public:
PPCTargetELFStreamer(MCStreamer &S) : PPCTargetStreamer(S) {}
virtual void emitTCEntry(const MCSymbol &S) { virtual void emitTCEntry(const MCSymbol &S) {
// Creates a R_PPC64_TOC relocation // Creates a R_PPC64_TOC relocation
Streamer->EmitSymbolValue(&S, 8); Streamer.EmitSymbolValue(&S, 8);
} }
virtual void emitMachine(StringRef CPU) { virtual void emitMachine(StringRef CPU) {
// FIXME: Is there anything to do in here or does this directive only // FIXME: Is there anything to do in here or does this directive only
@@ -147,8 +151,10 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
if (Triple(TT).isOSDarwin()) if (Triple(TT).isOSDarwin())
return createMachOStreamer(Ctx, MAB, OS, Emitter, RelaxAll); return createMachOStreamer(Ctx, MAB, OS, Emitter, RelaxAll);
PPCTargetStreamer *S = new PPCTargetELFStreamer(); MCStreamer *S =
return createELFStreamer(Ctx, S, MAB, OS, Emitter, RelaxAll, NoExecStack); createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll, NoExecStack);
new PPCTargetELFStreamer(*S);
return S;
} }
static MCStreamer * static MCStreamer *
@@ -156,11 +162,12 @@ createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc, bool useCFI, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useDwarfDirectory, MCInstPrinter *InstPrint, bool useDwarfDirectory, MCInstPrinter *InstPrint,
MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
PPCTargetStreamer *S = new PPCTargetAsmStreamer(OS);
return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, MCStreamer *S =
useDwarfDirectory, InstPrint, CE, TAB, llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
ShowInst); useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
new PPCTargetAsmStreamer(*S, OS);
return S;
} }
static MCInstPrinter *createPPCMCInstPrinter(const Target &T, static MCInstPrinter *createPPCMCInstPrinter(const Target &T,

View File

@@ -15,6 +15,7 @@
namespace llvm { namespace llvm {
class PPCTargetStreamer : public MCTargetStreamer { class PPCTargetStreamer : public MCTargetStreamer {
public: public:
PPCTargetStreamer(MCStreamer &S);
virtual ~PPCTargetStreamer(); virtual ~PPCTargetStreamer();
virtual void emitTCEntry(const MCSymbol &S) = 0; virtual void emitTCEntry(const MCSymbol &S) = 0;
virtual void emitMachine(StringRef CPU) = 0; virtual void emitMachine(StringRef CPU) = 0;

View File

@@ -88,7 +88,7 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
MCCodeEmitter *_Emitter, MCCodeEmitter *_Emitter,
bool RelaxAll, bool RelaxAll,
bool NoExecStack) { bool NoExecStack) {
return createELFStreamer(Ctx, 0, MAB, _OS, _Emitter, false, false); return createELFStreamer(Ctx, MAB, _OS, _Emitter, false, false);
} }
extern "C" void LLVMInitializeR600TargetMC() { extern "C" void LLVMInitializeR600TargetMC() {

View File

@@ -105,8 +105,10 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
MCContext &Context, MCAsmBackend &MAB, MCContext &Context, MCAsmBackend &MAB,
raw_ostream &OS, MCCodeEmitter *Emitter, raw_ostream &OS, MCCodeEmitter *Emitter,
bool RelaxAll, bool NoExecStack) { bool RelaxAll, bool NoExecStack) {
SparcTargetELFStreamer *S = new SparcTargetELFStreamer(); MCStreamer *S =
return createELFStreamer(Context, S, MAB, OS, Emitter, RelaxAll, NoExecStack); createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack);
new SparcTargetELFStreamer(*S);
return S;
} }
static MCStreamer * static MCStreamer *
@@ -114,11 +116,12 @@ createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc, bool useCFI, bool isVerboseAsm, bool useLoc, bool useCFI,
bool useDwarfDirectory, MCInstPrinter *InstPrint, bool useDwarfDirectory, MCInstPrinter *InstPrint,
MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
SparcTargetAsmStreamer *S = new SparcTargetAsmStreamer(OS);
return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, MCStreamer *S =
useDwarfDirectory, InstPrint, CE, TAB, llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
ShowInst); useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
new SparcTargetAsmStreamer(*S, OS);
return S;
} }
static MCInstPrinter *createSparcMCInstPrinter(const Target &T, static MCInstPrinter *createSparcMCInstPrinter(const Target &T,

View File

@@ -18,10 +18,13 @@
using namespace llvm; using namespace llvm;
// pin vtable to this file // pin vtable to this file
SparcTargetStreamer::SparcTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
void SparcTargetStreamer::anchor() {} void SparcTargetStreamer::anchor() {}
SparcTargetAsmStreamer::SparcTargetAsmStreamer(formatted_raw_ostream &OS) SparcTargetAsmStreamer::SparcTargetAsmStreamer(MCStreamer &S,
: OS(OS) {} formatted_raw_ostream &OS)
: SparcTargetStreamer(S), OS(OS) {}
void SparcTargetAsmStreamer::emitSparcRegisterIgnore(unsigned reg) { void SparcTargetAsmStreamer::emitSparcRegisterIgnore(unsigned reg) {
OS << "\t.register " OS << "\t.register "
@@ -35,6 +38,9 @@ void SparcTargetAsmStreamer::emitSparcRegisterScratch(unsigned reg) {
<< ", #scratch\n"; << ", #scratch\n";
} }
SparcTargetELFStreamer::SparcTargetELFStreamer(MCStreamer &S)
: SparcTargetStreamer(S) {}
MCELFStreamer &SparcTargetELFStreamer::getStreamer() { MCELFStreamer &SparcTargetELFStreamer::getStreamer() {
return static_cast<MCELFStreamer &>(*Streamer); return static_cast<MCELFStreamer &>(Streamer);
} }

View File

@@ -18,6 +18,7 @@ class SparcTargetStreamer : public MCTargetStreamer {
virtual void anchor(); virtual void anchor();
public: public:
SparcTargetStreamer(MCStreamer &S);
/// Emit ".register <reg>, #ignore". /// Emit ".register <reg>, #ignore".
virtual void emitSparcRegisterIgnore(unsigned reg) = 0; virtual void emitSparcRegisterIgnore(unsigned reg) = 0;
/// Emit ".register <reg>, #scratch". /// Emit ".register <reg>, #scratch".
@@ -29,7 +30,7 @@ class SparcTargetAsmStreamer : public SparcTargetStreamer {
formatted_raw_ostream &OS; formatted_raw_ostream &OS;
public: public:
SparcTargetAsmStreamer(formatted_raw_ostream &OS); SparcTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
virtual void emitSparcRegisterIgnore(unsigned reg); virtual void emitSparcRegisterIgnore(unsigned reg);
virtual void emitSparcRegisterScratch(unsigned reg); virtual void emitSparcRegisterScratch(unsigned reg);
@@ -38,6 +39,7 @@ public:
// This part is for ELF object output // This part is for ELF object output
class SparcTargetELFStreamer : public SparcTargetStreamer { class SparcTargetELFStreamer : public SparcTargetStreamer {
public: public:
SparcTargetELFStreamer(MCStreamer &S);
MCELFStreamer &getStreamer(); MCELFStreamer &getStreamer();
virtual void emitSparcRegisterIgnore(unsigned reg) {} virtual void emitSparcRegisterIgnore(unsigned reg) {}
virtual void emitSparcRegisterScratch(unsigned reg) {} virtual void emitSparcRegisterScratch(unsigned reg) {}

View File

@@ -187,7 +187,7 @@ static MCStreamer *createSystemZMCObjectStreamer(const Target &T, StringRef TT,
MCCodeEmitter *Emitter, MCCodeEmitter *Emitter,
bool RelaxAll, bool RelaxAll,
bool NoExecStack) { bool NoExecStack) {
return createELFStreamer(Ctx, 0, MAB, OS, Emitter, RelaxAll, NoExecStack); return createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll, NoExecStack);
} }
extern "C" void LLVMInitializeSystemZTargetMC() { extern "C" void LLVMInitializeSystemZTargetMC() {

View File

@@ -371,7 +371,7 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF) if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
return createWinCOFFStreamer(Ctx, MAB, *_Emitter, _OS, RelaxAll); return createWinCOFFStreamer(Ctx, MAB, *_Emitter, _OS, RelaxAll);
return createELFStreamer(Ctx, 0, MAB, _OS, _Emitter, RelaxAll, NoExecStack); return createELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll, NoExecStack);
} }
static MCInstPrinter *createX86MCInstPrinter(const Target &T, static MCInstPrinter *createX86MCInstPrinter(const Target &T,