1bdd1243dSDimitry Andric //===- DXILResourceAnalysis.h   - DXIL Resource analysis-------------------===//
2bdd1243dSDimitry Andric //
3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric //
7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric ///
9bdd1243dSDimitry Andric /// \file This file contains Analysis for information about DXIL resources.
10bdd1243dSDimitry Andric ///
11bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
12bdd1243dSDimitry Andric 
1306c3fb27SDimitry Andric #ifndef LLVM_TARGET_DIRECTX_DXILRESOURCEANALYSIS_H
1406c3fb27SDimitry Andric #define LLVM_TARGET_DIRECTX_DXILRESOURCEANALYSIS_H
1506c3fb27SDimitry Andric 
16bdd1243dSDimitry Andric #include "DXILResource.h"
17bdd1243dSDimitry Andric #include "llvm/IR/PassManager.h"
18bdd1243dSDimitry Andric #include "llvm/Pass.h"
19bdd1243dSDimitry Andric #include <memory>
20bdd1243dSDimitry Andric 
21bdd1243dSDimitry Andric namespace llvm {
22bdd1243dSDimitry Andric /// Analysis pass that exposes the \c DXILResource for a module.
23bdd1243dSDimitry Andric class DXILResourceAnalysis : public AnalysisInfoMixin<DXILResourceAnalysis> {
24bdd1243dSDimitry Andric   friend AnalysisInfoMixin<DXILResourceAnalysis>;
25bdd1243dSDimitry Andric   static AnalysisKey Key;
26bdd1243dSDimitry Andric 
27bdd1243dSDimitry Andric public:
28bdd1243dSDimitry Andric   typedef dxil::Resources Result;
29bdd1243dSDimitry Andric   dxil::Resources run(Module &M, ModuleAnalysisManager &AM);
30bdd1243dSDimitry Andric };
31bdd1243dSDimitry Andric 
32bdd1243dSDimitry Andric /// Printer pass for the \c DXILResourceAnalysis results.
33bdd1243dSDimitry Andric class DXILResourcePrinterPass : public PassInfoMixin<DXILResourcePrinterPass> {
34bdd1243dSDimitry Andric   raw_ostream &OS;
35bdd1243dSDimitry Andric 
36bdd1243dSDimitry Andric public:
DXILResourcePrinterPass(raw_ostream & OS)37bdd1243dSDimitry Andric   explicit DXILResourcePrinterPass(raw_ostream &OS) : OS(OS) {}
38bdd1243dSDimitry Andric   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
isRequired()39*1db9f3b2SDimitry Andric   static bool isRequired() { return true; }
40bdd1243dSDimitry Andric };
41bdd1243dSDimitry Andric 
42bdd1243dSDimitry Andric /// The legacy pass manager's analysis pass to compute DXIL resource
43bdd1243dSDimitry Andric /// information.
44bdd1243dSDimitry Andric class DXILResourceWrapper : public ModulePass {
45bdd1243dSDimitry Andric   dxil::Resources Resources;
46bdd1243dSDimitry Andric 
47bdd1243dSDimitry Andric public:
48bdd1243dSDimitry Andric   static char ID; // Pass identification, replacement for typeid
49bdd1243dSDimitry Andric 
50bdd1243dSDimitry Andric   DXILResourceWrapper();
51bdd1243dSDimitry Andric 
getDXILResource()52bdd1243dSDimitry Andric   dxil::Resources &getDXILResource() { return Resources; }
getDXILResource()53bdd1243dSDimitry Andric   const dxil::Resources &getDXILResource() const { return Resources; }
54bdd1243dSDimitry Andric 
55bdd1243dSDimitry Andric   /// Calculate the DXILResource for the module.
56bdd1243dSDimitry Andric   bool runOnModule(Module &M) override;
57bdd1243dSDimitry Andric 
58bdd1243dSDimitry Andric   void print(raw_ostream &O, const Module *M = nullptr) const override;
59bdd1243dSDimitry Andric };
60bdd1243dSDimitry Andric } // namespace llvm
6106c3fb27SDimitry Andric 
6206c3fb27SDimitry Andric #endif // LLVM_TARGET_DIRECTX_DXILRESOURCEANALYSIS_H
63