| //===- DXILUpgrade.cpp - Upgrade DXIL metadata to LLVM constructs ---------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Transforms/Utils/DXILUpgrade.h" | |
| #include "llvm/IR/Constants.h" | |
| #include "llvm/IR/Metadata.h" | |
| #include "llvm/IR/Module.h" | |
| #include "llvm/Support/Debug.h" | |
| using namespace llvm; | |
| #define DEBUG_TYPE "dxil-upgrade" | |
| static bool handleValVerMetadata(Module &M) { | |
| NamedMDNode *ValVer = M.getNamedMetadata("dx.valver"); | |
| if (!ValVer) | |
| return false; | |
| LLVM_DEBUG({ | |
| MDNode *N = ValVer->getOperand(0); | |
| auto X = mdconst::extract<ConstantInt>(N->getOperand(0))->getZExtValue(); | |
| auto Y = mdconst::extract<ConstantInt>(N->getOperand(1))->getZExtValue(); | |
| dbgs() << "DXIL: validation version: " << X << "." << Y << "\n"; | |
| }); | |
| // We don't need the validation version internally, so we drop it. | |
| ValVer->dropAllReferences(); | |
| ValVer->eraseFromParent(); | |
| return true; | |
| } | |
| PreservedAnalyses DXILUpgradePass::run(Module &M, ModuleAnalysisManager &AM) { | |
| PreservedAnalyses PA; | |
| // We never add, remove, or change functions here. | |
| PA.preserve<FunctionAnalysisManagerModuleProxy>(); | |
| PA.preserveSet<AllAnalysesOn<Function>>(); | |
| bool Changed = false; | |
| Changed |= handleValVerMetadata(M); | |
| if (!Changed) | |
| return PreservedAnalyses::all(); | |
| return PA; | |
| } |