181ad6265SDimitry Andric //===-- SPIRVMCTargetDesc.cpp - SPIR-V Target Descriptions ----*- C++ -*---===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This file provides SPIR-V specific target descriptions. 1081ad6265SDimitry Andric // 1181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1281ad6265SDimitry Andric 1381ad6265SDimitry Andric #include "SPIRVMCTargetDesc.h" 1481ad6265SDimitry Andric #include "SPIRVInstPrinter.h" 1581ad6265SDimitry Andric #include "SPIRVMCAsmInfo.h" 1681ad6265SDimitry Andric #include "SPIRVTargetStreamer.h" 1781ad6265SDimitry Andric #include "TargetInfo/SPIRVTargetInfo.h" 1881ad6265SDimitry Andric #include "llvm/MC/MCInstrAnalysis.h" 1981ad6265SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 2081ad6265SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 2181ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 2281ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h" 2381ad6265SDimitry Andric 2481ad6265SDimitry Andric #define GET_INSTRINFO_MC_DESC 25753f127fSDimitry Andric #define ENABLE_INSTR_PREDICATE_VERIFIER 2681ad6265SDimitry Andric #include "SPIRVGenInstrInfo.inc" 2781ad6265SDimitry Andric 2881ad6265SDimitry Andric #define GET_SUBTARGETINFO_MC_DESC 2981ad6265SDimitry Andric #include "SPIRVGenSubtargetInfo.inc" 3081ad6265SDimitry Andric 3181ad6265SDimitry Andric #define GET_REGINFO_MC_DESC 3281ad6265SDimitry Andric #include "SPIRVGenRegisterInfo.inc" 3381ad6265SDimitry Andric 3481ad6265SDimitry Andric using namespace llvm; 3581ad6265SDimitry Andric 3681ad6265SDimitry Andric static MCInstrInfo *createSPIRVMCInstrInfo() { 3781ad6265SDimitry Andric MCInstrInfo *X = new MCInstrInfo(); 3881ad6265SDimitry Andric InitSPIRVMCInstrInfo(X); 3981ad6265SDimitry Andric return X; 4081ad6265SDimitry Andric } 4181ad6265SDimitry Andric 4281ad6265SDimitry Andric static MCRegisterInfo *createSPIRVMCRegisterInfo(const Triple &TT) { 4381ad6265SDimitry Andric MCRegisterInfo *X = new MCRegisterInfo(); 4481ad6265SDimitry Andric return X; 4581ad6265SDimitry Andric } 4681ad6265SDimitry Andric 4781ad6265SDimitry Andric static MCSubtargetInfo * 4881ad6265SDimitry Andric createSPIRVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 4981ad6265SDimitry Andric return createSPIRVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 5081ad6265SDimitry Andric } 5181ad6265SDimitry Andric 5281ad6265SDimitry Andric static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S, 5381ad6265SDimitry Andric formatted_raw_ostream &, 54*0fca6ea1SDimitry Andric MCInstPrinter *) { 5581ad6265SDimitry Andric return new SPIRVTargetStreamer(S); 5681ad6265SDimitry Andric } 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric static MCInstPrinter *createSPIRVMCInstPrinter(const Triple &T, 5981ad6265SDimitry Andric unsigned SyntaxVariant, 6081ad6265SDimitry Andric const MCAsmInfo &MAI, 6181ad6265SDimitry Andric const MCInstrInfo &MII, 6281ad6265SDimitry Andric const MCRegisterInfo &MRI) { 6381ad6265SDimitry Andric assert(SyntaxVariant == 0); 6481ad6265SDimitry Andric return new SPIRVInstPrinter(MAI, MII, MRI); 6581ad6265SDimitry Andric } 6681ad6265SDimitry Andric 6781ad6265SDimitry Andric namespace { 6881ad6265SDimitry Andric 6981ad6265SDimitry Andric class SPIRVMCInstrAnalysis : public MCInstrAnalysis { 7081ad6265SDimitry Andric public: 7181ad6265SDimitry Andric explicit SPIRVMCInstrAnalysis(const MCInstrInfo *Info) 7281ad6265SDimitry Andric : MCInstrAnalysis(Info) {} 7381ad6265SDimitry Andric }; 7481ad6265SDimitry Andric 7581ad6265SDimitry Andric } // end anonymous namespace 7681ad6265SDimitry Andric 7781ad6265SDimitry Andric static MCInstrAnalysis *createSPIRVInstrAnalysis(const MCInstrInfo *Info) { 7881ad6265SDimitry Andric return new SPIRVMCInstrAnalysis(Info); 7981ad6265SDimitry Andric } 8081ad6265SDimitry Andric 8181ad6265SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTargetMC() { 825f757f3fSDimitry Andric for (Target *T : {&getTheSPIRV32Target(), &getTheSPIRV64Target(), 835f757f3fSDimitry Andric &getTheSPIRVLogicalTarget()}) { 8481ad6265SDimitry Andric RegisterMCAsmInfo<SPIRVMCAsmInfo> X(*T); 8581ad6265SDimitry Andric TargetRegistry::RegisterMCInstrInfo(*T, createSPIRVMCInstrInfo); 8681ad6265SDimitry Andric TargetRegistry::RegisterMCRegInfo(*T, createSPIRVMCRegisterInfo); 8781ad6265SDimitry Andric TargetRegistry::RegisterMCSubtargetInfo(*T, createSPIRVMCSubtargetInfo); 8881ad6265SDimitry Andric TargetRegistry::RegisterMCInstPrinter(*T, createSPIRVMCInstPrinter); 8981ad6265SDimitry Andric TargetRegistry::RegisterMCInstrAnalysis(*T, createSPIRVInstrAnalysis); 9081ad6265SDimitry Andric TargetRegistry::RegisterMCCodeEmitter(*T, createSPIRVMCCodeEmitter); 9181ad6265SDimitry Andric TargetRegistry::RegisterMCAsmBackend(*T, createSPIRVAsmBackend); 9281ad6265SDimitry Andric TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer); 9381ad6265SDimitry Andric } 9481ad6265SDimitry Andric } 95