Path: blob/main/contrib/llvm-project/llvm/lib/Analysis/DXILMetadataAnalysis.cpp
213765 views
//=- DXILMetadataAnalysis.cpp - Representation of Module metadata -*- C++ -*=//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//===----------------------------------------------------------------------===//78#include "llvm/Analysis/DXILMetadataAnalysis.h"9#include "llvm/ADT/APInt.h"10#include "llvm/ADT/StringExtras.h"11#include "llvm/ADT/StringRef.h"12#include "llvm/IR/Constants.h"13#include "llvm/IR/Instructions.h"14#include "llvm/IR/Metadata.h"15#include "llvm/IR/Module.h"16#include "llvm/InitializePasses.h"17#include "llvm/Support/ErrorHandling.h"1819#define DEBUG_TYPE "dxil-metadata-analysis"2021using namespace llvm;22using namespace dxil;2324static ModuleMetadataInfo collectMetadataInfo(Module &M) {25ModuleMetadataInfo MMDAI;26const Triple &TT = M.getTargetTriple();27MMDAI.DXILVersion = TT.getDXILVersion();28MMDAI.ShaderModelVersion = TT.getOSVersion();29MMDAI.ShaderProfile = TT.getEnvironment();30NamedMDNode *ValidatorVerNode = M.getNamedMetadata("dx.valver");31if (ValidatorVerNode) {32auto *ValVerMD = cast<MDNode>(ValidatorVerNode->getOperand(0));33auto *MajorMD = mdconst::extract<ConstantInt>(ValVerMD->getOperand(0));34auto *MinorMD = mdconst::extract<ConstantInt>(ValVerMD->getOperand(1));35MMDAI.ValidatorVersion =36VersionTuple(MajorMD->getZExtValue(), MinorMD->getZExtValue());37}3839// For all HLSL Shader functions40for (auto &F : M.functions()) {41if (!F.hasFnAttribute("hlsl.shader"))42continue;4344EntryProperties EFP(&F);45// Get "hlsl.shader" attribute46Attribute EntryAttr = F.getFnAttribute("hlsl.shader");47assert(EntryAttr.isValid() &&48"Invalid value specified for HLSL function attribute hlsl.shader");49StringRef EntryProfile = EntryAttr.getValueAsString();50Triple T("", "", "", EntryProfile);51EFP.ShaderStage = T.getEnvironment();52// Get numthreads attribute value, if one exists53StringRef NumThreadsStr =54F.getFnAttribute("hlsl.numthreads").getValueAsString();55if (!NumThreadsStr.empty()) {56SmallVector<StringRef> NumThreadsVec;57NumThreadsStr.split(NumThreadsVec, ',');58assert(NumThreadsVec.size() == 3 && "Invalid numthreads specified");59// Read in the three component values of numthreads60[[maybe_unused]] bool Success =61llvm::to_integer(NumThreadsVec[0], EFP.NumThreadsX, 10);62assert(Success && "Failed to parse X component of numthreads");63Success = llvm::to_integer(NumThreadsVec[1], EFP.NumThreadsY, 10);64assert(Success && "Failed to parse Y component of numthreads");65Success = llvm::to_integer(NumThreadsVec[2], EFP.NumThreadsZ, 10);66assert(Success && "Failed to parse Z component of numthreads");67}68MMDAI.EntryPropertyVec.push_back(EFP);69}70return MMDAI;71}7273void ModuleMetadataInfo::print(raw_ostream &OS) const {74OS << "Shader Model Version : " << ShaderModelVersion.getAsString() << "\n";75OS << "DXIL Version : " << DXILVersion.getAsString() << "\n";76OS << "Target Shader Stage : "77<< Triple::getEnvironmentTypeName(ShaderProfile) << "\n";78OS << "Validator Version : " << ValidatorVersion.getAsString() << "\n";79for (const auto &EP : EntryPropertyVec) {80OS << " " << EP.Entry->getName() << "\n";81OS << " Function Shader Stage : "82<< Triple::getEnvironmentTypeName(EP.ShaderStage) << "\n";83OS << " NumThreads: " << EP.NumThreadsX << "," << EP.NumThreadsY << ","84<< EP.NumThreadsZ << "\n";85}86}8788//===----------------------------------------------------------------------===//89// DXILMetadataAnalysis and DXILMetadataAnalysisPrinterPass9091// Provide an explicit template instantiation for the static ID.92AnalysisKey DXILMetadataAnalysis::Key;9394llvm::dxil::ModuleMetadataInfo95DXILMetadataAnalysis::run(Module &M, ModuleAnalysisManager &AM) {96return collectMetadataInfo(M);97}9899PreservedAnalyses100DXILMetadataAnalysisPrinterPass::run(Module &M, ModuleAnalysisManager &AM) {101llvm::dxil::ModuleMetadataInfo &Data = AM.getResult<DXILMetadataAnalysis>(M);102103Data.print(OS);104return PreservedAnalyses::all();105}106107//===----------------------------------------------------------------------===//108// DXILMetadataAnalysisWrapperPass109110DXILMetadataAnalysisWrapperPass::DXILMetadataAnalysisWrapperPass()111: ModulePass(ID) {}112113DXILMetadataAnalysisWrapperPass::~DXILMetadataAnalysisWrapperPass() = default;114115void DXILMetadataAnalysisWrapperPass::getAnalysisUsage(116AnalysisUsage &AU) const {117AU.setPreservesAll();118}119120bool DXILMetadataAnalysisWrapperPass::runOnModule(Module &M) {121MetadataInfo.reset(new ModuleMetadataInfo(collectMetadataInfo(M)));122return false;123}124125void DXILMetadataAnalysisWrapperPass::releaseMemory() { MetadataInfo.reset(); }126127void DXILMetadataAnalysisWrapperPass::print(raw_ostream &OS,128const Module *) const {129if (!MetadataInfo) {130OS << "No module metadata info has been built!\n";131return;132}133MetadataInfo->print(dbgs());134}135136#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)137LLVM_DUMP_METHOD138void DXILMetadataAnalysisWrapperPass::dump() const { print(dbgs(), nullptr); }139#endif140141INITIALIZE_PASS(DXILMetadataAnalysisWrapperPass, "dxil-metadata-analysis",142"DXIL Module Metadata analysis", false, true)143char DXILMetadataAnalysisWrapperPass::ID = 0;144145146