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