56
55
typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT);
58
typedef const MCAsmInfo *(*AsmInfoCtorFnTy)(const Target &T,
57
typedef MCAsmInfo *(*AsmInfoCtorFnTy)(const Target &T,
60
59
typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T,
61
60
const std::string &TT,
62
61
const std::string &Features);
63
typedef AsmPrinter *(*AsmPrinterCtorTy)(formatted_raw_ostream &OS,
67
const MCAsmInfo *MAI);
62
typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM,
63
MCStreamer &Streamer);
68
64
typedef TargetAsmBackend *(*AsmBackendCtorTy)(const Target &T,
65
const std::string &TT);
70
66
typedef TargetAsmLexer *(*AsmLexerCtorTy)(const Target &T,
71
67
const MCAsmInfo &MAI);
72
typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,MCAsmParser &P);
73
typedef const MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T);
68
typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &T,MCAsmParser &P,
70
typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T);
74
71
typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T,
75
72
unsigned SyntaxVariant,
73
const MCAsmInfo &MAI);
78
74
typedef MCCodeEmitter *(*CodeEmitterCtorTy)(const Target &T,
77
typedef MCStreamer *(*ObjectStreamerCtorTy)(const Target &T,
78
const std::string &TT,
80
TargetAsmBackend &TAB,
82
MCCodeEmitter *_Emitter,
83
86
/// Next - The next registered target in the linked list, maintained by the
131
134
/// if registered.
132
135
CodeEmitterCtorTy CodeEmitterCtorFn;
137
/// ObjectStreamerCtorFn - Construction function for this target's
138
/// ObjectStreamer, if registered.
139
ObjectStreamerCtorTy ObjectStreamerCtorFn;
135
142
/// @name Target Information
175
182
/// hasCodeEmitter - Check if this target supports instruction encoding.
176
183
bool hasCodeEmitter() const { return CodeEmitterCtorFn != 0; }
185
/// hasObjectStreamer - Check if this target supports streaming to files.
186
bool hasObjectStreamer() const { return ObjectStreamerCtorFn != 0; }
179
189
/// @name Feature Constructors
186
196
/// feature set; it should always be provided. Generally this should be
187
197
/// either the target triple from the module, or the target triple of the
188
198
/// host if that does not exist.
189
const MCAsmInfo *createAsmInfo(StringRef Triple) const {
199
MCAsmInfo *createAsmInfo(StringRef Triple) const {
190
200
if (!AsmInfoCtorFn)
192
202
return AsmInfoCtorFn(*this, Triple);
209
219
/// createAsmBackend - Create a target specific assembly parser.
221
/// \arg Triple - The target triple string.
211
222
/// \arg Backend - The target independent assembler object.
212
TargetAsmBackend *createAsmBackend(MCAssembler &Backend) const {
223
TargetAsmBackend *createAsmBackend(const std::string &Triple) const {
213
224
if (!AsmBackendCtorFn)
215
return AsmBackendCtorFn(*this, Backend);
226
return AsmBackendCtorFn(*this, Triple);
218
229
/// createAsmLexer - Create a target specific assembly lexer.
228
239
/// \arg Parser - The target independent parser implementation to use for
229
240
/// parsing and lexing.
230
TargetAsmParser *createAsmParser(MCAsmParser &Parser) const {
241
TargetAsmParser *createAsmParser(MCAsmParser &Parser,
242
TargetMachine &TM) const {
231
243
if (!AsmParserCtorFn)
233
return AsmParserCtorFn(*this, Parser);
245
return AsmParserCtorFn(*this, Parser, TM);
236
248
/// createAsmPrinter - Create a target specific assembly printer pass. This
237
/// takes ownership of the MCContext and MCStreamer objects but not the MAI.
238
AsmPrinter *createAsmPrinter(formatted_raw_ostream &OS, TargetMachine &TM,
239
MCContext &Ctx, MCStreamer &Streamer,
240
const MCAsmInfo *MAI) const {
249
/// takes ownership of the MCStreamer object.
250
AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{
241
251
if (!AsmPrinterCtorFn)
243
return AsmPrinterCtorFn(OS, TM, Ctx, Streamer, MAI);
253
return AsmPrinterCtorFn(TM, Streamer);
246
const MCDisassembler *createMCDisassembler() const {
256
MCDisassembler *createMCDisassembler() const {
247
257
if (!MCDisassemblerCtorFn)
249
259
return MCDisassemblerCtorFn(*this);
252
262
MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant,
253
const MCAsmInfo &MAI,
254
raw_ostream &O) const {
263
const MCAsmInfo &MAI) const {
255
264
if (!MCInstPrinterCtorFn)
257
return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, O);
266
return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI);
265
274
return CodeEmitterCtorFn(*this, TM, Ctx);
277
/// createObjectStreamer - Create a target specific MCStreamer.
279
/// \arg TT - The target triple.
280
/// \arg Ctx - The target context.
281
/// \arg TAB - The target assembler backend object. Takes ownership.
282
/// \arg _OS - The stream object.
283
/// \arg _Emitter - The target independent assembler object.Takes ownership.
284
/// \arg RelaxAll - Relax all fixups?
285
MCStreamer *createObjectStreamer(const std::string &TT, MCContext &Ctx,
286
TargetAsmBackend &TAB,
288
MCCodeEmitter *_Emitter,
289
bool RelaxAll) const {
290
if (!ObjectStreamerCtorFn)
292
return ObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, RelaxAll);
486
513
T.CodeEmitterCtorFn = Fn;
516
/// RegisterObjectStreamer - Register an MCStreamer implementation
517
/// for the given target.
519
/// Clients are responsible for ensuring that registration doesn't occur
520
/// while another thread is attempting to access the registry. Typically
521
/// this is done by initializing all targets at program startup.
523
/// @param T - The target being registered.
524
/// @param Fn - A function to construct an MCStreamer for the target.
525
static void RegisterObjectStreamer(Target &T, Target::ObjectStreamerCtorTy Fn) {
526
if (!T.ObjectStreamerCtorFn)
527
T.ObjectStreamerCtorFn = Fn;
531
572
TargetRegistry::RegisterAsmInfo(T, &Allocator);
534
static const MCAsmInfo *Allocator(const Target &T, StringRef TT) {
575
static MCAsmInfo *Allocator(const Target &T, StringRef TT) {
535
576
return new MCAsmInfoImpl(T, TT);
590
static TargetAsmBackend *Allocator(const Target &T, MCAssembler &Backend) {
591
return new AsmBackendImpl(T, Backend);
631
static TargetAsmBackend *Allocator(const Target &T,
632
const std::string &Triple) {
633
return new AsmBackendImpl(T, Triple);
630
static TargetAsmParser *Allocator(const Target &T, MCAsmParser &P) {
631
return new AsmParserImpl(T, P);
672
static TargetAsmParser *Allocator(const Target &T, MCAsmParser &P,
674
return new AsmParserImpl(T, P, TM);
650
static AsmPrinter *Allocator(formatted_raw_ostream &OS, TargetMachine &TM,
651
MCContext &Ctx, MCStreamer &Streamer,
652
const MCAsmInfo *MAI) {
653
return new AsmPrinterImpl(OS, TM, Ctx, Streamer, MAI);
693
static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) {
694
return new AsmPrinterImpl(TM, Streamer);