mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 22:24:54 +00:00
Split the object streamer callback in one per file format.
There are two main advantages to doing this * Targets that only need to handle one of the formats specially don't have to worry about the others. For example, x86 now only registers a constructor for the COFF streamer. * Changes to the arguments passed to one format constructor will not impact the other formats. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232699 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -58,10 +58,14 @@ namespace llvm {
|
||||
bool isVerboseAsm, bool useDwarfDirectory,
|
||||
MCInstPrinter *InstPrint, MCCodeEmitter *CE,
|
||||
MCAsmBackend *TAB, bool ShowInst);
|
||||
MCStreamer *createObjectStreamer(const Triple &T, MCContext &Ctx,
|
||||
MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter,
|
||||
const MCSubtargetInfo &STI, bool RelaxAll);
|
||||
|
||||
/// Takes ownership of \p TAB and \p CE.
|
||||
MCStreamer *createELFStreamer(MCContext &Ctx, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *CE,
|
||||
bool RelaxAll);
|
||||
MCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *CE,
|
||||
bool RelaxAll, bool LabelSections = false);
|
||||
|
||||
MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx);
|
||||
|
||||
@@ -130,13 +134,25 @@ namespace llvm {
|
||||
typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II,
|
||||
const MCRegisterInfo &MRI,
|
||||
MCContext &Ctx);
|
||||
typedef MCStreamer *(*MCObjectStreamerCtorTy)(
|
||||
const Triple &T, MCContext &Ctx, MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter, const MCSubtargetInfo &STI, bool RelaxAll);
|
||||
typedef MCStreamer *(*ELFStreamerCtorTy)(const Triple &T, MCContext &Ctx,
|
||||
MCAsmBackend &TAB, raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter,
|
||||
bool RelaxAll);
|
||||
typedef MCStreamer *(*MachOStreamerCtorTy)(MCContext &Ctx,
|
||||
MCAsmBackend &TAB,
|
||||
raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter,
|
||||
bool RelaxAll);
|
||||
typedef MCStreamer *(*COFFStreamerCtorTy)(MCContext &Ctx, MCAsmBackend &TAB,
|
||||
raw_ostream &OS,
|
||||
MCCodeEmitter *Emitter,
|
||||
bool RelaxAll);
|
||||
typedef MCTargetStreamer *(*NullTargetStreamerCtorTy)(MCStreamer &S);
|
||||
typedef MCTargetStreamer *(*AsmTargetStreamerCtorTy)(
|
||||
MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint,
|
||||
bool IsVerboseAsm);
|
||||
typedef MCTargetStreamer *(*ObjectTargetStreamerCtorTy)(
|
||||
MCStreamer &S, const MCSubtargetInfo &STI);
|
||||
typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT,
|
||||
MCContext &Ctx);
|
||||
typedef MCSymbolizer *(*MCSymbolizerCtorTy)(
|
||||
@@ -213,9 +229,10 @@ namespace llvm {
|
||||
/// CodeEmitter, if registered.
|
||||
MCCodeEmitterCtorTy MCCodeEmitterCtorFn;
|
||||
|
||||
/// MCObjectStreamerCtorFn - Construction function for this target's
|
||||
/// MCObjectStreamer, if registered.
|
||||
MCObjectStreamerCtorTy MCObjectStreamerCtorFn;
|
||||
// Construction functions for the various object formats, if registered.
|
||||
COFFStreamerCtorTy COFFStreamerCtorFn;
|
||||
MachOStreamerCtorTy MachOStreamerCtorFn;
|
||||
ELFStreamerCtorTy ELFStreamerCtorFn;
|
||||
|
||||
/// Construction function for this target's null TargetStreamer, if
|
||||
/// registered (default = nullptr).
|
||||
@@ -225,6 +242,10 @@ namespace llvm {
|
||||
/// registered (default = nullptr).
|
||||
AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn;
|
||||
|
||||
/// Construction function for this target's obj TargetStreamer, if
|
||||
/// registered (default = nullptr).
|
||||
ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn;
|
||||
|
||||
/// MCRelocationInfoCtorFn - Construction function for this target's
|
||||
/// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo)
|
||||
MCRelocationInfoCtorTy MCRelocationInfoCtorFn;
|
||||
@@ -235,9 +256,10 @@ namespace llvm {
|
||||
|
||||
public:
|
||||
Target()
|
||||
: MCObjectStreamerCtorFn(nullptr), NullTargetStreamerCtorFn(nullptr),
|
||||
AsmTargetStreamerCtorFn(nullptr), MCRelocationInfoCtorFn(nullptr),
|
||||
MCSymbolizerCtorFn(nullptr) {}
|
||||
: COFFStreamerCtorFn(nullptr), MachOStreamerCtorFn(nullptr),
|
||||
ELFStreamerCtorFn(nullptr), NullTargetStreamerCtorFn(nullptr),
|
||||
AsmTargetStreamerCtorFn(nullptr), ObjectTargetStreamerCtorFn(nullptr),
|
||||
MCRelocationInfoCtorFn(nullptr), MCSymbolizerCtorFn(nullptr) {}
|
||||
|
||||
/// @name Target Information
|
||||
/// @{
|
||||
@@ -423,10 +445,30 @@ namespace llvm {
|
||||
MCCodeEmitter *Emitter,
|
||||
const MCSubtargetInfo &STI,
|
||||
bool RelaxAll) const {
|
||||
if (!MCObjectStreamerCtorFn)
|
||||
return llvm::createObjectStreamer(T, Ctx, TAB, OS, Emitter, STI,
|
||||
RelaxAll);
|
||||
return MCObjectStreamerCtorFn(T, Ctx, TAB, OS, Emitter, STI, RelaxAll);
|
||||
MCStreamer *S;
|
||||
switch (T.getObjectFormat()) {
|
||||
default:
|
||||
llvm_unreachable("Unknown object format");
|
||||
case Triple::COFF:
|
||||
assert(T.isOSWindows() && "only Windows COFF is supported");
|
||||
S = COFFStreamerCtorFn(Ctx, TAB, OS, Emitter, RelaxAll);
|
||||
break;
|
||||
case Triple::MachO:
|
||||
if (MachOStreamerCtorFn)
|
||||
S = MachOStreamerCtorFn(Ctx, TAB, OS, Emitter, RelaxAll);
|
||||
else
|
||||
S = createMachOStreamer(Ctx, TAB, OS, Emitter, RelaxAll);
|
||||
break;
|
||||
case Triple::ELF:
|
||||
if (ELFStreamerCtorFn)
|
||||
S = ELFStreamerCtorFn(T, Ctx, TAB, OS, Emitter, RelaxAll);
|
||||
else
|
||||
S = createELFStreamer(Ctx, TAB, OS, Emitter, RelaxAll);
|
||||
break;
|
||||
}
|
||||
if (ObjectTargetStreamerCtorFn)
|
||||
ObjectTargetStreamerCtorFn(*S, STI);
|
||||
return S;
|
||||
}
|
||||
|
||||
MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
|
||||
@@ -760,18 +802,17 @@ namespace llvm {
|
||||
T.MCCodeEmitterCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// RegisterMCObjectStreamer - Register a object code MCStreamer
|
||||
/// implementation for the given target.
|
||||
///
|
||||
/// Clients are responsible for ensuring that registration doesn't occur
|
||||
/// while another thread is attempting to access the registry. Typically
|
||||
/// this is done by initializing all targets at program startup.
|
||||
///
|
||||
/// @param T - The target being registered.
|
||||
/// @param Fn - A function to construct an MCStreamer for the target.
|
||||
static void RegisterMCObjectStreamer(Target &T,
|
||||
Target::MCObjectStreamerCtorTy Fn) {
|
||||
T.MCObjectStreamerCtorFn = Fn;
|
||||
static void RegisterCOFFStreamer(Target &T, Target::COFFStreamerCtorTy Fn) {
|
||||
T.COFFStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
static void RegisterMachOStreamer(Target &T,
|
||||
Target::MachOStreamerCtorTy Fn) {
|
||||
T.MachOStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn) {
|
||||
T.ELFStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -784,6 +825,12 @@ namespace llvm {
|
||||
T.AsmTargetStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
static void
|
||||
RegisterObjectTargetStreamer(Target &T,
|
||||
Target::ObjectTargetStreamerCtorTy Fn) {
|
||||
T.ObjectTargetStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// RegisterMCRelocationInfo - Register an MCRelocationInfo
|
||||
/// implementation for the given target.
|
||||
///
|
||||
|
Reference in New Issue
Block a user