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