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