1//===- DXILTranslateMetadata.cpp - Pass to emit DXIL metadata ---*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9//===----------------------------------------------------------------------===//
10
11#include "DXILMetadata.h"
12#include "DXILResource.h"
13#include "DXILResourceAnalysis.h"
14#include "DXILShaderFlags.h"
15#include "DirectX.h"
16#include "llvm/ADT/StringSet.h"
17#include "llvm/IR/Constants.h"
18#include "llvm/IR/Metadata.h"
19#include "llvm/IR/Module.h"
20#include "llvm/Pass.h"
21#include "llvm/TargetParser/Triple.h"
22
23using namespace llvm;
24using namespace llvm::dxil;
25
26namespace {
27class DXILTranslateMetadata : public ModulePass {
28public:
29  static char ID; // Pass identification, replacement for typeid
30  explicit DXILTranslateMetadata() : ModulePass(ID) {}
31
32  StringRef getPassName() const override { return "DXIL Metadata Emit"; }
33
34  void getAnalysisUsage(AnalysisUsage &AU) const override {
35    AU.setPreservesAll();
36    AU.addRequired<DXILResourceWrapper>();
37    AU.addRequired<ShaderFlagsAnalysisWrapper>();
38  }
39
40  bool runOnModule(Module &M) override;
41};
42
43} // namespace
44
45bool DXILTranslateMetadata::runOnModule(Module &M) {
46
47  dxil::ValidatorVersionMD ValVerMD(M);
48  if (ValVerMD.isEmpty())
49    ValVerMD.update(VersionTuple(1, 0));
50  dxil::createShaderModelMD(M);
51
52  const dxil::Resources &Res =
53      getAnalysis<DXILResourceWrapper>().getDXILResource();
54  Res.write(M);
55
56  const uint64_t Flags =
57      (uint64_t)(getAnalysis<ShaderFlagsAnalysisWrapper>().getShaderFlags());
58  dxil::createEntryMD(M, Flags);
59
60  return false;
61}
62
63char DXILTranslateMetadata::ID = 0;
64
65ModulePass *llvm::createDXILTranslateMetadataPass() {
66  return new DXILTranslateMetadata();
67}
68
69INITIALIZE_PASS_BEGIN(DXILTranslateMetadata, "dxil-metadata-emit",
70                      "DXIL Metadata Emit", false, false)
71INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapper)
72INITIALIZE_PASS_DEPENDENCY(ShaderFlagsAnalysisWrapper)
73INITIALIZE_PASS_END(DXILTranslateMetadata, "dxil-metadata-emit",
74                    "DXIL Metadata Emit", false, false)
75