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 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm-c/Disassembler.h" 238977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h" 24255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.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; 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines class MCTargetOptions; 49bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar class TargetMachine; 508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky class TargetOptions; 5190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner class raw_ostream; 526da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou class formatted_raw_ostream; 536da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer *createNullStreamer(MCContext &Ctx); 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isVerboseAsm, bool useDwarfDirectory, 57320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCInstPrinter *InstPrint, MCCodeEmitter *CE, 58320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola MCAsmBackend *TAB, bool ShowInst); 59bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 60de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx); 61de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 62de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizer *createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, 63de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 64de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 65de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, 66de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *RelInfo); 672c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 68bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Target - Wrapper for Target specific information. 69bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 70bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// For registration purposes, this is a POD type so that targets can be 71bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// registered without the use of static constructors. 7273b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// 7373b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Targets should implement a single global instance of this class (which 7473b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// will be zero initialized), and pass that instance to the TargetRegistry as 7573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// part of their initialization. 7673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar class Target { 77a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner public: 78a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner friend struct TargetRegistry; 79a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines typedef bool (*ArchMatchFnTy)(Triple::ArchType Arch); 81bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI, 834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef TT); 8434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng typedef MCCodeGenInfo *(*MCCodeGenInfoCtorFnTy)(StringRef TT, 8534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 86b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 87b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 8894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 8941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo*Info); 900e6a052331f674dd70e28af41f654a7874405eabEvan Cheng typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(StringRef TT); 91ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(StringRef TT, 92ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef CPU, 93ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features); 94a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner typedef TargetMachine *(*TargetMachineCtorTy)(const Target &T, 95439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef TT, 96439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, 97439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef Features, 988a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 9934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 100b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 101b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL); 102b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner typedef AsmPrinter *(*AsmPrinterCtorTy)(TargetMachine &TM, 10311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner MCStreamer &Streamer); 104536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, 105c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling const MCRegisterInfo &MRI, 106536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef TT, 107536a88ad5bf160232205192a7ce72e50bfadbdedRoman Divacky StringRef CPU); 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines typedef MCTargetAsmParser *(*MCAsmParserCtorTy)( 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSubtargetInfo &STI, 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCAsmParser &P, 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCInstrInfo &MII, 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCTargetOptions &Options); 113b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T, 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCSubtargetInfo &STI, 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext &Ctx); 11690edac0e8b35f766599362b6301863229f0ddcdbChris Lattner typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Target &T, 11790edac0e8b35f766599362b6301863229f0ddcdbChris Lattner unsigned SyntaxVariant, 118b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 11917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 120c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 121b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI); 12228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 123918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 12428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 12528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx); 12628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng typedef MCStreamer *(*MCObjectStreamerCtorTy)(const Target &T, 12728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng StringRef TT, 12828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx, 12928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 13028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 13128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI, 13328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 13428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack); 1356da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou typedef MCStreamer *(*AsmStreamerCtorTy)(MCContext &Ctx, 1366da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 1376da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 13844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 1396da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 1406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 14178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 142e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst); 143cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines typedef MCStreamer *(*NullStreamerCtorTy)(MCContext &Ctx); 1442c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(StringRef TT, 1452c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCContext &Ctx); 146de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet typedef MCSymbolizer *(*MCSymbolizerCtorTy)(StringRef TT, 147de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMOpInfoCallback GetOpInfo, 148de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 149de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 150de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, 151de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCRelocationInfo *RelInfo); 1524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 153a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 154bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// Next - The next registered target in the linked list, maintained by the 155bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry. 156bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target *Next; 157bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// The target function for checking if an architecture is supported. 15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ArchMatchFnTy ArchMatchFn; 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 230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Construction function for this target's NullStreamer, if registered 231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// (default = llvm::createNullStreamer). 232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines NullStreamerCtorTy NullStreamerCtorFn; 233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 2342c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfoCtorFn - Construction function for this target's 2352c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo) 2362c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfoCtorTy MCRelocationInfoCtorFn; 2372c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 238de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// MCSymbolizerCtorFn - Construction function for this target's 239de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer) 240de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizerCtorTy MCSymbolizerCtorFn; 241de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 242bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar public: 243320296a4cfe414ce59f406b8a5ce15272f563103Rafael Espindola Target() 244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : AsmStreamerCtorFn(nullptr), NullStreamerCtorFn(nullptr), 245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCRelocationInfoCtorFn(nullptr), MCSymbolizerCtorFn(nullptr) {} 2466da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 2474a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Target Information 2484a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 250c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar // getNext - Return the next registered target. 251c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar const Target *getNext() const { return Next; } 252c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar 253bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getName - Get the target name. 254bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getName() const { return Name; } 255bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 256bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// getShortDescription - Get a short description of the target. 257bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *getShortDescription() const { return ShortDesc; } 258bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 2594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Predicates 2614a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 2624a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 2634a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// hasJIT - Check if this targets supports the just-in-time compilation. 264d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool hasJIT() const { return HasJIT; } 26551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar 266603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar /// hasTargetMachine - Check if this target supports code generation. 267dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasTargetMachine() const { return TargetMachineCtorFn != nullptr; } 268603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 26978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// hasMCAsmBackend - Check if this target supports .o generation. 270dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != nullptr; } 271e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 2724a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 2734a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @name Feature Constructors 2744a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @{ 27524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2761abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 277a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// target triple. 278a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 2792d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 280a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// feature set; it should always be provided. Generally this should be 281a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// either the target triple from the module, or the target triple of the 282a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// host if that does not exist. 2834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI, 2844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola StringRef Triple) const { 2851abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (!MCAsmInfoCtorFn) 286dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 2874a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola return MCAsmInfoCtorFn(MRI, Triple); 288a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 28924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 290439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// createMCCodeGenInfo - Create a MCCodeGenInfo implementation. 291439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 29234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng MCCodeGenInfo *createMCCodeGenInfo(StringRef Triple, Reloc::Model RM, 293b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 294b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) const { 295439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (!MCCodeGenInfoCtorFn) 296dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 297b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng return MCCodeGenInfoCtorFn(Triple, RM, CM, OL); 298439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 299439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 30094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// createMCInstrInfo - Create a MCInstrInfo implementation. 30194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 30294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng MCInstrInfo *createMCInstrInfo() const { 30394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng if (!MCInstrInfoCtorFn) 304dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 30594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return MCInstrInfoCtorFn(); 30694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 30794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 30841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 30941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// 31041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 31141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer if (!MCInstrAnalysisCtorFn) 312dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 31341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer return MCInstrAnalysisCtorFn(Info); 31441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 31541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 316f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// createMCRegInfo - Create a MCRegisterInfo implementation. 317a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 3180e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *createMCRegInfo(StringRef Triple) const { 319f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng if (!MCRegInfoCtorFn) 320dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 3210e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return MCRegInfoCtorFn(Triple); 322a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 323a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 324ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 325ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 3262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 327ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// feature set; it should always be provided. Generally this should be 328ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// either the target triple from the module, or the target triple of the 329ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// host if that does not exist. 3302d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param CPU This specifies the name of the target CPU. 3312d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Features This specifies the string representation of the 332ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// additional target features. 333ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng MCSubtargetInfo *createMCSubtargetInfo(StringRef Triple, StringRef CPU, 334ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng StringRef Features) const { 335ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng if (!MCSubtargetInfoCtorFn) 336dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 337ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return MCSubtargetInfoCtorFn(Triple, CPU, Features); 338ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 339ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 3403c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// createTargetMachine - Create a target specific machine implementation 3412d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// for the specified \p Triple. 3423c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// 3432d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple This argument is used to determine the target machine 3443c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// feature set; it should always be provided. Generally this should be 3453c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// either the target triple from the module, or the target triple of the 3463c2d4bf97fa96fe171883cd80e4ea93fc43563e6Daniel Dunbar /// host if that does not exist. 347439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetMachine *createTargetMachine(StringRef Triple, StringRef CPU, 3488a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky StringRef Features, const TargetOptions &Options, 349b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM = Reloc::Default, 350b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM = CodeModel::Default, 351b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL = CodeGenOpt::Default) const { 352bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar if (!TargetMachineCtorFn) 353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 3548a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return TargetMachineCtorFn(*this, Triple, CPU, Features, Options, 3558a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky RM, CM, OL); 356214e22396fe86aa20c587d5c7df9ce63bfd4549eDaniel Dunbar } 357bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 35878c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// createMCAsmBackend - Create a target specific assembly parser. 359e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 3602d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Triple The target triple string. 361c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI, 362c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling StringRef Triple, StringRef CPU) const { 36378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng if (!MCAsmBackendCtorFn) 364dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 365c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling return MCAsmBackendCtorFn(*this, MRI, Triple, CPU); 366e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 367e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 36894b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// createMCAsmParser - Create a target specific assembly parser. 369a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// 3702d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Parser The target independent parser implementation to use for 371a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// parsing and lexing. 372dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCTargetAsmParser *createMCAsmParser( 373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSubtargetInfo &STI, 374dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCAsmParser &Parser, 375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCInstrInfo &MII, 376dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCTargetOptions &Options) const { 37794b9550a32d189704a8eae55505edf62662c0534Evan Cheng if (!MCAsmParserCtorFn) 378dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 379dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return MCAsmParserCtorFn(STI, Parser, MII, Options); 380092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar } 38124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 38224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// createAsmPrinter - Create a target specific assembly printer pass. This 38311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner /// takes ownership of the MCStreamer object. 384b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner AsmPrinter *createAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) const{ 38524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar if (!AsmPrinterCtorFn) 386dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 387b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return AsmPrinterCtorFn(TM, Streamer); 38824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 38924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 390dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI, 391dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext &Ctx) const { 392251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan if (!MCDisassemblerCtorFn) 393dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 394dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return MCDisassemblerCtorFn(*this, STI, Ctx); 395251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 3964a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 397b262799d49891b036daa00eddf51947487346c98Evan Cheng MCInstPrinter *createMCInstPrinter(unsigned SyntaxVariant, 398b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 39917463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 400c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach const MCRegisterInfo &MRI, 401b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI) const { 40290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner if (!MCInstPrinterCtorFn) 403dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 40417463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper return MCInstPrinterCtorFn(*this, SyntaxVariant, MAI, MII, MRI, STI); 40590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 40624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 40724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 40828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCCodeEmitter - Create a target specific code emitter. 40928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 410918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 41128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng const MCSubtargetInfo &STI, 41228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx) const { 41328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCCodeEmitterCtorFn) 414dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 415918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach return MCCodeEmitterCtorFn(II, MRI, STI, Ctx); 4164a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 4174a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 41828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// createMCObjectStreamer - Create a target specific MCStreamer. 419d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 4202d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TT The target triple. 4212d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Ctx The target context. 4222d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param TAB The target assembler backend object. Takes ownership. 4232d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _OS The stream object. 4242d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param _Emitter The target independent assembler object.Takes ownership. 4252d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param RelaxAll Relax all fixups? 4262d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param NoExecStack Mark file as not needing a executable stack. 42728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCStreamer *createMCObjectStreamer(StringRef TT, MCContext &Ctx, 42828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCAsmBackend &TAB, 42928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng raw_ostream &_OS, 43028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCCodeEmitter *_Emitter, 43136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MCSubtargetInfo &STI, 43228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool RelaxAll, 43328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng bool NoExecStack) const { 43428c85a81a17dd719a254dc00cbeb484774893197Evan Cheng if (!MCObjectStreamerCtorFn) 435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 43636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return MCObjectStreamerCtorFn(*this, TT, Ctx, TAB, _OS, _Emitter, STI, 43728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RelaxAll, NoExecStack); 438d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 439d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 4406da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// createAsmStreamer - Create a target specific MCStreamer. 4416da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCStreamer *createAsmStreamer(MCContext &Ctx, 4426da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou formatted_raw_ostream &OS, 4436da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou bool isVerboseAsm, 44444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky bool useDwarfDirectory, 4456da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCInstPrinter *InstPrint, 4466da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou MCCodeEmitter *CE, 44778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng MCAsmBackend *TAB, 448e266ce6c6eaf52ebe2b18d85b5e23788cf2f6ef4Bill Wendling bool ShowInst) const { 449670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola if (AsmStreamerCtorFn) 450dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useDwarfDirectory, 451dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines InstPrint, CE, TAB, ShowInst); 452dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useDwarfDirectory, 453dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines InstPrint, CE, TAB, ShowInst); 4546da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 4556da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 456cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer *createNullStreamer(MCContext &Ctx) const { 457cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (NullStreamerCtorFn) 458cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return NullStreamerCtorFn(Ctx); 459cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return llvm::createNullStreamer(Ctx); 460cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 461cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 4622c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// createMCRelocationInfo - Create a target specific MCRelocationInfo. 4632c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 4642c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param TT The target triple. 4652c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// \param Ctx The target context. 4662c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha MCRelocationInfo * 4672c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha createMCRelocationInfo(StringRef TT, MCContext &Ctx) const { 468670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola MCRelocationInfoCtorTy Fn = MCRelocationInfoCtorFn 469670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola ? MCRelocationInfoCtorFn 470670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola : llvm::createMCRelocationInfo; 471670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola return Fn(TT, Ctx); 4722c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 4732c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 474de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// createMCSymbolizer - Create a target specific MCSymbolizer. 475de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 476de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param TT The target triple. 477de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param GetOpInfo The function to get the symbolic information for operands. 478de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param SymbolLookUp The function to lookup a symbol name. 479de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param DisInfo The pointer to the block of symbolic information for above call 480de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// back. 481de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param Ctx The target context. 482de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// \param RelInfo The relocation information for this target. Takes ownership. 483de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCSymbolizer * 484de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, 485de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet LLVMSymbolLookupCallback SymbolLookUp, 486de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet void *DisInfo, 487de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext *Ctx, MCRelocationInfo *RelInfo) const { 488670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola MCSymbolizerCtorTy Fn = 489670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola MCSymbolizerCtorFn ? MCSymbolizerCtorFn : llvm::createMCSymbolizer; 490670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola return Fn(TT, GetOpInfo, SymbolLookUp, DisInfo, Ctx, RelInfo); 491de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet } 492de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 4934a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @} 494bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 495bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 496bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// TargetRegistry - Generic interface to target specific features. 497bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar struct TargetRegistry { 498603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar class iterator { 499603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *Current; 500603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar explicit iterator(Target *T) : Current(T) {} 501edcb540496ca798003d9fece8cf4e57d536afa38Daniel Dunbar friend struct TargetRegistry; 502603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar public: 503dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines iterator() : Current(nullptr) {} 504603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 505603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator==(const iterator &x) const { 506603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return Current == x.Current; 507603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 508603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar bool operator!=(const iterator &x) const { 509603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return !operator==(x); 510603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 511603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 512603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar // Iterator traversal: forward iteration only 513603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator &operator++() { // Preincrement 514603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot increment end iterator!"); 515c981da0192ab42d28f1034f2a7fa9cbab096425aDaniel Dunbar Current = Current->getNext(); 516603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *this; 517603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 518603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar iterator operator++(int) { // Postincrement 51924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar iterator tmp = *this; 52024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar ++*this; 521603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return tmp; 522603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 523603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 524603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target &operator*() const { 525603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar assert(Current && "Cannot dereference end iterator!"); 526603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return *Current; 527603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 528603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 529603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar const Target *operator->() const { 530603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar return &operator*(); 531603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar } 532603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar }; 533603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 534077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// printRegisteredTargetsForVersion - Print the registered targets 535077c40871780136f7016a496703b20ebea9c0978Chandler Carruth /// appropriately for inclusion in a tool's version output. 536077c40871780136f7016a496703b20ebea9c0978Chandler Carruth static void printRegisteredTargetsForVersion(); 537077c40871780136f7016a496703b20ebea9c0978Chandler Carruth 538bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Registry Access 539bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 540bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 541603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator begin(); 542603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 543603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar static iterator end() { return iterator(); } 544603bea32743dc9914a1d32ae36fc64fe497af801Daniel Dunbar 545a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// lookupTarget - Lookup a target based on a target triple. 546a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// 547a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Triple - The triple to use for finding a target. 548a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// \param Error - On failure, an error string describing why no target was 549a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar /// found. 550a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar static const Target *lookupTarget(const std::string &Triple, 551a5881e3060aee9f82aef3747a97650e5eafe893aDaniel Dunbar std::string &Error); 552bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 5539ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// lookupTarget - Lookup a target based on an architecture name 5549ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// and a target triple. If the architecture name is non-empty, 5559ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// then the lookup is done by architecture. Otherwise, the target 5569ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is used. 5579ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// 5589ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param ArchName - The architecture to use for finding a target. 5599ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param TheTriple - The triple to use for finding a target. The 5609ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// triple is updated with canonical architecture name if a lookup 5619ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// by architecture is done. 5629ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// \param Error - On failure, an error string describing why no target was 5639ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby /// found. 5649ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby static const Target *lookupTarget(const std::string &ArchName, 5659ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby Triple &TheTriple, 5669ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby std::string &Error); 5679ed9e5d0f994c7721185eba963ea9b907dabcde6Kevin Enderby 568bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 569bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @name Target Registration 570bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @{ 571bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 57251b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// RegisterTarget - Register the given target. Attempts to register a 57351b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar /// target which has already been registered will be ignored. 57424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 57573b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 57673b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 57773b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 578bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// 579bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 580bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Name - The target name. This should be a static string. 581bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param ShortDesc - A short target description. This should be a static 58224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// string. 58336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @param ArchMatchFn - The arch match checking function for this target. 584d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// @param HasJIT - Whether the target supports JIT code 585d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar /// generation. 586bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar static void RegisterTarget(Target &T, 587bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *Name, 588bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar const char *ShortDesc, 58936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Target::ArchMatchFnTy ArchMatchFn, 590d6fd377f3333922c4e928019cdfa124ff7f4dd2eDaniel Dunbar bool HasJIT = false); 591a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 5921abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 593a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// given target. 59424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 595a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// Clients are responsible for ensuring that registration doesn't occur 596a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// while another thread is attempting to access the registry. Typically 597a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// this is done by initializing all targets at program startup. 59824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 599a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// @param T - The target being registered. 600af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner /// @param Fn - A function to construct a MCAsmInfo for the target. 6011abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 602670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCAsmInfoCtorFn = Fn; 603a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 60424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 605439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Register a MCCodeGenInfo implementation for the 606439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// given target. 607439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 608439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 609439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// while another thread is attempting to access the registry. Typically 610439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// this is done by initializing all targets at program startup. 611439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 612439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param T - The target being registered. 613439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// @param Fn - A function to construct a MCCodeGenInfo for the target. 614439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static void RegisterMCCodeGenInfo(Target &T, 615439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Target::MCCodeGenInfoCtorFnTy Fn) { 616670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCCodeGenInfoCtorFn = Fn; 617439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 618439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 61994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 62094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// given target. 62194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 62294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 62394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// while another thread is attempting to access the registry. Typically 62494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// this is done by initializing all targets at program startup. 62594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 62694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param T - The target being registered. 62794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// @param Fn - A function to construct a MCInstrInfo for the target. 62894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 629670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCInstrInfoCtorFn = Fn; 63094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 63194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 63241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 63341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// the given target. 63441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer static void RegisterMCInstrAnalysis(Target &T, 63541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer Target::MCInstrAnalysisCtorFnTy Fn) { 636670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCInstrAnalysisCtorFn = Fn; 63741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 63841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 639f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 640a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// given target. 641a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 642a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// Clients are responsible for ensuring that registration doesn't occur 643a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// while another thread is attempting to access the registry. Typically 644a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// this is done by initializing all targets at program startup. 645a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// 646a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param T - The target being registered. 647a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng /// @param Fn - A function to construct a MCRegisterInfo for the target. 648f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 649670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCRegInfoCtorFn = Fn; 650a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng } 651a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 652ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 653ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// the given target. 654ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 655ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// Clients are responsible for ensuring that registration doesn't occur 656ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// while another thread is attempting to access the registry. Typically 657ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// this is done by initializing all targets at program startup. 658ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 659ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param T - The target being registered. 660ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// @param Fn - A function to construct a MCSubtargetInfo for the target. 661ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng static void RegisterMCSubtargetInfo(Target &T, 662ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng Target::MCSubtargetInfoCtorFnTy Fn) { 663670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCSubtargetInfoCtorFn = Fn; 664ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 665ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 666bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// RegisterTargetMachine - Register a TargetMachine implementation for the 667bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// given target. 66824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 66973b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 67073b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// while another thread is attempting to access the registry. Typically 67173b3ec41349511dbf28c18997e3f64761ff0f114Daniel Dunbar /// this is done by initializing all targets at program startup. 67224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 673bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param T - The target being registered. 674bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @param Fn - A function to construct a TargetMachine for the target. 67524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterTargetMachine(Target &T, 676bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar Target::TargetMachineCtorTy Fn) { 677670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.TargetMachineCtorFn = Fn; 678bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 679bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 68078c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 681e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// given target. 682e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 683e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 684e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// while another thread is attempting to access the registry. Typically 685e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// this is done by initializing all targets at program startup. 686e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 687e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param T - The target being registered. 688e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// @param Fn - A function to construct an AsmBackend for the target. 68978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 690670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCAsmBackendCtorFn = Fn; 691e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 692e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 69394b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 69494b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// the given target. 69524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 696092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 697092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// while another thread is attempting to access the registry. Typically 698092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// this is done by initializing all targets at program startup. 699092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// 700092a9dda2d13918a6410db26f41c7b5aa97ff989Daniel Dunbar /// @param T - The target being registered. 70194b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// @param Fn - A function to construct an MCTargetAsmParser for the target. 70294b9550a32d189704a8eae55505edf62662c0534Evan Cheng static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 703670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCAsmParserCtorFn = Fn; 704bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar } 70524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 70624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 70724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// target. 70824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 70924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 71024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// while another thread is attempting to access the registry. Typically 71124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// this is done by initializing all targets at program startup. 71224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 71324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param T - The target being registered. 71424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an AsmPrinter for the target. 71524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 716670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.AsmPrinterCtorFn = Fn; 71724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 71824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 719251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// RegisterMCDisassembler - Register a MCDisassembler implementation for 720251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the given target. 72124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 722251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// Clients are responsible for ensuring that registration doesn't occur 723251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// while another thread is attempting to access the registry. Typically 724251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// this is done by initializing all targets at program startup. 725251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 726251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param T - The target being registered. 727251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param Fn - A function to construct an MCDisassembler for the target. 72824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar static void RegisterMCDisassembler(Target &T, 729251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan Target::MCDisassemblerCtorTy Fn) { 730670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCDisassemblerCtorFn = Fn; 731251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan } 732bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 7332685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 7342685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// given target. 73524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 7362685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7372685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// while another thread is attempting to access the registry. Typically 7382685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// this is done by initializing all targets at program startup. 7392685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7402685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param T - The target being registered. 7412685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// @param Fn - A function to construct an MCInstPrinter for the target. 74290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner static void RegisterMCInstPrinter(Target &T, 74390edac0e8b35f766599362b6301863229f0ddcdbChris Lattner Target::MCInstPrinterCtorTy Fn) { 744670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCInstPrinterCtorFn = Fn; 74590edac0e8b35f766599362b6301863229f0ddcdbChris Lattner } 74624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 74728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 7484a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// given target. 7492685a29a8d4ced7791bb671e28f9fe51c74eb3bbDaniel Dunbar /// 7504a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// Clients are responsible for ensuring that registration doesn't occur 7514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// while another thread is attempting to access the registry. Typically 7524a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// this is done by initializing all targets at program startup. 7534a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 7544a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// @param T - The target being registered. 75524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// @param Fn - A function to construct an MCCodeEmitter for the target. 75628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCCodeEmitter(Target &T, 75728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCCodeEmitterCtorTy Fn) { 758670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCCodeEmitterCtorFn = Fn; 7594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 7604a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 76128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCObjectStreamer - Register a object code MCStreamer 76228c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// implementation for the given target. 763d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 764d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// Clients are responsible for ensuring that registration doesn't occur 765d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// while another thread is attempting to access the registry. Typically 766d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// this is done by initializing all targets at program startup. 767d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// 768d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param T - The target being registered. 769d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming /// @param Fn - A function to construct an MCStreamer for the target. 77028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng static void RegisterMCObjectStreamer(Target &T, 77128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng Target::MCObjectStreamerCtorTy Fn) { 772670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCObjectStreamerCtorFn = Fn; 773d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming } 774d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 7756da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// RegisterAsmStreamer - Register an assembly MCStreamer implementation 7766da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// for the given target. 7776da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7786da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// Clients are responsible for ensuring that registration doesn't occur 7796da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// while another thread is attempting to access the registry. Typically 7806da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// this is done by initializing all targets at program startup. 7816da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// 7826da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param T - The target being registered. 7836da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou /// @param Fn - A function to construct an MCStreamer for the target. 7846da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou static void RegisterAsmStreamer(Target &T, Target::AsmStreamerCtorTy Fn) { 785670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.AsmStreamerCtorFn = Fn; 7866da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou } 7876da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 788cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static void RegisterNullStreamer(Target &T, Target::NullStreamerCtorTy Fn) { 789cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines T.NullStreamerCtorFn = Fn; 790cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 791cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 7922c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// RegisterMCRelocationInfo - Register an MCRelocationInfo 7932c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// implementation for the given target. 7942c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 7952c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// Clients are responsible for ensuring that registration doesn't occur 7962c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// while another thread is attempting to access the registry. Typically 7972c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// this is done by initializing all targets at program startup. 7982c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// 7992c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param T - The target being registered. 8002c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// @param Fn - A function to construct an MCRelocationInfo for the target. 8012c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha static void RegisterMCRelocationInfo(Target &T, 8022c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha Target::MCRelocationInfoCtorTy Fn) { 803670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCRelocationInfoCtorFn = Fn; 8042c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 8052c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 806de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// RegisterMCSymbolizer - Register an MCSymbolizer 807de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// implementation for the given target. 808de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 809de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// Clients are responsible for ensuring that registration doesn't occur 810de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// while another thread is attempting to access the registry. Typically 811de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// this is done by initializing all targets at program startup. 812de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// 813de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// @param T - The target being registered. 814de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet /// @param Fn - A function to construct an MCSymbolizer for the target. 815de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet static void RegisterMCSymbolizer(Target &T, 816de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet Target::MCSymbolizerCtorTy Fn) { 817670655471dfc35d90271393bd3e6e26a708f1a3cRafael Espindola T.MCSymbolizerCtorFn = Fn; 818de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet } 819de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 820bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar /// @} 821bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 822bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 8230c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8240c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar //===--------------------------------------------------------------------===// 8250c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8260c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTarget - Helper template for registering a target, for use in the 8270c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// target's initialization function. Usage: 8280c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8290c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8300c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// Target TheFooTarget; // The global target instance. 8310c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 8320c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTargetInfo() { 8338977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar /// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 8340c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 835124e51c0d2b521b0fb3aaaf2443403cd451b7857Chandler Carruth template<Triple::ArchType TargetArchType = Triple::UnknownArch, 8368977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar bool HasJIT = false> 8370c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTarget { 8380c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTarget(Target &T, const char *Name, const char *Desc) { 83936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TargetRegistry::RegisterTarget(T, Name, Desc, &getArchMatch, HasJIT); 8408977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar } 8418977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar 84236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static bool getArchMatch(Triple::ArchType Arch) { 84336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Arch == TargetArchType; 8440c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 8450c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 8460c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 8471abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo - Helper template for registering a target assembly info 848a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the static "Create" method on the class to 849a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// actually do the construction. Usage: 850a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 851a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 852a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 8531abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 854a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 855af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner template<class MCAsmInfoImpl> 8561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfo { 8571abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfo(Target &T) { 8581abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 859a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 860a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner private: 86148d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCAsmInfo *Allocator(const MCRegisterInfo &/*MRI*/, StringRef TT) { 8626e53180db120b30f600ac31611a9dd47ef7f4921Rafael Espindola return new MCAsmInfoImpl(TT); 863a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 86424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 865a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 866a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 8671abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 868a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// implementation. This invokes the specified function to do the 869a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// construction. Usage: 870a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 871a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern "C" void LLVMInitializeFooTarget() { 872a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// extern Target TheFooTarget; 8731abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng /// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 874a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// } 8751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng struct RegisterMCAsmInfoFn { 8761abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 8771abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng TargetRegistry::RegisterMCAsmInfo(T, Fn); 87894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 87994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 88094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 881439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo - Helper template for registering a target codegen info 882439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// implementation. This invokes the static "Create" method on the class 883439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// to actually do the construction. Usage: 884439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 885439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 886439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 887439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfo<FooMCCodeGenInfo> X(TheFooTarget); 888439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 889439661395fd2a2a832dba01c65bc88718528313cEvan Cheng template<class MCCodeGenInfoImpl> 890439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfo { 891439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfo(Target &T) { 892439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, &Allocator); 893439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 894439661395fd2a2a832dba01c65bc88718528313cEvan Cheng private: 89548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCCodeGenInfo *Allocator(StringRef /*TT*/, Reloc::Model /*RM*/, 89648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands CodeModel::Model /*CM*/, 89748d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands CodeGenOpt::Level /*OL*/) { 898439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return new MCCodeGenInfoImpl(); 899439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 900439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 901439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 902439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn - Helper template for registering a target codegen 903439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// info implementation. This invokes the specified function to do the 904439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// construction. Usage: 905439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 906439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 907439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// extern Target TheFooTarget; 908439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// RegisterMCCodeGenInfoFn X(TheFooTarget, TheFunction); 909439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// } 910439661395fd2a2a832dba01c65bc88718528313cEvan Cheng struct RegisterMCCodeGenInfoFn { 911439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RegisterMCCodeGenInfoFn(Target &T, Target::MCCodeGenInfoCtorFnTy Fn) { 912439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(T, Fn); 913439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 914439661395fd2a2a832dba01c65bc88718528313cEvan Cheng }; 915439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 91694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo - Helper template for registering a target instruction 91794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// info implementation. This invokes the static "Create" method on the class 91894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// to actually do the construction. Usage: 91994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 92094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 92194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 92294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 92394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 92494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng template<class MCInstrInfoImpl> 92594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfo { 92694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfo(Target &T) { 92794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 92894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 92994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng private: 93094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng static MCInstrInfo *Allocator() { 93194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng return new MCInstrInfoImpl(); 93294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng } 93394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng }; 93494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 93594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn - Helper template for registering a target 93694b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// instruction info implementation. This invokes the specified function to 93794b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// do the construction. Usage: 93894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 93994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 94094b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// extern Target TheFooTarget; 94194b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 94294b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// } 94394b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng struct RegisterMCInstrInfoFn { 94494b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 94594b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng TargetRegistry::RegisterMCInstrInfo(T, Fn); 946a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner } 947a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner }; 948a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 9497801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis - Helper template for registering a target 9507801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the static "Create" 9517801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// method on the class to actually do the construction. Usage: 9527801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 9537801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 9547801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 9557801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 9567801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9577801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng template<class MCInstrAnalysisImpl> 9587801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysis { 9597801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysis(Target &T) { 9607801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 9617801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9627801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng private: 9637801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 9647801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return new MCInstrAnalysisImpl(Info); 9657801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9667801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9677801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 9687801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn - Helper template for registering a target 9697801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// instruction analyzer implementation. This invokes the specified function 9707801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// to do the construction. Usage: 9717801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 9727801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 9737801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// extern Target TheFooTarget; 9747801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 9757801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// } 9767801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng struct RegisterMCInstrAnalysisFn { 9777801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 9787801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 9797801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng } 9807801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng }; 9817801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 982f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo - Helper template for registering a target register info 983f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// implementation. This invokes the static "Create" method on the class to 984f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// actually do the construction. Usage: 985f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 986f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 987f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 988f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 989f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 990f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng template<class MCRegisterInfoImpl> 991f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfo { 992f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfo(Target &T) { 993f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, &Allocator); 994f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 995f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng private: 99648d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCRegisterInfo *Allocator(StringRef /*TT*/) { 997f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng return new MCRegisterInfoImpl(); 998f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 999f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 1000f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng 1001f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn - Helper template for registering a target register 1002f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// info implementation. This invokes the specified function to do the 1003f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// construction. Usage: 1004f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 1005f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1006f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// extern Target TheFooTarget; 1007f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 1008f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// } 1009f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng struct RegisterMCRegInfoFn { 1010f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 1011f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng TargetRegistry::RegisterMCRegInfo(T, Fn); 1012f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng } 1013f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng }; 1014a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner 1015ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo - Helper template for registering a target 1016ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the static "Create" method 1017ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// on the class to actually do the construction. Usage: 1018ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 1019ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1020ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1021ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 1022ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1023ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng template<class MCSubtargetInfoImpl> 1024ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfo { 1025ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfo(Target &T) { 1026ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 1027ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1028ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng private: 102948d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCSubtargetInfo *Allocator(StringRef /*TT*/, StringRef /*CPU*/, 103048d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands StringRef /*FS*/) { 1031ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng return new MCSubtargetInfoImpl(); 1032ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1033ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1034ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 1035ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn - Helper template for registering a target 1036ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// subtarget info implementation. This invokes the specified function to 1037ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// do the construction. Usage: 1038ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 1039ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern "C" void LLVMInitializeFooTarget() { 1040ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// extern Target TheFooTarget; 1041ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 1042ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// } 1043ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng struct RegisterMCSubtargetInfoFn { 1044ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 1045ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 1046ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng } 1047ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng }; 1048ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 10490c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine - Helper template for registering a target machine 10500c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// implementation, for use in the target machine initialization 10510c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// function. Usage: 10520c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 10530c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern "C" void LLVMInitializeFooTarget() { 10540c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 10550c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 10560c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 10570c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar template<class TargetMachineImpl> 10580c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar struct RegisterTargetMachine { 10590c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar RegisterTargetMachine(Target &T) { 10600c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar TargetRegistry::RegisterTargetMachine(T, &Allocator); 10610c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 10620c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 10630c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1064439661395fd2a2a832dba01c65bc88718528313cEvan Cheng static TargetMachine *Allocator(const Target &T, StringRef TT, 1065439661395fd2a2a832dba01c65bc88718528313cEvan Cheng StringRef CPU, StringRef FS, 10668a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 106734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng Reloc::Model RM, 1068b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 1069b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) { 10708a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL); 1071e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar } 1072e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar }; 1073e28039cfd1a9c43b5fa9274bf19372d96f58f460Daniel Dunbar 107478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend - Helper template for registering a target specific 1075e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// assembler backend. Usage: 1076e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 107778c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// extern "C" void LLVMInitializeFooMCAsmBackend() { 1078e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// extern Target TheFooTarget; 107978c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng /// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 1080e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// } 108178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng template<class MCAsmBackendImpl> 108278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng struct RegisterMCAsmBackend { 108378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng RegisterMCAsmBackend(Target &T) { 108478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 1085e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1086e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 1087e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar private: 1088c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling static MCAsmBackend *Allocator(const Target &T, 1089c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling const MCRegisterInfo &MRI, 1090c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling StringRef Triple, StringRef CPU) { 1091c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill Wendling return new MCAsmBackendImpl(T, MRI, Triple, CPU); 1092e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar } 1093e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar }; 1094e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 109594b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser - Helper template for registering a target specific 1096a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// assembly parser, for use in the target machine initialization 1097a2edbabcb86f213eca6daeda5d801f8c7b1e44b2Daniel Dunbar /// function. Usage: 10980c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 109994b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// extern "C" void LLVMInitializeFooMCAsmParser() { 11000c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// extern Target TheFooTarget; 110194b9550a32d189704a8eae55505edf62662c0534Evan Cheng /// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 11020c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// } 110394b9550a32d189704a8eae55505edf62662c0534Evan Cheng template<class MCAsmParserImpl> 110494b9550a32d189704a8eae55505edf62662c0534Evan Cheng struct RegisterMCAsmParser { 110594b9550a32d189704a8eae55505edf62662c0534Evan Cheng RegisterMCAsmParser(Target &T) { 110694b9550a32d189704a8eae55505edf62662c0534Evan Cheng TargetRegistry::RegisterMCAsmParser(T, &Allocator); 11070c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 11080c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 11090c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar private: 1110715d98d657491b3fb8ea0e14643e9801b2f9628cJoey Gouly static MCTargetAsmParser *Allocator(MCSubtargetInfo &STI, MCAsmParser &P, 1111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCInstrInfo &MII, 1112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCTargetOptions &Options) { 1113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return new MCAsmParserImpl(STI, P, MII, Options); 11140c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar } 11150c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar }; 11160c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 111724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter - Helper template for registering a target specific 111824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// assembly printer, for use in the target machine initialization 111924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// function. Usage: 112024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 112124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern "C" void LLVMInitializeFooAsmPrinter() { 112224b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// extern Target TheFooTarget; 112324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 112424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// } 112524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar template<class AsmPrinterImpl> 112624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar struct RegisterAsmPrinter { 112724b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar RegisterAsmPrinter(Target &T) { 112824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar TargetRegistry::RegisterAsmPrinter(T, &Allocator); 112924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 113024b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 113124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar private: 1132b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner static AsmPrinter *Allocator(TargetMachine &TM, MCStreamer &Streamer) { 1133b23569aff0a6d2b231cb93cc4acd0ac060ba560fChris Lattner return new AsmPrinterImpl(TM, Streamer); 113424b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar } 113524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar }; 113624b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 113728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter - Helper template for registering a target specific 11384a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// machine code emitter, for use in the target initialization 11394a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// function. Usage: 11404a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 114128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// extern "C" void LLVMInitializeFooMCCodeEmitter() { 11424a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// extern Target TheFooTarget; 114328c85a81a17dd719a254dc00cbeb484774893197Evan Cheng /// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 11444a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// } 114528c85a81a17dd719a254dc00cbeb484774893197Evan Cheng template<class MCCodeEmitterImpl> 114628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng struct RegisterMCCodeEmitter { 114728c85a81a17dd719a254dc00cbeb484774893197Evan Cheng RegisterMCCodeEmitter(Target &T) { 114828c85a81a17dd719a254dc00cbeb484774893197Evan Cheng TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 11494a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11504a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 11514a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar private: 115248d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands static MCCodeEmitter *Allocator(const MCInstrInfo &/*II*/, 115348d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands const MCRegisterInfo &/*MRI*/, 115448d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands const MCSubtargetInfo &/*STI*/, 115548d5e750a8189c55087333d2bbc5dd0e1e07ddfaDuncan Sands MCContext &/*Ctx*/) { 115628c85a81a17dd719a254dc00cbeb484774893197Evan Cheng return new MCCodeEmitterImpl(); 11574a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar } 11584a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar }; 11594a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 1160bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar} 1161bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 1162bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif 1163