mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Give the MCStreamer class hierarchy LLVM RTTI facilities for use with
isa<> and dyn_cast<>. In several places, code is already hacking around the absence of this, and there seem to be several interfaces that might be lifted and/or devirtualized using this. This change was based on a discussion with Jim Grosbach about how best to handle testing for specific MCStreamer subclasses. He said that this was the correct end state, and everything else was too hacky so I decided to just make it so. No functionality should be changed here, this is just threading the kind through all the constructors and setting up the classof overloads. llvm-svn: 174113
This commit is contained in:
parent
7faa9ee1dc
commit
0c74d78ebf
@ -28,15 +28,20 @@ class MCSymbolData;
|
||||
class raw_ostream;
|
||||
|
||||
class MCELFStreamer : public MCObjectStreamer {
|
||||
public:
|
||||
MCELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
protected:
|
||||
MCELFStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(Context, TAB, OS, Emitter) {}
|
||||
: MCObjectStreamer(Kind, Context, TAB, OS, Emitter) {}
|
||||
|
||||
MCELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter,
|
||||
MCAssembler *Assembler)
|
||||
: MCObjectStreamer(Context, TAB, OS, Emitter, Assembler) {}
|
||||
public:
|
||||
MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter) {}
|
||||
|
||||
MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter, MCAssembler *Assembler)
|
||||
: MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter,
|
||||
Assembler) {}
|
||||
|
||||
virtual ~MCELFStreamer();
|
||||
|
||||
@ -81,6 +86,10 @@ public:
|
||||
virtual void FinishImpl();
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_ELFStreamer && S->getKind() == SK_ARMELFStreamer;
|
||||
}
|
||||
|
||||
private:
|
||||
virtual void EmitInstToFragment(const MCInst &Inst);
|
||||
virtual void EmitInstToData(const MCInst &Inst);
|
||||
|
@ -38,9 +38,9 @@ class MCObjectStreamer : public MCStreamer {
|
||||
virtual void EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame);
|
||||
|
||||
protected:
|
||||
MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
MCObjectStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &_OS, MCCodeEmitter *_Emitter);
|
||||
MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
MCObjectStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &_OS, MCCodeEmitter *_Emitter,
|
||||
MCAssembler *_Assembler);
|
||||
~MCObjectStreamer();
|
||||
@ -107,6 +107,10 @@ public:
|
||||
virtual void FinishImpl();
|
||||
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() >= SK_ELFStreamer && S->getKind() <= SK_WinCOFFStreamer;
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -46,6 +46,22 @@ namespace llvm {
|
||||
/// a .s file, and implementations that write out .o files of various formats.
|
||||
///
|
||||
class MCStreamer {
|
||||
public:
|
||||
enum StreamerKind {
|
||||
SK_AsmStreamer,
|
||||
SK_NullStreamer,
|
||||
SK_RecordStreamer,
|
||||
|
||||
// MCObjectStreamer subclasses.
|
||||
SK_ELFStreamer,
|
||||
SK_ARMELFStreamer,
|
||||
SK_MachOStreamer,
|
||||
SK_PureStreamer,
|
||||
SK_WinCOFFStreamer
|
||||
};
|
||||
|
||||
private:
|
||||
const StreamerKind Kind;
|
||||
MCContext &Context;
|
||||
|
||||
MCStreamer(const MCStreamer&) LLVM_DELETED_FUNCTION;
|
||||
@ -74,7 +90,7 @@ namespace llvm {
|
||||
bool AutoInitSections;
|
||||
|
||||
protected:
|
||||
MCStreamer(MCContext &Ctx);
|
||||
MCStreamer(StreamerKind Kind, MCContext &Ctx);
|
||||
|
||||
const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A,
|
||||
const MCSymbol *B);
|
||||
@ -93,6 +109,8 @@ namespace llvm {
|
||||
public:
|
||||
virtual ~MCStreamer();
|
||||
|
||||
StreamerKind getKind() const { return Kind; }
|
||||
|
||||
/// State management
|
||||
///
|
||||
virtual void reset();
|
||||
|
@ -71,7 +71,7 @@ public:
|
||||
MCInstPrinter *printer, MCCodeEmitter *emitter,
|
||||
MCAsmBackend *asmbackend,
|
||||
bool showInst)
|
||||
: MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()),
|
||||
: MCStreamer(SK_AsmStreamer, Context), OS(os), MAI(Context.getAsmInfo()),
|
||||
InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend),
|
||||
CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm),
|
||||
ShowInst(showInst), UseLoc(useLoc), UseCFI(useCFI),
|
||||
@ -277,6 +277,10 @@ public:
|
||||
virtual void FinishImpl();
|
||||
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_NullStreamer;
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace.
|
||||
|
@ -34,9 +34,9 @@ private:
|
||||
void EmitDataRegion(DataRegionData::KindTy Kind);
|
||||
void EmitDataRegionEnd();
|
||||
public:
|
||||
MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(Context, MAB, OS, Emitter) {}
|
||||
MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(SK_MachOStreamer, Context, MAB, OS, Emitter) {}
|
||||
|
||||
/// @name MCStreamer Interface
|
||||
/// @{
|
||||
@ -87,6 +87,10 @@ public:
|
||||
virtual void FinishImpl();
|
||||
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_MachOStreamer;
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace.
|
||||
|
@ -19,7 +19,7 @@ namespace {
|
||||
|
||||
class MCNullStreamer : public MCStreamer {
|
||||
public:
|
||||
MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
|
||||
MCNullStreamer(MCContext &Context) : MCStreamer(SK_NullStreamer, Context) {}
|
||||
|
||||
/// @name MCStreamer Interface
|
||||
/// @{
|
||||
@ -109,6 +109,11 @@ namespace {
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_NullStreamer;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -20,22 +20,19 @@
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
using namespace llvm;
|
||||
|
||||
MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter_)
|
||||
: MCStreamer(Context),
|
||||
Assembler(new MCAssembler(Context, TAB,
|
||||
*Emitter_, *TAB.createObjectWriter(OS),
|
||||
OS)),
|
||||
CurSectionData(0)
|
||||
{
|
||||
}
|
||||
MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context,
|
||||
MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter_)
|
||||
: MCStreamer(Kind, Context),
|
||||
Assembler(new MCAssembler(Context, TAB, *Emitter_,
|
||||
*TAB.createObjectWriter(OS), OS)),
|
||||
CurSectionData(0) {}
|
||||
|
||||
MCObjectStreamer::MCObjectStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter_,
|
||||
MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context,
|
||||
MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter_,
|
||||
MCAssembler *_Assembler)
|
||||
: MCStreamer(Context), Assembler(_Assembler), CurSectionData(0)
|
||||
{
|
||||
}
|
||||
: MCStreamer(Kind, Context), Assembler(_Assembler), CurSectionData(0) {}
|
||||
|
||||
MCObjectStreamer::~MCObjectStreamer() {
|
||||
delete &Assembler->getBackend();
|
||||
|
@ -28,9 +28,9 @@ private:
|
||||
virtual void EmitInstToData(const MCInst &Inst);
|
||||
|
||||
public:
|
||||
MCPureStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(Context, TAB, OS, Emitter) {}
|
||||
MCPureStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter)
|
||||
: MCObjectStreamer(SK_PureStreamer, Context, TAB, OS, Emitter) {}
|
||||
|
||||
/// @name MCStreamer Interface
|
||||
/// @{
|
||||
@ -100,6 +100,10 @@ public:
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_PureStreamer;
|
||||
}
|
||||
};
|
||||
|
||||
} // end anonymous namespace.
|
||||
|
@ -21,10 +21,9 @@
|
||||
#include <cstdlib>
|
||||
using namespace llvm;
|
||||
|
||||
MCStreamer::MCStreamer(MCContext &Ctx)
|
||||
: Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
|
||||
CurrentW64UnwindInfo(0), LastSymbol(0),
|
||||
AutoInitSections(false) {
|
||||
MCStreamer::MCStreamer(StreamerKind Kind, MCContext &Ctx)
|
||||
: Kind(Kind), Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
|
||||
CurrentW64UnwindInfo(0), LastSymbol(0), AutoInitSections(false) {
|
||||
const MCSection *section = NULL;
|
||||
SectionStack.push_back(std::make_pair(section, section));
|
||||
}
|
||||
|
@ -75,6 +75,10 @@ public:
|
||||
virtual void EmitWin64EHHandlerData();
|
||||
virtual void FinishImpl();
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_WinCOFFStreamer;
|
||||
}
|
||||
|
||||
private:
|
||||
virtual void EmitInstToData(const MCInst &Inst) {
|
||||
MCDataFragment *DF = getOrCreateDataFragment();
|
||||
@ -128,13 +132,10 @@ private:
|
||||
};
|
||||
} // end anonymous namespace.
|
||||
|
||||
WinCOFFStreamer::WinCOFFStreamer(MCContext &Context,
|
||||
MCAsmBackend &MAB,
|
||||
MCCodeEmitter &CE,
|
||||
raw_ostream &OS)
|
||||
: MCObjectStreamer(Context, MAB, OS, &CE)
|
||||
, CurSymbol(NULL) {
|
||||
}
|
||||
WinCOFFStreamer::WinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB,
|
||||
MCCodeEmitter &CE, raw_ostream &OS)
|
||||
: MCObjectStreamer(SK_WinCOFFStreamer, Context, MAB, OS, &CE),
|
||||
CurSymbol(NULL) {}
|
||||
|
||||
void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||
unsigned ByteAlignment, bool External) {
|
||||
|
@ -54,12 +54,11 @@ namespace {
|
||||
/// by MachO. Beware!
|
||||
class ARMELFStreamer : public MCELFStreamer {
|
||||
public:
|
||||
ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *Emitter, bool IsThumb)
|
||||
: MCELFStreamer(Context, TAB, OS, Emitter),
|
||||
IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None),
|
||||
ExTab(0), FnStart(0), Personality(0), CantUnwind(false) {
|
||||
}
|
||||
ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter, bool IsThumb)
|
||||
: MCELFStreamer(SK_ARMELFStreamer, Context, TAB, OS, Emitter),
|
||||
IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None), ExTab(0),
|
||||
FnStart(0), Personality(0), CantUnwind(false) {}
|
||||
|
||||
~ARMELFStreamer() {}
|
||||
|
||||
@ -134,6 +133,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind() == SK_ARMELFStreamer;
|
||||
}
|
||||
|
||||
private:
|
||||
enum ElfMappingSymbol {
|
||||
EMS_None,
|
||||
|
@ -733,7 +733,8 @@ namespace {
|
||||
return Symbols.end();
|
||||
}
|
||||
|
||||
RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
|
||||
RecordStreamer(MCContext &Context)
|
||||
: MCStreamer(SK_RecordStreamer, Context) {}
|
||||
|
||||
virtual void EmitInstruction(const MCInst &Inst) {
|
||||
// Scan for values.
|
||||
@ -804,6 +805,10 @@ namespace {
|
||||
const MCSymbol *Label,
|
||||
unsigned PointerSize) {}
|
||||
virtual void FinishImpl() {}
|
||||
|
||||
static bool classof(const MCStreamer *S) {
|
||||
return S->getKind == SK_RecordStreamer;
|
||||
}
|
||||
};
|
||||
} // end anonymous namespace
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user