TargetRegistry.h revision 3e74d6fdd248e20a280f1dff3da9a6c689c2c4c3
13e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng//===-- Support/TargetRegistry.h - Target Registration ----------*- C++ -*-===// 2bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 3bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// The LLVM Compiler Infrastructure 4bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 5bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file is distributed under the University of Illinois Open Source 6bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// License. See LICENSE.TXT for details. 7bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 8bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===// 9bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 10bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// This file exposes the TargetRegistry interface, which tools can use to access 11bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// the appropriate target specific classes (TargetMachine, AsmPrinter, etc.) 12bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// which have been registered. 13bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 14bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// Target specific class implementations should register themselves using the 15bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// appropriate TargetRegistry interfaces. 16bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar// 17bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar//===----------------------------------------------------------------------===// 18bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 193e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#ifndef LLVM_SUPPORT_TARGETREGISTRY_H 203e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#define LLVM_SUPPORT_TARGETREGISTRY_H 21bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#include "llvm/Support/CodeGen.h" 238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h" 24bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <string> 25bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert> 26bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 27bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbarnamespace llvm { 28789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar class AsmPrinter; 29bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class Module; 30e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar class MCAssembler; 3194b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCAsmBackend; 32af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner class MCAsmInfo; 3356591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCAsmParser; 3456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCCodeEmitter; 3594b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCCodeGenInfo; 3656591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCContext; 37251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan class MCDisassembler; 387801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng class MCInstrAnalysis; 3990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class MCInstPrinter; 4094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng class MCInstrInfo; 41a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng class MCRegisterInfo; 4256591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCStreamer; 43ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng class MCSubtargetInfo; 4494b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCTargetAsmLexer; 4594b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCTargetAsmParser; 46bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class TargetMachine; 4790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class raw_ostream; 486da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou class formatted_raw_ostream; 496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 5189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool isVerboseAsm, 52f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useLoc, bool useCFI, 536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 5578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 56e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 57bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 58bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Target - Wrapper for Target specific information. 59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 60bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// For registration purposes, this is a POD type so that targets can be 61bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// registered without the use of static constructors. 6273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// 6373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Targets should implement a single global instance of this class (which 6473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// will be zero initialized), and pass that instance to the TargetRegistry as 6573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// part of their initialization. 6673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar class Target { 67a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner public: 68a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner friend struct TargetRegistry; 69a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT); 71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const Target &T, 731abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng StringRef TT); 7434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT, 7534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 7634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model CM); 7794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 7841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info); 790e6a052331f674dd70e28af41f654a7874405eabEvan Cheng typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT); 80ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT, 81ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef CPU, 82ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features); 83a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T, 84439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef TT, 85439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, 86439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef Features, 8734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 8834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model CM); 89b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM, 9011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner MCStreamer &Streamer); 9178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, StringRef TT); 9294b9550a32d189704a8eae55505edf62662c0534Evan Cheng typedef MCTargetAsmLexer *(*MCAsmLexerCtorTy)(const Target &T, 9394b9550a32d189704a8eae55505edf62662c0534Evan Cheng const MCRegisterInfo &MRI, 9494b9550a32d189704a8eae55505edf62662c0534Evan Cheng const MCAsmInfo &MAI); 9594b9550a32d189704a8eae55505edf62662c0534Evan Cheng typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI, 9694b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParser &P); 975d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T); 9890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T, 9990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner unsigned SyntaxVariant, 100d374087be5360a353a4239a155b1227057145f48Chris Lattner const MCAsmInfo &MAI); 10128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 10228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 10328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx); 10428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T, 10528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng StringRef TT, 10628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx, 10728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 10828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 10928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 11028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 11128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack); 1126da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx, 1136da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 1146da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 11589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 116f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 1176da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 1186da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 11978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 120e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 1214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 122a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 123bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Next - The next registered target in the linked list, maintained by the 124bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry. 125bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target *Next; 126bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 127bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TripleMatchQualityFn - The target function for rating the match quality 128bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// of a triple. 129bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TripleMatchQualityFnTy TripleMatchQualityFn; 130bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 131bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Name - The target name. 132bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name; 133bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 134bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// ShortDesc - A short description of the target. 135bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc; 136bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 137d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// HasJIT - Whether this target supports the JIT. 138d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT; 139d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar 1401abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if 141a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// registered. 1421abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCAsmInfoCtorFnTy MCAsmInfoCtorFn; 14324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 144439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// MCCodeGenInfoCtorFn - Constructor function for this target's MCCodeGenInfo, 145439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// if registered. 146439661395fd2a2a832dba01c65bc88718528313cEvan Cheng MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn; 147439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 14894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, 14994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// if registered. 15094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfoCtorFnTy MCInstrInfoCtorFn; 15194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 15241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysisCtorFn - Constructor function for this target's 15341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysis, if registered. 15441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn; 15541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 156f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo, 157a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// if registered. 158f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng MCRegInfoCtorFnTy MCRegInfoCtorFn; 159a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 160ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfoCtorFn - Constructor function for this target's 161ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfo, if registered. 162ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn; 163ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 164bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachineCtorFn - Construction function for this target's 165bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachine, if registered. 166bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TargetMachineCtorTy TargetMachineCtorFn; 167bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 16878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackendCtorFn - Construction function for this target's 16978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackend, if registered. 17078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackendCtorTy MCAsmBackendCtorFn; 171e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 17294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCAsmLexerCtorFn - Construction function for this target's 17394b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCTargetAsmLexer, if registered. 17494b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmLexerCtorTy MCAsmLexerCtorFn; 17524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 17694b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCAsmParserCtorFn - Construction function for this target's 17794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCTargetAsmParser, if registered. 17894b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParserCtorTy MCAsmParserCtorFn; 17924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 18024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter, 18124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// if registered. 18224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar AsmPrinterCtorTy AsmPrinterCtorFn; 18324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 184251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassemblerCtorFn - Construction function for this target's 185251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassembler, if registered. 186251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan MCDisassemblerCtorTy MCDisassemblerCtorFn; 187092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 18824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// MCInstPrinterCtorFn - Construction function for this target's 18990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// MCInstPrinter, if registered. 19090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner MCInstPrinterCtorTy MCInstPrinterCtorFn; 19124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 19228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCCodeEmitterCtorFn - Construction function for this target's 19328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// CodeEmitter, if registered. 19428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitterCtorTy MCCodeEmitterCtorFn; 1954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 19628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamerCtorFn - Construction function for this target's 19728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamer, if registered. 19828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCObjectStreamerCtorTy MCObjectStreamerCtorFn; 199d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2006da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamerCtorFn - Construction function for this target's 2016da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamer, if registered (default = llvm::createAsmStreamer). 2026da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou AsmStreamerCtorTy AsmStreamerCtorFn; 2036da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 204bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar public: 2056da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {} 2066da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Target Information 2084a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2094a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 210c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar // getNext - Return the next registered target. 211c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar const Target *getNext() const { return Next; } 212c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar 213bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getName - Get the target name. 214bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getName() const { return Name; } 215bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 216bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getShortDescription - Get a short description of the target. 217bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getShortDescription() const { return ShortDesc; } 218bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 2194a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2204a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Predicates 2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 2234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// hasJIT - Check if this targets supports the just-in-time compilation. 224d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool hasJIT() const { return HasJIT; } 22551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 226603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar /// hasTargetMachine - Check if this target supports code generation. 227603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool hasTargetMachine() const { return TargetMachineCtorFn != 0; } 228603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 22978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// hasMCAsmBackend - Check if this target supports .o generation. 23078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; } 231e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 23294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// hasMCAsmLexer - Check if this target supports .s lexing. 23394b9550a32d189704a8eae55505edf62662c0534Evan Cheng bool hasMCAsmLexer() const { return MCAsmLexerCtorFn != 0; } 234603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 235092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// hasAsmParser - Check if this target supports .s parsing. 23694b9550a32d189704a8eae55505edf62662c0534Evan Cheng bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; } 23724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 23824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// hasAsmPrinter - Check if this target supports .s printing. 23924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; } 24024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 241251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// hasMCDisassembler - Check if this target has a disassembler. 242251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; } 243092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 24490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// hasMCInstPrinter - Check if this target has an instruction printer. 24590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; } 24690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner 24728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCCodeEmitter - Check if this target supports instruction encoding. 24828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; } 2494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 25028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCObjectStreamer - Check if this target supports streaming to files. 25128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; } 252d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// hasAsmStreamer - Check if this target supports streaming to files. 2546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; } 2556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2564a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Constructors 2584a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 25924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2601abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 261a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// target triple. 262a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 263a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// \arg Triple - This argument is used to determine the target machine 264a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// feature set; it should always be provided. Generally this should be 265a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// either the target triple from the module, or the target triple of the 266a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// host if that does not exist. 2671abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCAsmInfo *createMCAsmInfo(StringRef Triple) const { 2681abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!MCAsmInfoCtorFn) 269a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner return 0; 2701abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng return MCAsmInfoCtorFn(*this, Triple); 271a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 27224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 273439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation. 274439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 27534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM, 27634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model CM) const { 277439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!MCCodeGenInfoCtorFn) 278439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return 0; 27934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng return MCCodeGenInfoCtorFn(Triple, RM, CM); 280439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 281439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 28294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// createMCInstrInfo - Create a MCInstrInfo implementation. 28394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 28494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfo *createMCInstrInfo() const { 28594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!MCInstrInfoCtorFn) 28694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return 0; 28794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return MCInstrInfoCtorFn(); 28894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 28994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 29041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 29141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// 29241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 29341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!MCInstrAnalysisCtorFn) 2947801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return 0; 29541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer return MCInstrAnalysisCtorFn(Info); 29641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 29741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 298f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// createMCRegInfo - Create a MCRegisterInfo implementation. 299a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 3000e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *createMCRegInfo(StringRef Triple) const { 301f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!MCRegInfoCtorFn) 302a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return 0; 3030e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return MCRegInfoCtorFn(Triple); 304a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 305a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 306ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 307ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 308ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// \arg Triple - This argument is used to determine the target machine 309ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// feature set; it should always be provided. Generally this should be 310ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// either the target triple from the module, or the target triple of the 311ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// host if that does not exist. 312ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// \arg CPU - This specifies the name of the target CPU. 313ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// \arg Features - This specifies the string representation of the 314ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// additional target features. 315ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU, 316ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features) const { 317ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!MCSubtargetInfoCtorFn) 318ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return 0; 319ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return MCSubtargetInfoCtorFn(Triple, CPU, Features); 320ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 321ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 3223c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// createTargetMachine - Create a target specific machine implementation 323a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// for the specified \arg Triple. 3243c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// 3253c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// \arg Triple - This argument is used to determine the target machine 3263c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// feature set; it should always be provided. Generally this should be 3273c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// either the target triple from the module, or the target triple of the 3283c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// host if that does not exist. 329439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU, 33034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng StringRef Features, 33134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM = Reloc::Default, 33234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model CM = CodeModel::Default) const { 333bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar if (!TargetMachineCtorFn) 334bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar return 0; 33534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng return TargetMachineCtorFn(*this, Triple, CPU, Features, RM, CM); 336214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar } 337bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 33878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// createMCAsmBackend - Create a target specific assembly parser. 339e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 3406c27f5e5743481c6a519c60135cf85ac238c150aDaniel Dunbar /// \arg Triple - The target triple string. 341e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// \arg Backend - The target independent assembler object. 34278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *createMCAsmBackend(StringRef Triple) const { 34378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!MCAsmBackendCtorFn) 344e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar return 0; 34578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng return MCAsmBackendCtorFn(*this, Triple); 346e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 347e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 34894b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// createMCAsmLexer - Create a target specific assembly lexer. 349a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// 35094b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCTargetAsmLexer *createMCAsmLexer(const MCRegisterInfo &MRI, 35194b9550a32d189704a8eae55505edf62662c0534Evan Cheng const MCAsmInfo &MAI) const { 35294b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!MCAsmLexerCtorFn) 353a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner return 0; 35494b9550a32d189704a8eae55505edf62662c0534Evan Cheng return MCAsmLexerCtorFn(*this, MRI, MAI); 355a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner } 35624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 35794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// createMCAsmParser - Create a target specific assembly parser. 358a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// 359a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// \arg Parser - The target independent parser implementation to use for 360a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// parsing and lexing. 36194b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI, 36294b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParser &Parser) const { 36394b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!MCAsmParserCtorFn) 364092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar return 0; 36594b9550a32d189704a8eae55505edf62662c0534Evan Cheng return MCAsmParserCtorFn(STI, Parser); 366092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar } 36724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 36824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// createAsmPrinter - Create a target specific assembly printer pass. This 36911d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner /// takes ownership of the MCStreamer object. 370b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{ 37124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!AsmPrinterCtorFn) 37224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar return 0; 373b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return AsmPrinterCtorFn(TM, Streamer); 37424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 37524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 3765d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar MCDisassembler *createMCDisassembler() const { 377251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!MCDisassemblerCtorFn) 378251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan return 0; 379251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan return MCDisassemblerCtorFn(*this); 380251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 3814a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 382b262799d49891b036daa00eddf51947487346c98Evan Cheng MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant, 383d374087be5360a353a4239a155b1227057145f48Chris Lattner const MCAsmInfo &MAI) const { 38490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!MCInstPrinterCtorFn) 38590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner return 0; 386b262799d49891b036daa00eddf51947487346c98Evan Cheng return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI); 38790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 38824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 38924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 39028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCCodeEmitter - Create a target specific code emitter. 39128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 39228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 39328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx) const { 39428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCCodeEmitterCtorFn) 3954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar return 0; 39628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return MCCodeEmitterCtorFn(II, STI, Ctx); 3974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 3984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 39928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCObjectStreamer - Create a target specific MCStreamer. 400d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 401d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// \arg TT - The target triple. 402d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// \arg Ctx - The target context. 4031abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// \arg TAB - The target assembler backend object. Takes ownership. 404d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// \arg _OS - The stream object. 4051abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer /// \arg _Emitter - The target independent assembler object.Takes ownership. 406d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// \arg RelaxAll - Relax all fixups? 40796aa78c8c5ef1a5f268539c9edc86569b436d573Rafael Espindola /// \arg NoExecStack - Mark file as not needing a executable stack. 40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx, 40928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 41028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 41128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 41228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 41328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack) const { 41428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCObjectStreamerCtorFn) 415d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming return 0; 41628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, 41728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RelaxAll, NoExecStack); 418d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 419d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 4206da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// createAsmStreamer - Create a target specific MCStreamer. 4216da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, 4226da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 4236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 42489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 425f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 4266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 4276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 42878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 429e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst) const { 4306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou // AsmStreamerCtorFn is default to llvm::createAsmStreamer 431f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI, 432e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling InstPrint, CE, TAB, ShowInst); 4336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 4346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 4354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 436bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 437bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 438bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry - Generic interface to target specific features. 439bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar struct TargetRegistry { 440603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar class iterator { 441603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *Current; 442603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar explicit iterator(Target *T) : Current(T) {} 443edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar friend struct TargetRegistry; 444603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar public: 445603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator(const iterator &I) : Current(I.Current) {} 446603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator() : Current(0) {} 447603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 448603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator==(const iterator &x) const { 449603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return Current == x.Current; 450603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 451603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator!=(const iterator &x) const { 452603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return !operator==(x); 453603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 454603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 455603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar // Iterator traversal: forward iteration only 456603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator &operator++() { // Preincrement 457603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot increment end iterator!"); 458c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar Current = Current->getNext(); 459603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *this; 460603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 461603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator operator++(int) { // Postincrement 46224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar iterator tmp = *this; 46324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar ++*this; 464603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return tmp; 465603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 466603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 467603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target &operator*() const { 468603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot dereference end iterator!"); 469603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *Current; 470603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 471603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 472603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *operator->() const { 473603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return &operator*(); 474603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 475603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar }; 476603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 477077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// printRegisteredTargetsForVersion - Print the registered targets 478077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// appropriately for inclusion in a tool's version output. 479077c40871780136f7016a496703b20ebea9c0978Chandler Carruth static void printRegisteredTargetsForVersion(); 480077c40871780136f7016a496703b20ebea9c0978Chandler Carruth 481bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Registry Access 482bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 483bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 484603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator begin(); 485603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 486603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator end() { return iterator(); } 487603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 488a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// lookupTarget - Lookup a target based on a target triple. 489a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 490a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Triple - The triple to use for finding a target. 491a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Error - On failure, an error string describing why no target was 492a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// found. 493a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar static const Target *lookupTarget(const std::string &Triple, 494a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar std::string &Error); 495bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 496bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getClosestTargetForJIT - Pick the best target that is compatible with 497bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// the current host. If no close target can be found, this returns null 498bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// and sets the Error string to a reason. 499a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 500011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar /// Maintained for compatibility through 2.6. 5014bd03abe593222b26e84066223feb321bf738625Daniel Dunbar static const Target *getClosestTargetForJIT(std::string &Error); 502bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 503bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 504bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Target Registration 505bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 506bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 50751b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// RegisterTarget - Register the given target. Attempts to register a 50851b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// target which has already been registered will be ignored. 50924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 51073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 51173b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 51273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 513bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 514bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 515bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Name - The target name. This should be a static string. 516bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param ShortDesc - A short target description. This should be a static 51724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// string. 518bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param TQualityFn - The triple match quality computation function for 519bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// this target. 520d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// @param HasJIT - Whether the target supports JIT code 521d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// generation. 522bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar static void RegisterTarget(Target &T, 523bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name, 524bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc, 525bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TripleMatchQualityFnTy TQualityFn, 526d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT = false); 527a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 5281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 529a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// given target. 53024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 531a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// Clients are responsible for ensuring that registration doesn't occur 532a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// while another thread is attempting to access the registry. Typically 533a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// this is done by initializing all targets at program startup. 53424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 535a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// @param T - The target being registered. 536af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// @param Fn - A function to construct a MCAsmInfo for the target. 5371abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 538a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner // Ignore duplicate registration. 5391abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!T.MCAsmInfoCtorFn) 5401abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng T.MCAsmInfoCtorFn = Fn; 541a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 54224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 543439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the 544439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// given target. 545439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 546439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 547439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// while another thread is attempting to access the registry. Typically 548439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// this is done by initializing all targets at program startup. 549439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 550439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param T - The target being registered. 551439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param Fn - A function to construct a MCCodeGenInfo for the target. 552439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static void RegisterMCCodeGenInfo(Target &T, 553439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Target::MCCodeGenInfoCtorFnTy Fn) { 554439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // Ignore duplicate registration. 555439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!T.MCCodeGenInfoCtorFn) 556439661395fd2a2a832dba01c65bc88718528313cEvan Cheng T.MCCodeGenInfoCtorFn = Fn; 557439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 558439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 55994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 56094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// given target. 56194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 56294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 56394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// while another thread is attempting to access the registry. Typically 56494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// this is done by initializing all targets at program startup. 56594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 56694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param T - The target being registered. 56794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param Fn - A function to construct a MCInstrInfo for the target. 56894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 56994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng // Ignore duplicate registration. 57094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!T.MCInstrInfoCtorFn) 57194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng T.MCInstrInfoCtorFn = Fn; 57294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 57394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 57441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 57541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// the given target. 57641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer static void RegisterMCInstrAnalysis(Target &T, 57741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer Target::MCInstrAnalysisCtorFnTy Fn) { 57841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer // Ignore duplicate registration. 57941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!T.MCInstrAnalysisCtorFn) 58041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer T.MCInstrAnalysisCtorFn = Fn; 58141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 58241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 583f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 584a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// given target. 585a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 586a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 587a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// while another thread is attempting to access the registry. Typically 588a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// this is done by initializing all targets at program startup. 589a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 590a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param T - The target being registered. 591a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param Fn - A function to construct a MCRegisterInfo for the target. 592f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 593a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng // Ignore duplicate registration. 594f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!T.MCRegInfoCtorFn) 595f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng T.MCRegInfoCtorFn = Fn; 596a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 597a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 598ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 599ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// the given target. 600ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 601ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// Clients are responsible for ensuring that registration doesn't occur 602ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// while another thread is attempting to access the registry. Typically 603ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// this is done by initializing all targets at program startup. 604ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 605ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param T - The target being registered. 606ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param Fn - A function to construct a MCSubtargetInfo for the target. 607ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static void RegisterMCSubtargetInfo(Target &T, 608ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng Target::MCSubtargetInfoCtorFnTy Fn) { 609ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng // Ignore duplicate registration. 610ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!T.MCSubtargetInfoCtorFn) 611ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng T.MCSubtargetInfoCtorFn = Fn; 612ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 613ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 614bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// RegisterTargetMachine - Register a TargetMachine implementation for the 615bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// given target. 61624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 61773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 61873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 61973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 62024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 621bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 622bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Fn - A function to construct a TargetMachine for the target. 62324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterTargetMachine(Target &T, 624bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TargetMachineCtorTy Fn) { 625092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar // Ignore duplicate registration. 626092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar if (!T.TargetMachineCtorFn) 627092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar T.TargetMachineCtorFn = Fn; 628bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 629bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 63078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 631e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// given target. 632e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 633e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 634e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// while another thread is attempting to access the registry. Typically 635e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// this is done by initializing all targets at program startup. 636e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 637e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param T - The target being registered. 638e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param Fn - A function to construct an AsmBackend for the target. 63978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 64078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!T.MCAsmBackendCtorFn) 64178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng T.MCAsmBackendCtorFn = Fn; 642e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 643e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 64494b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmLexer - Register a MCTargetAsmLexer implementation for the 645a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// given target. 64624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 647a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// Clients are responsible for ensuring that registration doesn't occur 648a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// while another thread is attempting to access the registry. Typically 649a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// this is done by initializing all targets at program startup. 650a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// 651a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// @param T - The target being registered. 65294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// @param Fn - A function to construct an MCAsmLexer for the target. 65394b9550a32d189704a8eae55505edf62662c0534Evan Cheng static void RegisterMCAsmLexer(Target &T, Target::MCAsmLexerCtorTy Fn) { 65494b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!T.MCAsmLexerCtorFn) 65594b9550a32d189704a8eae55505edf62662c0534Evan Cheng T.MCAsmLexerCtorFn = Fn; 656a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner } 65724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 65894b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 65994b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// the given target. 66024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 661092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 662092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// while another thread is attempting to access the registry. Typically 663092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// this is done by initializing all targets at program startup. 664092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// 665092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// @param T - The target being registered. 66694b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// @param Fn - A function to construct an MCTargetAsmParser for the target. 66794b9550a32d189704a8eae55505edf62662c0534Evan Cheng static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 66894b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!T.MCAsmParserCtorFn) 66994b9550a32d189704a8eae55505edf62662c0534Evan Cheng T.MCAsmParserCtorFn = Fn; 670bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 67124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 67224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 67324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// target. 67424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 67524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 67624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// while another thread is attempting to access the registry. Typically 67724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// this is done by initializing all targets at program startup. 67824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 67924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param T - The target being registered. 68024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an AsmPrinter for the target. 68124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 68224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar // Ignore duplicate registration. 68324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!T.AsmPrinterCtorFn) 68424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar T.AsmPrinterCtorFn = Fn; 68524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 68624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 687251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// RegisterMCDisassembler - Register a MCDisassembler implementation for 688251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the given target. 68924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 690251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// Clients are responsible for ensuring that registration doesn't occur 691251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// while another thread is attempting to access the registry. Typically 692251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// this is done by initializing all targets at program startup. 693251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 694251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param T - The target being registered. 695251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param Fn - A function to construct an MCDisassembler for the target. 69624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterMCDisassembler(Target &T, 697251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan Target::MCDisassemblerCtorTy Fn) { 698251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!T.MCDisassemblerCtorFn) 699251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan T.MCDisassemblerCtorFn = Fn; 700251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 701bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 7022685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 7032685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// given target. 70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 7052685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7062685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// while another thread is attempting to access the registry. Typically 7072685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// this is done by initializing all targets at program startup. 7082685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7092685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param T - The target being registered. 7102685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param Fn - A function to construct an MCInstPrinter for the target. 71190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner static void RegisterMCInstPrinter(Target &T, 71290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner Target::MCInstPrinterCtorTy Fn) { 71390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!T.MCInstPrinterCtorFn) 71490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner T.MCInstPrinterCtorFn = Fn; 71590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 71624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 71728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 7184a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// given target. 7192685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7204a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// while another thread is attempting to access the registry. Typically 7224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// this is done by initializing all targets at program startup. 7234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 7244a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @param T - The target being registered. 72524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an MCCodeEmitter for the target. 72628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCCodeEmitter(Target &T, 72728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCCodeEmitterCtorTy Fn) { 72828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCCodeEmitterCtorFn) 72928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCCodeEmitterCtorFn = Fn; 7304a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 7314a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 73228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCObjectStreamer - Register a object code MCStreamer 73328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// implementation for the given target. 734d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 735d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// Clients are responsible for ensuring that registration doesn't occur 736d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// while another thread is attempting to access the registry. Typically 737d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// this is done by initializing all targets at program startup. 738d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 739d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param T - The target being registered. 740d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param Fn - A function to construct an MCStreamer for the target. 74128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCObjectStreamer(Target &T, 74228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCObjectStreamerCtorTy Fn) { 74328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCObjectStreamerCtorFn) 74428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCObjectStreamerCtorFn = Fn; 745d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 746d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 7476da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// RegisterAsmStreamer - Register an assembly MCStreamer implementation 7486da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// for the given target. 7496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// Clients are responsible for ensuring that registration doesn't occur 7516da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// while another thread is attempting to access the registry. Typically 7526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// this is done by initializing all targets at program startup. 7536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param T - The target being registered. 7556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param Fn - A function to construct an MCStreamer for the target. 7566da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) { 7576da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou if (T.AsmStreamerCtorFn == createAsmStreamer) 7586da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou T.AsmStreamerCtorFn = Fn; 7596da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 7606da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 761bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 762bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 763bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 7640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 7650c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar //===--------------------------------------------------------------------===// 7660c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 7670c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTarget - Helper template for registering a target, for use in the 7680c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// target's initialization function. Usage: 7690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 7700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 7710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// Target TheFooTarget; // The global target instance. 7720c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 7730c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTargetInfo() { 7748977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar /// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 7750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 7768977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar template<Triple::ArchType TargetArchType = Triple::InvalidArch, 7778977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar bool HasJIT = false> 7780c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTarget { 7790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTarget(Target &T, const char *Name, const char *Desc) { 7800c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTarget(T, Name, Desc, 7818977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar &getTripleMatchQuality, 7828977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar HasJIT); 7838977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar } 7848977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar 7858977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar static unsigned getTripleMatchQuality(const std::string &TT) { 7865026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer if (Triple(TT).getArch() == TargetArchType) 7878977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 20; 7888977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 0; 7890c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 7900c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 7910c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 7921abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Helper template for registering a target assembly info 793a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the static "Create" method on the class to 794a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// actually do the construction. Usage: 795a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 796a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 797a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 7981abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 799a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 800af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner template<class MCAsmInfoImpl> 8011abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfo { 8021abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfo(Target &T) { 8031abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 804a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 805a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 8065d067fe1580772a8e012ff0acc06e21e9b95d340Daniel Dunbar static MCAsmInfo *Allocator(const Target &T, StringRef TT) { 807af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner return new MCAsmInfoImpl(T, TT); 808a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 80924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 810a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 811a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 8121abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 813a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the specified function to do the 814a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// construction. Usage: 815a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 816a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 817a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 8181abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 819a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 8201abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfoFn { 8211abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 8221abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, Fn); 82394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 82494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 82594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 826439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info 827439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// implementation. This invokes the static "Create" method on the class 828439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// to actually do the construction. Usage: 829439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 830439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 831439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 832439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget); 833439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 834439661395fd2a2a832dba01c65bc88718528313cEvan Cheng template<class MCCodeGenInfoImpl> 835439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfo { 836439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfo(Target &T) { 837439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator); 838439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 839439661395fd2a2a832dba01c65bc88718528313cEvan Cheng private: 84034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng static MCCodeGenInfo *Allocator(StringRef TT, 84134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, CodeModel::Model CM) { 842439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return new MCCodeGenInfoImpl(); 843439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 844439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 845439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 846439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen 847439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// info implementation. This invokes the specified function to do the 848439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// construction. Usage: 849439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 850439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 851439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 852439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction); 853439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 854439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfoFn { 855439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) { 856439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, Fn); 857439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 858439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 859439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 86094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Helper template for registering a target instruction 86194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// info implementation. This invokes the static "Create" method on the class 86294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// to actually do the construction. Usage: 86394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 86494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 86594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 86694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 86794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 86894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng template<class MCInstrInfoImpl> 86994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfo { 87094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfo(Target &T) { 87194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 87294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 87394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng private: 87494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static MCInstrInfo *Allocator() { 87594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return new MCInstrInfoImpl(); 87694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 87794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 87894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 87994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn - Helper template for registering a target 88094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// instruction info implementation. This invokes the specified function to 88194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// do the construction. Usage: 88294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 88394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 88494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 88594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 88694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 88794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfoFn { 88894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 88994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, Fn); 890a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 891a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 892a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 8937801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis - Helper template for registering a target 8947801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the static "Create" 8957801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// method on the class to actually do the construction. Usage: 8967801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 8977801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 8987801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 8997801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 9007801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9017801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng template<class MCInstrAnalysisImpl> 9027801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysis { 9037801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysis(Target &T) { 9047801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 9057801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9067801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng private: 9077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 9087801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return new MCInstrAnalysisImpl(Info); 9097801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9107801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9117801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 9127801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn - Helper template for registering a target 9137801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the specified function 9147801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// to do the construction. Usage: 9157801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 9167801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 9177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 9187801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 9197801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9207801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysisFn { 9217801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 9227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 9237801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9247801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9257801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 926f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Helper template for registering a target register info 927f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// implementation. This invokes the static "Create" method on the class to 928f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// actually do the construction. Usage: 929f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 930f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 931f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 932f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 933f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 934f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng template<class MCRegisterInfoImpl> 935f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfo { 936f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfo(Target &T) { 937f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, &Allocator); 938f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 939f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng private: 9400e6a052331f674dd70e28af41f654a7874405eabEvan Cheng static MCRegisterInfo *Allocator(StringRef TT) { 941f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng return new MCRegisterInfoImpl(); 942f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 943f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 944f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng 945f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn - Helper template for registering a target register 946f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// info implementation. This invokes the specified function to do the 947f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// construction. Usage: 948f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 949f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 950f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 951f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 952f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 953f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfoFn { 954f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 955f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, Fn); 956f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 957f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 958a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 959ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Helper template for registering a target 960ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the static "Create" method 961ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// on the class to actually do the construction. Usage: 962ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 963ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 964ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 965ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 966ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 967ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng template<class MCSubtargetInfoImpl> 968ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfo { 969ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfo(Target &T) { 970ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 971ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 972ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng private: 973ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU, 974ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef FS) { 975ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return new MCSubtargetInfoImpl(); 976ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 977ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 978ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 979ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn - Helper template for registering a target 980ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the specified function to 981ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// do the construction. Usage: 982ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 983ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 984ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 985ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 986ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 987ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfoFn { 988ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 989ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 990ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 991ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 992ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 9930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine - Helper template for registering a target machine 9940c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// implementation, for use in the target machine initialization 9950c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// function. Usage: 9960c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 9970c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTarget() { 9980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 9990c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 10000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 10010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar template<class TargetMachineImpl> 10020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTargetMachine { 10030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTargetMachine(Target &T) { 10040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTargetMachine(T, &Allocator); 10050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 10070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1008439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static TargetMachine *Allocator(const Target &T, StringRef TT, 1009439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, StringRef FS, 101034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 101134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CodeModel::Model CM) { 101234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng return new TargetMachineImpl(T, TT, CPU, FS, RM, CM); 1013e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar } 1014e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar }; 1015e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar 101678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Helper template for registering a target specific 1017e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// assembler backend. Usage: 1018e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 101978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// extern "C" void LLVMInitializeFooMCAsmBackend() { 1020e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// extern Target TheFooTarget; 102178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 1022e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// } 102378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng template<class MCAsmBackendImpl> 102478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng struct RegisterMCAsmBackend { 102578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng RegisterMCAsmBackend(Target &T) { 102678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 1027e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1028e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 1029e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar private: 103078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng static MCAsmBackend *Allocator(const Target &T, StringRef Triple) { 103178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng return new MCAsmBackendImpl(T, Triple); 1032e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1033e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar }; 1034e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 103594b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmLexer - Helper template for registering a target specific 1036a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// assembly lexer, for use in the target machine initialization 1037a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// function. Usage: 1038a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// 103994b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// extern "C" void LLVMInitializeFooMCAsmLexer() { 1040a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// extern Target TheFooTarget; 104194b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmLexer<FooMCAsmLexer> X(TheFooTarget); 1042a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner /// } 104394b9550a32d189704a8eae55505edf62662c0534Evan Cheng template<class MCAsmLexerImpl> 104494b9550a32d189704a8eae55505edf62662c0534Evan Cheng struct RegisterMCAsmLexer { 104594b9550a32d189704a8eae55505edf62662c0534Evan Cheng RegisterMCAsmLexer(Target &T) { 104694b9550a32d189704a8eae55505edf62662c0534Evan Cheng TargetRegistry::RegisterMCAsmLexer(T, &Allocator); 1047a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner } 104824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 1049a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner private: 105094b9550a32d189704a8eae55505edf62662c0534Evan Cheng static MCTargetAsmLexer *Allocator(const Target &T, 105194b9550a32d189704a8eae55505edf62662c0534Evan Cheng const MCRegisterInfo &MRI, 105294b9550a32d189704a8eae55505edf62662c0534Evan Cheng const MCAsmInfo &MAI) { 105394b9550a32d189704a8eae55505edf62662c0534Evan Cheng return new MCAsmLexerImpl(T, MRI, MAI); 1054a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner } 1055a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner }; 1056a27f64f3e34ee82f87f9cb197d02504a8b2cdae7Chris Lattner 105794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Helper template for registering a target specific 1058a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// assembly parser, for use in the target machine initialization 1059a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// function. Usage: 10600c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 106194b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// extern "C" void LLVMInitializeFooMCAsmParser() { 10620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 106394b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 10640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 106594b9550a32d189704a8eae55505edf62662c0534Evan Cheng template<class MCAsmParserImpl> 106694b9550a32d189704a8eae55505edf62662c0534Evan Cheng struct RegisterMCAsmParser { 106794b9550a32d189704a8eae55505edf62662c0534Evan Cheng RegisterMCAsmParser(Target &T) { 106894b9550a32d189704a8eae55505edf62662c0534Evan Cheng TargetRegistry::RegisterMCAsmParser(T, &Allocator); 10690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 10710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 107294b9550a32d189704a8eae55505edf62662c0534Evan Cheng static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) { 107394b9550a32d189704a8eae55505edf62662c0534Evan Cheng return new MCAsmParserImpl(STI, P); 10740c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 10760c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 107724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Helper template for registering a target specific 107824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// assembly printer, for use in the target machine initialization 107924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// function. Usage: 108024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 108124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern "C" void LLVMInitializeFooAsmPrinter() { 108224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern Target TheFooTarget; 108324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 108424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// } 108524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar template<class AsmPrinterImpl> 108624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar struct RegisterAsmPrinter { 108724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar RegisterAsmPrinter(Target &T) { 108824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar TargetRegistry::RegisterAsmPrinter(T, &Allocator); 108924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 109024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 109124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar private: 1092b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) { 1093b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return new AsmPrinterImpl(TM, Streamer); 109424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 109524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar }; 109624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 109728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Helper template for registering a target specific 10984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// machine code emitter, for use in the target initialization 10994a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// function. Usage: 11004a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 110128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// extern "C" void LLVMInitializeFooMCCodeEmitter() { 11024a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// extern Target TheFooTarget; 110328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 11044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// } 110528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng template<class MCCodeEmitterImpl> 110628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng struct RegisterMCCodeEmitter { 110728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RegisterMCCodeEmitter(Target &T) { 110828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 11094a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11104a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 11114a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar private: 111259ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng static MCCodeEmitter *Allocator(const MCInstrInfo &II, 111359ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng const MCSubtargetInfo &STI, 111486020e46289643de2f8c7603b550ffc8b6aff376Chris Lattner MCContext &Ctx) { 111528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return new MCCodeEmitterImpl(); 11164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar }; 11184a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 1119bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar} 1120bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 1121bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif 1122