97 lines · cpp
1//===-- SPIRVMCTargetDesc.cpp - SPIR-V Target Descriptions ----*- C++ -*---===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file provides SPIR-V specific target descriptions.10//11//===----------------------------------------------------------------------===//12 13#include "SPIRVMCTargetDesc.h"14#include "SPIRVInstPrinter.h"15#include "SPIRVMCAsmInfo.h"16#include "SPIRVTargetStreamer.h"17#include "TargetInfo/SPIRVTargetInfo.h"18#include "llvm/MC/MCInstrAnalysis.h"19#include "llvm/MC/MCInstrInfo.h"20#include "llvm/MC/MCRegisterInfo.h"21#include "llvm/MC/MCSubtargetInfo.h"22#include "llvm/MC/TargetRegistry.h"23#include "llvm/Support/Compiler.h"24 25#define GET_INSTRINFO_MC_DESC26#define ENABLE_INSTR_PREDICATE_VERIFIER27#include "SPIRVGenInstrInfo.inc"28 29#define GET_SUBTARGETINFO_MC_DESC30#include "SPIRVGenSubtargetInfo.inc"31 32#define GET_REGINFO_MC_DESC33#include "SPIRVGenRegisterInfo.inc"34 35using namespace llvm;36 37static MCInstrInfo *createSPIRVMCInstrInfo() {38 MCInstrInfo *X = new MCInstrInfo();39 InitSPIRVMCInstrInfo(X);40 return X;41}42 43static MCRegisterInfo *createSPIRVMCRegisterInfo(const Triple &TT) {44 MCRegisterInfo *X = new MCRegisterInfo();45 return X;46}47 48static MCSubtargetInfo *49createSPIRVMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {50 return createSPIRVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);51}52 53static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,54 formatted_raw_ostream &,55 MCInstPrinter *) {56 return new SPIRVTargetStreamer(S);57}58 59static MCInstPrinter *createSPIRVMCInstPrinter(const Triple &T,60 unsigned SyntaxVariant,61 const MCAsmInfo &MAI,62 const MCInstrInfo &MII,63 const MCRegisterInfo &MRI) {64 assert(SyntaxVariant == 0);65 return new SPIRVInstPrinter(MAI, MII, MRI);66}67 68namespace {69 70class SPIRVMCInstrAnalysis : public MCInstrAnalysis {71public:72 explicit SPIRVMCInstrAnalysis(const MCInstrInfo *Info)73 : MCInstrAnalysis(Info) {}74};75 76} // end anonymous namespace77 78static MCInstrAnalysis *createSPIRVInstrAnalysis(const MCInstrInfo *Info) {79 return new SPIRVMCInstrAnalysis(Info);80}81 82extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void83LLVMInitializeSPIRVTargetMC() {84 for (Target *T : {&getTheSPIRV32Target(), &getTheSPIRV64Target(),85 &getTheSPIRVLogicalTarget()}) {86 RegisterMCAsmInfo<SPIRVMCAsmInfo> X(*T);87 TargetRegistry::RegisterMCInstrInfo(*T, createSPIRVMCInstrInfo);88 TargetRegistry::RegisterMCRegInfo(*T, createSPIRVMCRegisterInfo);89 TargetRegistry::RegisterMCSubtargetInfo(*T, createSPIRVMCSubtargetInfo);90 TargetRegistry::RegisterMCInstPrinter(*T, createSPIRVMCInstPrinter);91 TargetRegistry::RegisterMCInstrAnalysis(*T, createSPIRVInstrAnalysis);92 TargetRegistry::RegisterMCCodeEmitter(*T, createSPIRVMCCodeEmitter);93 TargetRegistry::RegisterMCAsmBackend(*T, createSPIRVAsmBackend);94 TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);95 }96}97