mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Currently, createMachOStreamer() is invoked directly in llvm-mc which
isn't ideal if we want to be able to use another object file format. Add a createObjectStreamer() factory method so that the correct object file streamer can be instantiated for a given target triple. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -73,6 +73,13 @@ namespace llvm {
|
||||
typedef MCCodeEmitter *(*CodeEmitterCtorTy)(const Target &T,
|
||||
TargetMachine &TM,
|
||||
MCContext &Ctx);
|
||||
typedef MCStreamer *(*ObjectStreamerCtorTy)(const Target &T,
|
||||
const std::string &TT,
|
||||
MCContext &Ctx,
|
||||
TargetAsmBackend &TAB,
|
||||
raw_ostream &_OS,
|
||||
MCCodeEmitter *_Emitter,
|
||||
bool RelaxAll);
|
||||
|
||||
private:
|
||||
/// Next - The next registered target in the linked list, maintained by the
|
||||
@@ -126,6 +133,10 @@ namespace llvm {
|
||||
/// if registered.
|
||||
CodeEmitterCtorTy CodeEmitterCtorFn;
|
||||
|
||||
/// ObjectStreamerCtorFn - Construction function for this target's
|
||||
/// ObjectStreamer, if registered.
|
||||
ObjectStreamerCtorTy ObjectStreamerCtorFn;
|
||||
|
||||
public:
|
||||
/// @name Target Information
|
||||
/// @{
|
||||
@@ -170,6 +181,9 @@ namespace llvm {
|
||||
/// hasCodeEmitter - Check if this target supports instruction encoding.
|
||||
bool hasCodeEmitter() const { return CodeEmitterCtorFn != 0; }
|
||||
|
||||
/// hasObjectStreamer - Check if this target supports streaming to files.
|
||||
bool hasObjectStreamer() const { return ObjectStreamerCtorFn != 0; }
|
||||
|
||||
/// @}
|
||||
/// @name Feature Constructors
|
||||
/// @{
|
||||
@@ -258,6 +272,24 @@ namespace llvm {
|
||||
return CodeEmitterCtorFn(*this, TM, Ctx);
|
||||
}
|
||||
|
||||
/// createObjectStreamer - Create a target specific MCStreamer.
|
||||
///
|
||||
/// \arg TT - The target triple.
|
||||
/// \arg Ctx - The target context.
|
||||
/// \arg TAB - The target assembler backend object.
|
||||
/// \arg _OS - The stream object.
|
||||
/// \arg _Emitter - The target independent assembler object.
|
||||
/// \arg RelaxAll - Relax all fixups?
|
||||
MCStreamer *createObjectStreamer(const std::string &TT, MCContext &Ctx,
|
||||
TargetAsmBackend &TAB,
|
||||
raw_ostream &_OS,
|
||||
MCCodeEmitter *_Emitter,
|
||||
bool RelaxAll) const {
|
||||
if (!ObjectStreamerCtorFn)
|
||||
return 0;
|
||||
return ObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, RelaxAll);
|
||||
}
|
||||
|
||||
/// @}
|
||||
};
|
||||
|
||||
@@ -479,6 +511,20 @@ namespace llvm {
|
||||
T.CodeEmitterCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// RegisterObjectStreamer - Register an 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 RegisterObjectStreamer(Target &T, Target::ObjectStreamerCtorTy Fn) {
|
||||
if (!T.ObjectStreamerCtorFn)
|
||||
T.ObjectStreamerCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// @}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user