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 "DXILRootSignature.h"
16#include "DXILShaderFlags.h"
19#include "DirectX.h"
20#include "DirectXSubtarget.h"
25#include "llvm/CodeGen/Passes.h"
31#include "llvm/MC/SectionKind.h"
43#include <optional>
44
45using namespace llvm;
46
79}
80
82public:
84
86 const TargetMachine &TM) const override {
87 return getContext().getDXContainerSection(GO->getSection(), Kind);
88 }
89
90protected:
92 const TargetMachine &TM) const override {
93 llvm_unreachable("Not supported!");
94 }
95};
96
98public:
101
105
106 FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
140};
141
143 StringRef CPU, StringRef FS,
144 const TargetOptions &Options,
145 std::optional<Reloc::Model> RM,
146 std::optional<CodeModel::Model> CM,
147 CodeGenOptLevel OL, bool JIT)
148 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options, Reloc::Static,
149 CodeModel::Small, OL),
150 TLOF(std::make_unique<DXILTargetObjectFile>()),
151 Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {
152 initAsmInfo();
153}
154
156
158#define GET_PASS_REGISTRY "DirectXPassRegistry.def"
160}
161
164 CodeGenFileType FileType, bool DisableVerify,
166 TargetPassConfig *PassConfig = createPassConfig(PM);
167 PM.add(PassConfig);
168
169 if (!MMIWP)
170 MMIWP = new MachineModuleInfoWrapperPass(this);
171 PM.add(MMIWP);
172
174 PassConfig->addCodeGenPrepare();
175
176 switch (FileType) {
179 break;
181 if (PassConfig->willCompleteCodeGenPipeline()) {
183 // We embed the other DXContainer globals after embedding DXIL so that the
184 // globals don't pollute the DXIL.
187
188 if (addAsmPrinter(PM, Out, DwoOut, FileType,
189 MMIWP->getMMI().getContext()))
190 return true;
191 } else
192 PM.add(createDXILWriterPass(Out));
193 break;
195 break;
196 }
197 return false;
198}
199
201 MCContext *&Ctx,
203 bool DisableVerify) {
204 return true;
205}
206
210
211const DirectXSubtarget *
213 return Subtarget.get();
214}
215
218 return TargetTransformInfo(std::make_unique<DirectXTTIImpl>(this, F));
219}
220
222 const DirectXSubtarget &STI)
223 : TargetLowering(TM, STI) {
224 addRegisterClass(MVT::i32, &dxil::DXILClassRegClass);
226}
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
#define LLVM_ABI
Definition Compiler.h:211
#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(Mod->getContext(), 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 initializeDXILContainerGlobalsLegacyPass(PassRegistry &)
Initializer for DXILContainerGlobals pass.
void initializeShaderFlagsAnalysisWrapperPass(PassRegistry &)
Initializer for dxil::ShaderFlagsAnalysisWrapper pass.
LLVM_ABI void initializeStripConvergenceIntrinsicsLegacyPassPass(PassRegistry &)
FunctionPass * createDXILLegalizeLegacyPass()
void initializeDXILPrepareModuleLegacyPass(PassRegistry &)
Initializer for DXIL-prepare.
void initializeDXILPrettyPrinterLegacyPass(PassRegistry &)
Initializer for DXILPrettyPrinter.
ModulePass * createDXILDataScalarizationLegacyPass()
ModulePass * createDXILWriterPass(raw_ostream &Str)
Create and return a pass that writes the module to the specified ostream.
ModulePass * createDXILContainerPDBLegacyPass()
ModulePass * createDXILPostOptimizationValidationLegacyPass()
ModulePass * createDXILTranslateMetadataLegacyPass()
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()
ModulePass * createDXILCBufferAccessLegacyPass()
LLVM_ABI ModulePass * createGlobalDCEPass()
ModulePass * createDXILFlattenArraysLegacyPass()
ModulePass * createDXILResourceImplicitBindingLegacyPass()
Target & getTheDirectXTarget()
LLVM_ABI void initializeGlobalDCELegacyPassPass(PassRegistry &)
FunctionPass * createDXILResourceAccessLegacyPass()
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
Definition CodeGen.h:309
void initializeDXILResourceImplicitBindingLegacyPass(PassRegistry &)
Initializer for DXILResourceImplicitBindingLegacyPass.
void initializeDXILForwardHandleAccessesLegacyPass(PassRegistry &)
Initializer for DXIL Forward Handle Accesses Pass.
void initializeDXILDataScalarizationLegacyPass(PassRegistry &)
Initializer for DXIL Data Scalarization Pass.
ModulePass * createDXILFinalizeLinkageLegacyPass()
void initializeEmbedDXILPassPass(PassRegistry &)
Initializer for dxil embedder pass.
void initializeSignatureAnalysisWrapperPass(PassRegistry &)
Initializer for dxil::SignatureAnalysisWrapper pass.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:280
ModulePass * createDXILIntrinsicExpansionLegacyPass()
ModulePass * createDXILPrepareModuleLegacyPass()
LLVM_ABI FunctionPass * createStripConvergenceIntrinsicsPass()
void initializeDXILFinalizeLinkageLegacyPass(PassRegistry &)
Initializer for DXILFinalizeLinkage pass.
void initializeDXILContainerPDBLegacyPass(PassRegistry &)
Initializer for DXILContainerPDB 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()
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()
ModulePass * createDXILOpLoweringLegacyPass()
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)
void initializeDXILRemoveUnusedResourcesLegacyPass(PassRegistry &)
Initializer for DXILRemoveUnusedResources.
LLVM_ABI void initializeScalarizerLegacyPassPass(PassRegistry &)
FunctionPass * createDXILForwardHandleAccessesLegacyPass()
ModulePass * createDXILContainerGlobalsLegacyPass()
void initializeDXILResourceAccessLegacyPass(PassRegistry &)
Initializer for DXILResourceAccess.
void initializeDXILTranslateMetadataLegacyPass(PassRegistry &)
Initializer for DXILTranslateMetadata.
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