xref: /freebsd/contrib/llvm-project/llvm/lib/Transforms/Utils/DXILUpgrade.cpp (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
15f757f3fSDimitry Andric //===- DXILUpgrade.cpp - Upgrade DXIL metadata to LLVM constructs ---------===//
25f757f3fSDimitry Andric //
35f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f757f3fSDimitry Andric //
75f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
85f757f3fSDimitry Andric 
95f757f3fSDimitry Andric #include "llvm/Transforms/Utils/DXILUpgrade.h"
10*cb14a3feSDimitry Andric #include "llvm/IR/Constants.h"
11*cb14a3feSDimitry Andric #include "llvm/IR/Metadata.h"
12*cb14a3feSDimitry Andric #include "llvm/IR/Module.h"
13*cb14a3feSDimitry Andric #include "llvm/Support/Debug.h"
145f757f3fSDimitry Andric 
155f757f3fSDimitry Andric using namespace llvm;
165f757f3fSDimitry Andric 
17*cb14a3feSDimitry Andric #define DEBUG_TYPE "dxil-upgrade"
18*cb14a3feSDimitry Andric 
195f757f3fSDimitry Andric static bool handleValVerMetadata(Module &M) {
205f757f3fSDimitry Andric   NamedMDNode *ValVer = M.getNamedMetadata("dx.valver");
215f757f3fSDimitry Andric   if (!ValVer)
225f757f3fSDimitry Andric     return false;
235f757f3fSDimitry Andric 
24*cb14a3feSDimitry Andric   LLVM_DEBUG({
25*cb14a3feSDimitry Andric     MDNode *N = ValVer->getOperand(0);
26*cb14a3feSDimitry Andric     auto X = mdconst::extract<ConstantInt>(N->getOperand(0))->getZExtValue();
27*cb14a3feSDimitry Andric     auto Y = mdconst::extract<ConstantInt>(N->getOperand(1))->getZExtValue();
28*cb14a3feSDimitry Andric     dbgs() << "DXIL: validation version: " << X << "." << Y << "\n";
29*cb14a3feSDimitry Andric   });
305f757f3fSDimitry Andric   // We don't need the validation version internally, so we drop it.
315f757f3fSDimitry Andric   ValVer->dropAllReferences();
325f757f3fSDimitry Andric   ValVer->eraseFromParent();
335f757f3fSDimitry Andric   return true;
345f757f3fSDimitry Andric }
355f757f3fSDimitry Andric 
365f757f3fSDimitry Andric PreservedAnalyses DXILUpgradePass::run(Module &M, ModuleAnalysisManager &AM) {
375f757f3fSDimitry Andric   PreservedAnalyses PA;
385f757f3fSDimitry Andric   // We never add, remove, or change functions here.
395f757f3fSDimitry Andric   PA.preserve<FunctionAnalysisManagerModuleProxy>();
405f757f3fSDimitry Andric   PA.preserveSet<AllAnalysesOn<Function>>();
415f757f3fSDimitry Andric 
425f757f3fSDimitry Andric   bool Changed = false;
435f757f3fSDimitry Andric   Changed |= handleValVerMetadata(M);
445f757f3fSDimitry Andric 
455f757f3fSDimitry Andric   if (!Changed)
465f757f3fSDimitry Andric     return PreservedAnalyses::all();
475f757f3fSDimitry Andric   return PA;
485f757f3fSDimitry Andric }
49