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
DXILTranslateMetadata()30bdd1243dSDimitry Andric explicit DXILTranslateMetadata() : ModulePass(ID) {}
3181ad6265SDimitry Andric
getPassName() const3281ad6265SDimitry Andric StringRef getPassName() const override { return "DXIL Metadata Emit"; }
3381ad6265SDimitry Andric
getAnalysisUsage(AnalysisUsage & AU) const34bdd1243dSDimitry 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
runOnModule(Module & M)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
createDXILTranslateMetadataPass()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