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 32 using 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 44 namespace { 45 46 // DXILInstPrinter is a null stub because DXIL instructions aren't printed. 47 class DXILInstPrinter : public MCInstPrinter { 48 public: 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>("", 0ull); 59 } 60 61 private: 62 }; 63 64 class DXILMCCodeEmitter : public MCCodeEmitter { 65 public: 66 DXILMCCodeEmitter() {} 67 68 void encodeInstruction(const MCInst &Inst, SmallVectorImpl<char> &CB, 69 SmallVectorImpl<MCFixup> &Fixups, 70 const MCSubtargetInfo &STI) const override {} 71 }; 72 73 class DXILAsmBackend : public MCAsmBackend { 74 75 public: 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 MutableArrayRef<char> Data, uint64_t Value, 82 bool IsResolved) override {} 83 84 std::unique_ptr<MCObjectTargetWriter> 85 createObjectTargetWriter() const override { 86 return createDXContainerTargetObjectWriter(); 87 } 88 89 bool writeNopData(raw_ostream &OS, uint64_t Count, 90 const MCSubtargetInfo *STI) const override { 91 return true; 92 } 93 }; 94 95 class DirectXMCAsmInfo : public MCAsmInfo { 96 public: 97 explicit DirectXMCAsmInfo(const Triple &TT, const MCTargetOptions &Options) 98 : MCAsmInfo() {} 99 }; 100 101 } // namespace 102 103 static MCInstPrinter *createDXILMCInstPrinter(const Triple &T, 104 unsigned SyntaxVariant, 105 const MCAsmInfo &MAI, 106 const MCInstrInfo &MII, 107 const MCRegisterInfo &MRI) { 108 if (SyntaxVariant == 0) 109 return new DXILInstPrinter(MAI, MII, MRI); 110 return nullptr; 111 } 112 113 MCCodeEmitter *createDXILMCCodeEmitter(const MCInstrInfo &MCII, 114 MCContext &Ctx) { 115 return new DXILMCCodeEmitter(); 116 } 117 118 MCAsmBackend *createDXILMCAsmBackend(const Target &T, 119 const MCSubtargetInfo &STI, 120 const MCRegisterInfo &MRI, 121 const MCTargetOptions &Options) { 122 return new DXILAsmBackend(STI); 123 } 124 125 static MCSubtargetInfo * 126 createDirectXMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 127 return createDirectXMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 128 } 129 130 static MCRegisterInfo *createDirectXMCRegisterInfo(const Triple &Triple) { 131 return new MCRegisterInfo(); 132 } 133 134 static MCInstrInfo *createDirectXMCInstrInfo() { return new MCInstrInfo(); } 135 136 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTargetMC() { 137 Target &T = getTheDirectXTarget(); 138 RegisterMCAsmInfo<DirectXMCAsmInfo> X(T); 139 TargetRegistry::RegisterMCInstrInfo(T, createDirectXMCInstrInfo); 140 TargetRegistry::RegisterMCInstPrinter(T, createDXILMCInstPrinter); 141 TargetRegistry::RegisterMCRegInfo(T, createDirectXMCRegisterInfo); 142 TargetRegistry::RegisterMCSubtargetInfo(T, createDirectXMCSubtargetInfo); 143 TargetRegistry::RegisterMCCodeEmitter(T, createDXILMCCodeEmitter); 144 TargetRegistry::RegisterMCAsmBackend(T, createDXILMCAsmBackend); 145 } 146