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