TargetRegistry.h revision 320296a4cfe414ce59f406b8a5ce15272f563103
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" 24de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet#include "llvm-c/Disassembler.h" 25bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert> 26255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <string> 27bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 28bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbarnamespace llvm { 29789457847002f5289dbbc5cfce9d68c72e00bed1Daniel Dunbar class AsmPrinter; 30bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class Module; 31e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar class MCAssembler; 3294b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCAsmBackend; 33af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner class MCAsmInfo; 3456591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCAsmParser; 3556591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCCodeEmitter; 3694b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCCodeGenInfo; 3756591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCContext; 38251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan class MCDisassembler; 397801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng class MCInstrAnalysis; 4090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class MCInstPrinter; 4194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng class MCInstrInfo; 42a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng class MCRegisterInfo; 4356591ab218639d8a6e4c756ca37adaf20215c3b6Chris Lattner class MCStreamer; 44ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng class MCSubtargetInfo; 45de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet class MCSymbolizer; 462c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha class MCRelocationInfo; 4794b9550a32d189704a8eae55505edf62662c0534Evan Cheng class MCTargetAsmParser; 48bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class TargetMachine; 49320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola class MCTargetStreamer; 508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky class TargetOptions; 5190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class raw_ostream; 526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou class formatted_raw_ostream; 536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 54320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCStreamer *createAsmStreamer(MCContext &Ctx, 55320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCTargetStreamer *TargetStreamer, 56320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola formatted_raw_ostream &OS, bool isVerboseAsm, 57f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useLoc, bool useCFI, 5844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 59320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCInstPrinter *InstPrint, MCCodeEmitter *CE, 60320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCAsmBackend *TAB, bool ShowInst); 61bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 62de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx); 63de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 64de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizer *createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, 65de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 66de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 67de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, 68de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *RelInfo); 692c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Target - Wrapper for Target specific information. 71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 72bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// For registration purposes, this is a POD type so that targets can be 73bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// registered without the use of static constructors. 7473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// 7573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Targets should implement a single global instance of this class (which 7673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// will be zero initialized), and pass that instance to the TargetRegistry as 7773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// part of their initialization. 7873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar class Target { 79a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner public: 80a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner friend struct TargetRegistry; 81a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 82bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar typedef unsigned (*TripleMatchQualityFnTy)(const std::string &TT); 83bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI, 854a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef TT); 8634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT, 8734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 88b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 89b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 9094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 9141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info); 920e6a052331f674dd70e28af41f654a7874405eabEvan Cheng typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT); 93ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT, 94ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef CPU, 95ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features); 96a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T, 97439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef TT, 98439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, 99439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef Features, 1008a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 10134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 102b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 103b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 104b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM, 10511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner MCStreamer &Streamer); 106536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, 107c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling const MCRegisterInfo &MRI, 108536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef TT, 109536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef CPU); 11094b9550a32d189704a8eae55505edf62662c0534Evan Cheng typedef MCTargetAsmParser *(*MCAsmParserCtorTy)(MCSubtargetInfo &STI, 111715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly MCAsmParser &P, 112715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly const MCInstrInfo &MII); 113b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T, 114b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI); 11590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T, 11690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner unsigned SyntaxVariant, 117b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 11817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 119c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 120b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI); 12128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 122918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 12328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 12428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx); 12528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T, 12628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng StringRef TT, 12728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx, 12828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 12928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 13028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 13128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 13228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack); 1336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx, 1346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 1356da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 13689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 137f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 13844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 1396da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 1406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 14178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 142e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 1432c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT, 1442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCContext &Ctx); 145de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet typedef MCSymbolizer *(*MCSymbolizerCtorTy)(StringRef TT, 146de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMOpInfoCallback GetOpInfo, 147de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 148de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 149de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, 150de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *RelInfo); 1514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 152a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 153bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Next - The next registered target in the linked list, maintained by the 154bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry. 155bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target *Next; 156bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 157bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TripleMatchQualityFn - The target function for rating the match quality 158bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// of a triple. 159bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TripleMatchQualityFnTy TripleMatchQualityFn; 160bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 161bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Name - The target name. 162bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name; 163bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 164bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// ShortDesc - A short description of the target. 165bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc; 166bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 167d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// HasJIT - Whether this target supports the JIT. 168d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT; 169d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar 1701abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if 171a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// registered. 1721abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCAsmInfoCtorFnTy MCAsmInfoCtorFn; 17324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 174b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// MCCodeGenInfoCtorFn - Constructor function for this target's 175b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng /// MCCodeGenInfo, if registered. 176439661395fd2a2a832dba01c65bc88718528313cEvan Cheng MCCodeGenInfoCtorFnTy MCCodeGenInfoCtorFn; 177439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 17894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, 17994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// if registered. 18094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfoCtorFnTy MCInstrInfoCtorFn; 18194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 18241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysisCtorFn - Constructor function for this target's 18341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// MCInstrAnalysis, if registered. 18441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn; 18541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 186f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo, 187a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// if registered. 188f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng MCRegInfoCtorFnTy MCRegInfoCtorFn; 189a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 190ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfoCtorFn - Constructor function for this target's 191ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// MCSubtargetInfo, if registered. 192ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn; 193ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 194bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachineCtorFn - Construction function for this target's 195bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetMachine, if registered. 196bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar TargetMachineCtorTy TargetMachineCtorFn; 197bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 19878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackendCtorFn - Construction function for this target's 19978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// MCAsmBackend, if registered. 20078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackendCtorTy MCAsmBackendCtorFn; 201e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 20294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCAsmParserCtorFn - Construction function for this target's 20394b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// MCTargetAsmParser, if registered. 20494b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCAsmParserCtorTy MCAsmParserCtorFn; 20524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 20624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter, 20724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// if registered. 20824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar AsmPrinterCtorTy AsmPrinterCtorFn; 20924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 210251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassemblerCtorFn - Construction function for this target's 211251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// MCDisassembler, if registered. 212251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan MCDisassemblerCtorTy MCDisassemblerCtorFn; 213092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 21424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// MCInstPrinterCtorFn - Construction function for this target's 21590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// MCInstPrinter, if registered. 21690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner MCInstPrinterCtorTy MCInstPrinterCtorFn; 21724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 21828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCCodeEmitterCtorFn - Construction function for this target's 21928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// CodeEmitter, if registered. 22028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitterCtorTy MCCodeEmitterCtorFn; 2214a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 22228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamerCtorFn - Construction function for this target's 22328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// MCObjectStreamer, if registered. 22428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCObjectStreamerCtorTy MCObjectStreamerCtorFn; 225d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamerCtorFn - Construction function for this target's 2276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// AsmStreamer, if registered (default = llvm::createAsmStreamer). 2286da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou AsmStreamerCtorTy AsmStreamerCtorFn; 2296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2302c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfoCtorFn - Construction function for this target's 2312c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo) 2322c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfoCtorTy MCRelocationInfoCtorFn; 2332c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 234de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// MCSymbolizerCtorFn - Construction function for this target's 235de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer) 236de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizerCtorTy MCSymbolizerCtorFn; 237de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 238320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola static MCStreamer * 239320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola createDefaultAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 240320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola bool isVerboseAsm, bool useLoc, bool useCFI, 241320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola bool useDwarfDirectory, MCInstPrinter *InstPrint, 242320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCCodeEmitter *CE, MCAsmBackend *TAB, 243320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola bool ShowInst) { 244320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola return llvm::createAsmStreamer(Ctx, 0, OS, isVerboseAsm, useLoc, useCFI, 245320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola useDwarfDirectory, InstPrint, CE, TAB, 246320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola ShowInst); 247320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola } 248320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola 249bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar public: 250320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola Target() 251320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola : AsmStreamerCtorFn(createDefaultAsmStreamer), 252320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCRelocationInfoCtorFn(llvm::createMCRelocationInfo), 253320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCSymbolizerCtorFn(llvm::createMCSymbolizer) {} 2546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2554a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Target Information 2564a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 258c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar // getNext - Return the next registered target. 259c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar const Target *getNext() const { return Next; } 260c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar 261bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getName - Get the target name. 262bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getName() const { return Name; } 263bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 264bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getShortDescription - Get a short description of the target. 265bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getShortDescription() const { return ShortDesc; } 266bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 2674a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2684a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Predicates 2694a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2704a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 2714a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// hasJIT - Check if this targets supports the just-in-time compilation. 272d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool hasJIT() const { return HasJIT; } 27351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 274603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar /// hasTargetMachine - Check if this target supports code generation. 275603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool hasTargetMachine() const { return TargetMachineCtorFn != 0; } 276603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 27778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// hasMCAsmBackend - Check if this target supports .o generation. 27878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != 0; } 279e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 280092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// hasAsmParser - Check if this target supports .s parsing. 28194b9550a32d189704a8eae55505edf62662c0534Evan Cheng bool hasMCAsmParser() const { return MCAsmParserCtorFn != 0; } 28224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 28324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// hasAsmPrinter - Check if this target supports .s printing. 28424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; } 28524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 286251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// hasMCDisassembler - Check if this target has a disassembler. 287251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan bool hasMCDisassembler() const { return MCDisassemblerCtorFn != 0; } 288092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar 28990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner /// hasMCInstPrinter - Check if this target has an instruction printer. 29090edac0e8b35f766599362b6301863229f0ddcdbChris Lattner bool hasMCInstPrinter() const { return MCInstPrinterCtorFn != 0; } 29190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner 29228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCCodeEmitter - Check if this target supports instruction encoding. 29328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCCodeEmitter() const { return MCCodeEmitterCtorFn != 0; } 2944a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 29528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// hasMCObjectStreamer - Check if this target supports streaming to files. 29628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool hasMCObjectStreamer() const { return MCObjectStreamerCtorFn != 0; } 297d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 2986da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// hasAsmStreamer - Check if this target supports streaming to files. 2996da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool hasAsmStreamer() const { return AsmStreamerCtorFn != 0; } 3006da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 3014a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 3024a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Constructors 3034a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 30424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 3051abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 306a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// target triple. 307a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 3082d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 309a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// feature set; it should always be provided. Generally this should be 310a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// either the target triple from the module, or the target triple of the 311a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// host if that does not exist. 3124a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI, 3134a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef Triple) const { 3141abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!MCAsmInfoCtorFn) 315a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner return 0; 3164a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola return MCAsmInfoCtorFn(MRI, Triple); 317a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 31824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 319439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation. 320439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 32134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM, 322b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 323b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) const { 324439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!MCCodeGenInfoCtorFn) 325439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return 0; 326b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng return MCCodeGenInfoCtorFn(Triple, RM, CM, OL); 327439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 328439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 32994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// createMCInstrInfo - Create a MCInstrInfo implementation. 33094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 33194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfo *createMCInstrInfo() const { 33294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!MCInstrInfoCtorFn) 33394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return 0; 33494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return MCInstrInfoCtorFn(); 33594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 33694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 33741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 33841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// 33941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 34041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!MCInstrAnalysisCtorFn) 3417801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return 0; 34241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer return MCInstrAnalysisCtorFn(Info); 34341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 34441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 345f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// createMCRegInfo - Create a MCRegisterInfo implementation. 346a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 3470e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *createMCRegInfo(StringRef Triple) const { 348f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!MCRegInfoCtorFn) 349a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng return 0; 3500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return MCRegInfoCtorFn(Triple); 351a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 352a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 353ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 354ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 3552d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 356ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// feature set; it should always be provided. Generally this should be 357ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// either the target triple from the module, or the target triple of the 358ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// host if that does not exist. 3592d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param CPU This specifies the name of the target CPU. 3602d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Features This specifies the string representation of the 361ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// additional target features. 362ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU, 363ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features) const { 364ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!MCSubtargetInfoCtorFn) 365ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return 0; 366ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return MCSubtargetInfoCtorFn(Triple, CPU, Features); 367ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 368ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 3693c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// createTargetMachine - Create a target specific machine implementation 3702d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// for the specified \p Triple. 3713c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// 3722d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 3733c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// feature set; it should always be provided. Generally this should be 3743c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// either the target triple from the module, or the target triple of the 3753c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// host if that does not exist. 376439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU, 3778a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef Features, const TargetOptions &Options, 378b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM = Reloc::Default, 379b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM = CodeModel::Default, 380b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL = CodeGenOpt::Default) const { 381bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar if (!TargetMachineCtorFn) 382bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar return 0; 3838a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return TargetMachineCtorFn(*this, Triple, CPU, Features, Options, 3848a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky RM, CM, OL); 385214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar } 386bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 38778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// createMCAsmBackend - Create a target specific assembly parser. 388e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 3892d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple The target triple string. 390c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI, 391c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling StringRef Triple, StringRef CPU) const { 39278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!MCAsmBackendCtorFn) 393e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar return 0; 394c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling return MCAsmBackendCtorFn(*this, MRI, Triple, CPU); 395e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 396e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 39794b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// createMCAsmParser - Create a target specific assembly parser. 398a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// 3992d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Parser The target independent parser implementation to use for 400a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// parsing and lexing. 40194b9550a32d189704a8eae55505edf62662c0534Evan Cheng MCTargetAsmParser *createMCAsmParser(MCSubtargetInfo &STI, 402715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly MCAsmParser &Parser, 403715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly const MCInstrInfo &MII) const { 40494b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!MCAsmParserCtorFn) 405092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar return 0; 406715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly return MCAsmParserCtorFn(STI, Parser, MII); 407092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar } 40824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 40924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// createAsmPrinter - Create a target specific assembly printer pass. This 41011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner /// takes ownership of the MCStreamer object. 411b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{ 41224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!AsmPrinterCtorFn) 41324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar return 0; 414b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return AsmPrinterCtorFn(TM, Streamer); 41524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 41624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 417b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI) const { 418251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!MCDisassemblerCtorFn) 419251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan return 0; 420b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy return MCDisassemblerCtorFn(*this, STI); 421251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 4224a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 423b262799d49891b036daa00eddf51947487346c98Evan Cheng MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant, 424b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 42517463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 426c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 427b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI) const { 42890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!MCInstPrinterCtorFn) 42990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner return 0; 43017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI); 43190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 43224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 43324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 43428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCCodeEmitter - Create a target specific code emitter. 43528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 436918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 43728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 43828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx) const { 43928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCCodeEmitterCtorFn) 4404a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar return 0; 441918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach return MCCodeEmitterCtorFn(II, MRI, STI, Ctx); 4424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 4434a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 44428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCObjectStreamer - Create a target specific MCStreamer. 445d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 4462d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TT The target triple. 4472d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Ctx The target context. 4482d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TAB The target assembler backend object. Takes ownership. 4492d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _OS The stream object. 4502d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _Emitter The target independent assembler object.Takes ownership. 4512d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param RelaxAll Relax all fixups? 4522d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param NoExecStack Mark file as not needing a executable stack. 45328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx, 45428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 45528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 45628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 45728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 45828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack) const { 45928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCObjectStreamerCtorFn) 460d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming return 0; 46128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, 46228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RelaxAll, NoExecStack); 463d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 464d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 4656da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// createAsmStreamer - Create a target specific MCStreamer. 4666da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, 4676da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 4686da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 46989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool useLoc, 470f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola bool useCFI, 47144d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 4726da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 4736da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 47478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 475e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst) const { 4766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou // AsmStreamerCtorFn is default to llvm::createAsmStreamer 477f1a5c7ec04002769f1638e64f7439589f0f926e6Rafael Espindola return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI, 47844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky useDwarfDirectory, InstPrint, CE, TAB, ShowInst); 4796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 4806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 4812c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// createMCRelocationInfo - Create a target specific MCRelocationInfo. 4822c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 4832c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param TT The target triple. 4842c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param Ctx The target context. 4852c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfo * 4862c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha createMCRelocationInfo(StringRef TT, MCContext &Ctx) const { 4872c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha return MCRelocationInfoCtorFn(TT, Ctx); 4882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 4892c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 490de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// createMCSymbolizer - Create a target specific MCSymbolizer. 491de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 492de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param TT The target triple. 493de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param GetOpInfo The function to get the symbolic information for operands. 494de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param SymbolLookUp The function to lookup a symbol name. 495de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param DisInfo The pointer to the block of symbolic information for above call 496de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// back. 497de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param Ctx The target context. 498de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param RelInfo The relocation information for this target. Takes ownership. 499de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizer * 500de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, 501de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 502de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 503de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, MCRelocationInfo *RelInfo) const { 504de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet return MCSymbolizerCtorFn(TT, GetOpInfo, SymbolLookUp, DisInfo, 505de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet Ctx, RelInfo); 506de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet } 507de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 5084a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 509bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 510bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 511bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry - Generic interface to target specific features. 512bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar struct TargetRegistry { 513603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar class iterator { 514603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *Current; 515603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar explicit iterator(Target *T) : Current(T) {} 516edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar friend struct TargetRegistry; 517603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar public: 518603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator(const iterator &I) : Current(I.Current) {} 519603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator() : Current(0) {} 520603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 521603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator==(const iterator &x) const { 522603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return Current == x.Current; 523603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 524603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator!=(const iterator &x) const { 525603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return !operator==(x); 526603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 527603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 528603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar // Iterator traversal: forward iteration only 529603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator &operator++() { // Preincrement 530603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot increment end iterator!"); 531c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar Current = Current->getNext(); 532603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *this; 533603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 534603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator operator++(int) { // Postincrement 53524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar iterator tmp = *this; 53624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar ++*this; 537603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return tmp; 538603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 539603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 540603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target &operator*() const { 541603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot dereference end iterator!"); 542603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *Current; 543603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 544603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 545603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *operator->() const { 546603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return &operator*(); 547603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 548603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar }; 549603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 550077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// printRegisteredTargetsForVersion - Print the registered targets 551077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// appropriately for inclusion in a tool's version output. 552077c40871780136f7016a496703b20ebea9c0978Chandler Carruth static void printRegisteredTargetsForVersion(); 553077c40871780136f7016a496703b20ebea9c0978Chandler Carruth 554bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Registry Access 555bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 556bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 557603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator begin(); 558603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 559603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator end() { return iterator(); } 560603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 561a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// lookupTarget - Lookup a target based on a target triple. 562a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 563a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Triple - The triple to use for finding a target. 564a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Error - On failure, an error string describing why no target was 565a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// found. 566a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar static const Target *lookupTarget(const std::string &Triple, 567a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar std::string &Error); 568bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 5699ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// lookupTarget - Lookup a target based on an architecture name 5709ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// and a target triple. If the architecture name is non-empty, 5719ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// then the lookup is done by architecture. Otherwise, the target 5729ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is used. 5739ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// 5749ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param ArchName - The architecture to use for finding a target. 5759ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param TheTriple - The triple to use for finding a target. The 5769ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is updated with canonical architecture name if a lookup 5779ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// by architecture is done. 5789ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param Error - On failure, an error string describing why no target was 5799ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// found. 5809ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby static const Target *lookupTarget(const std::string &ArchName, 5819ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby Triple &TheTriple, 5829ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby std::string &Error); 5839ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby 584bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getClosestTargetForJIT - Pick the best target that is compatible with 585bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// the current host. If no close target can be found, this returns null 586bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// and sets the Error string to a reason. 587a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 588011e4db845b5c4166142338c77adc8ac03e5e041Daniel Dunbar /// Maintained for compatibility through 2.6. 5894bd03abe593222b26e84066223feb321bf738625Daniel Dunbar static const Target *getClosestTargetForJIT(std::string &Error); 590bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 591bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 592bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Target Registration 593bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 594bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 59551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// RegisterTarget - Register the given target. Attempts to register a 59651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// target which has already been registered will be ignored. 59724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 59873b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 59973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 60073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 601bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 602bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 603bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Name - The target name. This should be a static string. 604bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param ShortDesc - A short target description. This should be a static 60524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// string. 606bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param TQualityFn - The triple match quality computation function for 607bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// this target. 608d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// @param HasJIT - Whether the target supports JIT code 609d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// generation. 610bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar static void RegisterTarget(Target &T, 611bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name, 612bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc, 613bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TripleMatchQualityFnTy TQualityFn, 614d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT = false); 615a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 6161abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 617a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// given target. 61824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 619a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// Clients are responsible for ensuring that registration doesn't occur 620a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// while another thread is attempting to access the registry. Typically 621a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// this is done by initializing all targets at program startup. 62224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 623a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// @param T - The target being registered. 624af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// @param Fn - A function to construct a MCAsmInfo for the target. 6251abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 626a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner // Ignore duplicate registration. 6271abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!T.MCAsmInfoCtorFn) 6281abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng T.MCAsmInfoCtorFn = Fn; 629a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 63024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 631439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the 632439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// given target. 633439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 634439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 635439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// while another thread is attempting to access the registry. Typically 636439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// this is done by initializing all targets at program startup. 637439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 638439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param T - The target being registered. 639439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param Fn - A function to construct a MCCodeGenInfo for the target. 640439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static void RegisterMCCodeGenInfo(Target &T, 641439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Target::MCCodeGenInfoCtorFnTy Fn) { 642439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // Ignore duplicate registration. 643439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!T.MCCodeGenInfoCtorFn) 644439661395fd2a2a832dba01c65bc88718528313cEvan Cheng T.MCCodeGenInfoCtorFn = Fn; 645439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 646439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 64794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 64894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// given target. 64994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 65094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 65194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// while another thread is attempting to access the registry. Typically 65294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// this is done by initializing all targets at program startup. 65394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 65494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param T - The target being registered. 65594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param Fn - A function to construct a MCInstrInfo for the target. 65694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 65794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng // Ignore duplicate registration. 65894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!T.MCInstrInfoCtorFn) 65994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng T.MCInstrInfoCtorFn = Fn; 66094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 66194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 66241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 66341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// the given target. 66441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer static void RegisterMCInstrAnalysis(Target &T, 66541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer Target::MCInstrAnalysisCtorFnTy Fn) { 66641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer // Ignore duplicate registration. 66741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!T.MCInstrAnalysisCtorFn) 66841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer T.MCInstrAnalysisCtorFn = Fn; 66941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 67041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 671f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 672a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// given target. 673a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 674a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 675a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// while another thread is attempting to access the registry. Typically 676a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// this is done by initializing all targets at program startup. 677a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 678a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param T - The target being registered. 679a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param Fn - A function to construct a MCRegisterInfo for the target. 680f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 681a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng // Ignore duplicate registration. 682f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!T.MCRegInfoCtorFn) 683f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng T.MCRegInfoCtorFn = Fn; 684a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 685a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 686ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 687ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// the given target. 688ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 689ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// Clients are responsible for ensuring that registration doesn't occur 690ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// while another thread is attempting to access the registry. Typically 691ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// this is done by initializing all targets at program startup. 692ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 693ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param T - The target being registered. 694ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param Fn - A function to construct a MCSubtargetInfo for the target. 695ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static void RegisterMCSubtargetInfo(Target &T, 696ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng Target::MCSubtargetInfoCtorFnTy Fn) { 697ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng // Ignore duplicate registration. 698ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!T.MCSubtargetInfoCtorFn) 699ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng T.MCSubtargetInfoCtorFn = Fn; 700ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 701ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 702bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// RegisterTargetMachine - Register a TargetMachine implementation for the 703bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// given target. 70424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 70573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 70673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 70773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 70824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 709bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 710bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Fn - A function to construct a TargetMachine for the target. 71124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterTargetMachine(Target &T, 712bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TargetMachineCtorTy Fn) { 713092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar // Ignore duplicate registration. 714092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar if (!T.TargetMachineCtorFn) 715092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar T.TargetMachineCtorFn = Fn; 716bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 717bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 71878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 719e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// given target. 720e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 721e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 722e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// while another thread is attempting to access the registry. Typically 723e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// this is done by initializing all targets at program startup. 724e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 725e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param T - The target being registered. 726e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param Fn - A function to construct an AsmBackend for the target. 72778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 72878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!T.MCAsmBackendCtorFn) 72978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng T.MCAsmBackendCtorFn = Fn; 730e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 731e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 73294b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 73394b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// the given target. 73424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 735092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 736092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// while another thread is attempting to access the registry. Typically 737092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// this is done by initializing all targets at program startup. 738092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// 739092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// @param T - The target being registered. 74094b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// @param Fn - A function to construct an MCTargetAsmParser for the target. 74194b9550a32d189704a8eae55505edf62662c0534Evan Cheng static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 74294b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!T.MCAsmParserCtorFn) 74394b9550a32d189704a8eae55505edf62662c0534Evan Cheng T.MCAsmParserCtorFn = Fn; 744bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 74524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 74724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// target. 74824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 74924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 75024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// while another thread is attempting to access the registry. Typically 75124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// this is done by initializing all targets at program startup. 75224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 75324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param T - The target being registered. 75424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an AsmPrinter for the target. 75524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 75624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar // Ignore duplicate registration. 75724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!T.AsmPrinterCtorFn) 75824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar T.AsmPrinterCtorFn = Fn; 75924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 76024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 761251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// RegisterMCDisassembler - Register a MCDisassembler implementation for 762251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the given target. 76324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 764251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// Clients are responsible for ensuring that registration doesn't occur 765251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// while another thread is attempting to access the registry. Typically 766251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// this is done by initializing all targets at program startup. 767251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 768251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param T - The target being registered. 769251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param Fn - A function to construct an MCDisassembler for the target. 77024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterMCDisassembler(Target &T, 771251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan Target::MCDisassemblerCtorTy Fn) { 772251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!T.MCDisassemblerCtorFn) 773251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan T.MCDisassemblerCtorFn = Fn; 774251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 775bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 7762685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 7772685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// given target. 77824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 7792685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7802685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// while another thread is attempting to access the registry. Typically 7812685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// this is done by initializing all targets at program startup. 7822685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7832685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param T - The target being registered. 7842685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param Fn - A function to construct an MCInstPrinter for the target. 78590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner static void RegisterMCInstPrinter(Target &T, 78690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner Target::MCInstPrinterCtorTy Fn) { 78790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!T.MCInstPrinterCtorFn) 78890edac0e8b35f766599362b6301863229f0ddcdbChris Lattner T.MCInstPrinterCtorFn = Fn; 78990edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 79024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 79128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 7924a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// given target. 7932685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7944a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// while another thread is attempting to access the registry. Typically 7964a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// this is done by initializing all targets at program startup. 7974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 7984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @param T - The target being registered. 79924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an MCCodeEmitter for the target. 80028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCCodeEmitter(Target &T, 80128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCCodeEmitterCtorTy Fn) { 80228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCCodeEmitterCtorFn) 80328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCCodeEmitterCtorFn = Fn; 8044a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 8054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 80628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCObjectStreamer - Register a object code MCStreamer 80728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// implementation for the given target. 808d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 809d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// Clients are responsible for ensuring that registration doesn't occur 810d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// while another thread is attempting to access the registry. Typically 811d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// this is done by initializing all targets at program startup. 812d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 813d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param T - The target being registered. 814d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param Fn - A function to construct an MCStreamer for the target. 81528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCObjectStreamer(Target &T, 81628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCObjectStreamerCtorTy Fn) { 81728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!T.MCObjectStreamerCtorFn) 81828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng T.MCObjectStreamerCtorFn = Fn; 819d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 820d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 8216da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// RegisterAsmStreamer - Register an assembly MCStreamer implementation 8226da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// for the given target. 8236da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 8246da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// Clients are responsible for ensuring that registration doesn't occur 8256da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// while another thread is attempting to access the registry. Typically 8266da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// this is done by initializing all targets at program startup. 8276da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 8286da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param T - The target being registered. 8296da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param Fn - A function to construct an MCStreamer for the target. 8306da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) { 831320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola if (T.AsmStreamerCtorFn == Target::createDefaultAsmStreamer) 8326da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou T.AsmStreamerCtorFn = Fn; 8336da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 8346da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 8352c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// RegisterMCRelocationInfo - Register an MCRelocationInfo 8362c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// implementation for the given target. 8372c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 8382c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// Clients are responsible for ensuring that registration doesn't occur 8392c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// while another thread is attempting to access the registry. Typically 8402c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// this is done by initializing all targets at program startup. 8412c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 8422c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param T - The target being registered. 8432c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param Fn - A function to construct an MCRelocationInfo for the target. 8442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha static void RegisterMCRelocationInfo(Target &T, 8452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha Target::MCRelocationInfoCtorTy Fn) { 846de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet if (T.MCRelocationInfoCtorFn == llvm::createMCRelocationInfo) 8472c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha T.MCRelocationInfoCtorFn = Fn; 8482c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 8492c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 850de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// RegisterMCSymbolizer - Register an MCSymbolizer 851de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// implementation for the given target. 852de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 853de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// Clients are responsible for ensuring that registration doesn't occur 854de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// while another thread is attempting to access the registry. Typically 855de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// this is done by initializing all targets at program startup. 856de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 857de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// @param T - The target being registered. 858de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// @param Fn - A function to construct an MCSymbolizer for the target. 859de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet static void RegisterMCSymbolizer(Target &T, 860de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet Target::MCSymbolizerCtorTy Fn) { 861de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet if (T.MCSymbolizerCtorFn == llvm::createMCSymbolizer) 862de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet T.MCSymbolizerCtorFn = Fn; 863de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet } 864de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 865bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 866bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 867bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 8680c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8690c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar //===--------------------------------------------------------------------===// 8700c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8710c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTarget - Helper template for registering a target, for use in the 8720c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// target's initialization function. Usage: 8730c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8740c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8750c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// Target TheFooTarget; // The global target instance. 8760c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8770c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTargetInfo() { 8788977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar /// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 8790c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 880124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth template<Triple::ArchType TargetArchType = Triple::UnknownArch, 8818977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar bool HasJIT = false> 8820c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTarget { 8830c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTarget(Target &T, const char *Name, const char *Desc) { 8840c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTarget(T, Name, Desc, 8858977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar &getTripleMatchQuality, 8868977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar HasJIT); 8878977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar } 8888977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar 8898977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar static unsigned getTripleMatchQuality(const std::string &TT) { 8905026274ba8e311aa86d3bf950eefa76c8c9aa008Benjamin Kramer if (Triple(TT).getArch() == TargetArchType) 8918977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 20; 8928977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar return 0; 8930c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 8940c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 8950c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8961abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Helper template for registering a target assembly info 897a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the static "Create" method on the class to 898a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// actually do the construction. Usage: 899a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 900a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 901a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 9021abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 903a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 904af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner template<class MCAsmInfoImpl> 9051abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfo { 9061abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfo(Target &T) { 9071abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 908a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 909a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 91048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCAsmInfo *Allocator(const MCRegisterInfo &/*MRI*/, StringRef TT) { 9116e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola return new MCAsmInfoImpl(TT); 912a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 91324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 914a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 915a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 9161abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 917a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the specified function to do the 918a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// construction. Usage: 919a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 920a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 921a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 9221abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 923a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 9241abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfoFn { 9251abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 9261abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, Fn); 92794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 92894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 92994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 930439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info 931439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// implementation. This invokes the static "Create" method on the class 932439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// to actually do the construction. Usage: 933439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 934439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 935439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 936439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget); 937439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 938439661395fd2a2a832dba01c65bc88718528313cEvan Cheng template<class MCCodeGenInfoImpl> 939439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfo { 940439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfo(Target &T) { 941439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator); 942439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 943439661395fd2a2a832dba01c65bc88718528313cEvan Cheng private: 94448d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCCodeGenInfo *Allocator(StringRef /*TT*/, Reloc::Model /*RM*/, 94548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands CodeModel::Model /*CM*/, 94648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands CodeGenOpt::Level /*OL*/) { 947439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return new MCCodeGenInfoImpl(); 948439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 949439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 950439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 951439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen 952439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// info implementation. This invokes the specified function to do the 953439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// construction. Usage: 954439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 955439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 956439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 957439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction); 958439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 959439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfoFn { 960439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) { 961439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, Fn); 962439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 963439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 964439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 96594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Helper template for registering a target instruction 96694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// info implementation. This invokes the static "Create" method on the class 96794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// to actually do the construction. Usage: 96894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 96994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 97094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 97194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 97294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 97394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng template<class MCInstrInfoImpl> 97494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfo { 97594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfo(Target &T) { 97694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 97794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 97894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng private: 97994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static MCInstrInfo *Allocator() { 98094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return new MCInstrInfoImpl(); 98194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 98294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 98394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 98494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn - Helper template for registering a target 98594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// instruction info implementation. This invokes the specified function to 98694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// do the construction. Usage: 98794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 98894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 98994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 99094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 99194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 99294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfoFn { 99394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 99494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, Fn); 995a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 996a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 997a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 9987801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis - Helper template for registering a target 9997801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the static "Create" 10007801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// method on the class to actually do the construction. Usage: 10017801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 10027801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 10037801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 10047801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 10057801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 10067801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng template<class MCInstrAnalysisImpl> 10077801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysis { 10087801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysis(Target &T) { 10097801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 10107801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 10117801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng private: 10127801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 10137801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return new MCInstrAnalysisImpl(Info); 10147801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 10157801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 10167801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 10177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn - Helper template for registering a target 10187801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the specified function 10197801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// to do the construction. Usage: 10207801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 10217801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 10227801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 10237801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 10247801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 10257801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysisFn { 10267801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 10277801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 10287801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 10297801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 10307801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 1031f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Helper template for registering a target register info 1032f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// implementation. This invokes the static "Create" method on the class to 1033f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// actually do the construction. Usage: 1034f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 1035f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1036f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 1037f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 1038f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 1039f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng template<class MCRegisterInfoImpl> 1040f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfo { 1041f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfo(Target &T) { 1042f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, &Allocator); 1043f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 1044f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng private: 104548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCRegisterInfo *Allocator(StringRef /*TT*/) { 1046f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng return new MCRegisterInfoImpl(); 1047f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 1048f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 1049f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng 1050f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn - Helper template for registering a target register 1051f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// info implementation. This invokes the specified function to do the 1052f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// construction. Usage: 1053f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 1054f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1055f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 1056f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 1057f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 1058f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfoFn { 1059f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 1060f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, Fn); 1061f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 1062f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 1063a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 1064ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Helper template for registering a target 1065ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the static "Create" method 1066ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// on the class to actually do the construction. Usage: 1067ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 1068ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1069ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1070ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 1071ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1072ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng template<class MCSubtargetInfoImpl> 1073ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfo { 1074ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfo(Target &T) { 1075ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 1076ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1077ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng private: 107848d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCSubtargetInfo *Allocator(StringRef /*TT*/, StringRef /*CPU*/, 107948d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands StringRef /*FS*/) { 1080ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return new MCSubtargetInfoImpl(); 1081ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1082ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1083ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 1084ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn - Helper template for registering a target 1085ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the specified function to 1086ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// do the construction. Usage: 1087ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 1088ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1089ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1090ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 1091ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1092ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfoFn { 1093ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 1094ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 1095ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1096ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1097ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 10980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine - Helper template for registering a target machine 10990c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// implementation, for use in the target machine initialization 11000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// function. Usage: 11010c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 11020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTarget() { 11030c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 11040c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 11050c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 11060c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar template<class TargetMachineImpl> 11070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTargetMachine { 11080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTargetMachine(Target &T) { 11090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTargetMachine(T, &Allocator); 11100c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 11110c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 11120c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1113439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static TargetMachine *Allocator(const Target &T, StringRef TT, 1114439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, StringRef FS, 11158a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 111634ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 1117b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 1118b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) { 11198a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL); 1120e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar } 1121e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar }; 1122e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar 112378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Helper template for registering a target specific 1124e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// assembler backend. Usage: 1125e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 112678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// extern "C" void LLVMInitializeFooMCAsmBackend() { 1127e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// extern Target TheFooTarget; 112878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 1129e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// } 113078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng template<class MCAsmBackendImpl> 113178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng struct RegisterMCAsmBackend { 113278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng RegisterMCAsmBackend(Target &T) { 113378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 1134e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1135e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 1136e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar private: 1137c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling static MCAsmBackend *Allocator(const Target &T, 1138c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling const MCRegisterInfo &MRI, 1139c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling StringRef Triple, StringRef CPU) { 1140c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling return new MCAsmBackendImpl(T, MRI, Triple, CPU); 1141e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1142e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar }; 1143e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 114494b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Helper template for registering a target specific 1145a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// assembly parser, for use in the target machine initialization 1146a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// function. Usage: 11470c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 114894b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// extern "C" void LLVMInitializeFooMCAsmParser() { 11490c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 115094b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 11510c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 115294b9550a32d189704a8eae55505edf62662c0534Evan Cheng template<class MCAsmParserImpl> 115394b9550a32d189704a8eae55505edf62662c0534Evan Cheng struct RegisterMCAsmParser { 115494b9550a32d189704a8eae55505edf62662c0534Evan Cheng RegisterMCAsmParser(Target &T) { 115594b9550a32d189704a8eae55505edf62662c0534Evan Cheng TargetRegistry::RegisterMCAsmParser(T, &Allocator); 11560c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 11570c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 11580c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1159715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P, 1160715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly const MCInstrInfo &MII) { 1161715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly return new MCAsmParserImpl(STI, P, MII); 11620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 11630c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 11640c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 116524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Helper template for registering a target specific 116624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// assembly printer, for use in the target machine initialization 116724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// function. Usage: 116824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 116924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern "C" void LLVMInitializeFooAsmPrinter() { 117024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern Target TheFooTarget; 117124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 117224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// } 117324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar template<class AsmPrinterImpl> 117424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar struct RegisterAsmPrinter { 117524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar RegisterAsmPrinter(Target &T) { 117624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar TargetRegistry::RegisterAsmPrinter(T, &Allocator); 117724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 117824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 117924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar private: 1180b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) { 1181b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return new AsmPrinterImpl(TM, Streamer); 118224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 118324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar }; 118424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 118528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Helper template for registering a target specific 11864a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// machine code emitter, for use in the target initialization 11874a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// function. Usage: 11884a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 118928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// extern "C" void LLVMInitializeFooMCCodeEmitter() { 11904a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// extern Target TheFooTarget; 119128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 11924a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// } 119328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng template<class MCCodeEmitterImpl> 119428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng struct RegisterMCCodeEmitter { 119528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RegisterMCCodeEmitter(Target &T) { 119628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 11974a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11984a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 11994a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar private: 120048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCCodeEmitter *Allocator(const MCInstrInfo &/*II*/, 120148d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands const MCRegisterInfo &/*MRI*/, 120248d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands const MCSubtargetInfo &/*STI*/, 120348d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands MCContext &/*Ctx*/) { 120428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return new MCCodeEmitterImpl(); 12054a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 12064a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar }; 12074a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 1208bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar} 1209bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 1210bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif 1211