1 | //=- DXILMetadataAnalysis.h - Representation of Module metadata --*- 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 | #ifndef LLVM_ANALYSIS_DXILMETADATA_H |
10 | #define LLVM_ANALYSIS_DXILMETADATA_H |
11 | |
12 | #include "llvm/ADT/SmallVector.h" |
13 | #include "llvm/IR/PassManager.h" |
14 | #include "llvm/Pass.h" |
15 | #include "llvm/Support/VersionTuple.h" |
16 | #include "llvm/TargetParser/Triple.h" |
17 | |
18 | namespace llvm { |
19 | |
20 | class Function; |
21 | namespace dxil { |
22 | |
23 | struct EntryProperties { |
24 | const Function *Entry{nullptr}; |
25 | // Specific target shader stage may be specified for entry functions |
26 | Triple::EnvironmentType ShaderStage{Triple::UnknownEnvironment}; |
27 | unsigned NumThreadsX{0}; // X component |
28 | unsigned NumThreadsY{0}; // Y component |
29 | unsigned NumThreadsZ{0}; // Z component |
30 | |
31 | EntryProperties(const Function *Fn = nullptr) : Entry(Fn) {}; |
32 | }; |
33 | |
34 | struct ModuleMetadataInfo { |
35 | VersionTuple DXILVersion{}; |
36 | VersionTuple ShaderModelVersion{}; |
37 | Triple::EnvironmentType ShaderProfile{Triple::UnknownEnvironment}; |
38 | VersionTuple ValidatorVersion{}; |
39 | SmallVector<EntryProperties> EntryPropertyVec{}; |
40 | void print(raw_ostream &OS) const; |
41 | }; |
42 | |
43 | } // namespace dxil |
44 | |
45 | // Module metadata analysis pass for new pass manager |
46 | class DXILMetadataAnalysis : public AnalysisInfoMixin<DXILMetadataAnalysis> { |
47 | friend AnalysisInfoMixin<DXILMetadataAnalysis>; |
48 | |
49 | static AnalysisKey Key; |
50 | |
51 | public: |
52 | using Result = dxil::ModuleMetadataInfo; |
53 | /// Gather module metadata info for the module \c M. |
54 | dxil::ModuleMetadataInfo run(Module &M, ModuleAnalysisManager &AM); |
55 | }; |
56 | |
57 | /// Printer pass for the \c DXILMetadataAnalysis results. |
58 | class DXILMetadataAnalysisPrinterPass |
59 | : public PassInfoMixin<DXILMetadataAnalysisPrinterPass> { |
60 | raw_ostream &OS; |
61 | |
62 | public: |
63 | explicit DXILMetadataAnalysisPrinterPass(raw_ostream &OS) : OS(OS) {} |
64 | |
65 | PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); |
66 | |
67 | static bool isRequired() { return true; } |
68 | }; |
69 | |
70 | /// Legacy pass |
71 | class DXILMetadataAnalysisWrapperPass : public ModulePass { |
72 | std::unique_ptr<dxil::ModuleMetadataInfo> MetadataInfo; |
73 | |
74 | public: |
75 | static char ID; // Class identification, replacement for typeinfo |
76 | |
77 | DXILMetadataAnalysisWrapperPass(); |
78 | ~DXILMetadataAnalysisWrapperPass() override; |
79 | |
80 | const dxil::ModuleMetadataInfo &getModuleMetadata() const { |
81 | return *MetadataInfo; |
82 | } |
83 | dxil::ModuleMetadataInfo &getModuleMetadata() { return *MetadataInfo; } |
84 | |
85 | void getAnalysisUsage(AnalysisUsage &AU) const override; |
86 | bool runOnModule(Module &M) override; |
87 | void releaseMemory() override; |
88 | |
89 | void print(raw_ostream &OS, const Module *M) const override; |
90 | void dump() const; |
91 | }; |
92 | |
93 | } // namespace llvm |
94 | |
95 | #endif // LLVM_ANALYSIS_DXILMETADATA_H |
96 |