1 //===-- Support/TargetRegistry.h - Target Registration ----------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file exposes the TargetRegistry interface, which tools can use to access 11 // the appropriate target specific classes (TargetMachine, AsmPrinter, etc.) 12 // which have been registered. 13 // 14 // Target specific class implementations should register themselves using the 15 // appropriate TargetRegistry interfaces. 16 // 17 //===----------------------------------------------------------------------===// 18 19 #ifndef LLVM_SUPPORT_TARGETREGISTRY_H 20 #define LLVM_SUPPORT_TARGETREGISTRY_H 21 22 #include "llvm/Support/CodeGen.h" 23 #include "llvm/ADT/Triple.h" 24 #include <string> 25 #include <cassert> 26 27 namespace llvm { 28 class AsmPrinter; 29 class Module; 30 class MCAssembler; 31 class MCAsmBackend; 32 class MCAsmInfo; 33 class MCAsmParser; 34 class MCCodeEmitter; 35 class MCCodeGenInfo; 36 class MCContext; 37 class MCDisassembler; 38 class MCInstrAnalysis; 39 class MCInstPrinter; 40 class MCInstrInfo; 41 class MCRegisterInfo; 42 class MCStreamer; 43 class MCSubtargetInfo; 44 class MCTargetAsmLexer; 45 class MCTargetAsmParser; 46 class TargetMachine; 47 class raw_ostream; 48 class formatted_raw_ostream; 49 50 MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 51 bool isVerboseAsm, 52 bool useLoc, bool useCFI, 53 bool useDwarfDirectory, 54 MCInstPrinter *InstPrint, 55 MCCodeEmitter *CE, 56 MCAsmBackend *TAB, 57 bool ShowInst); 58 59 /// Target - Wrapper for Target specific information. 60 /// 61 /// For registration purposes, this is a POD type so that targets can be 62 /// registered without the use of static constructors. 63 /// 64 /// Targets should implement a single global instance of this class (which 65 /// will be zero initialized), and pass that instance to the TargetRegistry as 66 /// part of their initialization. 67 class Target { 68 public: 69 friend struct TargetRegistry; 70 71 typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT); 72 73 typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const Target &T, 74 StringRef TT); 75 typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT, 76 Reloc::Model RM, 77 CodeModel::Model CM); 78 typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 79 typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info); 80 typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT); 81 typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT, 82 StringRef CPU, 83 StringRef Features); 84 typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T, 85 StringRef TT, 86 StringRef CPU, 87 StringRef Features, 88 Reloc::Model RM, 89 CodeModel::Model CM); 90 typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM, 91 MCStreamer &Streamer); 92 typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, StringRef TT); 93 typedef MCTargetAsmLexer *(*MCAsmLexerCtorTy)(const Target &T, 94 const MCRegisterInfo &MRI, 95 const MCAsmInfo &MAI); 96 typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI, 97 MCAsmParser &P); 98 typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T, 99 const MCSubtargetInfo &STI); 100 typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T, 101 unsigned SyntaxVariant, 102 const MCAsmInfo &MAI, 103 const MCSubtargetInfo &STI); 104 typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 105 const MCSubtargetInfo &STI, 106 MCContext &Ctx); 107 typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T, 108 StringRef TT, 109 MCContext &Ctx, 110 MCAsmBackend &TAB, 111 raw_ostream &_OS, 112 MCCodeEmitter *_Emitter, 113 bool RelaxAll, 114 bool NoExecStack); 115 typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx, 116 formatted_raw_ostream &OS, 117 bool isVerboseAsm, 118 bool useLoc, 119 bool useCFI, 120 bool useDwarfDirectory, 121 MCInstPrinter *InstPrint, 122 MCCodeEmitter *CE, 123 MCAsmBackend *TAB, 124 bool ShowInst); 125 126 private: 127 /// Next - The next registered target in the linked list, maintained by the 128 /// TargetRegistry. 129 Target *Next; 130 131 /// TripleMatchQualityFn - The target function for rating the match quality 132 /// of a triple. 133 TripleMatchQualityFnTy TripleMatchQualityFn; 134 135 /// Name - The target name. 136 const char *Name; 137 138 /// ShortDesc - A short description of the target. 139 const char *ShortDesc; 140 141 /// HasJIT - Whether this target supports the JIT. 142 bool HasJIT; 143 144 /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if 145 /// registered. 146 MCAsmInfoCtorFnTy MCAsmInfoCtorFn; 147 148 /// MCCodeGenInfoCtorFn - Constructor function for this target's MCCodeGenInfo, 149 /// if registered. 150 MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn; 151 152 /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, 153 /// if registered. 154 MCInstrInfoCtorFnTy MCInstrInfoCtorFn; 155 156 /// MCInstrAnalysisCtorFn - Constructor function for this target's 157 /// MCInstrAnalysis, if registered. 158 MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn; 159 160 /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo, 161 /// if registered. 162 MCRegInfoCtorFnTy MCRegInfoCtorFn; 163 164 /// MCSubtargetInfoCtorFn - Constructor function for this target's 165 /// MCSubtargetInfo, if registered. 166 MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn; 167 168 /// TargetMachineCtorFn - Construction function for this target's 169 /// TargetMachine, if registered. 170 TargetMachineCtorTy TargetMachineCtorFn; 171 172 /// MCAsmBackendCtorFn - Construction function for this target's 173 /// MCAsmBackend, if registered. 174 MCAsmBackendCtorTy MCAsmBackendCtorFn; 175 176 /// MCAsmLexerCtorFn - Construction function for this target's 177 /// MCTargetAsmLexer, if registered. 178 MCAsmLexerCtorTy MCAsmLexerCtorFn; 179 180 /// MCAsmParserCtorFn - Construction function for this target's 181 /// MCTargetAsmParser, if registered. 182 MCAsmParserCtorTy MCAsmParserCtorFn; 183 184 /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter, 185 /// if registered. 186 AsmPrinterCtorTy AsmPrinterCtorFn; 187 188 /// MCDisassemblerCtorFn - Construction function for this target's 189 /// MCDisassembler, if registered. 190 MCDisassemblerCtorTy MCDisassemblerCtorFn; 191 192 /// MCInstPrinterCtorFn - Construction function for this target's 193 /// MCInstPrinter, if registered. 194 MCInstPrinterCtorTy MCInstPrinterCtorFn; 195 196 /// MCCodeEmitterCtorFn - Construction function for this target's 197 /// CodeEmitter, if registered. 198 MCCodeEmitterCtorTy MCCodeEmitterCtorFn; 199 200 /// MCObjectStreamerCtorFn - Construction function for this target's 201 /// MCObjectStreamer, if registered. 202 MCObjectStreamerCtorTy MCObjectStreamerCtorFn; 203 204 /// AsmStreamerCtorFn - Construction function for this target's 205 /// AsmStreamer, if registered (default = llvm::createAsmStreamer). 206 AsmStreamerCtorTy AsmStreamerCtorFn; 207 208 public: 209 Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {} 210 211 /// @name Target Information 212 /// @{ 213 214 // getNext - Return the next registered target. 215 const Target *getNext() const { return Next; } 216 217 /// getName - Get the target name. 218 const char *getName() const { return Name; } 219 220 /// getShortDescription - Get a short description of the target. 221 const char *getShortDescription() const { return ShortDesc; } 222 223 /// @} 224 /// @name Feature Predicates 225 /// @{ 226 227 /// hasJIT - Check if this targets supports the just-in-time compilation. 228 bool hasJIT() const { return HasJIT; } 229 230 /// hasTargetMachine - Check if this target supports code generation. 231 bool hasTargetMachine() const { return TargetMachineCtorFn != 0; } 232 233 /// hasMCAsmBackend - Check if this target supports .o generation. 234 bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; } 235 236 /// hasMCAsmLexer - Check if this target supports .s lexing. 237 bool hasMCAsmLexer() const { return MCAsmLexerCtorFn != 0; } 238 239 /// hasAsmParser - Check if this target supports .s parsing. 240 bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; } 241 242 /// hasAsmPrinter - Check if this target supports .s printing. 243 bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; } 244 245 /// hasMCDisassembler - Check if this target has a disassembler. 246 bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; } 247 248 /// hasMCInstPrinter - Check if this target has an instruction printer. 249 bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; } 250 251 /// hasMCCodeEmitter - Check if this target supports instruction encoding. 252 bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; } 253 254 /// hasMCObjectStreamer - Check if this target supports streaming to files. 255 bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; } 256 257 /// hasAsmStreamer - Check if this target supports streaming to files. 258 bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; } 259 260 /// @} 261 /// @name Feature Constructors 262 /// @{ 263 264 /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 265 /// target triple. 266 /// 267 /// \arg Triple - This argument is used to determine the target machine 268 /// feature set; it should always be provided. Generally this should be 269 /// either the target triple from the module, or the target triple of the 270 /// host if that does not exist. 271 MCAsmInfo *createMCAsmInfo(StringRef Triple) const { 272 if (!MCAsmInfoCtorFn) 273 return 0; 274 return MCAsmInfoCtorFn(*this, Triple); 275 } 276 277 /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation. 278 /// 279 MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM, 280 CodeModel::Model CM) const { 281 if (!MCCodeGenInfoCtorFn) 282 return 0; 283 return MCCodeGenInfoCtorFn(Triple, RM, CM); 284 } 285 286 /// createMCInstrInfo - Create a MCInstrInfo implementation. 287 /// 288 MCInstrInfo *createMCInstrInfo() const { 289 if (!MCInstrInfoCtorFn) 290 return 0; 291 return MCInstrInfoCtorFn(); 292 } 293 294 /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 295 /// 296 MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 297 if (!MCInstrAnalysisCtorFn) 298 return 0; 299 return MCInstrAnalysisCtorFn(Info); 300 } 301 302 /// createMCRegInfo - Create a MCRegisterInfo implementation. 303 /// 304 MCRegisterInfo *createMCRegInfo(StringRef Triple) const { 305 if (!MCRegInfoCtorFn) 306 return 0; 307 return MCRegInfoCtorFn(Triple); 308 } 309 310 /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 311 /// 312 /// \arg Triple - This argument is used to determine the target machine 313 /// feature set; it should always be provided. Generally this should be 314 /// either the target triple from the module, or the target triple of the 315 /// host if that does not exist. 316 /// \arg CPU - This specifies the name of the target CPU. 317 /// \arg Features - This specifies the string representation of the 318 /// additional target features. 319 MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU, 320 StringRef Features) const { 321 if (!MCSubtargetInfoCtorFn) 322 return 0; 323 return MCSubtargetInfoCtorFn(Triple, CPU, Features); 324 } 325 326 /// createTargetMachine - Create a target specific machine implementation 327 /// for the specified \arg Triple. 328 /// 329 /// \arg Triple - This argument is used to determine the target machine 330 /// feature set; it should always be provided. Generally this should be 331 /// either the target triple from the module, or the target triple of the 332 /// host if that does not exist. 333 TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU, 334 StringRef Features, 335 Reloc::Model RM = Reloc::Default, 336 CodeModel::Model CM = CodeModel::Default) const { 337 if (!TargetMachineCtorFn) 338 return 0; 339 return TargetMachineCtorFn(*this, Triple, CPU, Features, RM, CM); 340 } 341 342 /// createMCAsmBackend - Create a target specific assembly parser. 343 /// 344 /// \arg Triple - The target triple string. 345 /// \arg Backend - The target independent assembler object. 346 MCAsmBackend *createMCAsmBackend(StringRef Triple) const { 347 if (!MCAsmBackendCtorFn) 348 return 0; 349 return MCAsmBackendCtorFn(*this, Triple); 350 } 351 352 /// createMCAsmLexer - Create a target specific assembly lexer. 353 /// 354 MCTargetAsmLexer *createMCAsmLexer(const MCRegisterInfo &MRI, 355 const MCAsmInfo &MAI) const { 356 if (!MCAsmLexerCtorFn) 357 return 0; 358 return MCAsmLexerCtorFn(*this, MRI, MAI); 359 } 360 361 /// createMCAsmParser - Create a target specific assembly parser. 362 /// 363 /// \arg Parser - The target independent parser implementation to use for 364 /// parsing and lexing. 365 MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI, 366 MCAsmParser &Parser) const { 367 if (!MCAsmParserCtorFn) 368 return 0; 369 return MCAsmParserCtorFn(STI, Parser); 370 } 371 372 /// createAsmPrinter - Create a target specific assembly printer pass. This 373 /// takes ownership of the MCStreamer object. 374 AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{ 375 if (!AsmPrinterCtorFn) 376 return 0; 377 return AsmPrinterCtorFn(TM, Streamer); 378 } 379 380 MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const { 381 if (!MCDisassemblerCtorFn) 382 return 0; 383 return MCDisassemblerCtorFn(*this, STI); 384 } 385 386 MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant, 387 const MCAsmInfo &MAI, 388 const MCSubtargetInfo &STI) const { 389 if (!MCInstPrinterCtorFn) 390 return 0; 391 return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, STI); 392 } 393 394 395 /// createMCCodeEmitter - Create a target specific code emitter. 396 MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 397 const MCSubtargetInfo &STI, 398 MCContext &Ctx) const { 399 if (!MCCodeEmitterCtorFn) 400 return 0; 401 return MCCodeEmitterCtorFn(II, STI, Ctx); 402 } 403 404 /// createMCObjectStreamer - Create a target specific MCStreamer. 405 /// 406 /// \arg TT - The target triple. 407 /// \arg Ctx - The target context. 408 /// \arg TAB - The target assembler backend object. Takes ownership. 409 /// \arg _OS - The stream object. 410 /// \arg _Emitter - The target independent assembler object.Takes ownership. 411 /// \arg RelaxAll - Relax all fixups? 412 /// \arg NoExecStack - Mark file as not needing a executable stack. 413 MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx, 414 MCAsmBackend &TAB, 415 raw_ostream &_OS, 416 MCCodeEmitter *_Emitter, 417 bool RelaxAll, 418 bool NoExecStack) const { 419 if (!MCObjectStreamerCtorFn) 420 return 0; 421 return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, 422 RelaxAll, NoExecStack); 423 } 424 425 /// createAsmStreamer - Create a target specific MCStreamer. 426 MCStreamer *createAsmStreamer(MCContext &Ctx, 427 formatted_raw_ostream &OS, 428 bool isVerboseAsm, 429 bool useLoc, 430 bool useCFI, 431 bool useDwarfDirectory, 432 MCInstPrinter *InstPrint, 433 MCCodeEmitter *CE, 434 MCAsmBackend *TAB, 435 bool ShowInst) const { 436 // AsmStreamerCtorFn is default to llvm::createAsmStreamer 437 return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI, 438 useDwarfDirectory, InstPrint, CE, TAB, ShowInst); 439 } 440 441 /// @} 442 }; 443 444 /// TargetRegistry - Generic interface to target specific features. 445 struct TargetRegistry { 446 class iterator { 447 const Target *Current; 448 explicit iterator(Target *T) : Current(T) {} 449 friend struct TargetRegistry; 450 public: 451 iterator(const iterator &I) : Current(I.Current) {} 452 iterator() : Current(0) {} 453 454 bool operator==(const iterator &x) const { 455 return Current == x.Current; 456 } 457 bool operator!=(const iterator &x) const { 458 return !operator==(x); 459 } 460 461 // Iterator traversal: forward iteration only 462 iterator &operator++() { // Preincrement 463 assert(Current && "Cannot increment end iterator!"); 464 Current = Current->getNext(); 465 return *this; 466 } 467 iterator operator++(int) { // Postincrement 468 iterator tmp = *this; 469 ++*this; 470 return tmp; 471 } 472 473 const Target &operator*() const { 474 assert(Current && "Cannot dereference end iterator!"); 475 return *Current; 476 } 477 478 const Target *operator->() const { 479 return &operator*(); 480 } 481 }; 482 483 /// printRegisteredTargetsForVersion - Print the registered targets 484 /// appropriately for inclusion in a tool's version output. 485 static void printRegisteredTargetsForVersion(); 486 487 /// @name Registry Access 488 /// @{ 489 490 static iterator begin(); 491 492 static iterator end() { return iterator(); } 493 494 /// lookupTarget - Lookup a target based on a target triple. 495 /// 496 /// \param Triple - The triple to use for finding a target. 497 /// \param Error - On failure, an error string describing why no target was 498 /// found. 499 static const Target *lookupTarget(const std::string &Triple, 500 std::string &Error); 501 502 /// getClosestTargetForJIT - Pick the best target that is compatible with 503 /// the current host. If no close target can be found, this returns null 504 /// and sets the Error string to a reason. 505 /// 506 /// Maintained for compatibility through 2.6. 507 static const Target *getClosestTargetForJIT(std::string &Error); 508 509 /// @} 510 /// @name Target Registration 511 /// @{ 512 513 /// RegisterTarget - Register the given target. Attempts to register a 514 /// target which has already been registered will be ignored. 515 /// 516 /// Clients are responsible for ensuring that registration doesn't occur 517 /// while another thread is attempting to access the registry. Typically 518 /// this is done by initializing all targets at program startup. 519 /// 520 /// @param T - The target being registered. 521 /// @param Name - The target name. This should be a static string. 522 /// @param ShortDesc - A short target description. This should be a static 523 /// string. 524 /// @param TQualityFn - The triple match quality computation function for 525 /// this target. 526 /// @param HasJIT - Whether the target supports JIT code 527 /// generation. 528 static void RegisterTarget(Target &T, 529 const char *Name, 530 const char *ShortDesc, 531 Target::TripleMatchQualityFnTy TQualityFn, 532 bool HasJIT = false); 533 534 /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 535 /// given target. 536 /// 537 /// Clients are responsible for ensuring that registration doesn't occur 538 /// while another thread is attempting to access the registry. Typically 539 /// this is done by initializing all targets at program startup. 540 /// 541 /// @param T - The target being registered. 542 /// @param Fn - A function to construct a MCAsmInfo for the target. 543 static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 544 // Ignore duplicate registration. 545 if (!T.MCAsmInfoCtorFn) 546 T.MCAsmInfoCtorFn = Fn; 547 } 548 549 /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the 550 /// given target. 551 /// 552 /// Clients are responsible for ensuring that registration doesn't occur 553 /// while another thread is attempting to access the registry. Typically 554 /// this is done by initializing all targets at program startup. 555 /// 556 /// @param T - The target being registered. 557 /// @param Fn - A function to construct a MCCodeGenInfo for the target. 558 static void RegisterMCCodeGenInfo(Target &T, 559 Target::MCCodeGenInfoCtorFnTy Fn) { 560 // Ignore duplicate registration. 561 if (!T.MCCodeGenInfoCtorFn) 562 T.MCCodeGenInfoCtorFn = Fn; 563 } 564 565 /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 566 /// given target. 567 /// 568 /// Clients are responsible for ensuring that registration doesn't occur 569 /// while another thread is attempting to access the registry. Typically 570 /// this is done by initializing all targets at program startup. 571 /// 572 /// @param T - The target being registered. 573 /// @param Fn - A function to construct a MCInstrInfo for the target. 574 static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 575 // Ignore duplicate registration. 576 if (!T.MCInstrInfoCtorFn) 577 T.MCInstrInfoCtorFn = Fn; 578 } 579 580 /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 581 /// the given target. 582 static void RegisterMCInstrAnalysis(Target &T, 583 Target::MCInstrAnalysisCtorFnTy Fn) { 584 // Ignore duplicate registration. 585 if (!T.MCInstrAnalysisCtorFn) 586 T.MCInstrAnalysisCtorFn = Fn; 587 } 588 589 /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 590 /// given target. 591 /// 592 /// Clients are responsible for ensuring that registration doesn't occur 593 /// while another thread is attempting to access the registry. Typically 594 /// this is done by initializing all targets at program startup. 595 /// 596 /// @param T - The target being registered. 597 /// @param Fn - A function to construct a MCRegisterInfo for the target. 598 static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 599 // Ignore duplicate registration. 600 if (!T.MCRegInfoCtorFn) 601 T.MCRegInfoCtorFn = Fn; 602 } 603 604 /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 605 /// the given target. 606 /// 607 /// Clients are responsible for ensuring that registration doesn't occur 608 /// while another thread is attempting to access the registry. Typically 609 /// this is done by initializing all targets at program startup. 610 /// 611 /// @param T - The target being registered. 612 /// @param Fn - A function to construct a MCSubtargetInfo for the target. 613 static void RegisterMCSubtargetInfo(Target &T, 614 Target::MCSubtargetInfoCtorFnTy Fn) { 615 // Ignore duplicate registration. 616 if (!T.MCSubtargetInfoCtorFn) 617 T.MCSubtargetInfoCtorFn = Fn; 618 } 619 620 /// RegisterTargetMachine - Register a TargetMachine implementation for the 621 /// given target. 622 /// 623 /// Clients are responsible for ensuring that registration doesn't occur 624 /// while another thread is attempting to access the registry. Typically 625 /// this is done by initializing all targets at program startup. 626 /// 627 /// @param T - The target being registered. 628 /// @param Fn - A function to construct a TargetMachine for the target. 629 static void RegisterTargetMachine(Target &T, 630 Target::TargetMachineCtorTy Fn) { 631 // Ignore duplicate registration. 632 if (!T.TargetMachineCtorFn) 633 T.TargetMachineCtorFn = Fn; 634 } 635 636 /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 637 /// given target. 638 /// 639 /// Clients are responsible for ensuring that registration doesn't occur 640 /// while another thread is attempting to access the registry. Typically 641 /// this is done by initializing all targets at program startup. 642 /// 643 /// @param T - The target being registered. 644 /// @param Fn - A function to construct an AsmBackend for the target. 645 static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 646 if (!T.MCAsmBackendCtorFn) 647 T.MCAsmBackendCtorFn = Fn; 648 } 649 650 /// RegisterMCAsmLexer - Register a MCTargetAsmLexer implementation for the 651 /// given target. 652 /// 653 /// Clients are responsible for ensuring that registration doesn't occur 654 /// while another thread is attempting to access the registry. Typically 655 /// this is done by initializing all targets at program startup. 656 /// 657 /// @param T - The target being registered. 658 /// @param Fn - A function to construct an MCAsmLexer for the target. 659 static void RegisterMCAsmLexer(Target &T, Target::MCAsmLexerCtorTy Fn) { 660 if (!T.MCAsmLexerCtorFn) 661 T.MCAsmLexerCtorFn = Fn; 662 } 663 664 /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 665 /// the given target. 666 /// 667 /// Clients are responsible for ensuring that registration doesn't occur 668 /// while another thread is attempting to access the registry. Typically 669 /// this is done by initializing all targets at program startup. 670 /// 671 /// @param T - The target being registered. 672 /// @param Fn - A function to construct an MCTargetAsmParser for the target. 673 static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 674 if (!T.MCAsmParserCtorFn) 675 T.MCAsmParserCtorFn = Fn; 676 } 677 678 /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 679 /// target. 680 /// 681 /// Clients are responsible for ensuring that registration doesn't occur 682 /// while another thread is attempting to access the registry. Typically 683 /// this is done by initializing all targets at program startup. 684 /// 685 /// @param T - The target being registered. 686 /// @param Fn - A function to construct an AsmPrinter for the target. 687 static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 688 // Ignore duplicate registration. 689 if (!T.AsmPrinterCtorFn) 690 T.AsmPrinterCtorFn = Fn; 691 } 692 693 /// RegisterMCDisassembler - Register a MCDisassembler implementation for 694 /// the given target. 695 /// 696 /// Clients are responsible for ensuring that registration doesn't occur 697 /// while another thread is attempting to access the registry. Typically 698 /// this is done by initializing all targets at program startup. 699 /// 700 /// @param T - The target being registered. 701 /// @param Fn - A function to construct an MCDisassembler for the target. 702 static void RegisterMCDisassembler(Target &T, 703 Target::MCDisassemblerCtorTy Fn) { 704 if (!T.MCDisassemblerCtorFn) 705 T.MCDisassemblerCtorFn = Fn; 706 } 707 708 /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 709 /// given target. 710 /// 711 /// Clients are responsible for ensuring that registration doesn't occur 712 /// while another thread is attempting to access the registry. Typically 713 /// this is done by initializing all targets at program startup. 714 /// 715 /// @param T - The target being registered. 716 /// @param Fn - A function to construct an MCInstPrinter for the target. 717 static void RegisterMCInstPrinter(Target &T, 718 Target::MCInstPrinterCtorTy Fn) { 719 if (!T.MCInstPrinterCtorFn) 720 T.MCInstPrinterCtorFn = Fn; 721 } 722 723 /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 724 /// given target. 725 /// 726 /// Clients are responsible for ensuring that registration doesn't occur 727 /// while another thread is attempting to access the registry. Typically 728 /// this is done by initializing all targets at program startup. 729 /// 730 /// @param T - The target being registered. 731 /// @param Fn - A function to construct an MCCodeEmitter for the target. 732 static void RegisterMCCodeEmitter(Target &T, 733 Target::MCCodeEmitterCtorTy Fn) { 734 if (!T.MCCodeEmitterCtorFn) 735 T.MCCodeEmitterCtorFn = Fn; 736 } 737 738 /// RegisterMCObjectStreamer - Register a object code MCStreamer 739 /// implementation for the given target. 740 /// 741 /// Clients are responsible for ensuring that registration doesn't occur 742 /// while another thread is attempting to access the registry. Typically 743 /// this is done by initializing all targets at program startup. 744 /// 745 /// @param T - The target being registered. 746 /// @param Fn - A function to construct an MCStreamer for the target. 747 static void RegisterMCObjectStreamer(Target &T, 748 Target::MCObjectStreamerCtorTy Fn) { 749 if (!T.MCObjectStreamerCtorFn) 750 T.MCObjectStreamerCtorFn = Fn; 751 } 752 753 /// RegisterAsmStreamer - Register an assembly MCStreamer implementation 754 /// for the given target. 755 /// 756 /// Clients are responsible for ensuring that registration doesn't occur 757 /// while another thread is attempting to access the registry. Typically 758 /// this is done by initializing all targets at program startup. 759 /// 760 /// @param T - The target being registered. 761 /// @param Fn - A function to construct an MCStreamer for the target. 762 static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) { 763 if (T.AsmStreamerCtorFn == createAsmStreamer) 764 T.AsmStreamerCtorFn = Fn; 765 } 766 767 /// @} 768 }; 769 770 771 //===--------------------------------------------------------------------===// 772 773 /// RegisterTarget - Helper template for registering a target, for use in the 774 /// target's initialization function. Usage: 775 /// 776 /// 777 /// Target TheFooTarget; // The global target instance. 778 /// 779 /// extern "C" void LLVMInitializeFooTargetInfo() { 780 /// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 781 /// } 782 template<Triple::ArchType TargetArchType = Triple::InvalidArch, 783 bool HasJIT = false> 784 struct RegisterTarget { 785 RegisterTarget(Target &T, const char *Name, const char *Desc) { 786 TargetRegistry::RegisterTarget(T, Name, Desc, 787 &getTripleMatchQuality, 788 HasJIT); 789 } 790 791 static unsigned getTripleMatchQuality(const std::string &TT) { 792 if (Triple(TT).getArch() == TargetArchType) 793 return 20; 794 return 0; 795 } 796 }; 797 798 /// RegisterMCAsmInfo - Helper template for registering a target assembly info 799 /// implementation. This invokes the static "Create" method on the class to 800 /// actually do the construction. Usage: 801 /// 802 /// extern "C" void LLVMInitializeFooTarget() { 803 /// extern Target TheFooTarget; 804 /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 805 /// } 806 template<class MCAsmInfoImpl> 807 struct RegisterMCAsmInfo { 808 RegisterMCAsmInfo(Target &T) { 809 TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 810 } 811 private: 812 static MCAsmInfo *Allocator(const Target &T, StringRef TT) { 813 return new MCAsmInfoImpl(T, TT); 814 } 815 816 }; 817 818 /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 819 /// implementation. This invokes the specified function to do the 820 /// construction. Usage: 821 /// 822 /// extern "C" void LLVMInitializeFooTarget() { 823 /// extern Target TheFooTarget; 824 /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 825 /// } 826 struct RegisterMCAsmInfoFn { 827 RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 828 TargetRegistry::RegisterMCAsmInfo(T, Fn); 829 } 830 }; 831 832 /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info 833 /// implementation. This invokes the static "Create" method on the class 834 /// to actually do the construction. Usage: 835 /// 836 /// extern "C" void LLVMInitializeFooTarget() { 837 /// extern Target TheFooTarget; 838 /// RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget); 839 /// } 840 template<class MCCodeGenInfoImpl> 841 struct RegisterMCCodeGenInfo { 842 RegisterMCCodeGenInfo(Target &T) { 843 TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator); 844 } 845 private: 846 static MCCodeGenInfo *Allocator(StringRef TT, 847 Reloc::Model RM, CodeModel::Model CM) { 848 return new MCCodeGenInfoImpl(); 849 } 850 }; 851 852 /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen 853 /// info implementation. This invokes the specified function to do the 854 /// construction. Usage: 855 /// 856 /// extern "C" void LLVMInitializeFooTarget() { 857 /// extern Target TheFooTarget; 858 /// RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction); 859 /// } 860 struct RegisterMCCodeGenInfoFn { 861 RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) { 862 TargetRegistry::RegisterMCCodeGenInfo(T, Fn); 863 } 864 }; 865 866 /// RegisterMCInstrInfo - Helper template for registering a target instruction 867 /// info implementation. This invokes the static "Create" method on the class 868 /// to actually do the construction. Usage: 869 /// 870 /// extern "C" void LLVMInitializeFooTarget() { 871 /// extern Target TheFooTarget; 872 /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 873 /// } 874 template<class MCInstrInfoImpl> 875 struct RegisterMCInstrInfo { 876 RegisterMCInstrInfo(Target &T) { 877 TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 878 } 879 private: 880 static MCInstrInfo *Allocator() { 881 return new MCInstrInfoImpl(); 882 } 883 }; 884 885 /// RegisterMCInstrInfoFn - Helper template for registering a target 886 /// instruction info implementation. This invokes the specified function to 887 /// do the construction. Usage: 888 /// 889 /// extern "C" void LLVMInitializeFooTarget() { 890 /// extern Target TheFooTarget; 891 /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 892 /// } 893 struct RegisterMCInstrInfoFn { 894 RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 895 TargetRegistry::RegisterMCInstrInfo(T, Fn); 896 } 897 }; 898 899 /// RegisterMCInstrAnalysis - Helper template for registering a target 900 /// instruction analyzer implementation. This invokes the static "Create" 901 /// method on the class to actually do the construction. Usage: 902 /// 903 /// extern "C" void LLVMInitializeFooTarget() { 904 /// extern Target TheFooTarget; 905 /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 906 /// } 907 template<class MCInstrAnalysisImpl> 908 struct RegisterMCInstrAnalysis { 909 RegisterMCInstrAnalysis(Target &T) { 910 TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 911 } 912 private: 913 static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 914 return new MCInstrAnalysisImpl(Info); 915 } 916 }; 917 918 /// RegisterMCInstrAnalysisFn - Helper template for registering a target 919 /// instruction analyzer implementation. This invokes the specified function 920 /// to do the construction. Usage: 921 /// 922 /// extern "C" void LLVMInitializeFooTarget() { 923 /// extern Target TheFooTarget; 924 /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 925 /// } 926 struct RegisterMCInstrAnalysisFn { 927 RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 928 TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 929 } 930 }; 931 932 /// RegisterMCRegInfo - Helper template for registering a target register info 933 /// implementation. This invokes the static "Create" method on the class to 934 /// actually do the construction. Usage: 935 /// 936 /// extern "C" void LLVMInitializeFooTarget() { 937 /// extern Target TheFooTarget; 938 /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 939 /// } 940 template<class MCRegisterInfoImpl> 941 struct RegisterMCRegInfo { 942 RegisterMCRegInfo(Target &T) { 943 TargetRegistry::RegisterMCRegInfo(T, &Allocator); 944 } 945 private: 946 static MCRegisterInfo *Allocator(StringRef TT) { 947 return new MCRegisterInfoImpl(); 948 } 949 }; 950 951 /// RegisterMCRegInfoFn - Helper template for registering a target register 952 /// info implementation. This invokes the specified function to do the 953 /// construction. Usage: 954 /// 955 /// extern "C" void LLVMInitializeFooTarget() { 956 /// extern Target TheFooTarget; 957 /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 958 /// } 959 struct RegisterMCRegInfoFn { 960 RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 961 TargetRegistry::RegisterMCRegInfo(T, Fn); 962 } 963 }; 964 965 /// RegisterMCSubtargetInfo - Helper template for registering a target 966 /// subtarget info implementation. This invokes the static "Create" method 967 /// on the class to actually do the construction. Usage: 968 /// 969 /// extern "C" void LLVMInitializeFooTarget() { 970 /// extern Target TheFooTarget; 971 /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 972 /// } 973 template<class MCSubtargetInfoImpl> 974 struct RegisterMCSubtargetInfo { 975 RegisterMCSubtargetInfo(Target &T) { 976 TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 977 } 978 private: 979 static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU, 980 StringRef FS) { 981 return new MCSubtargetInfoImpl(); 982 } 983 }; 984 985 /// RegisterMCSubtargetInfoFn - Helper template for registering a target 986 /// subtarget info implementation. This invokes the specified function to 987 /// do the construction. Usage: 988 /// 989 /// extern "C" void LLVMInitializeFooTarget() { 990 /// extern Target TheFooTarget; 991 /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 992 /// } 993 struct RegisterMCSubtargetInfoFn { 994 RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 995 TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 996 } 997 }; 998 999 /// RegisterTargetMachine - Helper template for registering a target machine 1000 /// implementation, for use in the target machine initialization 1001 /// function. Usage: 1002 /// 1003 /// extern "C" void LLVMInitializeFooTarget() { 1004 /// extern Target TheFooTarget; 1005 /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 1006 /// } 1007 template<class TargetMachineImpl> 1008 struct RegisterTargetMachine { 1009 RegisterTargetMachine(Target &T) { 1010 TargetRegistry::RegisterTargetMachine(T, &Allocator); 1011 } 1012 1013 private: 1014 static TargetMachine *Allocator(const Target &T, StringRef TT, 1015 StringRef CPU, StringRef FS, 1016 Reloc::Model RM, 1017 CodeModel::Model CM) { 1018 return new TargetMachineImpl(T, TT, CPU, FS, RM, CM); 1019 } 1020 }; 1021 1022 /// RegisterMCAsmBackend - Helper template for registering a target specific 1023 /// assembler backend. Usage: 1024 /// 1025 /// extern "C" void LLVMInitializeFooMCAsmBackend() { 1026 /// extern Target TheFooTarget; 1027 /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 1028 /// } 1029 template<class MCAsmBackendImpl> 1030 struct RegisterMCAsmBackend { 1031 RegisterMCAsmBackend(Target &T) { 1032 TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 1033 } 1034 1035 private: 1036 static MCAsmBackend *Allocator(const Target &T, StringRef Triple) { 1037 return new MCAsmBackendImpl(T, Triple); 1038 } 1039 }; 1040 1041 /// RegisterMCAsmLexer - Helper template for registering a target specific 1042 /// assembly lexer, for use in the target machine initialization 1043 /// function. Usage: 1044 /// 1045 /// extern "C" void LLVMInitializeFooMCAsmLexer() { 1046 /// extern Target TheFooTarget; 1047 /// RegisterMCAsmLexer<FooMCAsmLexer> X(TheFooTarget); 1048 /// } 1049 template<class MCAsmLexerImpl> 1050 struct RegisterMCAsmLexer { 1051 RegisterMCAsmLexer(Target &T) { 1052 TargetRegistry::RegisterMCAsmLexer(T, &Allocator); 1053 } 1054 1055 private: 1056 static MCTargetAsmLexer *Allocator(const Target &T, 1057 const MCRegisterInfo &MRI, 1058 const MCAsmInfo &MAI) { 1059 return new MCAsmLexerImpl(T, MRI, MAI); 1060 } 1061 }; 1062 1063 /// RegisterMCAsmParser - Helper template for registering a target specific 1064 /// assembly parser, for use in the target machine initialization 1065 /// function. Usage: 1066 /// 1067 /// extern "C" void LLVMInitializeFooMCAsmParser() { 1068 /// extern Target TheFooTarget; 1069 /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 1070 /// } 1071 template<class MCAsmParserImpl> 1072 struct RegisterMCAsmParser { 1073 RegisterMCAsmParser(Target &T) { 1074 TargetRegistry::RegisterMCAsmParser(T, &Allocator); 1075 } 1076 1077 private: 1078 static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) { 1079 return new MCAsmParserImpl(STI, P); 1080 } 1081 }; 1082 1083 /// RegisterAsmPrinter - Helper template for registering a target specific 1084 /// assembly printer, for use in the target machine initialization 1085 /// function. Usage: 1086 /// 1087 /// extern "C" void LLVMInitializeFooAsmPrinter() { 1088 /// extern Target TheFooTarget; 1089 /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 1090 /// } 1091 template<class AsmPrinterImpl> 1092 struct RegisterAsmPrinter { 1093 RegisterAsmPrinter(Target &T) { 1094 TargetRegistry::RegisterAsmPrinter(T, &Allocator); 1095 } 1096 1097 private: 1098 static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) { 1099 return new AsmPrinterImpl(TM, Streamer); 1100 } 1101 }; 1102 1103 /// RegisterMCCodeEmitter - Helper template for registering a target specific 1104 /// machine code emitter, for use in the target initialization 1105 /// function. Usage: 1106 /// 1107 /// extern "C" void LLVMInitializeFooMCCodeEmitter() { 1108 /// extern Target TheFooTarget; 1109 /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 1110 /// } 1111 template<class MCCodeEmitterImpl> 1112 struct RegisterMCCodeEmitter { 1113 RegisterMCCodeEmitter(Target &T) { 1114 TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 1115 } 1116 1117 private: 1118 static MCCodeEmitter *Allocator(const MCInstrInfo &II, 1119 const MCSubtargetInfo &STI, 1120 MCContext &Ctx) { 1121 return new MCCodeEmitterImpl(); 1122 } 1123 }; 1124 1125 } 1126 1127 #endif 1128