TargetRegistry.h revision 2c94d0faa0e1c268893d5e04dc77e8a35889db00
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 228977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h" 23255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.h" 24bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert> 25255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <string> 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; 442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha class MCRelocationInfo; 4594b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCTargetAsmParser; 46bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class TargetMachine; 478a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky class TargetOptions; 4890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class raw_ostream; 496da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou class formatted_raw_ostream; 506da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 516da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 5289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool isVerboseAsm, 53f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useLoc, bool useCFI, 5444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 566da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 5778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 58e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 602c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfo *createMCRelocationInfo(MCContext &Ctx); 612c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 62bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Target - Wrapper for Target specific information. 63bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 64bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// For registration purposes, this is a POD type so that targets can be 65bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// registered without the use of static constructors. 6673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// 6773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Targets should implement a single global instance of this class (which 6873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// will be zero initialized), and pass that instance to the TargetRegistry as 6973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// part of their initialization. 7073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar class Target { 71a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner public: 72a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner friend struct TargetRegistry; 73a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 74bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT); 75bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI, 774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef TT); 7834ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT, 7934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 80b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 81b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 8294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 8341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info); 840e6a052331f674dd70e28af41f654a7874405eabEvan Cheng typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT); 85ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT, 86ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef CPU, 87ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features); 88a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T, 89439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef TT, 90439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, 91439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef Features, 928a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 9334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 94b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 95b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 96b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM, 9711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner MCStreamer &Streamer); 98536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, 99536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef TT, 100536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef CPU); 10194b9550a32d189704a8eae55505edf62662c0534Evan Cheng typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI, 10294b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParser &P); 103b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T, 104b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI); 10590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T, 10690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner unsigned SyntaxVariant, 107b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 10817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 109c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 110b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI); 11128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 112918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 11328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 11428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx); 11528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T, 11628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng StringRef TT, 11728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx, 11828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 11928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 12028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 12128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 12228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack); 1236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx, 1246da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 1256da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 12689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 127f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 12844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 1296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 1306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 13178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 132e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 1332c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT, 1342c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCContext &Ctx); 1354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 136a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 137bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Next - The next registered target in the linked list, maintained by the 138bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry. 139bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target *Next; 140bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 141bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TripleMatchQualityFn - The target function for rating the match quality 142bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// of a triple. 143bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TripleMatchQualityFnTy TripleMatchQualityFn; 144bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 145bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Name - The target name. 146bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name; 147bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 148bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// ShortDesc - A short description of the target. 149bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc; 150bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 151d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// HasJIT - Whether this target supports the JIT. 152d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT; 153d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar 1541abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if 155a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// registered. 1561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCAsmInfoCtorFnTy MCAsmInfoCtorFn; 15724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 158b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// MCCodeGenInfoCtorFn - Constructor function for this target's 159b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// MCCodeGenInfo, if registered. 160439661395fd2a2a832dba01c65bc88718528313cEvan Cheng MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn; 161439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 16294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, 16394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// if registered. 16494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfoCtorFnTy MCInstrInfoCtorFn; 16594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 16641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysisCtorFn - Constructor function for this target's 16741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysis, if registered. 16841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn; 16941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 170f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo, 171a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// if registered. 172f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng MCRegInfoCtorFnTy MCRegInfoCtorFn; 173a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 174ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfoCtorFn - Constructor function for this target's 175ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfo, if registered. 176ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn; 177ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 178bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachineCtorFn - Construction function for this target's 179bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachine, if registered. 180bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TargetMachineCtorTy TargetMachineCtorFn; 181bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 18278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackendCtorFn - Construction function for this target's 18378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackend, if registered. 18478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackendCtorTy MCAsmBackendCtorFn; 185e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 18694b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCAsmParserCtorFn - Construction function for this target's 18794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCTargetAsmParser, if registered. 18894b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParserCtorTy MCAsmParserCtorFn; 18924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 19024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter, 19124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// if registered. 19224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar AsmPrinterCtorTy AsmPrinterCtorFn; 19324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 194251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassemblerCtorFn - Construction function for this target's 195251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassembler, if registered. 196251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan MCDisassemblerCtorTy MCDisassemblerCtorFn; 197092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 19824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// MCInstPrinterCtorFn - Construction function for this target's 19990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// MCInstPrinter, if registered. 20090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner MCInstPrinterCtorTy MCInstPrinterCtorFn; 20124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 20228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCCodeEmitterCtorFn - Construction function for this target's 20328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// CodeEmitter, if registered. 20428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitterCtorTy MCCodeEmitterCtorFn; 2054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 20628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamerCtorFn - Construction function for this target's 20728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamer, if registered. 20828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCObjectStreamerCtorTy MCObjectStreamerCtorFn; 209d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2106da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamerCtorFn - Construction function for this target's 2116da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamer, if registered (default = llvm::createAsmStreamer). 2126da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou AsmStreamerCtorTy AsmStreamerCtorFn; 2136da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2142c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfoCtorFn - Construction function for this target's 2152c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo) 2162c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfoCtorTy MCRelocationInfoCtorFn; 2172c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 218bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar public: 2196da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou Target() : AsmStreamerCtorFn(llvm::createAsmStreamer) {} 2206da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Target Information 2224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2234a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 224c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar // getNext - Return the next registered target. 225c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar const Target *getNext() const { return Next; } 226c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar 227bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getName - Get the target name. 228bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getName() const { return Name; } 229bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 230bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getShortDescription - Get a short description of the target. 231bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getShortDescription() const { return ShortDesc; } 232bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 2334a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2344a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Predicates 2354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2364a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 2374a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// hasJIT - Check if this targets supports the just-in-time compilation. 238d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool hasJIT() const { return HasJIT; } 23951b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 240603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar /// hasTargetMachine - Check if this target supports code generation. 241603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool hasTargetMachine() const { return TargetMachineCtorFn != 0; } 242603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 24378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// hasMCAsmBackend - Check if this target supports .o generation. 24478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; } 245e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 246092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// hasAsmParser - Check if this target supports .s parsing. 24794b9550a32d189704a8eae55505edf62662c0534Evan Cheng bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; } 24824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 24924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// hasAsmPrinter - Check if this target supports .s printing. 25024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; } 25124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 252251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// hasMCDisassembler - Check if this target has a disassembler. 253251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; } 254092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 25590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// hasMCInstPrinter - Check if this target has an instruction printer. 25690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; } 25790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner 25828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCCodeEmitter - Check if this target supports instruction encoding. 25928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; } 2604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 26128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCObjectStreamer - Check if this target supports streaming to files. 26228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; } 263d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2646da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// hasAsmStreamer - Check if this target supports streaming to files. 2656da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; } 2666da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2674a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2684a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Constructors 2694a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 27024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2711abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 272a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// target triple. 273a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 2742d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 275a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// feature set; it should always be provided. Generally this should be 276a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// either the target triple from the module, or the target triple of the 277a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// host if that does not exist. 2784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI, 2794a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef Triple) const { 2801abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!MCAsmInfoCtorFn) 281a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner return 0; 2824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola return MCAsmInfoCtorFn(MRI, Triple); 283a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 28424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 285439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation. 286439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 28734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM, 288b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 289b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) const { 290439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!MCCodeGenInfoCtorFn) 291439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return 0; 292b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng return MCCodeGenInfoCtorFn(Triple, RM, CM, OL); 293439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 294439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 29594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// createMCInstrInfo - Create a MCInstrInfo implementation. 29694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 29794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfo *createMCInstrInfo() const { 29894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!MCInstrInfoCtorFn) 29994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return 0; 30094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return MCInstrInfoCtorFn(); 30194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 30294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 30341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 30441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// 30541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 30641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!MCInstrAnalysisCtorFn) 3077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return 0; 30841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer return MCInstrAnalysisCtorFn(Info); 30941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 31041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 311f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// createMCRegInfo - Create a MCRegisterInfo implementation. 312a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 3130e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *createMCRegInfo(StringRef Triple) const { 314f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!MCRegInfoCtorFn) 315a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return 0; 3160e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return MCRegInfoCtorFn(Triple); 317a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 318a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 319ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 320ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 3212d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 322ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// feature set; it should always be provided. Generally this should be 323ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// either the target triple from the module, or the target triple of the 324ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// host if that does not exist. 3252d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param CPU This specifies the name of the target CPU. 3262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Features This specifies the string representation of the 327ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// additional target features. 328ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU, 329ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features) const { 330ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!MCSubtargetInfoCtorFn) 331ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return 0; 332ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return MCSubtargetInfoCtorFn(Triple, CPU, Features); 333ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 334ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 3353c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// createTargetMachine - Create a target specific machine implementation 3362d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// for the specified \p Triple. 3373c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// 3382d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 3393c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// feature set; it should always be provided. Generally this should be 3403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// either the target triple from the module, or the target triple of the 3413c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// host if that does not exist. 342439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU, 3438a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef Features, const TargetOptions &Options, 344b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM = Reloc::Default, 345b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM = CodeModel::Default, 346b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL = CodeGenOpt::Default) const { 347bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar if (!TargetMachineCtorFn) 348bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar return 0; 3498a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return TargetMachineCtorFn(*this, Triple, CPU, Features, Options, 3508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky RM, CM, OL); 351214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar } 352bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 35378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// createMCAsmBackend - Create a target specific assembly parser. 354e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 3552d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple The target triple string. 356536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky MCAsmBackend *createMCAsmBackend(StringRef Triple, StringRef CPU) const { 35778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!MCAsmBackendCtorFn) 358e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar return 0; 359536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky return MCAsmBackendCtorFn(*this, Triple, CPU); 360e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 361e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 36294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// createMCAsmParser - Create a target specific assembly parser. 363a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// 3642d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Parser The target independent parser implementation to use for 365a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// parsing and lexing. 36694b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI, 36794b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParser &Parser) const { 36894b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!MCAsmParserCtorFn) 369092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar return 0; 37094b9550a32d189704a8eae55505edf62662c0534Evan Cheng return MCAsmParserCtorFn(STI, Parser); 371092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar } 37224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 37324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// createAsmPrinter - Create a target specific assembly printer pass. This 37411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner /// takes ownership of the MCStreamer object. 375b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{ 37624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!AsmPrinterCtorFn) 37724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar return 0; 378b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return AsmPrinterCtorFn(TM, Streamer); 37924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 38024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 381b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const { 382251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!MCDisassemblerCtorFn) 383251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan return 0; 384b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy return MCDisassemblerCtorFn(*this, STI); 385251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 3864a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 387b262799d49891b036daa00eddf51947487346c98Evan Cheng MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant, 388b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 38917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 390c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 391b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI) const { 39290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!MCInstPrinterCtorFn) 39390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner return 0; 39417463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI); 39590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 39624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 39724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 39828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCCodeEmitter - Create a target specific code emitter. 39928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 400918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 40128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 40228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx) const { 40328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCCodeEmitterCtorFn) 4044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar return 0; 405918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach return MCCodeEmitterCtorFn(II, MRI, STI, Ctx); 4064a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 4074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCObjectStreamer - Create a target specific MCStreamer. 409d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 4102d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TT The target triple. 4112d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Ctx The target context. 4122d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TAB The target assembler backend object. Takes ownership. 4132d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _OS The stream object. 4142d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _Emitter The target independent assembler object.Takes ownership. 4152d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param RelaxAll Relax all fixups? 4162d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param NoExecStack Mark file as not needing a executable stack. 41728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx, 41828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 41928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 42028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 42128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 42228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack) const { 42328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCObjectStreamerCtorFn) 424d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming return 0; 42528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, 42628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RelaxAll, NoExecStack); 427d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 428d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 4296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// createAsmStreamer - Create a target specific MCStreamer. 4306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, 4316da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 4326da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 43389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 434f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 43544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 4366da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 4376da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 43878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 439e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst) const { 4406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou // AsmStreamerCtorFn is default to llvm::createAsmStreamer 441f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI, 44244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky useDwarfDirectory, InstPrint, CE, TAB, ShowInst); 4436da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 4446da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 4452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// createMCRelocationInfo - Create a target specific MCRelocationInfo. 4462c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 4472c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param TT The target triple. 4482c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param Ctx The target context. 4492c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfo * 4502c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha createMCRelocationInfo(StringRef TT, MCContext &Ctx) const { 4512c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha // MCRelocationInfoCtorFn defaults to createMCRelocationInfo 4522c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha return MCRelocationInfoCtorFn(TT, Ctx); 4532c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 4542c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 4554a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 456bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 457bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 458bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry - Generic interface to target specific features. 459bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar struct TargetRegistry { 460603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar class iterator { 461603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *Current; 462603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar explicit iterator(Target *T) : Current(T) {} 463edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar friend struct TargetRegistry; 464603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar public: 465603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator(const iterator &I) : Current(I.Current) {} 466603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator() : Current(0) {} 467603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 468603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator==(const iterator &x) const { 469603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return Current == x.Current; 470603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 471603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator!=(const iterator &x) const { 472603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return !operator==(x); 473603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 474603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 475603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar // Iterator traversal: forward iteration only 476603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator &operator++() { // Preincrement 477603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot increment end iterator!"); 478c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar Current = Current->getNext(); 479603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *this; 480603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 481603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator operator++(int) { // Postincrement 48224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar iterator tmp = *this; 48324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar ++*this; 484603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return tmp; 485603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 486603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 487603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target &operator*() const { 488603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot dereference end iterator!"); 489603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *Current; 490603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 491603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 492603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *operator->() const { 493603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return &operator*(); 494603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 495603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar }; 496603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 497077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// printRegisteredTargetsForVersion - Print the registered targets 498077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// appropriately for inclusion in a tool's version output. 499077c40871780136f7016a496703b20ebea9c0978Chandler Carruth static void printRegisteredTargetsForVersion(); 500077c40871780136f7016a496703b20ebea9c0978Chandler Carruth 501bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Registry Access 502bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 503bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 504603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator begin(); 505603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 506603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator end() { return iterator(); } 507603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 508a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// lookupTarget - Lookup a target based on a target triple. 509a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 510a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Triple - The triple to use for finding a target. 511a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Error - On failure, an error string describing why no target was 512a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// found. 513a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar static const Target *lookupTarget(const std::string &Triple, 514a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar std::string &Error); 515bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 5169ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// lookupTarget - Lookup a target based on an architecture name 5179ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// and a target triple. If the architecture name is non-empty, 5189ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// then the lookup is done by architecture. Otherwise, the target 5199ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is used. 5209ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// 5219ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param ArchName - The architecture to use for finding a target. 5229ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param TheTriple - The triple to use for finding a target. The 5239ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is updated with canonical architecture name if a lookup 5249ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// by architecture is done. 5259ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param Error - On failure, an error string describing why no target was 5269ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// found. 5279ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby static const Target *lookupTarget(const std::string &ArchName, 5289ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby Triple &TheTriple, 5299ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby std::string &Error); 5309ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby 531bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getClosestTargetForJIT - Pick the best target that is compatible with 532bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// the current host. If no close target can be found, this returns null 533bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// and sets the Error string to a reason. 534a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 535011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar /// Maintained for compatibility through 2.6. 5364bd03abe593222b26e84066223feb321bf738625Daniel Dunbar static const Target *getClosestTargetForJIT(std::string &Error); 537bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 538bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 539bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Target Registration 540bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 541bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 54251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// RegisterTarget - Register the given target. Attempts to register a 54351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// target which has already been registered will be ignored. 54424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 54573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 54673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 54773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 548bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 549bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 550bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Name - The target name. This should be a static string. 551bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param ShortDesc - A short target description. This should be a static 55224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// string. 553bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param TQualityFn - The triple match quality computation function for 554bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// this target. 555d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// @param HasJIT - Whether the target supports JIT code 556d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// generation. 557bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar static void RegisterTarget(Target &T, 558bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name, 559bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc, 560bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TripleMatchQualityFnTy TQualityFn, 561d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT = false); 562a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 5631abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 564a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// given target. 56524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 566a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// Clients are responsible for ensuring that registration doesn't occur 567a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// while another thread is attempting to access the registry. Typically 568a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// this is done by initializing all targets at program startup. 56924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 570a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// @param T - The target being registered. 571af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// @param Fn - A function to construct a MCAsmInfo for the target. 5721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 573a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner // Ignore duplicate registration. 5741abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!T.MCAsmInfoCtorFn) 5751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng T.MCAsmInfoCtorFn = Fn; 576a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 57724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 578439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the 579439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// given target. 580439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 581439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 582439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// while another thread is attempting to access the registry. Typically 583439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// this is done by initializing all targets at program startup. 584439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 585439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param T - The target being registered. 586439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param Fn - A function to construct a MCCodeGenInfo for the target. 587439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static void RegisterMCCodeGenInfo(Target &T, 588439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Target::MCCodeGenInfoCtorFnTy Fn) { 589439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // Ignore duplicate registration. 590439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!T.MCCodeGenInfoCtorFn) 591439661395fd2a2a832dba01c65bc88718528313cEvan Cheng T.MCCodeGenInfoCtorFn = Fn; 592439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 593439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 59494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 59594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// given target. 59694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 59794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 59894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// while another thread is attempting to access the registry. Typically 59994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// this is done by initializing all targets at program startup. 60094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 60194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param T - The target being registered. 60294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param Fn - A function to construct a MCInstrInfo for the target. 60394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 60494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng // Ignore duplicate registration. 60594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!T.MCInstrInfoCtorFn) 60694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng T.MCInstrInfoCtorFn = Fn; 60794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 60894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 60941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 61041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// the given target. 61141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer static void RegisterMCInstrAnalysis(Target &T, 61241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer Target::MCInstrAnalysisCtorFnTy Fn) { 61341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer // Ignore duplicate registration. 61441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!T.MCInstrAnalysisCtorFn) 61541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer T.MCInstrAnalysisCtorFn = Fn; 61641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 61741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 618f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 619a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// given target. 620a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 621a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 622a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// while another thread is attempting to access the registry. Typically 623a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// this is done by initializing all targets at program startup. 624a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 625a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param T - The target being registered. 626a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param Fn - A function to construct a MCRegisterInfo for the target. 627f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 628a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng // Ignore duplicate registration. 629f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!T.MCRegInfoCtorFn) 630f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng T.MCRegInfoCtorFn = Fn; 631a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 632a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 633ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 634ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// the given target. 635ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 636ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// Clients are responsible for ensuring that registration doesn't occur 637ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// while another thread is attempting to access the registry. Typically 638ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// this is done by initializing all targets at program startup. 639ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 640ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param T - The target being registered. 641ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param Fn - A function to construct a MCSubtargetInfo for the target. 642ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static void RegisterMCSubtargetInfo(Target &T, 643ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng Target::MCSubtargetInfoCtorFnTy Fn) { 644ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng // Ignore duplicate registration. 645ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!T.MCSubtargetInfoCtorFn) 646ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng T.MCSubtargetInfoCtorFn = Fn; 647ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 648ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 649bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// RegisterTargetMachine - Register a TargetMachine implementation for the 650bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// given target. 65124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 65273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 65373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 65473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 65524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 656bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 657bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Fn - A function to construct a TargetMachine for the target. 65824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterTargetMachine(Target &T, 659bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TargetMachineCtorTy Fn) { 660092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar // Ignore duplicate registration. 661092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar if (!T.TargetMachineCtorFn) 662092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar T.TargetMachineCtorFn = Fn; 663bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 664bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 66578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 666e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// given target. 667e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 668e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 669e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// while another thread is attempting to access the registry. Typically 670e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// this is done by initializing all targets at program startup. 671e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 672e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param T - The target being registered. 673e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param Fn - A function to construct an AsmBackend for the target. 67478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 67578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!T.MCAsmBackendCtorFn) 67678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng T.MCAsmBackendCtorFn = Fn; 677e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 678e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 67994b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 68094b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// the given target. 68124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 682092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 683092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// while another thread is attempting to access the registry. Typically 684092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// this is done by initializing all targets at program startup. 685092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// 686092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// @param T - The target being registered. 68794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// @param Fn - A function to construct an MCTargetAsmParser for the target. 68894b9550a32d189704a8eae55505edf62662c0534Evan Cheng static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 68994b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!T.MCAsmParserCtorFn) 69094b9550a32d189704a8eae55505edf62662c0534Evan Cheng T.MCAsmParserCtorFn = Fn; 691bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 69224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 69324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 69424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// target. 69524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 69624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 69724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// while another thread is attempting to access the registry. Typically 69824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// this is done by initializing all targets at program startup. 69924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 70024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param T - The target being registered. 70124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an AsmPrinter for the target. 70224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 70324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar // Ignore duplicate registration. 70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!T.AsmPrinterCtorFn) 70524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar T.AsmPrinterCtorFn = Fn; 70624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 70724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 708251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// RegisterMCDisassembler - Register a MCDisassembler implementation for 709251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the given target. 71024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 711251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// Clients are responsible for ensuring that registration doesn't occur 712251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// while another thread is attempting to access the registry. Typically 713251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// this is done by initializing all targets at program startup. 714251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 715251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param T - The target being registered. 716251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param Fn - A function to construct an MCDisassembler for the target. 71724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterMCDisassembler(Target &T, 718251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan Target::MCDisassemblerCtorTy Fn) { 719251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!T.MCDisassemblerCtorFn) 720251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan T.MCDisassemblerCtorFn = Fn; 721251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 722bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 7232685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 7242685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// given target. 72524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 7262685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7272685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// while another thread is attempting to access the registry. Typically 7282685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// this is done by initializing all targets at program startup. 7292685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7302685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param T - The target being registered. 7312685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param Fn - A function to construct an MCInstPrinter for the target. 73290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner static void RegisterMCInstPrinter(Target &T, 73390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner Target::MCInstPrinterCtorTy Fn) { 73490edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!T.MCInstPrinterCtorFn) 73590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner T.MCInstPrinterCtorFn = Fn; 73690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 73724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 73828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 7394a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// given target. 7402685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7414a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// while another thread is attempting to access the registry. Typically 7434a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// this is done by initializing all targets at program startup. 7444a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 7454a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @param T - The target being registered. 74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an MCCodeEmitter for the target. 74728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCCodeEmitter(Target &T, 74828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCCodeEmitterCtorTy Fn) { 74928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCCodeEmitterCtorFn) 75028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCCodeEmitterCtorFn = Fn; 7514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 7524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 75328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCObjectStreamer - Register a object code MCStreamer 75428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// implementation for the given target. 755d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 756d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// Clients are responsible for ensuring that registration doesn't occur 757d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// while another thread is attempting to access the registry. Typically 758d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// this is done by initializing all targets at program startup. 759d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 760d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param T - The target being registered. 761d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param Fn - A function to construct an MCStreamer for the target. 76228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCObjectStreamer(Target &T, 76328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCObjectStreamerCtorTy Fn) { 76428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCObjectStreamerCtorFn) 76528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCObjectStreamerCtorFn = Fn; 766d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 767d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 7686da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// RegisterAsmStreamer - Register an assembly MCStreamer implementation 7696da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// for the given target. 7706da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7716da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// Clients are responsible for ensuring that registration doesn't occur 7726da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// while another thread is attempting to access the registry. Typically 7736da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// this is done by initializing all targets at program startup. 7746da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7756da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param T - The target being registered. 7766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param Fn - A function to construct an MCStreamer for the target. 7776da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) { 7786da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou if (T.AsmStreamerCtorFn == createAsmStreamer) 7796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou T.AsmStreamerCtorFn = Fn; 7806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 7816da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 7822c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// RegisterMCRelocationInfo - Register an MCRelocationInfo 7832c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// implementation for the given target. 7842c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 7852c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// Clients are responsible for ensuring that registration doesn't occur 7862c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// while another thread is attempting to access the registry. Typically 7872c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// this is done by initializing all targets at program startup. 7882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 7892c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param T - The target being registered. 7902c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param Fn - A function to construct an MCRelocationInfo for the target. 7912c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha static void RegisterMCRelocationInfo(Target &T, 7922c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha Target::MCRelocationInfoCtorTy Fn) { 7932c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha if (!T.MCRelocationInfoCtorFn) 7942c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha T.MCRelocationInfoCtorFn = Fn; 7952c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 7962c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 797bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 798bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 799bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 8000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar //===--------------------------------------------------------------------===// 8020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTarget - Helper template for registering a target, for use in the 8040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// target's initialization function. Usage: 8050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// Target TheFooTarget; // The global target instance. 8080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTargetInfo() { 8108977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar /// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 8110c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 812124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth template<Triple::ArchType TargetArchType = Triple::UnknownArch, 8138977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar bool HasJIT = false> 8140c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTarget { 8150c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTarget(Target &T, const char *Name, const char *Desc) { 8160c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTarget(T, Name, Desc, 8178977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar &getTripleMatchQuality, 8188977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar HasJIT); 8198977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar } 8208977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar 8218977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar static unsigned getTripleMatchQuality(const std::string &TT) { 8225026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer if (Triple(TT).getArch() == TargetArchType) 8238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 20; 8248977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 0; 8250c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 8260c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 8270c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Helper template for registering a target assembly info 829a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the static "Create" method on the class to 830a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// actually do the construction. Usage: 831a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 832a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 833a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 8341abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 835a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 836af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner template<class MCAsmInfoImpl> 8371abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfo { 8381abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfo(Target &T) { 8391abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 840a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 841a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 8424a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola static MCAsmInfo *Allocator(const MCRegisterInfo &MRI, StringRef TT) { 8436e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola return new MCAsmInfoImpl(TT); 844a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 84524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 846a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 847a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 8481abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 849a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the specified function to do the 850a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// construction. Usage: 851a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 852a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 853a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 8541abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 855a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 8561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfoFn { 8571abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 8581abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, Fn); 85994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 86094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 86194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 862439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info 863439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// implementation. This invokes the static "Create" method on the class 864439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// to actually do the construction. Usage: 865439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 866439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 867439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 868439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget); 869439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 870439661395fd2a2a832dba01c65bc88718528313cEvan Cheng template<class MCCodeGenInfoImpl> 871439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfo { 872439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfo(Target &T) { 873439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator); 874439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 875439661395fd2a2a832dba01c65bc88718528313cEvan Cheng private: 876b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng static MCCodeGenInfo *Allocator(StringRef TT, Reloc::Model RM, 877b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, CodeGenOpt::Level OL) { 878439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return new MCCodeGenInfoImpl(); 879439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 880439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 881439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 882439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen 883439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// info implementation. This invokes the specified function to do the 884439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// construction. Usage: 885439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 886439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 887439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 888439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction); 889439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 890439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfoFn { 891439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) { 892439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, Fn); 893439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 894439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 895439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 89694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Helper template for registering a target instruction 89794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// info implementation. This invokes the static "Create" method on the class 89894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// to actually do the construction. Usage: 89994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 90094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 90194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 90294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 90394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 90494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng template<class MCInstrInfoImpl> 90594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfo { 90694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfo(Target &T) { 90794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 90894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 90994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng private: 91094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static MCInstrInfo *Allocator() { 91194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return new MCInstrInfoImpl(); 91294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 91394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 91494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 91594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn - Helper template for registering a target 91694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// instruction info implementation. This invokes the specified function to 91794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// do the construction. Usage: 91894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 91994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 92094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 92194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 92294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 92394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfoFn { 92494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 92594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, Fn); 926a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 927a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 928a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 9297801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis - Helper template for registering a target 9307801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the static "Create" 9317801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// method on the class to actually do the construction. Usage: 9327801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 9337801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 9347801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 9357801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 9367801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9377801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng template<class MCInstrAnalysisImpl> 9387801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysis { 9397801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysis(Target &T) { 9407801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 9417801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9427801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng private: 9437801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 9447801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return new MCInstrAnalysisImpl(Info); 9457801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9467801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9477801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 9487801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn - Helper template for registering a target 9497801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the specified function 9507801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// to do the construction. Usage: 9517801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 9527801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 9537801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 9547801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 9557801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9567801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysisFn { 9577801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 9587801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 9597801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9607801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9617801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 962f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Helper template for registering a target register info 963f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// implementation. This invokes the static "Create" method on the class to 964f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// actually do the construction. Usage: 965f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 966f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 967f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 968f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 969f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 970f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng template<class MCRegisterInfoImpl> 971f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfo { 972f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfo(Target &T) { 973f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, &Allocator); 974f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 975f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng private: 9760e6a052331f674dd70e28af41f654a7874405eabEvan Cheng static MCRegisterInfo *Allocator(StringRef TT) { 977f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng return new MCRegisterInfoImpl(); 978f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 979f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 980f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng 981f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn - Helper template for registering a target register 982f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// info implementation. This invokes the specified function to do the 983f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// construction. Usage: 984f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 985f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 986f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 987f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 988f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 989f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfoFn { 990f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 991f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, Fn); 992f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 993f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 994a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 995ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Helper template for registering a target 996ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the static "Create" method 997ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// on the class to actually do the construction. Usage: 998ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 999ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1000ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1001ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 1002ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1003ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng template<class MCSubtargetInfoImpl> 1004ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfo { 1005ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfo(Target &T) { 1006ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 1007ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1008ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng private: 1009ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static MCSubtargetInfo *Allocator(StringRef TT, StringRef CPU, 1010ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef FS) { 1011ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return new MCSubtargetInfoImpl(); 1012ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1013ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1014ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 1015ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn - Helper template for registering a target 1016ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the specified function to 1017ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// do the construction. Usage: 1018ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 1019ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1020ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1021ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 1022ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1023ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfoFn { 1024ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 1025ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 1026ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1027ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1028ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 10290c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine - Helper template for registering a target machine 10300c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// implementation, for use in the target machine initialization 10310c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// function. Usage: 10320c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 10330c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTarget() { 10340c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 10350c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 10360c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 10370c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar template<class TargetMachineImpl> 10380c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTargetMachine { 10390c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTargetMachine(Target &T) { 10400c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTargetMachine(T, &Allocator); 10410c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10420c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 10430c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1044439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static TargetMachine *Allocator(const Target &T, StringRef TT, 1045439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, StringRef FS, 10468a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 104734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 1048b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 1049b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) { 10508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL); 1051e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar } 1052e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar }; 1053e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar 105478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Helper template for registering a target specific 1055e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// assembler backend. Usage: 1056e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 105778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// extern "C" void LLVMInitializeFooMCAsmBackend() { 1058e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// extern Target TheFooTarget; 105978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 1060e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// } 106178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng template<class MCAsmBackendImpl> 106278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng struct RegisterMCAsmBackend { 106378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng RegisterMCAsmBackend(Target &T) { 106478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 1065e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1066e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 1067e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar private: 1068536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky static MCAsmBackend *Allocator(const Target &T, StringRef Triple, 1069536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef CPU) { 1070536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky return new MCAsmBackendImpl(T, Triple, CPU); 1071e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1072e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar }; 1073e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 107494b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Helper template for registering a target specific 1075a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// assembly parser, for use in the target machine initialization 1076a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// function. Usage: 10770c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 107894b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// extern "C" void LLVMInitializeFooMCAsmParser() { 10790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 108094b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 10810c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 108294b9550a32d189704a8eae55505edf62662c0534Evan Cheng template<class MCAsmParserImpl> 108394b9550a32d189704a8eae55505edf62662c0534Evan Cheng struct RegisterMCAsmParser { 108494b9550a32d189704a8eae55505edf62662c0534Evan Cheng RegisterMCAsmParser(Target &T) { 108594b9550a32d189704a8eae55505edf62662c0534Evan Cheng TargetRegistry::RegisterMCAsmParser(T, &Allocator); 10860c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10870c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 10880c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 108994b9550a32d189704a8eae55505edf62662c0534Evan Cheng static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P) { 109094b9550a32d189704a8eae55505edf62662c0534Evan Cheng return new MCAsmParserImpl(STI, P); 10910c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10920c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 10930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 109424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Helper template for registering a target specific 109524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// assembly printer, for use in the target machine initialization 109624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// function. Usage: 109724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 109824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern "C" void LLVMInitializeFooAsmPrinter() { 109924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern Target TheFooTarget; 110024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 110124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// } 110224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar template<class AsmPrinterImpl> 110324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar struct RegisterAsmPrinter { 110424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar RegisterAsmPrinter(Target &T) { 110524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar TargetRegistry::RegisterAsmPrinter(T, &Allocator); 110624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 110724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 110824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar private: 1109b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) { 1110b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return new AsmPrinterImpl(TM, Streamer); 111124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 111224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar }; 111324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 111428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Helper template for registering a target specific 11154a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// machine code emitter, for use in the target initialization 11164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// function. Usage: 11174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 111828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// extern "C" void LLVMInitializeFooMCCodeEmitter() { 11194a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// extern Target TheFooTarget; 112028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 11214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// } 112228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng template<class MCCodeEmitterImpl> 112328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng struct RegisterMCCodeEmitter { 112428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RegisterMCCodeEmitter(Target &T) { 112528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 11264a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11274a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 11284a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar private: 112959ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng static MCCodeEmitter *Allocator(const MCInstrInfo &II, 1130918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 113159ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng const MCSubtargetInfo &STI, 113286020e46289643de2f8c7603b550ffc8b6aff376Chris Lattner MCContext &Ctx) { 113328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return new MCCodeEmitterImpl(); 11344a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11354a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar }; 11364a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 1137bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar} 1138bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 1139bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif 1140