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