xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/DirectX/DXILShaderFlags.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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