181ad6265SDimitry Andric //===- DirectXMCTargetDesc.cpp - DirectX Target Implementation --*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric /// 981ad6265SDimitry Andric /// \file 1081ad6265SDimitry Andric /// This file contains DirectX target initializer. 1181ad6265SDimitry Andric /// 1281ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1381ad6265SDimitry Andric 1481ad6265SDimitry Andric #include "DirectXMCTargetDesc.h" 1581ad6265SDimitry Andric #include "DirectXContainerObjectWriter.h" 1681ad6265SDimitry Andric #include "TargetInfo/DirectXTargetInfo.h" 1781ad6265SDimitry Andric #include "llvm/MC/LaneBitmask.h" 1881ad6265SDimitry Andric #include "llvm/MC/MCAsmBackend.h" 1981ad6265SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 2081ad6265SDimitry Andric #include "llvm/MC/MCCodeEmitter.h" 2181ad6265SDimitry Andric #include "llvm/MC/MCDXContainerWriter.h" 2281ad6265SDimitry Andric #include "llvm/MC/MCInstPrinter.h" 2381ad6265SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 2481ad6265SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 2581ad6265SDimitry Andric #include "llvm/MC/MCSchedule.h" 2681ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 2781ad6265SDimitry Andric #include "llvm/MC/TargetRegistry.h" 2881ad6265SDimitry Andric #include "llvm/Support/Compiler.h" 2906c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 3081ad6265SDimitry Andric #include <memory> 3181ad6265SDimitry Andric 3281ad6265SDimitry Andric using namespace llvm; 3381ad6265SDimitry Andric 3481ad6265SDimitry Andric #define GET_INSTRINFO_MC_DESC 3581ad6265SDimitry Andric #define GET_INSTRINFO_MC_HELPERS 3681ad6265SDimitry Andric #include "DirectXGenInstrInfo.inc" 3781ad6265SDimitry Andric 3881ad6265SDimitry Andric #define GET_SUBTARGETINFO_MC_DESC 3981ad6265SDimitry Andric #include "DirectXGenSubtargetInfo.inc" 4081ad6265SDimitry Andric 4181ad6265SDimitry Andric #define GET_REGINFO_MC_DESC 4281ad6265SDimitry Andric #include "DirectXGenRegisterInfo.inc" 4381ad6265SDimitry Andric 4481ad6265SDimitry Andric namespace { 4581ad6265SDimitry Andric 4681ad6265SDimitry Andric // DXILInstPrinter is a null stub because DXIL instructions aren't printed. 4781ad6265SDimitry Andric class DXILInstPrinter : public MCInstPrinter { 4881ad6265SDimitry Andric public: 4981ad6265SDimitry Andric DXILInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, 5081ad6265SDimitry Andric const MCRegisterInfo &MRI) 5181ad6265SDimitry Andric : MCInstPrinter(MAI, MII, MRI) {} 5281ad6265SDimitry Andric 5381ad6265SDimitry Andric void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, 5481ad6265SDimitry Andric const MCSubtargetInfo &STI, raw_ostream &O) override {} 5581ad6265SDimitry Andric 5681ad6265SDimitry Andric std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override { 5781ad6265SDimitry Andric return std::make_pair<const char *, uint64_t>("", 0ull); 5881ad6265SDimitry Andric } 5981ad6265SDimitry Andric 6081ad6265SDimitry Andric private: 6181ad6265SDimitry Andric }; 6281ad6265SDimitry Andric 6381ad6265SDimitry Andric class DXILMCCodeEmitter : public MCCodeEmitter { 6481ad6265SDimitry Andric public: 6581ad6265SDimitry Andric DXILMCCodeEmitter() {} 6681ad6265SDimitry Andric 67*5f757f3fSDimitry Andric void encodeInstruction(const MCInst &Inst, SmallVectorImpl<char> &CB, 6881ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 6981ad6265SDimitry Andric const MCSubtargetInfo &STI) const override {} 7081ad6265SDimitry Andric }; 7181ad6265SDimitry Andric 7281ad6265SDimitry Andric class DXILAsmBackend : public MCAsmBackend { 7381ad6265SDimitry Andric 7481ad6265SDimitry Andric public: 75*5f757f3fSDimitry Andric DXILAsmBackend(const MCSubtargetInfo &STI) 76*5f757f3fSDimitry Andric : MCAsmBackend(llvm::endianness::little) {} 7781ad6265SDimitry Andric ~DXILAsmBackend() override = default; 7881ad6265SDimitry Andric 7981ad6265SDimitry Andric void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup, 8081ad6265SDimitry Andric const MCValue &Target, MutableArrayRef<char> Data, 8181ad6265SDimitry Andric uint64_t Value, bool IsResolved, 8281ad6265SDimitry Andric const MCSubtargetInfo *STI) const override {} 8381ad6265SDimitry Andric 8481ad6265SDimitry Andric std::unique_ptr<MCObjectTargetWriter> 8581ad6265SDimitry Andric createObjectTargetWriter() const override { 8681ad6265SDimitry Andric return createDXContainerTargetObjectWriter(); 8781ad6265SDimitry Andric } 8881ad6265SDimitry Andric 8981ad6265SDimitry Andric unsigned getNumFixupKinds() const override { return 0; } 9081ad6265SDimitry Andric 9181ad6265SDimitry Andric bool writeNopData(raw_ostream &OS, uint64_t Count, 9281ad6265SDimitry Andric const MCSubtargetInfo *STI) const override { 9381ad6265SDimitry Andric return true; 9481ad6265SDimitry Andric } 9581ad6265SDimitry Andric }; 9681ad6265SDimitry Andric 9781ad6265SDimitry Andric class DirectXMCAsmInfo : public MCAsmInfo { 9881ad6265SDimitry Andric public: 9981ad6265SDimitry Andric explicit DirectXMCAsmInfo(const Triple &TT, const MCTargetOptions &Options) 10081ad6265SDimitry Andric : MCAsmInfo() {} 10181ad6265SDimitry Andric }; 10281ad6265SDimitry Andric 10381ad6265SDimitry Andric } // namespace 10481ad6265SDimitry Andric 10581ad6265SDimitry Andric static MCInstPrinter *createDXILMCInstPrinter(const Triple &T, 10681ad6265SDimitry Andric unsigned SyntaxVariant, 10781ad6265SDimitry Andric const MCAsmInfo &MAI, 10881ad6265SDimitry Andric const MCInstrInfo &MII, 10981ad6265SDimitry Andric const MCRegisterInfo &MRI) { 11081ad6265SDimitry Andric if (SyntaxVariant == 0) 11181ad6265SDimitry Andric return new DXILInstPrinter(MAI, MII, MRI); 11281ad6265SDimitry Andric return nullptr; 11381ad6265SDimitry Andric } 11481ad6265SDimitry Andric 11581ad6265SDimitry Andric MCCodeEmitter *createDXILMCCodeEmitter(const MCInstrInfo &MCII, 11681ad6265SDimitry Andric MCContext &Ctx) { 11781ad6265SDimitry Andric return new DXILMCCodeEmitter(); 11881ad6265SDimitry Andric } 11981ad6265SDimitry Andric 12081ad6265SDimitry Andric MCAsmBackend *createDXILMCAsmBackend(const Target &T, 12181ad6265SDimitry Andric const MCSubtargetInfo &STI, 12281ad6265SDimitry Andric const MCRegisterInfo &MRI, 12381ad6265SDimitry Andric const MCTargetOptions &Options) { 12481ad6265SDimitry Andric return new DXILAsmBackend(STI); 12581ad6265SDimitry Andric } 12681ad6265SDimitry Andric 12781ad6265SDimitry Andric static MCSubtargetInfo * 12881ad6265SDimitry Andric createDirectXMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 12981ad6265SDimitry Andric return createDirectXMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); 13081ad6265SDimitry Andric } 13181ad6265SDimitry Andric 13281ad6265SDimitry Andric static MCRegisterInfo *createDirectXMCRegisterInfo(const Triple &Triple) { 13381ad6265SDimitry Andric return new MCRegisterInfo(); 13481ad6265SDimitry Andric } 13581ad6265SDimitry Andric 13681ad6265SDimitry Andric static MCInstrInfo *createDirectXMCInstrInfo() { return new MCInstrInfo(); } 13781ad6265SDimitry Andric 13881ad6265SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTargetMC() { 13981ad6265SDimitry Andric Target &T = getTheDirectXTarget(); 14081ad6265SDimitry Andric RegisterMCAsmInfo<DirectXMCAsmInfo> X(T); 14181ad6265SDimitry Andric TargetRegistry::RegisterMCInstrInfo(T, createDirectXMCInstrInfo); 14281ad6265SDimitry Andric TargetRegistry::RegisterMCInstPrinter(T, createDXILMCInstPrinter); 14381ad6265SDimitry Andric TargetRegistry::RegisterMCRegInfo(T, createDirectXMCRegisterInfo); 14481ad6265SDimitry Andric TargetRegistry::RegisterMCSubtargetInfo(T, createDirectXMCSubtargetInfo); 14581ad6265SDimitry Andric TargetRegistry::RegisterMCCodeEmitter(T, createDXILMCCodeEmitter); 14681ad6265SDimitry Andric TargetRegistry::RegisterMCAsmBackend(T, createDXILMCAsmBackend); 14781ad6265SDimitry Andric } 148