97 lines · c
1//===- DXILRootSignature.h - DXIL Root Signature helper objects -----------===//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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file This file contains helper objects and APIs for working with DXIL10/// Root Signatures.11///12//===----------------------------------------------------------------------===//13#ifndef LLVM_LIB_TARGET_DIRECTX_DXILROOTSIGNATURE_H14#define LLVM_LIB_TARGET_DIRECTX_DXILROOTSIGNATURE_H15 16#include "llvm/ADT/DenseMap.h"17#include "llvm/Analysis/DXILMetadataAnalysis.h"18#include "llvm/IR/DiagnosticInfo.h"19#include "llvm/IR/Metadata.h"20#include "llvm/IR/Module.h"21#include "llvm/IR/PassManager.h"22#include "llvm/MC/DXContainerRootSignature.h"23#include "llvm/Pass.h"24 25namespace llvm {26namespace dxil {27 28class RootSignatureBindingInfo {29private:30 SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc> FuncToRsMap;31 32public:33 using iterator =34 SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc>::iterator;35 36 RootSignatureBindingInfo() = default;37 RootSignatureBindingInfo(38 SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc> Map)39 : FuncToRsMap(Map) {};40 41 iterator find(const Function *F) { return FuncToRsMap.find(F); }42 43 iterator end() { return FuncToRsMap.end(); }44 45 mcdxbc::RootSignatureDesc *getDescForFunction(const Function *F) {46 const auto FuncRs = find(F);47 if (FuncRs == end())48 return nullptr;49 return &FuncRs->second;50 }51};52 53class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {54 friend AnalysisInfoMixin<RootSignatureAnalysis>;55 static AnalysisKey Key;56 57public:58 RootSignatureAnalysis() = default;59 60 using Result = RootSignatureBindingInfo;61 62 Result run(Module &M, ModuleAnalysisManager &AM);63};64 65/// Wrapper pass for the legacy pass manager.66///67/// This is required because the passes that will depend on this are codegen68/// passes which run through the legacy pass manager.69class RootSignatureAnalysisWrapper : public ModulePass {70private:71 std::unique_ptr<RootSignatureBindingInfo> FuncToRsMap;72 73public:74 static char ID;75 RootSignatureAnalysisWrapper() : ModulePass(ID) {}76 77 RootSignatureBindingInfo &getRSInfo() { return *FuncToRsMap; }78 79 bool runOnModule(Module &M) override;80 81 void getAnalysisUsage(AnalysisUsage &AU) const override;82};83 84/// Printer pass for RootSignatureAnalysis results.85class RootSignatureAnalysisPrinter86 : public PassInfoMixin<RootSignatureAnalysisPrinter> {87 raw_ostream &OS;88 89public:90 explicit RootSignatureAnalysisPrinter(raw_ostream &OS) : OS(OS) {}91 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);92};93 94} // namespace dxil95} // namespace llvm96#endif97