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" 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/Optional.h" 248977d087c693fd581db82bcff134d12da0f48bd3Daniel Dunbar#include "llvm/ADT/Triple.h" 25255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/CodeGen.h" 260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/Support/FormattedStream.h" 27bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#include <cassert> 28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include <memory> 29255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include <string> 30bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 31bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbarnamespace llvm { 326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass AsmPrinter; 336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCAsmBackend; 346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCAsmInfo; 356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCAsmParser; 366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCCodeEmitter; 376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCContext; 386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCDisassembler; 396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCInstrAnalysis; 406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCInstPrinter; 416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCInstrInfo; 426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCRegisterInfo; 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCStreamer; 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCSubtargetInfo; 456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCSymbolizer; 466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCRelocationInfo; 476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCTargetAsmParser; 486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCTargetOptions; 496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass MCTargetStreamer; 506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass TargetMachine; 516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass TargetOptions; 526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass raw_ostream; 536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass raw_pwrite_stream; 546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass formatted_raw_ostream; 556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCStreamer *createNullStreamer(MCContext &Ctx); 576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCStreamer *createAsmStreamer(MCContext &Ctx, 586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<formatted_raw_ostream> OS, 596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool isVerboseAsm, bool useDwarfDirectory, 606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstPrinter *InstPrint, MCCodeEmitter *CE, 616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackend *TAB, bool ShowInst); 626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Takes ownership of \p TAB and \p CE. 646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCStreamer *createELFStreamer(MCContext &Ctx, MCAsmBackend &TAB, 656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar raw_pwrite_stream &OS, MCCodeEmitter *CE, 666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool RelaxAll); 676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB, 680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_pwrite_stream &OS, MCCodeEmitter *CE, 696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool RelaxAll, bool DWARFMustBeAtTheEnd, 706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool LabelSections = false); 716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarMCRelocationInfo *createMCRelocationInfo(const Triple &TT, MCContext &Ctx); 736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarMCSymbolizer *createMCSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo, 756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LLVMSymbolLookupCallback SymbolLookUp, 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void *DisInfo, MCContext *Ctx, 776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MCRelocationInfo> &&RelInfo); 786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Target - Wrapper for Target specific information. 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// For registration purposes, this is a POD type so that targets can be 826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// registered without the use of static constructors. 836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Targets should implement a single global instance of this class (which 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// will be zero initialized), and pass that instance to the TargetRegistry as 866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// part of their initialization. 876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass Target { 886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic: 896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar friend struct TargetRegistry; 906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef bool (*ArchMatchFnTy)(Triple::ArchType Arch); 926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCAsmInfo *(*MCAsmInfoCtorFnTy)(const MCRegisterInfo &MRI, 946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT); 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typedef void (*MCAdjustCodeGenOptsFnTy)(const Triple &TT, Reloc::Model RM, 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeModel::Model &CM); 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCInstrInfo *(*MCInstrInfoCtorFnTy)(void); 996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCInstrAnalysis *(*MCInstrAnalysisCtorFnTy)(const MCInstrInfo *Info); 100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar typedef MCRegisterInfo *(*MCRegInfoCtorFnTy)(const Triple &TT); 1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCSubtargetInfo *(*MCSubtargetInfoCtorFnTy)(const Triple &TT, 1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef CPU, 1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef Features); 1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef TargetMachine *(*TargetMachineCtorTy)( 105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Target &T, const Triple &TT, StringRef CPU, StringRef Features, 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const TargetOptions &Options, Optional<Reloc::Model> RM, 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeModel::Model CM, CodeGenOpt::Level OL); 1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // If it weren't for layering issues (this header is in llvm/Support, but 1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // depends on MC?) this should take the Streamer by value rather than rvalue 1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // reference. 1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef AsmPrinter *(*AsmPrinterCtorTy)( 1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetMachine &TM, std::unique_ptr<MCStreamer> &&Streamer); 1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCAsmBackend *(*MCAsmBackendCtorTy)(const Target &T, 1146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo &MRI, 1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT, StringRef CPU); 1166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCTargetAsmParser *(*MCAsmParserCtorTy)( 117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const MCSubtargetInfo &STI, MCAsmParser &P, const MCInstrInfo &MII, 1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCTargetOptions &Options); 1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCDisassembler *(*MCDisassemblerCtorTy)(const Target &T, 1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCSubtargetInfo &STI, 12128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng MCContext &Ctx); 1226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCInstPrinter *(*MCInstPrinterCtorTy)(const Triple &T, 1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned SyntaxVariant, 1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCAsmInfo &MAI, 1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCInstrInfo &MII, 1266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo &MRI); 1276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCCodeEmitter *(*MCCodeEmitterCtorTy)(const MCInstrInfo &II, 1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo &MRI, 1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext &Ctx); 1306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCStreamer *(*ELFStreamerCtorTy)(const Triple &T, MCContext &Ctx, 1316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackend &TAB, 1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar raw_pwrite_stream &OS, 1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCCodeEmitter *Emitter, 1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool RelaxAll); 1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCStreamer *(*MachOStreamerCtorTy)(MCContext &Ctx, MCAsmBackend &TAB, 1360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_pwrite_stream &OS, 1374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar MCCodeEmitter *Emitter, 1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool RelaxAll, 1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool DWARFMustBeAtTheEnd); 1406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCStreamer *(*COFFStreamerCtorTy)(MCContext &Ctx, MCAsmBackend &TAB, 1416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar raw_pwrite_stream &OS, 1426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCCodeEmitter *Emitter, 143f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool RelaxAll, 144f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool IncrementalLinkerCompatible); 1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCTargetStreamer *(*NullTargetStreamerCtorTy)(MCStreamer &S); 1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCTargetStreamer *(*AsmTargetStreamerCtorTy)( 1476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint, 1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool IsVerboseAsm); 1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCTargetStreamer *(*ObjectTargetStreamerCtorTy)( 1506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer &S, const MCSubtargetInfo &STI); 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCRelocationInfo *(*MCRelocationInfoCtorTy)(const Triple &TT, 1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext &Ctx); 1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar typedef MCSymbolizer *(*MCSymbolizerCtorTy)( 154f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const Triple &TT, LLVMOpInfoCallback GetOpInfo, 1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, 1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MCRelocationInfo> &&RelInfo); 1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 1596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Next - The next registered target in the linked list, maintained by the 1606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// TargetRegistry. 1616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target *Next; 1626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// The target function for checking if an architecture is supported. 1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ArchMatchFnTy ArchMatchFn; 1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Name - The target name. 1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const char *Name; 1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// ShortDesc - A short description of the target. 1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const char *ShortDesc; 1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// HasJIT - Whether this target supports the JIT. 1736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool HasJIT; 1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCAsmInfoCtorFn - Constructor function for this target's MCAsmInfo, if 1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// registered. 1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmInfoCtorFnTy MCAsmInfoCtorFn; 1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MCAdjustCodeGenOptsFnTy MCAdjustCodeGenOptsFn; 1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCInstrInfoCtorFn - Constructor function for this target's MCInstrInfo, 1826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// if registered. 1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstrInfoCtorFnTy MCInstrInfoCtorFn; 1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCInstrAnalysisCtorFn - Constructor function for this target's 1866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCInstrAnalysis, if registered. 1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstrAnalysisCtorFnTy MCInstrAnalysisCtorFn; 1886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCRegInfoCtorFn - Constructor function for this target's MCRegisterInfo, 1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// if registered. 1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCRegInfoCtorFnTy MCRegInfoCtorFn; 1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCSubtargetInfoCtorFn - Constructor function for this target's 1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCSubtargetInfo, if registered. 1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSubtargetInfoCtorFnTy MCSubtargetInfoCtorFn; 1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 1976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// TargetMachineCtorFn - Construction function for this target's 1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// TargetMachine, if registered. 1996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetMachineCtorTy TargetMachineCtorFn; 2006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCAsmBackendCtorFn - Construction function for this target's 2026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCAsmBackend, if registered. 2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackendCtorTy MCAsmBackendCtorFn; 2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCAsmParserCtorFn - Construction function for this target's 2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCTargetAsmParser, if registered. 2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmParserCtorTy MCAsmParserCtorFn; 2086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// AsmPrinterCtorFn - Construction function for this target's AsmPrinter, 2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// if registered. 2116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar AsmPrinterCtorTy AsmPrinterCtorFn; 2126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCDisassemblerCtorFn - Construction function for this target's 2146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCDisassembler, if registered. 2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCDisassemblerCtorTy MCDisassemblerCtorFn; 2166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCInstPrinterCtorFn - Construction function for this target's 2186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCInstPrinter, if registered. 2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstPrinterCtorTy MCInstPrinterCtorFn; 2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCCodeEmitterCtorFn - Construction function for this target's 2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// CodeEmitter, if registered. 2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCCodeEmitterCtorTy MCCodeEmitterCtorFn; 2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Construction functions for the various object formats, if registered. 2266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar COFFStreamerCtorTy COFFStreamerCtorFn; 2276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MachOStreamerCtorTy MachOStreamerCtorFn; 2286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ELFStreamerCtorTy ELFStreamerCtorFn; 2296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Construction function for this target's null TargetStreamer, if 2316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// registered (default = nullptr). 2326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NullTargetStreamerCtorTy NullTargetStreamerCtorFn; 2336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Construction function for this target's asm TargetStreamer, if 2356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// registered (default = nullptr). 2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn; 2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Construction function for this target's obj TargetStreamer, if 2396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// registered (default = nullptr). 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn; 2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCRelocationInfoCtorFn - Construction function for this target's 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCRelocationInfo, if registered (default = llvm::createMCRelocationInfo) 2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCRelocationInfoCtorTy MCRelocationInfoCtorFn; 245de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCSymbolizerCtorFn - Construction function for this target's 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// MCSymbolizer, if registered (default = llvm::createMCSymbolizer) 2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolizerCtorTy MCSymbolizerCtorFn; 24924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarpublic: 2516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target() 2526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : COFFStreamerCtorFn(nullptr), MachOStreamerCtorFn(nullptr), 2536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ELFStreamerCtorFn(nullptr), NullTargetStreamerCtorFn(nullptr), 2546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar AsmTargetStreamerCtorFn(nullptr), ObjectTargetStreamerCtorFn(nullptr), 2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCRelocationInfoCtorFn(nullptr), MCSymbolizerCtorFn(nullptr) {} 256439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 2576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @name Target Information 2586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @{ 25994b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng 2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // getNext - Return the next registered target. 2616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Target *getNext() const { return Next; } 26241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 2636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// getName - Get the target name. 2646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const char *getName() const { return Name; } 265a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng 2666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// getShortDescription - Get a short description of the target. 2676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const char *getShortDescription() const { return ShortDesc; } 268ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng 2696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @} 2706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @name Feature Predicates 2716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @{ 272bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 2736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// hasJIT - Check if this targets supports the just-in-time compilation. 2746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool hasJIT() const { return HasJIT; } 275e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 2766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// hasTargetMachine - Check if this target supports code generation. 2776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool hasTargetMachine() const { return TargetMachineCtorFn != nullptr; } 27824b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// hasMCAsmBackend - Check if this target supports .o generation. 2806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool hasMCAsmBackend() const { return MCAsmBackendCtorFn != nullptr; } 28124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @} 2836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @name Feature Constructors 2846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @{ 28524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 2866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCAsmInfo - Create a MCAsmInfo implementation for the specified 2876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// target triple. 2886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 2896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TheTriple This argument is used to determine the target machine 2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// feature set; it should always be provided. Generally this should be 2916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// either the target triple from the module, or the target triple of the 2926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// host if that does not exist. 2936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmInfo *createMCAsmInfo(const MCRegisterInfo &MRI, 2946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef TheTriple) const { 2956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCAsmInfoCtorFn) 2964c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return nullptr; 2976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCAsmInfoCtorFn(MRI, Triple(TheTriple)); 2986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2996da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void adjustCodeGenOpts(const Triple &TT, Reloc::Model RM, 301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CodeModel::Model &CM) const { 302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (MCAdjustCodeGenOptsFn) 303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MCAdjustCodeGenOptsFn(TT, RM, CM); 3046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 305de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 3066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCInstrInfo - Create a MCInstrInfo implementation. 3076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 3086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstrInfo *createMCInstrInfo() const { 3096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCInstrInfoCtorFn) 3106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCInstrInfoCtorFn(); 3126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 313bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 3146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCInstrAnalysis - Create a MCInstrAnalysis implementation. 3156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 3166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstrAnalysis *createMCInstrAnalysis(const MCInstrInfo *Info) const { 3176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCInstrAnalysisCtorFn) 3186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCInstrAnalysisCtorFn(Info); 3206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 321e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar 3226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCRegInfo - Create a MCRegisterInfo implementation. 3236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 324f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCRegisterInfo *createMCRegInfo(StringRef TT) const { 3256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCRegInfoCtorFn) 3266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 327f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return MCRegInfoCtorFn(Triple(TT)); 3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 32924b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 3306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCSubtargetInfo - Create a MCSubtargetInfo implementation. 3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TheTriple This argument is used to determine the target machine 3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// feature set; it should always be provided. Generally this should be 3346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// either the target triple from the module, or the target triple of the 3356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// host if that does not exist. 3366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param CPU This specifies the name of the target CPU. 3376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Features This specifies the string representation of the 3386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// additional target features. 3396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSubtargetInfo *createMCSubtargetInfo(StringRef TheTriple, StringRef CPU, 3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef Features) const { 3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCSubtargetInfoCtorFn) 3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCSubtargetInfoCtorFn(Triple(TheTriple), CPU, Features); 3446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 34524b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 3466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createTargetMachine - Create a target specific machine implementation 3476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// for the specified \p Triple. 3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 349f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// \param TT This argument is used to determine the target machine 3506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// feature set; it should always be provided. Generally this should be 3516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// either the target triple from the module, or the target triple of the 3526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// host if that does not exist. 3536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetMachine * 354f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar createTargetMachine(StringRef TT, StringRef CPU, StringRef Features, 355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const TargetOptions &Options, Optional<Reloc::Model> RM, 3566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CodeModel::Model CM = CodeModel::Default, 3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CodeGenOpt::Level OL = CodeGenOpt::Default) const { 3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!TargetMachineCtorFn) 3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 360f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return TargetMachineCtorFn(*this, Triple(TT), CPU, Features, Options, RM, 361f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar CM, OL); 3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 363bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 3646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCAsmBackend - Create a target specific assembly parser. 3656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 3666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TheTriple The target triple string. 3676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackend *createMCAsmBackend(const MCRegisterInfo &MRI, 3686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef TheTriple, StringRef CPU) const { 3696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCAsmBackendCtorFn) 3706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCAsmBackendCtorFn(*this, MRI, Triple(TheTriple), CPU); 3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 37324b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar 3746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCAsmParser - Create a target specific assembly parser. 3756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 3766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Parser The target independent parser implementation to use for 3776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// parsing and lexing. 378f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCTargetAsmParser *createMCAsmParser(const MCSubtargetInfo &STI, 3796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmParser &Parser, 3806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCInstrInfo &MII, 3816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCTargetOptions &Options) const { 3826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCAsmParserCtorFn) 3836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCAsmParserCtorFn(STI, Parser, MII, Options); 3856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createAsmPrinter - Create a target specific assembly printer pass. This 3886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// takes ownership of the MCStreamer object. 3896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar AsmPrinter *createAsmPrinter(TargetMachine &TM, 3906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MCStreamer> &&Streamer) const { 3916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!AsmPrinterCtorFn) 3926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 3936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return AsmPrinterCtorFn(TM, std::move(Streamer)); 3946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3954a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar 3966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCDisassembler *createMCDisassembler(const MCSubtargetInfo &STI, 3976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext &Ctx) const { 3986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCDisassemblerCtorFn) 3996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCDisassemblerCtorFn(*this, STI, Ctx); 4016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstPrinter *createMCInstPrinter(const Triple &T, unsigned SyntaxVariant, 4046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCAsmInfo &MAI, 4056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCInstrInfo &MII, 4066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo &MRI) const { 4076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCInstPrinterCtorFn) 4086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCInstPrinterCtorFn(T, SyntaxVariant, MAI, MII, MRI); 4106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCCodeEmitter - Create a target specific code emitter. 4136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCCodeEmitter *createMCCodeEmitter(const MCInstrInfo &II, 4146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo &MRI, 4156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext &Ctx) const { 4166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (!MCCodeEmitterCtorFn) 4176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCCodeEmitterCtorFn(II, MRI, Ctx); 4196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 420d8a33ddcfeb29e7ec792b14be946a05ab998a38eMatt Fleming 4216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Create a target specific MCStreamer. 4226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 4236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param T The target triple. 4246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Ctx The target context. 4256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TAB The target assembler backend object. Takes ownership. 4266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param OS The stream object. 4276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Emitter The target independent assembler object.Takes ownership. 4286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param RelaxAll Relax all fixups? 4296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *createMCObjectStreamer(const Triple &T, MCContext &Ctx, 4306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackend &TAB, raw_pwrite_stream &OS, 4316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCCodeEmitter *Emitter, 4326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCSubtargetInfo &STI, bool RelaxAll, 433f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool IncrementalLinkerCompatible, 4346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool DWARFMustBeAtTheEnd) const { 4356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *S; 4366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar switch (T.getObjectFormat()) { 4376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar default: 4386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar llvm_unreachable("Unknown object format"); 4396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case Triple::COFF: 4406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(T.isOSWindows() && "only Windows COFF is supported"); 441f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar S = COFFStreamerCtorFn(Ctx, TAB, OS, Emitter, RelaxAll, 442f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar IncrementalLinkerCompatible); 4436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 4446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case Triple::MachO: 4456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (MachOStreamerCtorFn) 4466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S = MachOStreamerCtorFn(Ctx, TAB, OS, Emitter, RelaxAll, 4476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DWARFMustBeAtTheEnd); 4486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 4496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S = createMachOStreamer(Ctx, TAB, OS, Emitter, RelaxAll, 4506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DWARFMustBeAtTheEnd); 4516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 4526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case Triple::ELF: 4536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (ELFStreamerCtorFn) 4546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S = ELFStreamerCtorFn(T, Ctx, TAB, OS, Emitter, RelaxAll); 4556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar else 4566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar S = createELFStreamer(Ctx, TAB, OS, Emitter, RelaxAll); 4576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar break; 4586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (ObjectTargetStreamerCtorFn) 4606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ObjectTargetStreamerCtorFn(*S, STI); 4616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return S; 4626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 4646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *createAsmStreamer(MCContext &Ctx, 4656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<formatted_raw_ostream> OS, 4666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool IsVerboseAsm, bool UseDwarfDirectory, 4676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstPrinter *InstPrint, MCCodeEmitter *CE, 4686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCAsmBackend *TAB, bool ShowInst) const { 4696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar formatted_raw_ostream &OSRef = *OS; 4706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *S = llvm::createAsmStreamer(Ctx, std::move(OS), IsVerboseAsm, 4716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar UseDwarfDirectory, InstPrint, CE, 4726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TAB, ShowInst); 4736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm); 4746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return S; 4756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S, 4786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar formatted_raw_ostream &OS, 4796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCInstPrinter *InstPrint, 4806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool IsVerboseAsm) const { 4816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (AsmTargetStreamerCtorFn) 4826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return AsmTargetStreamerCtorFn(S, OS, InstPrint, IsVerboseAsm); 4836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *createNullStreamer(MCContext &Ctx) const { 4876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCStreamer *S = llvm::createNullStreamer(Ctx); 4886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar createNullTargetStreamer(*S); 4896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return S; 4906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) const { 4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (NullTargetStreamerCtorFn) 4946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return NullTargetStreamerCtorFn(S); 4956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return nullptr; 4966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 4976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCRelocationInfo - Create a target specific MCRelocationInfo. 4996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 5006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TT The target triple. 5016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Ctx The target context. 5026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCRelocationInfo *createMCRelocationInfo(StringRef TT, MCContext &Ctx) const { 5036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCRelocationInfoCtorTy Fn = MCRelocationInfoCtorFn 5046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ? MCRelocationInfoCtorFn 5056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : llvm::createMCRelocationInfo; 5066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Fn(Triple(TT), Ctx); 5076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 5086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// createMCSymbolizer - Create a target specific MCSymbolizer. 5106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 5116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TT The target triple. 5126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param GetOpInfo The function to get the symbolic information for 5136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// operands. 5146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param SymbolLookUp The function to lookup a symbol name. 5156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param DisInfo The pointer to the block of symbolic information for above 5166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// call 5176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// back. 5186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Ctx The target context. 5196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param RelInfo The relocation information for this target. Takes 5206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// ownership. 5216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolizer * 5226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, 5236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, 5246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext *Ctx, 5256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MCRelocationInfo> &&RelInfo) const { 5266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolizerCtorTy Fn = 5276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolizerCtorFn ? MCSymbolizerCtorFn : llvm::createMCSymbolizer; 528f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Fn(Triple(TT), GetOpInfo, SymbolLookUp, DisInfo, Ctx, 529f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar std::move(RelInfo)); 5306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 5316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @} 5336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 5346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// TargetRegistry - Generic interface to target specific features. 5366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct TargetRegistry { 5376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // FIXME: Make this a namespace, probably just move all the Register* 5386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // functions into Target (currently they all just set members on the Target 5396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // anyway, and Target friends this class so those functions can... 5406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // function). 5416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry() = delete; 5426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar class iterator 5446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : public std::iterator<std::forward_iterator_tag, Target, ptrdiff_t> { 5456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Target *Current; 5466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar explicit iterator(Target *T) : Current(T) {} 5476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar friend struct TargetRegistry; 5486da24ca51d0a0483b4ff1537a177bd172997f129Che-Liang Chiou 5496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar public: 5506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar iterator() : Current(nullptr) {} 551c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 5526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool operator==(const iterator &x) const { return Current == x.Current; } 5536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool operator!=(const iterator &x) const { return !operator==(x); } 5544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 5556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // Iterator traversal: forward iteration only 5566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar iterator &operator++() { // Preincrement 5576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(Current && "Cannot increment end iterator!"); 5586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Current = Current->getNext(); 5596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return *this; 5604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 5616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar iterator operator++(int) { // Postincrement 5626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar iterator tmp = *this; 5636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ++*this; 5646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return tmp; 5652c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha } 5662c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 5676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Target &operator*() const { 5686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(Current && "Cannot dereference end iterator!"); 5696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return *Current; 570de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet } 571de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 5726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Target *operator->() const { return &operator*(); } 573bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar }; 574bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 5756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// printRegisteredTargetsForVersion - Print the registered targets 5766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// appropriately for inclusion in a tool's version output. 5776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void printRegisteredTargetsForVersion(); 5786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @name Registry Access 5806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @{ 5810c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 5826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static iterator_range<iterator> targets(); 5830c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar 5846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// lookupTarget - Lookup a target based on a target triple. 5850c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 5866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Triple - The triple to use for finding a target. 5876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Error - On failure, an error string describing why no target was 5886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// found. 5896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const Target *lookupTarget(const std::string &Triple, 5906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::string &Error); 5916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 5926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// lookupTarget - Lookup a target based on an architecture name 5936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// and a target triple. If the architecture name is non-empty, 5946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// then the lookup is done by architecture. Otherwise, the target 5956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// triple is used. 5960c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 5976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param ArchName - The architecture to use for finding a target. 5986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param TheTriple - The triple to use for finding a target. The 5996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// triple is updated with canonical architecture name if a lookup 6006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// by architecture is done. 6016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Error - On failure, an error string describing why no target was 6026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// found. 6036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static const Target *lookupTarget(const std::string &ArchName, 6046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Triple &TheTriple, std::string &Error); 6056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @} 6076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @name Target Registration 6086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @{ 6096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterTarget - Register the given target. Attempts to register a 6116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// target which has already been registered will be ignored. 6120c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 6136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 616a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 6176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 6186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Name - The target name. This should be a static string. 6196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param ShortDesc - A short target description. This should be a static 6206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// string. 6216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param ArchMatchFn - The arch match checking function for this target. 6226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param HasJIT - Whether the target supports JIT code 6236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// generation. 6246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterTarget(Target &T, const char *Name, const char *ShortDesc, 6256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::ArchMatchFnTy ArchMatchFn, 6266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool HasJIT = false); 6276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCAsmInfo - Register a MCAsmInfo implementation for the 6296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 630a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner /// 6316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 634439661395fd2a2a832dba01c65bc88718528313cEvan Cheng /// 6356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 6366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct a MCAsmInfo for the target. 6376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCAsmInfo(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 6386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCAsmInfoCtorFn = Fn; 6396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static void registerMCAdjustCodeGenOpts(Target &T, 642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Target::MCAdjustCodeGenOptsFnTy Fn) { 643de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar T.MCAdjustCodeGenOptsFn = Fn; 6446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCInstrInfo - Register a MCInstrInfo implementation for the 6476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 64894b01f688256fca49decb239a8c84b003f18cdbcEvan Cheng /// 6496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 6527801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 6536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 6546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct a MCInstrInfo for the target. 6556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCInstrInfo(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 6566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCInstrInfoCtorFn = Fn; 6576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCInstrAnalysis - Register a MCInstrAnalysis implementation for 6606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// the given target. 6616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCInstrAnalysis(Target &T, 6626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::MCInstrAnalysisCtorFnTy Fn) { 6636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCInstrAnalysisCtorFn = Fn; 6646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCRegInfo - Register a MCRegisterInfo implementation for the 6676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 6687801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng /// 6696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 672f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 6736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 6746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct a MCRegisterInfo for the target. 6756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCRegInfo(Target &T, Target::MCRegInfoCtorFnTy Fn) { 6766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCRegInfoCtorFn = Fn; 6776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCSubtargetInfo - Register a MCSubtargetInfo implementation for 6806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// the given target. 681f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng /// 6826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 685ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 6866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 6876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct a MCSubtargetInfo for the target. 6886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCSubtargetInfo(Target &T, 6896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::MCSubtargetInfoCtorFnTy Fn) { 6906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCSubtargetInfoCtorFn = Fn; 6916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 6926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 6936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterTargetMachine - Register a TargetMachine implementation for the 6946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 695ffc0e73046f737d75e0a62b3a83ef19bcef111e3Evan Cheng /// 6966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 6976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 6986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 6990c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 7006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct a TargetMachine for the target. 7026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterTargetMachine(Target &T, Target::TargetMachineCtorTy Fn) { 7036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.TargetMachineCtorFn = Fn; 7046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCAsmBackend - Register a MCAsmBackend implementation for the 7076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 708e7bd886cb8b69b8f787e7aadd097663632153436Daniel Dunbar /// 7096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7120c795d61878156817cedbac51ec2921f2634c1a5Daniel Dunbar /// 7136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an AsmBackend for the target. 7156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCAsmBackend(Target &T, Target::MCAsmBackendCtorTy Fn) { 7166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCAsmBackendCtorFn = Fn; 7176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCAsmParser - Register a MCTargetAsmParser implementation for 7206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// the given target. 72124b54250728986e87a21d2d65d46c3b87d7a6c5aDaniel Dunbar /// 7226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7254a0abd80f18f9c2a10bf5b14cd6731d51972a426Daniel Dunbar /// 7266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCTargetAsmParser for the target. 7286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCAsmParser(Target &T, Target::MCAsmParserCtorTy Fn) { 7296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCAsmParserCtorFn = Fn; 7306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterAsmPrinter - Register an AsmPrinter implementation for the given 7336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// target. 7346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an AsmPrinter for the target. 7416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) { 7426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.AsmPrinterCtorFn = Fn; 7436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCDisassembler - Register a MCDisassembler implementation for 7466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// the given target. 7476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCDisassembler for the target. 7546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCDisassembler(Target &T, 7556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::MCDisassemblerCtorTy Fn) { 7566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCDisassemblerCtorFn = Fn; 7576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCInstPrinter - Register a MCInstPrinter implementation for the 7606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 7616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCInstPrinter for the target. 7686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCInstPrinter(Target &T, Target::MCInstPrinterCtorTy Fn) { 7696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCInstPrinterCtorFn = Fn; 7706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCCodeEmitter - Register a MCCodeEmitter implementation for the 7736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// given target. 7746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 7766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 7776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 7786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 7796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 7806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCCodeEmitter for the target. 7816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCCodeEmitter(Target &T, Target::MCCodeEmitterCtorTy Fn) { 7826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCCodeEmitterCtorFn = Fn; 7836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterCOFFStreamer(Target &T, Target::COFFStreamerCtorTy Fn) { 7866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.COFFStreamerCtorFn = Fn; 7876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMachOStreamer(Target &T, Target::MachOStreamerCtorTy Fn) { 7906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MachOStreamerCtorFn = Fn; 7916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterELFStreamer(Target &T, Target::ELFStreamerCtorTy Fn) { 7946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.ELFStreamerCtorFn = Fn; 7956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 7966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 7976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterNullTargetStreamer(Target &T, 7986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::NullTargetStreamerCtorTy Fn) { 7996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.NullTargetStreamerCtorFn = Fn; 8006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterAsmTargetStreamer(Target &T, 8036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::AsmTargetStreamerCtorTy Fn) { 8046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.AsmTargetStreamerCtorFn = Fn; 8056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void 8086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterObjectTargetStreamer(Target &T, 8096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::ObjectTargetStreamerCtorTy Fn) { 8106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.ObjectTargetStreamerCtorFn = Fn; 8116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCRelocationInfo - Register an MCRelocationInfo 8146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// implementation for the given target. 8156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 8166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 8176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 8186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 8196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 8206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 8216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCRelocationInfo for the target. 8226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCRelocationInfo(Target &T, 8236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Target::MCRelocationInfoCtorTy Fn) { 8246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCRelocationInfoCtorFn = Fn; 8256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// RegisterMCSymbolizer - Register an MCSymbolizer 8286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// implementation for the given target. 8296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 8306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// Clients are responsible for ensuring that registration doesn't occur 8316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// while another thread is attempting to access the registry. Typically 8326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// this is done by initializing all targets at program startup. 8336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// 8346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param T - The target being registered. 8356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @param Fn - A function to construct an MCSymbolizer for the target. 8366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static void RegisterMCSymbolizer(Target &T, Target::MCSymbolizerCtorTy Fn) { 8376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar T.MCSymbolizerCtorFn = Fn; 8386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @} 8416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 8426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===--------------------------------------------------------------------===// 8446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterTarget - Helper template for registering a target, for use in the 8466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// target's initialization function. Usage: 8476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 8486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 8496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Target TheFooTarget; // The global target instance. 8506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 8516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTargetInfo() { 8526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterTarget<Triple::foo> X(TheFooTarget, "foo", "Foo description"); 8536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 8546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <Triple::ArchType TargetArchType = Triple::UnknownArch, 8556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool HasJIT = false> 8566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterTarget { 8576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterTarget(Target &T, const char *Name, const char *Desc) { 8586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterTarget(T, Name, Desc, &getArchMatch, HasJIT); 8596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static bool getArchMatch(Triple::ArchType Arch) { 8626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Arch == TargetArchType; 8636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 8656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmInfo - Helper template for registering a target assembly info 8676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// implementation. This invokes the static "Create" method on the class to 8686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// actually do the construction. Usage: 8696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 8706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 8716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 8726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmInfo<FooMCAsmInfo> X(TheFooTarget); 8736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 8746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCAsmInfoImpl> struct RegisterMCAsmInfo { 8756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCAsmInfo(Target &T) { 8766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCAsmInfo(T, &Allocator); 8776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 8806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCAsmInfo *Allocator(const MCRegisterInfo & /*MRI*/, 8816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT) { 8826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCAsmInfoImpl(TT); 8836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 8856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 8866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmInfoFn - Helper template for registering a target assembly info 8876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// implementation. This invokes the specified function to do the 8886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// construction. Usage: 8896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 8906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 8916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 8926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmInfoFn X(TheFooTarget, TheFunction); 8936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 8946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterMCAsmInfoFn { 8956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCAsmInfoFn(Target &T, Target::MCAsmInfoCtorFnTy Fn) { 8966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCAsmInfo(T, Fn); 8976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 8986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 8996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 900de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstruct RegisterMCAdjustCodeGenOptsFn { 901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RegisterMCAdjustCodeGenOptsFn(Target &T, Target::MCAdjustCodeGenOptsFnTy Fn) { 902de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetRegistry::registerMCAdjustCodeGenOpts(T, Fn); 9036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrInfo - Helper template for registering a target instruction 9076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// info implementation. This invokes the static "Create" method on the class 9086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// to actually do the construction. Usage: 9096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrInfo<FooMCInstrInfo> X(TheFooTarget); 9136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCInstrInfoImpl> struct RegisterMCInstrInfo { 9156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCInstrInfo(Target &T) { 9166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrInfo(T, &Allocator); 9176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 9206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCInstrInfo *Allocator() { return new MCInstrInfoImpl(); } 9216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrInfoFn - Helper template for registering a target 9246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// instruction info implementation. This invokes the specified function to 9256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// do the construction. Usage: 9266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrInfoFn X(TheFooTarget, TheFunction); 9306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterMCInstrInfoFn { 9326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCInstrInfoFn(Target &T, Target::MCInstrInfoCtorFnTy Fn) { 9336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrInfo(T, Fn); 9346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrAnalysis - Helper template for registering a target 9386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// instruction analyzer implementation. This invokes the static "Create" 9396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// method on the class to actually do the construction. Usage: 9406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrAnalysis<FooMCInstrAnalysis> X(TheFooTarget); 9446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCInstrAnalysisImpl> struct RegisterMCInstrAnalysis { 9466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCInstrAnalysis(Target &T) { 9476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrAnalysis(T, &Allocator); 9486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 9516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCInstrAnalysis *Allocator(const MCInstrInfo *Info) { 9526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCInstrAnalysisImpl(Info); 9536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrAnalysisFn - Helper template for registering a target 9576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// instruction analyzer implementation. This invokes the specified function 9586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// to do the construction. Usage: 9596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCInstrAnalysisFn X(TheFooTarget, TheFunction); 9636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterMCInstrAnalysisFn { 9656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCInstrAnalysisFn(Target &T, Target::MCInstrAnalysisCtorFnTy Fn) { 9666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrAnalysis(T, Fn); 9676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCRegInfo - Helper template for registering a target register info 9716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// implementation. This invokes the static "Create" method on the class to 9726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// actually do the construction. Usage: 9736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCRegInfo<FooMCRegInfo> X(TheFooTarget); 9776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCRegisterInfoImpl> struct RegisterMCRegInfo { 9796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCRegInfo(Target &T) { 9806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCRegInfo(T, &Allocator); 9816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 984f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static MCRegisterInfo *Allocator(const Triple & /*TT*/) { 9856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCRegisterInfoImpl(); 9866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 9876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 9886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 9896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCRegInfoFn - Helper template for registering a target register 9906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// info implementation. This invokes the specified function to do the 9916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// construction. Usage: 9926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 9936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 9946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 9956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCRegInfoFn X(TheFooTarget, TheFunction); 9966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 9976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterMCRegInfoFn { 9986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCRegInfoFn(Target &T, Target::MCRegInfoCtorFnTy Fn) { 9996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCRegInfo(T, Fn); 10006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCSubtargetInfo - Helper template for registering a target 10046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// subtarget info implementation. This invokes the static "Create" method 10056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// on the class to actually do the construction. Usage: 10066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 10076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 10086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 10096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCSubtargetInfo<FooMCSubtargetInfo> X(TheFooTarget); 10106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 10116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCSubtargetInfoImpl> struct RegisterMCSubtargetInfo { 10126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCSubtargetInfo(Target &T) { 10136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCSubtargetInfo(T, &Allocator); 10146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 10176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCSubtargetInfo *Allocator(const Triple & /*TT*/, StringRef /*CPU*/, 10186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef /*FS*/) { 10196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCSubtargetInfoImpl(); 10206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCSubtargetInfoFn - Helper template for registering a target 10246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// subtarget info implementation. This invokes the specified function to 10256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// do the construction. Usage: 10266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 10276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 10286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 10296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCSubtargetInfoFn X(TheFooTarget, TheFunction); 10306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 10316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstruct RegisterMCSubtargetInfoFn { 10326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCSubtargetInfoFn(Target &T, Target::MCSubtargetInfoCtorFnTy Fn) { 10336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCSubtargetInfo(T, Fn); 10346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterTargetMachine - Helper template for registering a target machine 10386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// implementation, for use in the target machine initialization 10396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// function. Usage: 10406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 10416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooTarget() { 10426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 10436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterTargetMachine<FooTargetMachine> X(TheFooTarget); 10446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 10456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class TargetMachineImpl> struct RegisterTargetMachine { 10466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterTargetMachine(Target &T) { 10476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterTargetMachine(T, &Allocator); 10486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 1051f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static TargetMachine *Allocator(const Target &T, const Triple &TT, 1052f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StringRef CPU, StringRef FS, 1053de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const TargetOptions &Options, 1054de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Optional<Reloc::Model> RM, 1055f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar CodeModel::Model CM, CodeGenOpt::Level OL) { 1056f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return new TargetMachineImpl(T, TT, CPU, FS, Options, RM, CM, OL); 10576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmBackend - Helper template for registering a target specific 10616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// assembler backend. Usage: 10626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 10636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooMCAsmBackend() { 10646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 10656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmBackend<FooAsmLexer> X(TheFooTarget); 10666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 10676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCAsmBackendImpl> struct RegisterMCAsmBackend { 10686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCAsmBackend(Target &T) { 10696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCAsmBackend(T, &Allocator); 10706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 10736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCAsmBackend *Allocator(const Target &T, const MCRegisterInfo &MRI, 10746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TheTriple, StringRef CPU) { 10756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCAsmBackendImpl(T, MRI, TheTriple, CPU); 10766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmParser - Helper template for registering a target specific 10806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// assembly parser, for use in the target machine initialization 10816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// function. Usage: 10826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 10836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooMCAsmParser() { 10846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 10856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCAsmParser<FooAsmParser> X(TheFooTarget); 10866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 10876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCAsmParserImpl> struct RegisterMCAsmParser { 10886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCAsmParser(Target &T) { 10896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCAsmParser(T, &Allocator); 10906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 10926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 1093f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar static MCTargetAsmParser *Allocator(const MCSubtargetInfo &STI, 1094f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCAsmParser &P, const MCInstrInfo &MII, 10956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCTargetOptions &Options) { 10966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCAsmParserImpl(STI, P, MII, Options); 10976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 10986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 10996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 11006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterAsmPrinter - Helper template for registering a target specific 11016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// assembly printer, for use in the target machine initialization 11026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// function. Usage: 11036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 11046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooAsmPrinter() { 11056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 11066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterAsmPrinter<FooAsmPrinter> X(TheFooTarget); 11076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 11086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class AsmPrinterImpl> struct RegisterAsmPrinter { 11096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterAsmPrinter(Target &T) { 11106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterAsmPrinter(T, &Allocator); 11116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 11136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 11146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static AsmPrinter *Allocator(TargetMachine &TM, 11156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar std::unique_ptr<MCStreamer> &&Streamer) { 11166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new AsmPrinterImpl(TM, std::move(Streamer)); 11176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 11196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 11206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCCodeEmitter - Helper template for registering a target specific 11216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// machine code emitter, for use in the target initialization 11226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// function. Usage: 11236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// 11246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern "C" void LLVMInitializeFooMCCodeEmitter() { 11256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// extern Target TheFooTarget; 11266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// RegisterMCCodeEmitter<FooCodeEmitter> X(TheFooTarget); 11276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// } 11286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainartemplate <class MCCodeEmitterImpl> struct RegisterMCCodeEmitter { 11296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RegisterMCCodeEmitter(Target &T) { 11306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar TargetRegistry::RegisterMCCodeEmitter(T, &Allocator); 11316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 11336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarprivate: 11346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar static MCCodeEmitter *Allocator(const MCInstrInfo & /*II*/, 11356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCRegisterInfo & /*MRI*/, 11366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCContext & /*Ctx*/) { 11376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return new MCCodeEmitterImpl(); 11386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 11396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}; 1140bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar} 1141bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar 1142bb061291406b1b9f0c976e9845f69f9faf985606Daniel Dunbar#endif 1143