| //===- DXILShaderFlags.h - DXIL Shader Flags helper objects ---------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file This file contains helper objects and APIs for working with DXIL |
| /// Shader Flags. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H |
| #define LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H |
| |
| #include "llvm/BinaryFormat/DXContainer.h" |
| #include "llvm/IR/PassManager.h" |
| #include "llvm/Pass.h" |
| #include "llvm/Support/Compiler.h" |
| #include "llvm/Support/Debug.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <cstdint> |
| |
| namespace llvm { |
| class Module; |
| class GlobalVariable; |
| |
| namespace dxil { |
| |
| struct ComputedShaderFlags { |
| #define SHADER_FLAG(bit, FlagName, Str) bool FlagName : 1; |
| #include "llvm/BinaryFormat/DXContainerConstants.def" |
| |
| #define SHADER_FLAG(bit, FlagName, Str) FlagName = false; |
| ComputedShaderFlags() { |
| #include "llvm/BinaryFormat/DXContainerConstants.def" |
| } |
| |
| operator uint64_t() const { |
| uint64_t FlagValue = 0; |
| #define SHADER_FLAG(bit, FlagName, Str) \ |
| FlagValue |= \ |
| FlagName ? static_cast<uint64_t>(dxbc::FeatureFlags::FlagName) : 0ull; |
| #include "llvm/BinaryFormat/DXContainerConstants.def" |
| return FlagValue; |
| } |
| |
| static ComputedShaderFlags computeFlags(Module &M); |
| void print(raw_ostream &OS = dbgs()) const; |
| LLVM_DUMP_METHOD void dump() const { print(); } |
| }; |
| |
| class ShaderFlagsAnalysis : public AnalysisInfoMixin<ShaderFlagsAnalysis> { |
| friend AnalysisInfoMixin<ShaderFlagsAnalysis>; |
| static AnalysisKey Key; |
| |
| public: |
| ShaderFlagsAnalysis() = default; |
| |
| using Result = ComputedShaderFlags; |
| |
| ComputedShaderFlags run(Module &M, ModuleAnalysisManager &AM); |
| }; |
| |
| /// Printer pass for ShaderFlagsAnalysis results. |
| class ShaderFlagsAnalysisPrinter |
| : public PassInfoMixin<ShaderFlagsAnalysisPrinter> { |
| raw_ostream &OS; |
| |
| public: |
| explicit ShaderFlagsAnalysisPrinter(raw_ostream &OS) : OS(OS) {} |
| PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); |
| }; |
| |
| /// Wrapper pass for the legacy pass manager. |
| /// |
| /// This is required because the passes that will depend on this are codegen |
| /// passes which run through the legacy pass manager. |
| class ShaderFlagsAnalysisWrapper : public ModulePass { |
| ComputedShaderFlags Flags; |
| |
| public: |
| static char ID; |
| |
| ShaderFlagsAnalysisWrapper() : ModulePass(ID) {} |
| |
| const ComputedShaderFlags &getShaderFlags() { return Flags; } |
| |
| bool runOnModule(Module &M) override { |
| Flags = ComputedShaderFlags::computeFlags(M); |
| return false; |
| } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| } // namespace dxil |
| } // namespace llvm |
| |
| #endif // LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H |