//===- AMDGPUUnifyMetadata.cpp - Unify OpenCL metadata --------------------===// // // 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 // //===----------------------------------------------------------------------===// // // \file // This pass that unifies multiple OpenCL metadata due to linking. // //===----------------------------------------------------------------------===// #include "AMDGPU.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Module.h" #include "llvm/IR/PassManager.h" #include "llvm/Pass.h" usingnamespacellvm; namespace { namespace kOCLMD { const char SpirVer[] = …; const char OCLVer[] = …; const char UsedExt[] = …; const char UsedOptCoreFeat[] = …; const char CompilerOptions[] = …; const char LLVMIdent[] = …; } // end namespace kOCLMD /// Unify multiple OpenCL metadata due to linking. class AMDGPUUnifyMetadata : public ModulePass { … }; /// Unify version metadata. /// \return true if changes are made. /// Assume the named metadata has operands each of which is a pair of /// integer constant, e.g. /// !Name = {!n1, !n2} /// !n1 = {i32 1, i32 2} /// !n2 = {i32 2, i32 0} /// Keep the largest version as the sole operand if PickFirst is false. /// Otherwise pick it from the first value, representing kernel module. bool unifyVersionMD(Module &M, StringRef Name, bool PickFirst) { … } /// Unify version metadata. /// \return true if changes are made. /// Assume the named metadata has operands each of which is a list e.g. /// !Name = {!n1, !n2} /// !n1 = !{!"cl_khr_fp16", {!"cl_khr_fp64"}} /// !n2 = !{!"cl_khr_image"} /// Combine it into a single list with unique operands. bool unifyExtensionMD(Module &M, StringRef Name) { … } bool unifyMetadataImpl(Module &M) { … } } // end anonymous namespace char AMDGPUUnifyMetadata::ID = …; char &llvm::AMDGPUUnifyMetadataID = …; INITIALIZE_PASS(…) ModulePass *llvm::createAMDGPUUnifyMetadataPass() { … } bool AMDGPUUnifyMetadata::runOnModule(Module &M) { … } PreservedAnalyses AMDGPUUnifyMetadataPass::run(Module &M, ModuleAnalysisManager &AM) { … }