Path: blob/main/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp
35266 views
//===- DirectXTargetMachine.cpp - DirectX Target Implementation -*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file9/// This file contains DirectX target initializer.10///11//===----------------------------------------------------------------------===//1213#include "DirectXTargetMachine.h"14#include "DXILResourceAnalysis.h"15#include "DXILShaderFlags.h"16#include "DXILWriter/DXILWriterPass.h"17#include "DirectX.h"18#include "DirectXSubtarget.h"19#include "DirectXTargetTransformInfo.h"20#include "TargetInfo/DirectXTargetInfo.h"21#include "llvm/CodeGen/MachineModuleInfo.h"22#include "llvm/CodeGen/Passes.h"23#include "llvm/CodeGen/TargetPassConfig.h"24#include "llvm/IR/IRPrintingPasses.h"25#include "llvm/IR/LegacyPassManager.h"26#include "llvm/MC/MCSectionDXContainer.h"27#include "llvm/MC/SectionKind.h"28#include "llvm/MC/TargetRegistry.h"29#include "llvm/Passes/PassBuilder.h"30#include "llvm/Support/CodeGen.h"31#include "llvm/Support/Compiler.h"32#include "llvm/Support/ErrorHandling.h"33#include "llvm/Target/TargetLoweringObjectFile.h"34#include <optional>3536using namespace llvm;3738extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() {39RegisterTargetMachine<DirectXTargetMachine> X(getTheDirectXTarget());40auto *PR = PassRegistry::getPassRegistry();41initializeDXILIntrinsicExpansionLegacyPass(*PR);42initializeDXILPrepareModulePass(*PR);43initializeEmbedDXILPassPass(*PR);44initializeWriteDXILPassPass(*PR);45initializeDXContainerGlobalsPass(*PR);46initializeDXILOpLoweringLegacyPass(*PR);47initializeDXILTranslateMetadataPass(*PR);48initializeDXILResourceWrapperPass(*PR);49initializeShaderFlagsAnalysisWrapperPass(*PR);50}5152class DXILTargetObjectFile : public TargetLoweringObjectFile {53public:54DXILTargetObjectFile() = default;5556MCSection *getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind,57const TargetMachine &TM) const override {58return getContext().getDXContainerSection(GO->getSection(), Kind);59}6061protected:62MCSection *SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind,63const TargetMachine &TM) const override {64llvm_unreachable("Not supported!");65}66};6768class DirectXPassConfig : public TargetPassConfig {69public:70DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM)71: TargetPassConfig(TM, PM) {}7273DirectXTargetMachine &getDirectXTargetMachine() const {74return getTM<DirectXTargetMachine>();75}7677FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }78void addCodeGenPrepare() override {79addPass(createDXILIntrinsicExpansionLegacyPass());80addPass(createDXILOpLoweringLegacyPass());81addPass(createDXILTranslateMetadataPass());82addPass(createDXILPrepareModulePass());83}84};8586DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT,87StringRef CPU, StringRef FS,88const TargetOptions &Options,89std::optional<Reloc::Model> RM,90std::optional<CodeModel::Model> CM,91CodeGenOptLevel OL, bool JIT)92: LLVMTargetMachine(T,93"e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-"94"f32:32-f64:64-n8:16:32:64",95TT, CPU, FS, Options, Reloc::Static, CodeModel::Small,96OL),97TLOF(std::make_unique<DXILTargetObjectFile>()),98Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {99initAsmInfo();100}101102DirectXTargetMachine::~DirectXTargetMachine() {}103104void DirectXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {105#define GET_PASS_REGISTRY "DirectXPassRegistry.def"106#include "llvm/Passes/TargetPassRegistry.inc"107}108109bool DirectXTargetMachine::addPassesToEmitFile(110PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut,111CodeGenFileType FileType, bool DisableVerify,112MachineModuleInfoWrapperPass *MMIWP) {113TargetPassConfig *PassConfig = createPassConfig(PM);114PassConfig->addCodeGenPrepare();115116switch (FileType) {117case CodeGenFileType::AssemblyFile:118PM.add(createDXILPrettyPrinterPass(Out));119PM.add(createPrintModulePass(Out, "", true));120break;121case CodeGenFileType::ObjectFile:122if (TargetPassConfig::willCompleteCodeGenPipeline()) {123PM.add(createDXILEmbedderPass());124// We embed the other DXContainer globals after embedding DXIL so that the125// globals don't pollute the DXIL.126PM.add(createDXContainerGlobalsPass());127128if (!MMIWP)129MMIWP = new MachineModuleInfoWrapperPass(this);130PM.add(MMIWP);131if (addAsmPrinter(PM, Out, DwoOut, FileType,132MMIWP->getMMI().getContext()))133return true;134} else135PM.add(createDXILWriterPass(Out));136break;137case CodeGenFileType::Null:138break;139}140return false;141}142143bool DirectXTargetMachine::addPassesToEmitMC(PassManagerBase &PM,144MCContext *&Ctx,145raw_pwrite_stream &Out,146bool DisableVerify) {147return true;148}149150TargetPassConfig *DirectXTargetMachine::createPassConfig(PassManagerBase &PM) {151return new DirectXPassConfig(*this, PM);152}153154const DirectXSubtarget *155DirectXTargetMachine::getSubtargetImpl(const Function &) const {156return Subtarget.get();157}158159TargetTransformInfo160DirectXTargetMachine::getTargetTransformInfo(const Function &F) const {161return TargetTransformInfo(DirectXTTIImpl(this, F));162}163164DirectXTargetLowering::DirectXTargetLowering(const DirectXTargetMachine &TM,165const DirectXSubtarget &STI)166: TargetLowering(TM) {}167168169