brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 62ad014 Raw
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