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 MCAssembler &Asm, const MCFixup &Fixup, 81 const MCValue &Target, MutableArrayRef<char> Data, 82 uint64_t Value, bool IsResolved, 83 const MCSubtargetInfo *STI) const override {} 84 85 std::unique_ptr<MCObjectTargetWriter> 86 createObjectTargetWriter() const override { 87 return createDXContainerTargetObjectWriter(); 88 } 89 90 unsigned getNumFixupKinds() const override { return 0; } 91 92 bool writeNopData(raw_ostream &OS, uint64_t Count, 93 const MCSubtargetInfo *STI) const override { 94 return true; 95 } 96 }; 97 98 class DirectXMCAsmInfo : public MCAsmInfo { 99 public: 100 explicit DirectXMCAsmInfo(const Triple &TT, const MCTargetOptions &Options) 101 : MCAsmInfo() {} 102 }; 103 104 } // namespace 105 106 static MCInstPrinter *createDXILMCInstPrinter(const Triple &T, 107 unsigned SyntaxVariant, 108 const MCAsmInfo &MAI, 109 const MCInstrInfo &MII, 110 const MCRegisterInfo &MRI) { 111 if (SyntaxVariant == 0) 112 return new DXILInstPrinter(MAI, MII, MRI); 113 return nullptr; 114 } 115 116 MCCodeEmitter *createDXILMCCodeEmitter(const MCInstrInfo &MCII, 117 MCContext &Ctx) { 118 return new DXILMCCodeEmitter(); 119 } 120 121 MCAsmBackend *createDXILMCAsmBackend(const Target &T, 122 const MCSubtargetInfo &STI, 123 const MCRegisterInfo &MRI, 124 const MCTargetOptions &Options) { 125 return new DXILAsmBackend(STI); 126 } 127 128 static MCSubtargetInfo * 129 createDirectXMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 130 return createDirectXMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 131 } 132 133 static MCRegisterInfo *createDirectXMCRegisterInfo(const Triple &Triple) { 134 return new MCRegisterInfo(); 135 } 136 137 static MCInstrInfo *createDirectXMCInstrInfo() { return new MCInstrInfo(); } 138 139 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTargetMC() { 140 Target &T = getTheDirectXTarget(); 141 RegisterMCAsmInfo<DirectXMCAsmInfo> X(T); 142 TargetRegistry::RegisterMCInstrInfo(T, createDirectXMCInstrInfo); 143 TargetRegistry::RegisterMCInstPrinter(T, createDXILMCInstPrinter); 144 TargetRegistry::RegisterMCRegInfo(T, createDirectXMCRegisterInfo); 145 TargetRegistry::RegisterMCSubtargetInfo(T, createDirectXMCSubtargetInfo); 146 TargetRegistry::RegisterMCCodeEmitter(T, createDXILMCCodeEmitter); 147 TargetRegistry::RegisterMCAsmBackend(T, createDXILMCAsmBackend); 148 } 149