146 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// 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_DESC35#define GET_INSTRINFO_MC_HELPERS36#include "DirectXGenInstrInfo.inc"37 38#define GET_SUBTARGETINFO_MC_DESC39#include "DirectXGenSubtargetInfo.inc"40 41#define GET_REGINFO_MC_DESC42#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>("", 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() {}98};99 100} // namespace101 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 void136LLVMInitializeDirectXTargetMC() {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