1*bdd1243dSDimitry Andric //===- DXILShaderFlags.h - DXIL Shader Flags helper objects ---------------===// 2*bdd1243dSDimitry Andric // 3*bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bdd1243dSDimitry Andric // 7*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8*bdd1243dSDimitry Andric /// 9*bdd1243dSDimitry Andric /// \file This file contains helper objects and APIs for working with DXIL 10*bdd1243dSDimitry Andric /// Shader Flags. 11*bdd1243dSDimitry Andric /// 12*bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13*bdd1243dSDimitry Andric 14*bdd1243dSDimitry Andric #ifndef LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H 15*bdd1243dSDimitry Andric #define LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H 16*bdd1243dSDimitry Andric 17*bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainer.h" 18*bdd1243dSDimitry Andric #include "llvm/IR/PassManager.h" 19*bdd1243dSDimitry Andric #include "llvm/Pass.h" 20*bdd1243dSDimitry Andric #include "llvm/Support/Compiler.h" 21*bdd1243dSDimitry Andric #include "llvm/Support/Debug.h" 22*bdd1243dSDimitry Andric #include "llvm/Support/raw_ostream.h" 23*bdd1243dSDimitry Andric #include <cstdint> 24*bdd1243dSDimitry Andric 25*bdd1243dSDimitry Andric namespace llvm { 26*bdd1243dSDimitry Andric class Module; 27*bdd1243dSDimitry Andric class GlobalVariable; 28*bdd1243dSDimitry Andric 29*bdd1243dSDimitry Andric namespace dxil { 30*bdd1243dSDimitry Andric 31*bdd1243dSDimitry Andric struct ComputedShaderFlags { 32*bdd1243dSDimitry Andric #define SHADER_FLAG(bit, FlagName, Str) bool FlagName : 1; 33*bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 34*bdd1243dSDimitry Andric 35*bdd1243dSDimitry Andric #define SHADER_FLAG(bit, FlagName, Str) FlagName = false; 36*bdd1243dSDimitry Andric ComputedShaderFlags() { 37*bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 38*bdd1243dSDimitry Andric } 39*bdd1243dSDimitry Andric 40*bdd1243dSDimitry Andric operator uint64_t() const { 41*bdd1243dSDimitry Andric uint64_t FlagValue = 0; 42*bdd1243dSDimitry Andric #define SHADER_FLAG(bit, FlagName, Str) \ 43*bdd1243dSDimitry Andric FlagValue |= \ 44*bdd1243dSDimitry Andric FlagName ? static_cast<uint64_t>(dxbc::FeatureFlags::FlagName) : 0ull; 45*bdd1243dSDimitry Andric #include "llvm/BinaryFormat/DXContainerConstants.def" 46*bdd1243dSDimitry Andric return FlagValue; 47*bdd1243dSDimitry Andric } 48*bdd1243dSDimitry Andric 49*bdd1243dSDimitry Andric static ComputedShaderFlags computeFlags(Module &M); 50*bdd1243dSDimitry Andric void print(raw_ostream &OS = dbgs()) const; 51*bdd1243dSDimitry Andric LLVM_DUMP_METHOD void dump() const { print(); } 52*bdd1243dSDimitry Andric }; 53*bdd1243dSDimitry Andric 54*bdd1243dSDimitry Andric class ShaderFlagsAnalysis : public AnalysisInfoMixin<ShaderFlagsAnalysis> { 55*bdd1243dSDimitry Andric friend AnalysisInfoMixin<ShaderFlagsAnalysis>; 56*bdd1243dSDimitry Andric static AnalysisKey Key; 57*bdd1243dSDimitry Andric 58*bdd1243dSDimitry Andric public: 59*bdd1243dSDimitry Andric ShaderFlagsAnalysis() = default; 60*bdd1243dSDimitry Andric 61*bdd1243dSDimitry Andric using Result = ComputedShaderFlags; 62*bdd1243dSDimitry Andric 63*bdd1243dSDimitry Andric ComputedShaderFlags run(Module &M, ModuleAnalysisManager &AM); 64*bdd1243dSDimitry Andric }; 65*bdd1243dSDimitry Andric 66*bdd1243dSDimitry Andric /// Printer pass for ShaderFlagsAnalysis results. 67*bdd1243dSDimitry Andric class ShaderFlagsAnalysisPrinter 68*bdd1243dSDimitry Andric : public PassInfoMixin<ShaderFlagsAnalysisPrinter> { 69*bdd1243dSDimitry Andric raw_ostream &OS; 70*bdd1243dSDimitry Andric 71*bdd1243dSDimitry Andric public: 72*bdd1243dSDimitry Andric explicit ShaderFlagsAnalysisPrinter(raw_ostream &OS) : OS(OS) {} 73*bdd1243dSDimitry Andric PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 74*bdd1243dSDimitry Andric }; 75*bdd1243dSDimitry Andric 76*bdd1243dSDimitry Andric /// Wrapper pass for the legacy pass manager. 77*bdd1243dSDimitry Andric /// 78*bdd1243dSDimitry Andric /// This is required because the passes that will depend on this are codegen 79*bdd1243dSDimitry Andric /// passes which run through the legacy pass manager. 80*bdd1243dSDimitry Andric class ShaderFlagsAnalysisWrapper : public ModulePass { 81*bdd1243dSDimitry Andric ComputedShaderFlags Flags; 82*bdd1243dSDimitry Andric 83*bdd1243dSDimitry Andric public: 84*bdd1243dSDimitry Andric static char ID; 85*bdd1243dSDimitry Andric 86*bdd1243dSDimitry Andric ShaderFlagsAnalysisWrapper() : ModulePass(ID) {} 87*bdd1243dSDimitry Andric 88*bdd1243dSDimitry Andric const ComputedShaderFlags &getShaderFlags() { return Flags; } 89*bdd1243dSDimitry Andric 90*bdd1243dSDimitry Andric bool runOnModule(Module &M) override { 91*bdd1243dSDimitry Andric Flags = ComputedShaderFlags::computeFlags(M); 92*bdd1243dSDimitry Andric return false; 93*bdd1243dSDimitry Andric } 94*bdd1243dSDimitry Andric 95*bdd1243dSDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 96*bdd1243dSDimitry Andric AU.setPreservesAll(); 97*bdd1243dSDimitry Andric } 98*bdd1243dSDimitry Andric }; 99*bdd1243dSDimitry Andric 100*bdd1243dSDimitry Andric } // namespace dxil 101*bdd1243dSDimitry Andric } // namespace llvm 102*bdd1243dSDimitry Andric 103*bdd1243dSDimitry Andric #endif // LLVM_TARGET_DIRECTX_DXILSHADERFLAGS_H 104