1 //===-- SPIRVMCTargetDesc.cpp - SPIR-V Target Descriptions ----*- C++ -*---===//
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-exception
7 //===----------------------------------------------------------------------===//
9 // This file provides SPIR-V specific target descriptions.
11 //===----------------------------------------------------------------------===//
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"
24 #define GET_INSTRINFO_MC_DESC
25 #define ENABLE_INSTR_PREDICATE_VERIFIER
26 #include "SPIRVGenInstrInfo.inc"
28 #define GET_SUBTARGETINFO_MC_DESC
29 #include "SPIRVGenSubtargetInfo.inc"
31 #define GET_REGINFO_MC_DESC
32 #include "SPIRVGenRegisterInfo.inc"
36 static MCInstrInfo
*createSPIRVMCInstrInfo() {
37 MCInstrInfo
*X
= new MCInstrInfo();
38 InitSPIRVMCInstrInfo(X
);
42 static MCRegisterInfo
*createSPIRVMCRegisterInfo(const Triple
&TT
) {
43 MCRegisterInfo
*X
= new MCRegisterInfo();
47 static MCSubtargetInfo
*
48 createSPIRVMCSubtargetInfo(const Triple
&TT
, StringRef CPU
, StringRef FS
) {
49 return createSPIRVMCSubtargetInfoImpl(TT
, CPU
, /*TuneCPU*/ CPU
, FS
);
53 createSPIRVMCStreamer(const Triple
&T
, MCContext
&Ctx
,
54 std::unique_ptr
<MCAsmBackend
> &&MAB
,
55 std::unique_ptr
<MCObjectWriter
> &&OW
,
56 std::unique_ptr
<MCCodeEmitter
> &&Emitter
, bool RelaxAll
) {
57 return createSPIRVStreamer(Ctx
, std::move(MAB
), std::move(OW
),
58 std::move(Emitter
), RelaxAll
);
61 static MCTargetStreamer
*createTargetAsmStreamer(MCStreamer
&S
,
62 formatted_raw_ostream
&,
63 MCInstPrinter
*, bool) {
64 return new SPIRVTargetStreamer(S
);
67 static MCInstPrinter
*createSPIRVMCInstPrinter(const Triple
&T
,
68 unsigned SyntaxVariant
,
70 const MCInstrInfo
&MII
,
71 const MCRegisterInfo
&MRI
) {
72 assert(SyntaxVariant
== 0);
73 return new SPIRVInstPrinter(MAI
, MII
, MRI
);
78 class SPIRVMCInstrAnalysis
: public MCInstrAnalysis
{
80 explicit SPIRVMCInstrAnalysis(const MCInstrInfo
*Info
)
81 : MCInstrAnalysis(Info
) {}
84 } // end anonymous namespace
86 static MCInstrAnalysis
*createSPIRVInstrAnalysis(const MCInstrInfo
*Info
) {
87 return new SPIRVMCInstrAnalysis(Info
);
90 extern "C" LLVM_EXTERNAL_VISIBILITY
void LLVMInitializeSPIRVTargetMC() {
91 for (Target
*T
: {&getTheSPIRV32Target(), &getTheSPIRV64Target(),
92 &getTheSPIRVLogicalTarget()}) {
93 RegisterMCAsmInfo
<SPIRVMCAsmInfo
> X(*T
);
94 TargetRegistry::RegisterMCInstrInfo(*T
, createSPIRVMCInstrInfo
);
95 TargetRegistry::RegisterMCRegInfo(*T
, createSPIRVMCRegisterInfo
);
96 TargetRegistry::RegisterMCSubtargetInfo(*T
, createSPIRVMCSubtargetInfo
);
97 TargetRegistry::RegisterSPIRVStreamer(*T
, createSPIRVMCStreamer
);
98 TargetRegistry::RegisterMCInstPrinter(*T
, createSPIRVMCInstPrinter
);
99 TargetRegistry::RegisterMCInstrAnalysis(*T
, createSPIRVInstrAnalysis
);
100 TargetRegistry::RegisterMCCodeEmitter(*T
, createSPIRVMCCodeEmitter
);
101 TargetRegistry::RegisterMCAsmBackend(*T
, createSPIRVAsmBackend
);
102 TargetRegistry::RegisterAsmTargetStreamer(*T
, createTargetAsmStreamer
);