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 "DirectXAsmPrinter.h"
21#include "DirectXSubtarget.h"
26#include "llvm/CodeGen/Passes.h"
32#include "llvm/MC/SectionKind.h"
44#include <optional>
45
46using namespace llvm;
47
80}
81
83public:
85
87 const TargetMachine &TM) const override {
88 return getContext().getDXContainerSection(GO->getSection(), Kind);
89 }
90
91protected:
93 const TargetMachine &TM) const override {
94 llvm_unreachable("Not supported!");
95 }
96};
97
99public:
102
106
107 FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; }
141};
142
144 StringRef CPU, StringRef FS,
145 const TargetOptions &Options,
146 std::optional<Reloc::Model> RM,
147 std::optional<CodeModel::Model> CM,
148 CodeGenOptLevel OL, bool JIT)
149 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options, Reloc::Static,
150 CodeModel::Small, OL),
151 TLOF(std::make_unique<DXILTargetObjectFile>()),
152 Subtarget(std::make_unique<DirectXSubtarget>(TT, CPU, FS, *this)) {
153 initAsmInfo();
154}
155
157
159#define GET_PASS_REGISTRY "DirectXPassRegistry.def"
161}
162
165 CodeGenFileType FileType, bool DisableVerify,
167 TargetPassConfig *PassConfig = createPassConfig(PM);
168 PM.add(PassConfig);
169
170 if (!MMIWP)
171 MMIWP = new MachineModuleInfoWrapperPass(this);
172 PM.add(MMIWP);
173
175 PassConfig->addCodeGenPrepare();
176
177 switch (FileType) {
180 break;
182 if (PassConfig->willCompleteCodeGenPipeline()) {
184 // We embed the other DXContainer globals after embedding DXIL so that the
185 // globals don't pollute the DXIL.
188
189 if (addAsmPrinter(PM, Out, DwoOut, FileType,
190 MMIWP->getMMI().getContext()))
191 return true;
192 } else
194 break;
196 break;
197 }
198 return false;
199}
200
202 MCContext *&Ctx,
204 bool DisableVerify) {
205 return true;
206}
207
211
212const DirectXSubtarget *
214 return Subtarget.get();
215}
216
219 return TargetTransformInfo(std::make_unique<DirectXTTIImpl>(this, F));
220}
221
223 const DirectXSubtarget &STI)
224 : TargetLowering(TM, STI) {
225 addRegisterClass(MVT::i32, &dxil::DXILClassRegClass);
227}
#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 * 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 * createDXILWriterLegacyPass(raw_ostream &Str)
ModulePass * createDXILCBufferAccessLegacyPass()
void initializeDXILWriterLegacyPass(PassRegistry &)
Initializer for dxil writer pass.
LLVM_ABI ModulePass * createGlobalDCEPass()
ModulePass * createDXILEmbedderLegacyPass()
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 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.
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.
ModulePass * createDXILPrettyPrinterLegacyPass(raw_ostream &OS)
void initializeDXILRemoveUnusedResourcesLegacyPass(PassRegistry &)
Initializer for DXILRemoveUnusedResources.
LLVM_ABI void initializeScalarizerLegacyPassPass(PassRegistry &)
FunctionPass * createDXILForwardHandleAccessesLegacyPass()
void initializeDXILEmbedderLegacyPass(PassRegistry &)
Initializer for dxil embedder pass.
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:879
RegisterTargetMachine - Helper template for registering a target machine implementation,...
bool ScalarizeLoadStore
Allow the scalarizer pass to scalarize loads and store.
Definition Scalarizer.h:48