| //===-- SPIRVMCTargetDesc.cpp - SPIR-V Target Descriptions ----*- C++ -*---===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file provides SPIR-V specific target descriptions. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "SPIRVMCTargetDesc.h" |
| #include "SPIRVInstPrinter.h" |
| #include "SPIRVMCAsmInfo.h" |
| #include "SPIRVTargetStreamer.h" |
| #include "TargetInfo/SPIRVTargetInfo.h" |
| #include "llvm/MC/MCInstrAnalysis.h" |
| #include "llvm/MC/MCInstrInfo.h" |
| #include "llvm/MC/MCRegisterInfo.h" |
| #include "llvm/MC/MCSubtargetInfo.h" |
| #include "llvm/MC/TargetRegistry.h" |
| |
| #define GET_INSTRINFO_MC_DESC |
| #define ENABLE_INSTR_PREDICATE_VERIFIER |
| #include "SPIRVGenInstrInfo.inc" |
| |
| #define GET_SUBTARGETINFO_MC_DESC |
| #include "SPIRVGenSubtargetInfo.inc" |
| |
| #define GET_REGINFO_MC_DESC |
| #include "SPIRVGenRegisterInfo.inc" |
| |
| using namespace llvm; |
| |
| static MCInstrInfo *createSPIRVMCInstrInfo() { |
| MCInstrInfo *X = new MCInstrInfo(); |
| InitSPIRVMCInstrInfo(X); |
| return X; |
| } |
| |
| static MCRegisterInfo *createSPIRVMCRegisterInfo(const Triple &TT) { |
| MCRegisterInfo *X = new MCRegisterInfo(); |
| return X; |
| } |
| |
| static MCSubtargetInfo * |
| createSPIRVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { |
| return createSPIRVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); |
| } |
| |
| static MCStreamer * |
| createSPIRVMCStreamer(const Triple &T, MCContext &Ctx, |
| std::unique_ptr<MCAsmBackend> &&MAB, |
| std::unique_ptr<MCObjectWriter> &&OW, |
| std::unique_ptr<MCCodeEmitter> &&Emitter, bool RelaxAll) { |
| return createSPIRVStreamer(Ctx, std::move(MAB), std::move(OW), |
| std::move(Emitter), RelaxAll); |
| } |
| |
| static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S, |
| formatted_raw_ostream &, |
| MCInstPrinter *, bool) { |
| return new SPIRVTargetStreamer(S); |
| } |
| |
| static MCInstPrinter *createSPIRVMCInstPrinter(const Triple &T, |
| unsigned SyntaxVariant, |
| const MCAsmInfo &MAI, |
| const MCInstrInfo &MII, |
| const MCRegisterInfo &MRI) { |
| assert(SyntaxVariant == 0); |
| return new SPIRVInstPrinter(MAI, MII, MRI); |
| } |
| |
| namespace { |
| |
| class SPIRVMCInstrAnalysis : public MCInstrAnalysis { |
| public: |
| explicit SPIRVMCInstrAnalysis(const MCInstrInfo *Info) |
| : MCInstrAnalysis(Info) {} |
| }; |
| |
| } // end anonymous namespace |
| |
| static MCInstrAnalysis *createSPIRVInstrAnalysis(const MCInstrInfo *Info) { |
| return new SPIRVMCInstrAnalysis(Info); |
| } |
| |
| extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTargetMC() { |
| for (Target *T : {&getTheSPIRV32Target(), &getTheSPIRV64Target()}) { |
| RegisterMCAsmInfo<SPIRVMCAsmInfo> X(*T); |
| TargetRegistry::RegisterMCInstrInfo(*T, createSPIRVMCInstrInfo); |
| TargetRegistry::RegisterMCRegInfo(*T, createSPIRVMCRegisterInfo); |
| TargetRegistry::RegisterMCSubtargetInfo(*T, createSPIRVMCSubtargetInfo); |
| TargetRegistry::RegisterSPIRVStreamer(*T, createSPIRVMCStreamer); |
| TargetRegistry::RegisterMCInstPrinter(*T, createSPIRVMCInstPrinter); |
| TargetRegistry::RegisterMCInstrAnalysis(*T, createSPIRVInstrAnalysis); |
| TargetRegistry::RegisterMCCodeEmitter(*T, createSPIRVMCCodeEmitter); |
| TargetRegistry::RegisterMCAsmBackend(*T, createSPIRVAsmBackend); |
| TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer); |
| } |
| } |