LLVM 24.0.0git
DirectXTargetMachine.cpp
Go to the documentation of this file.
1//===- DirectXTargetMachine.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-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file contains DirectX target initializer.
11///
12//===----------------------------------------------------------------------===//
13
15#include "DXILCBufferAccess.h"
17#include "DXILFinalizeLinkage.h"
18#include "DXILFlattenArrays.h"
21#include "DXILLegalizePass.h"
22#include "DXILMemIntrinsics.h"
23#include "DXILOpLowering.h"
25#include "DXILPrettyPrinter.h"
27#include "DXILResourceAccess.h"
29#include "DXILRootSignature.h"
30#include "DXILShaderFlags.h"
34#include "DirectX.h"
36#include "DirectXSubtarget.h"
41#include "llvm/CodeGen/Passes.h"
47#include "llvm/MC/SectionKind.h"
59#include <optional>
60
61using namespace llvm;
62
96
98public:
100
102 const TargetMachine &TM) const override {
103 return getContext().getDXContainerSection(GO->getSection(), Kind);
104 }
105
106protected:
108 const TargetMachine &TM) const override {
109 llvm_unreachable("Not supported!");
110 }
111};
112
114public:
117
121
122 FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
156};
157
159 StringRef CPU, StringRef FS,
160 const TargetOptions &Options,
161 std::optional<Reloc::Model> RM,
162 std::optional<CodeModel::Model> CM,
163 CodeGenOptLevel OL, bool JIT)
164 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options, Reloc::Static,
165 CodeModel::Small, OL),
166 TLOF(std::make_unique<DXILTargetObjectFile>()),
167 Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {
168 initAsmInfo();
169}
170
172
174#define GET_PASS_REGISTRY "DirectXPassRegistry.def"
176}
177
180 CodeGenFileType FileType, bool DisableVerify,
182 TargetPassConfig *PassConfig = createPassConfig(PM);
183 PM.add(PassConfig);
184
185 if (!MMIWP)
186 MMIWP = new MachineModuleInfoWrapperPass(this);
187 PM.add(MMIWP);
188
190 PassConfig->addCodeGenPrepare();
191
192 switch (FileType) {
195 break;
197 if (PassConfig->willCompleteCodeGenPipeline()) {
199 // We embed the other DXContainer globals after embedding DXIL so that the
200 // globals don't pollute the DXIL.
203
204 if (addAsmPrinter(PM, Out, DwoOut, FileType,
205 MMIWP->getMMI().getContext()))
206 return true;
207 } else
208 PM.add(createDXILWriterPass(Out));
209 break;
211 break;
212 }
213 return false;
214}
215
217 MCContext *&Ctx,
219 bool DisableVerify) {
220 return true;
221}
222
226
227const DirectXSubtarget *
229 return Subtarget.get();
230}
231
234 return TargetTransformInfo(std::make_unique<DirectXTTIImpl>(this, F));
235}
236
238 const DirectXSubtarget &STI)
239 : TargetLowering(TM, STI) {
240 addRegisterClass(MVT::i32, &dxil::DXILClassRegClass);
242}
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
This file provides a bitcode writing pass.
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget()
This file contains an interface for creating legacy passes to print out IR in various granularities.
#define F(x, y, z)
Definition MD5.cpp:54
#define T
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This pass converts vector operations into scalar operations (or, optionally, operations on smaller ve...
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
Defines the llvm::VersionTuple class, which represents a version in the form major[....
DXILTargetObjectFile()=default
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
FunctionPass * createTargetRegisterAllocator(bool) override
createTargetRegisterAllocator - Create the register allocator pass for this target at the current opt...
void addCodeGenPrepare() override
Add pass to prepare the LLVM IR for code generation.
DirectXPassConfig(DirectXTargetMachine &TM, PassManagerBase &PM)
DirectXTargetMachine & getDirectXTargetMachine() const
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
bool addAsmPrinter(PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, MCContext &Context) override
Adds an AsmPrinter pass to the pipeline that prints assembly or machine code from the MI representati...
const DirectXRegisterInfo * getRegisterInfo() const override
DirectXTargetLowering(const DirectXTargetMachine &TM, const DirectXSubtarget &STI)
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
DirectXTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
const DirectXSubtarget * getSubtargetImpl(const Function &) const override
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
bool addPassesToEmitFile(PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, bool DisableVerify, MachineModuleInfoWrapperPass *MMIWP) override
Add passes to the specified pass manager to get the specified file emitted.
bool addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, raw_pwrite_stream &Out, bool DisableVerify) override
Add passes to the specified pass manager to get machine code emitted with the MCJIT.
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:312
StringRef getSection() const
Get the custom section of this global if it has one.
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSectionDXContainer * getDXContainerSection(StringRef Section, SectionKind K)
Get the section for the provided Section name.
MCContext & getContext() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:580
const MCContext & getContext() const
This class provides access to building LLVM's passes.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition SectionKind.h:22
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
TargetLowering(const TargetLowering &)=delete
Primary interface to the complete machine description for the target machine.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
TargetIRAnalysis getTargetIRAnalysis() const
Get a TargetIRAnalysis appropriate for the target.
TargetOptions Options
Target-Independent Code Generator Pass Configuration Options.
virtual void addCodeGenPrepare()
Add pass to prepare the LLVM IR for code generation.
bool willCompleteCodeGenPipeline() const
Returns true if none of the -stop-before and -stop-after options is set.
AnalysisID addPass(AnalysisID PassID)
Utilities for targets to add passes to the pass manager.
TargetPassConfig(TargetMachine &TM, PassManagerBase &PM)
TMC & getTM() const
Get the right type of TargetMachine for this target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
Represents a version number in the form major[.minor[.subminor[.build]]].
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
virtual void add(Pass *P)=0
Add a pass to the queue of passes to run.
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI void initializeDSELegacyPassPass(PassRegistry &)
void initializeShaderFlagsAnalysisWrapperPass(PassRegistry &)
Initializer for dxil::ShaderFlagsAnalysisWrapper pass.
LLVM_ABI void initializeStripConvergenceIntrinsicsLegacyPassPass(PassRegistry &)
FunctionPass * createDXILLegalizeLegacyPass()
Pass to Legalize DXIL by remove i8 truncations and i64 insert/extract elements.
void initializeDXILPrettyPrinterLegacyPass(PassRegistry &)
Initializer for DXILPrettyPrinter.
ModulePass * createDXILDataScalarizationLegacyPass()
Pass to scalarize llvm global data into a DXIL legal form.
ModulePass * createDXILWriterPass(raw_ostream &Str)
Create and return a pass that writes the module to the specified ostream.
ModulePass * createDXILPostOptimizationValidationLegacyPass()
Pass to lowering LLVM intrinsic call to DXIL op function call.
ModulePass * createDXILTranslateMetadataLegacyPass()
Pass to emit metadata for DXIL.
void initializeDXILCBufferAccessLegacyPass(PassRegistry &)
Initializer for DXIL CBuffer Access Pass.
void initializeDXILFlattenArraysLegacyPass(PassRegistry &)
Initializer for DXIL Array Flatten Pass.
void initializeRootSignatureAnalysisWrapperPass(PassRegistry &)
Initializer for dxil::RootSignatureAnalysisWrapper pass.
ModulePass * createDXILDebugInfoLegacyPass()
Pass to downgrade debug information to forms supported by DXIL.
ModulePass * createDXILPrepareModulePass()
Pass to convert modules into DXIL-compatable modules.
ModulePass * createDXContainerGlobalsPass()
Pass for generating DXContainer part globals.
ModulePass * createDXILCBufferAccessLegacyPass()
Pass to translate loads in the cbuffer address space to intrinsics.
void initializeDXContainerPDBPass(PassRegistry &)
Initializer for DXContainerPDB pass.
LLVM_ABI ModulePass * createGlobalDCEPass()
ModulePass * createDXILFlattenArraysLegacyPass()
Pass to flatten arrays into a one dimensional DXIL legal form.
ModulePass * createDXILResourceImplicitBindingLegacyPass()
Pass to assign register slots to resources without binding.
Target & getTheDirectXTarget()
LLVM_ABI void initializeGlobalDCELegacyPassPass(PassRegistry &)
FunctionPass * createDXILResourceAccessLegacyPass()
Pass to update resource accesses to use load/store directly.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:256
void initializeDXILResourceImplicitBindingLegacyPass(PassRegistry &)
Initializer for DXILResourceImplicitBindingLegacyPass.
void initializeDXILPrepareModulePass(PassRegistry &)
Initializer for DXIL-prepare.
void initializeDXILForwardHandleAccessesLegacyPass(PassRegistry &)
Initializer for DXIL Forward Handle Accesses Pass.
void initializeDXILDataScalarizationLegacyPass(PassRegistry &)
Initializer for DXIL Data Scalarization Pass.
ModulePass * createDXILFinalizeLinkageLegacyPass()
Pass to finalize linkage of functions.
void initializeEmbedDXILPassPass(PassRegistry &)
Initializer for dxil embedder pass.
void initializeSignatureAnalysisWrapperPass(PassRegistry &)
Initializer for dxil::SignatureAnalysisWrapper pass.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
ModulePass * createDXILIntrinsicExpansionLegacyPass()
Pass to expand intrinsic operations that lack DXIL opCodes.
LLVM_ABI FunctionPass * createStripConvergenceIntrinsicsPass()
void initializeDXILFinalizeLinkageLegacyPass(PassRegistry &)
Initializer for DXILFinalizeLinkage pass.
void initializeDXILIntrinsicExpansionLegacyPass(PassRegistry &)
Initializer for DXIL Intrinsic Expansion.
void initializeDXILLegalizeLegacyPass(PassRegistry &)
Initializer DXIL legalizationPass.
LLVM_ABI ImmutablePass * createTargetTransformInfoWrapperPass(TargetIRAnalysis TIRA)
Create an analysis pass wrapper around a TTI object.
ModulePass * createDXILEmbedderPass()
Create and return a pass that writes the module to a global variable in the module for later emission...
FunctionPass * createDXILRemoveUnusedResourcesLegacyPass()
Pass to update remove unsused resources.
LLVM_ABI FunctionPass * createScalarizerPass(const ScalarizerPassOptions &Options=ScalarizerPassOptions())
Create a legacy pass manager instance of the Scalarizer pass.
void initializeDXILDebugInfoLegacyPass(PassRegistry &)
Initializer for DXIL debug info lowering.
void initializeDXILMemIntrinsicsLegacyPass(PassRegistry &)
Initializer for DXIL Mem Intrinsics.
ModulePass * createDXILMemIntrinsicsLegacyPass()
Pass to transform all llvm memory intrinsics to explicit loads and stores.
ModulePass * createDXILOpLoweringLegacyPass()
Pass to lowering LLVM intrinsic call to DXIL op function call.
LLVM_ABI FunctionPass * createDeadStoreEliminationPass()
void initializeDXILPostOptimizationValidationLegacyPass(PassRegistry &)
Initializer for DXILPostOptimizationValidation.
void initializeDXILOpLoweringLegacyPass(PassRegistry &)
Initializer for DXILOpLowering.
void initializeWriteDXILPassPass(PassRegistry &)
Initializer for dxil writer pass.
ModulePass * createDXILPrettyPrinterLegacyPass(raw_ostream &OS)
Pass to pretty print DXIL metadata.
void initializeDXILRemoveUnusedResourcesLegacyPass(PassRegistry &)
Initializer for DXILRemoveUnusedResources.
LLVM_ABI void initializeScalarizerLegacyPassPass(PassRegistry &)
void initializeDXContainerGlobalsPass(PassRegistry &)
Initializer for DXContainerGlobals pass.
FunctionPass * createDXILForwardHandleAccessesLegacyPass()
Pass to eliminate redundant stores and loads from handle globals.
void initializeDXILResourceAccessLegacyPass(PassRegistry &)
Initializer for DXILResourceAccess.
void initializeDXILTranslateMetadataLegacyPass(PassRegistry &)
Initializer for DXILTranslateMetadata.
ModulePass * createDXContainerPDBPass()
Pass for emitting DirectX PDB files.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
RegisterTargetMachine - Helper template for registering a target machine implementation,...
bool ScalarizeLoadStore
Allow the scalarizer pass to scalarize loads and store.
Definition Scalarizer.h:48