xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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