xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/DirectX/DXILTranslateMetadata.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 
11*bdd1243dSDimitry Andric #include "DXILMetadata.h"
12*bdd1243dSDimitry Andric #include "DXILResource.h"
13*bdd1243dSDimitry Andric #include "DXILResourceAnalysis.h"
14*bdd1243dSDimitry Andric #include "DXILShaderFlags.h"
1581ad6265SDimitry Andric #include "DirectX.h"
1681ad6265SDimitry Andric #include "llvm/ADT/StringSet.h"
1781ad6265SDimitry Andric #include "llvm/ADT/Triple.h"
1881ad6265SDimitry Andric #include "llvm/IR/Constants.h"
1981ad6265SDimitry Andric #include "llvm/IR/Metadata.h"
2081ad6265SDimitry Andric #include "llvm/IR/Module.h"
2181ad6265SDimitry Andric #include "llvm/Pass.h"
2281ad6265SDimitry Andric 
2381ad6265SDimitry Andric using namespace llvm;
24*bdd1243dSDimitry 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
30*bdd1243dSDimitry Andric   explicit DXILTranslateMetadata() : ModulePass(ID) {}
3181ad6265SDimitry Andric 
3281ad6265SDimitry Andric   StringRef getPassName() const override { return "DXIL Metadata Emit"; }
3381ad6265SDimitry Andric 
34*bdd1243dSDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override {
35*bdd1243dSDimitry Andric     AU.setPreservesAll();
36*bdd1243dSDimitry Andric     AU.addRequired<DXILResourceWrapper>();
37*bdd1243dSDimitry Andric     AU.addRequired<ShaderFlagsAnalysisWrapper>();
38*bdd1243dSDimitry Andric   }
3981ad6265SDimitry Andric 
40*bdd1243dSDimitry Andric   bool runOnModule(Module &M) override;
4181ad6265SDimitry Andric };
4281ad6265SDimitry Andric 
4381ad6265SDimitry Andric } // namespace
4481ad6265SDimitry Andric 
4581ad6265SDimitry Andric bool DXILTranslateMetadata::runOnModule(Module &M) {
46*bdd1243dSDimitry Andric 
47*bdd1243dSDimitry Andric   dxil::ValidatorVersionMD ValVerMD(M);
48*bdd1243dSDimitry Andric   if (ValVerMD.isEmpty())
49*bdd1243dSDimitry Andric     ValVerMD.update(VersionTuple(1, 0));
50*bdd1243dSDimitry Andric   dxil::createShaderModelMD(M);
51*bdd1243dSDimitry Andric 
52*bdd1243dSDimitry Andric   const dxil::Resources &Res =
53*bdd1243dSDimitry Andric       getAnalysis<DXILResourceWrapper>().getDXILResource();
54*bdd1243dSDimitry Andric   Res.write(M);
55*bdd1243dSDimitry Andric 
56*bdd1243dSDimitry Andric   const uint64_t Flags =
57*bdd1243dSDimitry Andric       (uint64_t)(getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags());
58*bdd1243dSDimitry Andric   dxil::createEntryMD(M, Flags);
59*bdd1243dSDimitry Andric 
6081ad6265SDimitry Andric   return false;
6181ad6265SDimitry Andric }
6281ad6265SDimitry Andric 
6381ad6265SDimitry Andric char DXILTranslateMetadata::ID = 0;
6481ad6265SDimitry Andric 
6581ad6265SDimitry Andric ModulePass *llvm::createDXILTranslateMetadataPass() {
6681ad6265SDimitry Andric   return new DXILTranslateMetadata();
6781ad6265SDimitry Andric }
6881ad6265SDimitry Andric 
69*bdd1243dSDimitry Andric INITIALIZE_PASS_BEGIN(DXILTranslateMetadata, "dxil-metadata-emit",
70*bdd1243dSDimitry Andric                       "DXIL Metadata Emit", false, false)
71*bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapper)
72*bdd1243dSDimitry Andric INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
73*bdd1243dSDimitry Andric INITIALIZE_PASS_END(DXILTranslateMetadata, "dxil-metadata-emit",
7481ad6265SDimitry Andric                     "DXIL Metadata Emit", false, false)
75