Path: blob/main/contrib/llvm-project/llvm/lib/Target/DirectX/DXILRootSignature.h
213799 views
//===- DXILRootSignature.h - DXIL Root Signature helper objects -----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7///8/// \file This file contains helper objects and APIs for working with DXIL9/// Root Signatures.10///11//===----------------------------------------------------------------------===//12#ifndef LLVM_LIB_TARGET_DIRECTX_DXILROOTSIGNATURE_H13#define LLVM_LIB_TARGET_DIRECTX_DXILROOTSIGNATURE_H1415#include "llvm/ADT/DenseMap.h"16#include "llvm/Analysis/DXILMetadataAnalysis.h"17#include "llvm/IR/DiagnosticInfo.h"18#include "llvm/IR/Metadata.h"19#include "llvm/IR/Module.h"20#include "llvm/IR/PassManager.h"21#include "llvm/MC/DXContainerRootSignature.h"22#include "llvm/Pass.h"23#include <optional>2425namespace llvm {26namespace dxil {2728enum class RootSignatureElementKind {29Error = 0,30RootFlags = 1,31RootConstants = 2,32SRV = 3,33UAV = 4,34CBV = 5,35DescriptorTable = 6,36StaticSamplers = 737};3839class RootSignatureBindingInfo {40private:41SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc> FuncToRsMap;4243public:44using iterator =45SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc>::iterator;4647RootSignatureBindingInfo() = default;48RootSignatureBindingInfo(49SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc> Map)50: FuncToRsMap(Map) {};5152iterator find(const Function *F) { return FuncToRsMap.find(F); }5354iterator end() { return FuncToRsMap.end(); }5556std::optional<mcdxbc::RootSignatureDesc>57getDescForFunction(const Function *F) {58const auto FuncRs = find(F);59if (FuncRs == end())60return std::nullopt;6162return FuncRs->second;63}64};6566class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {67friend AnalysisInfoMixin<RootSignatureAnalysis>;68static AnalysisKey Key;6970public:71RootSignatureAnalysis() = default;7273using Result = RootSignatureBindingInfo;7475Result run(Module &M, ModuleAnalysisManager &AM);76};7778/// Wrapper pass for the legacy pass manager.79///80/// This is required because the passes that will depend on this are codegen81/// passes which run through the legacy pass manager.82class RootSignatureAnalysisWrapper : public ModulePass {83private:84std::unique_ptr<RootSignatureBindingInfo> FuncToRsMap;8586public:87static char ID;88RootSignatureAnalysisWrapper() : ModulePass(ID) {}8990RootSignatureBindingInfo &getRSInfo() { return *FuncToRsMap; }9192bool runOnModule(Module &M) override;9394void getAnalysisUsage(AnalysisUsage &AU) const override;95};9697/// Printer pass for RootSignatureAnalysis results.98class RootSignatureAnalysisPrinter99: public PassInfoMixin<RootSignatureAnalysisPrinter> {100raw_ostream &OS;101102public:103explicit RootSignatureAnalysisPrinter(raw_ostream &OS) : OS(OS) {}104PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);105};106107} // namespace dxil108} // namespace llvm109#endif110111112