1//===- DirectXMCTargetDesc.cpp - DirectX Target Implementation --*- 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-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file contains DirectX target initializer.
11///
12//===----------------------------------------------------------------------===//
13
14#include "DirectXMCTargetDesc.h"
15#include "DirectXContainerObjectWriter.h"
16#include "TargetInfo/DirectXTargetInfo.h"
17#include "llvm/MC/LaneBitmask.h"
18#include "llvm/MC/MCAsmBackend.h"
19#include "llvm/MC/MCAsmInfo.h"
20#include "llvm/MC/MCCodeEmitter.h"
21#include "llvm/MC/MCDXContainerWriter.h"
22#include "llvm/MC/MCInstPrinter.h"
23#include "llvm/MC/MCInstrInfo.h"
24#include "llvm/MC/MCRegisterInfo.h"
25#include "llvm/MC/MCSchedule.h"
26#include "llvm/MC/MCSubtargetInfo.h"
27#include "llvm/MC/TargetRegistry.h"
28#include "llvm/Support/Compiler.h"
29#include "llvm/TargetParser/Triple.h"
30#include <memory>
31
32using namespace llvm;
33
34#define GET_INSTRINFO_MC_DESC
35#define GET_INSTRINFO_MC_HELPERS
36#include "DirectXGenInstrInfo.inc"
37
38#define GET_SUBTARGETINFO_MC_DESC
39#include "DirectXGenSubtargetInfo.inc"
40
41#define GET_REGINFO_MC_DESC
42#include "DirectXGenRegisterInfo.inc"
43
44namespace {
45
46// DXILInstPrinter is a null stub because DXIL instructions aren't printed.
47class DXILInstPrinter : public MCInstPrinter {
48public:
49 DXILInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
50 const MCRegisterInfo &MRI)
51 : MCInstPrinter(MAI, MII, MRI) {}
52
53 void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
54 const MCSubtargetInfo &STI, raw_ostream &O) override {}
55
56 std::pair<const char *, uint64_t>
57 getMnemonic(const MCInst &MI) const override {
58 return std::make_pair<const char *, uint64_t>(x: "", y: 0ull);
59 }
60
61private:
62};
63
64class DXILMCCodeEmitter : public MCCodeEmitter {
65public:
66 DXILMCCodeEmitter() {}
67
68 void encodeInstruction(const MCInst &Inst, SmallVectorImpl<char> &CB,
69 SmallVectorImpl<MCFixup> &Fixups,
70 const MCSubtargetInfo &STI) const override {}
71};
72
73class DXILAsmBackend : public MCAsmBackend {
74
75public:
76 DXILAsmBackend(const MCSubtargetInfo &STI)
77 : MCAsmBackend(llvm::endianness::little) {}
78 ~DXILAsmBackend() override = default;
79
80 void applyFixup(const MCFragment &, const MCFixup &, const MCValue &Target,
81 uint8_t *Data, uint64_t Value, bool IsResolved) override {}
82
83 std::unique_ptr<MCObjectTargetWriter>
84 createObjectTargetWriter() const override {
85 return createDXContainerTargetObjectWriter();
86 }
87
88 bool writeNopData(raw_ostream &OS, uint64_t Count,
89 const MCSubtargetInfo *STI) const override {
90 return true;
91 }
92};
93
94class DirectXMCAsmInfo : public MCAsmInfo {
95public:
96 explicit DirectXMCAsmInfo(const Triple &TT, const MCTargetOptions &Options)
97 : MCAsmInfo(Options) {}
98};
99
100} // namespace
101
102static MCInstPrinter *createDXILMCInstPrinter(const Triple &T,
103 unsigned SyntaxVariant,
104 const MCAsmInfo &MAI,
105 const MCInstrInfo &MII,
106 const MCRegisterInfo &MRI) {
107 if (SyntaxVariant == 0)
108 return new DXILInstPrinter(MAI, MII, MRI);
109 return nullptr;
110}
111
112MCCodeEmitter *createDXILMCCodeEmitter(const MCInstrInfo &MCII,
113 MCContext &Ctx) {
114 return new DXILMCCodeEmitter();
115}
116
117MCAsmBackend *createDXILMCAsmBackend(const Target &T,
118 const MCSubtargetInfo &STI,
119 const MCRegisterInfo &MRI,
120 const MCTargetOptions &Options) {
121 return new DXILAsmBackend(STI);
122}
123
124static MCSubtargetInfo *
125createDirectXMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
126 return createDirectXMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
127}
128
129static MCRegisterInfo *createDirectXMCRegisterInfo(const Triple &Triple) {
130 return new MCRegisterInfo();
131}
132
133static MCInstrInfo *createDirectXMCInstrInfo() { return new MCInstrInfo(); }
134
135extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void
136LLVMInitializeDirectXTargetMC() {
137 Target &T = getTheDirectXTarget();
138 RegisterMCAsmInfo<DirectXMCAsmInfo> X(T);
139 TargetRegistry::RegisterMCInstrInfo(T, Fn: createDirectXMCInstrInfo);
140 TargetRegistry::RegisterMCInstPrinter(T, Fn: createDXILMCInstPrinter);
141 TargetRegistry::RegisterMCRegInfo(T, Fn: createDirectXMCRegisterInfo);
142 TargetRegistry::RegisterMCSubtargetInfo(T, Fn: createDirectXMCSubtargetInfo);
143 TargetRegistry::RegisterMCCodeEmitter(T, Fn: createDXILMCCodeEmitter);
144 TargetRegistry::RegisterMCAsmBackend(T, Fn: createDXILMCAsmBackend);
145}
146