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
createSPIRVMCInstrInfo()3681ad6265SDimitry Andric static MCInstrInfo *createSPIRVMCInstrInfo() {
3781ad6265SDimitry Andric MCInstrInfo *X = new MCInstrInfo();
3881ad6265SDimitry Andric InitSPIRVMCInstrInfo(X);
3981ad6265SDimitry Andric return X;
4081ad6265SDimitry Andric }
4181ad6265SDimitry Andric
createSPIRVMCRegisterInfo(const Triple & TT)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 *
createSPIRVMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)4881ad6265SDimitry Andric createSPIRVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
4981ad6265SDimitry Andric return createSPIRVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
5081ad6265SDimitry Andric }
5181ad6265SDimitry Andric
createTargetAsmStreamer(MCStreamer & S,formatted_raw_ostream &,MCInstPrinter *)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
createSPIRVMCInstPrinter(const Triple & T,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)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:
SPIRVMCInstrAnalysis(const MCInstrInfo * Info)7181ad6265SDimitry Andric explicit SPIRVMCInstrAnalysis(const MCInstrInfo *Info)
7281ad6265SDimitry Andric : MCInstrAnalysis(Info) {}
7381ad6265SDimitry Andric };
7481ad6265SDimitry Andric
7581ad6265SDimitry Andric } // end anonymous namespace
7681ad6265SDimitry Andric
createSPIRVInstrAnalysis(const MCInstrInfo * Info)7781ad6265SDimitry Andric static MCInstrAnalysis *createSPIRVInstrAnalysis(const MCInstrInfo *Info) {
7881ad6265SDimitry Andric return new SPIRVMCInstrAnalysis(Info);
7981ad6265SDimitry Andric }
8081ad6265SDimitry Andric
LLVMInitializeSPIRVTargetMC()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