181ad6265SDimitry Andric //===- DXILTranslateMetadata.cpp - Pass to emit DXIL metadata ---*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric /// 981ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1081ad6265SDimitry Andric 11bdd1243dSDimitry Andric #include "DXILMetadata.h" 12bdd1243dSDimitry Andric #include "DXILResource.h" 13bdd1243dSDimitry Andric #include "DXILResourceAnalysis.h" 14bdd1243dSDimitry Andric #include "DXILShaderFlags.h" 1581ad6265SDimitry Andric #include "DirectX.h" 1681ad6265SDimitry Andric #include "llvm/ADT/StringSet.h" 1781ad6265SDimitry Andric #include "llvm/IR/Constants.h" 1881ad6265SDimitry Andric #include "llvm/IR/Metadata.h" 1981ad6265SDimitry Andric #include "llvm/IR/Module.h" 2081ad6265SDimitry Andric #include "llvm/Pass.h" 2106c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric using namespace llvm; 24bdd1243dSDimitry Andric using namespace llvm::dxil; 2581ad6265SDimitry Andric 2681ad6265SDimitry Andric namespace { 2781ad6265SDimitry Andric class DXILTranslateMetadata : public ModulePass { 2881ad6265SDimitry Andric public: 2981ad6265SDimitry Andric static char ID; // Pass identification, replacement for typeid 30bdd1243dSDimitry Andric explicit DXILTranslateMetadata() : ModulePass(ID) {} 3181ad6265SDimitry Andric 3281ad6265SDimitry Andric StringRef getPassName() const override { return "DXIL Metadata Emit"; } 3381ad6265SDimitry Andric 34bdd1243dSDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 35bdd1243dSDimitry Andric AU.setPreservesAll(); 36bdd1243dSDimitry Andric AU.addRequired<DXILResourceWrapper>(); 37bdd1243dSDimitry Andric AU.addRequired<ShaderFlagsAnalysisWrapper>(); 38bdd1243dSDimitry Andric } 3981ad6265SDimitry Andric 40bdd1243dSDimitry Andric bool runOnModule(Module &M) override; 4181ad6265SDimitry Andric }; 4281ad6265SDimitry Andric 4381ad6265SDimitry Andric } // namespace 4481ad6265SDimitry Andric 4581ad6265SDimitry Andric bool DXILTranslateMetadata::runOnModule(Module &M) { 46bdd1243dSDimitry Andric 47bdd1243dSDimitry Andric dxil::ValidatorVersionMD ValVerMD(M); 48bdd1243dSDimitry Andric if (ValVerMD.isEmpty()) 49bdd1243dSDimitry Andric ValVerMD.update(VersionTuple(1, 0)); 50bdd1243dSDimitry Andric dxil::createShaderModelMD(M); 51*0fca6ea1SDimitry Andric dxil::createDXILVersionMD(M); 52bdd1243dSDimitry Andric 53bdd1243dSDimitry Andric const dxil::Resources &Res = 54bdd1243dSDimitry Andric getAnalysis<DXILResourceWrapper>().getDXILResource(); 55bdd1243dSDimitry Andric Res.write(M); 56bdd1243dSDimitry Andric 57*0fca6ea1SDimitry Andric const uint64_t Flags = static_cast<uint64_t>( 58*0fca6ea1SDimitry Andric getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags()); 59bdd1243dSDimitry Andric dxil::createEntryMD(M, Flags); 60bdd1243dSDimitry Andric 6181ad6265SDimitry Andric return false; 6281ad6265SDimitry Andric } 6381ad6265SDimitry Andric 6481ad6265SDimitry Andric char DXILTranslateMetadata::ID = 0; 6581ad6265SDimitry Andric 6681ad6265SDimitry Andric ModulePass *llvm::createDXILTranslateMetadataPass() { 6781ad6265SDimitry Andric return new DXILTranslateMetadata(); 6881ad6265SDimitry Andric } 6981ad6265SDimitry Andric 70bdd1243dSDimitry Andric INITIALIZE_PASS_BEGIN(DXILTranslateMetadata, "dxil-metadata-emit", 71bdd1243dSDimitry Andric "DXIL Metadata Emit", false, false) 72bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapper) 73bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper) 74bdd1243dSDimitry Andric INITIALIZE_PASS_END(DXILTranslateMetadata, "dxil-metadata-emit", 7581ad6265SDimitry Andric "DXIL Metadata Emit", false, false) 76