diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp b/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp index 44bef80ea6fb..59e6fcb44d5a 100644 --- a/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp +++ b/contrib/llvm-project/llvm/lib/Target/DirectX/DirectXTargetMachine.cpp @@ -12,6 +12,8 @@ //===----------------------------------------------------------------------===// #include "DirectXTargetMachine.h" +#include "DXILResourceAnalysis.h" +#include "DXILShaderFlags.h" #include "DXILWriter/DXILWriterPass.h" #include "DirectX.h" #include "DirectXSubtarget.h" @@ -25,10 +27,12 @@ #include "llvm/MC/MCSectionDXContainer.h" #include "llvm/MC/SectionKind.h" #include "llvm/MC/TargetRegistry.h" +#include "llvm/Passes/PassBuilder.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetLoweringObjectFile.h" +#include <optional> using namespace llvm; @@ -37,8 +41,11 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeDirectXTarget() { auto *PR = PassRegistry::getPassRegistry(); initializeDXILPrepareModulePass(*PR); initializeEmbedDXILPassPass(*PR); + initializeWriteDXILPassPass(*PR); initializeDXILOpLoweringLegacyPass(*PR); initializeDXILTranslateMetadataPass(*PR); + initializeDXILResourceWrapperPass(*PR); + initializeShaderFlagsAnalysisWrapperPass(*PR); } class DXILTargetObjectFile : public TargetLoweringObjectFile { @@ -67,13 +74,18 @@ public: } FunctionPass *createTargetRegisterAllocator(bool) override { return nullptr; } + void addCodeGenPrepare() override { + addPass(createDXILOpLoweringLegacyPass()); + addPass(createDXILPrepareModulePass()); + addPass(createDXILTranslateMetadataPass()); + } }; DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, - Optional<Reloc::Model> RM, - Optional<CodeModel::Model> CM, + std::optional<Reloc::Model> RM, + std::optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT) : LLVMTargetMachine(T, "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-" @@ -87,18 +99,43 @@ DirectXTargetMachine::DirectXTargetMachine(const Target &T, const Triple &TT, DirectXTargetMachine::~DirectXTargetMachine() {} +void DirectXTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) { + PB.registerPipelineParsingCallback( + [](StringRef PassName, ModulePassManager &PM, + ArrayRef<PassBuilder::PipelineElement>) { + if (PassName == "print-dxil-resource") { + PM.addPass(DXILResourcePrinterPass(dbgs())); + return true; + } + if (PassName == "print-dx-shader-flags") { + PM.addPass(dxil::ShaderFlagsAnalysisPrinter(dbgs())); + return true; + } + return false; + }); + + PB.registerAnalysisRegistrationCallback([](ModuleAnalysisManager &MAM) { + MAM.registerPass([&] { return DXILResourceAnalysis(); }); + MAM.registerPass([&] { return dxil::ShaderFlagsAnalysis(); }); + }); +} + bool DirectXTargetMachine::addPassesToEmitFile( PassManagerBase &PM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, bool DisableVerify, MachineModuleInfoWrapperPass *MMIWP) { - PM.add(createDXILOpLoweringLegacyPass()); - PM.add(createDXILPrepareModulePass()); - PM.add(createDXILTranslateMetadataPass()); + TargetPassConfig *PassConfig = createPassConfig(PM); + PassConfig->addCodeGenPrepare(); + if (TargetPassConfig::willCompleteCodeGenPipeline()) { PM.add(createDXILEmbedderPass()); + // We embed the other DXContainer globals after embedding DXIL so that the + // globals don't pollute the DXIL. + PM.add(createDXContainerGlobalsPass()); } switch (FileType) { case CGFT_AssemblyFile: + PM.add(createDXILPrettyPrinterPass(Out)); PM.add(createPrintModulePass(Out, "", true)); break; case CGFT_ObjectFile: |