1db279c72SHelena Kotas //===- DXILFinalizeLinkage.cpp - Finalize linkage of functions ------------===// 2db279c72SHelena Kotas // 3db279c72SHelena Kotas // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4db279c72SHelena Kotas // See https://llvm.org/LICENSE.txt for license information. 5db279c72SHelena Kotas // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6db279c72SHelena Kotas // 7db279c72SHelena Kotas //===----------------------------------------------------------------------===// 8db279c72SHelena Kotas 9db279c72SHelena Kotas #include "DXILFinalizeLinkage.h" 10db279c72SHelena Kotas #include "DirectX.h" 11db279c72SHelena Kotas #include "llvm/IR/Function.h" 12db279c72SHelena Kotas #include "llvm/IR/GlobalValue.h" 13db279c72SHelena Kotas #include "llvm/IR/Metadata.h" 14db279c72SHelena Kotas #include "llvm/IR/Module.h" 15db279c72SHelena Kotas 16db279c72SHelena Kotas #define DEBUG_TYPE "dxil-finalize-linkage" 17db279c72SHelena Kotas 18db279c72SHelena Kotas using namespace llvm; 19db279c72SHelena Kotas 20db279c72SHelena Kotas static bool finalizeLinkage(Module &M) { 21ab751805SGreg Roth SmallPtrSet<Function *, 8> Funcs; 22db279c72SHelena Kotas 23ab751805SGreg Roth // Collect non-entry and non-exported functions to set to internal linkage. 24db279c72SHelena Kotas for (Function &EF : M.functions()) { 25*93d2a2caSJustin Bogner if (EF.isIntrinsic()) 26*93d2a2caSJustin Bogner continue; 27ab751805SGreg Roth if (EF.hasFnAttribute("hlsl.shader") || EF.hasFnAttribute("hlsl.export")) 28db279c72SHelena Kotas continue; 29ab751805SGreg Roth Funcs.insert(&EF); 30db279c72SHelena Kotas } 31db279c72SHelena Kotas 32ab751805SGreg Roth for (Function *F : Funcs) { 33ab751805SGreg Roth if (F->getLinkage() == GlobalValue::ExternalLinkage) 34ab751805SGreg Roth F->setLinkage(GlobalValue::InternalLinkage); 35ab751805SGreg Roth if (F->isDefTriviallyDead()) 36ab751805SGreg Roth M.getFunctionList().erase(F); 37db279c72SHelena Kotas } 38db279c72SHelena Kotas 39db279c72SHelena Kotas return false; 40db279c72SHelena Kotas } 41db279c72SHelena Kotas 42db279c72SHelena Kotas PreservedAnalyses DXILFinalizeLinkage::run(Module &M, 43db279c72SHelena Kotas ModuleAnalysisManager &AM) { 44db279c72SHelena Kotas if (finalizeLinkage(M)) 45db279c72SHelena Kotas return PreservedAnalyses::none(); 46db279c72SHelena Kotas return PreservedAnalyses::all(); 47db279c72SHelena Kotas } 48db279c72SHelena Kotas 49db279c72SHelena Kotas bool DXILFinalizeLinkageLegacy::runOnModule(Module &M) { 50db279c72SHelena Kotas return finalizeLinkage(M); 51db279c72SHelena Kotas } 52db279c72SHelena Kotas 53db279c72SHelena Kotas char DXILFinalizeLinkageLegacy::ID = 0; 54db279c72SHelena Kotas 55db279c72SHelena Kotas INITIALIZE_PASS_BEGIN(DXILFinalizeLinkageLegacy, DEBUG_TYPE, 56db279c72SHelena Kotas "DXIL Finalize Linkage", false, false) 57db279c72SHelena Kotas INITIALIZE_PASS_END(DXILFinalizeLinkageLegacy, DEBUG_TYPE, 58db279c72SHelena Kotas "DXIL Finalize Linkage", false, false) 59db279c72SHelena Kotas 60db279c72SHelena Kotas ModulePass *llvm::createDXILFinalizeLinkageLegacyPass() { 61db279c72SHelena Kotas return new DXILFinalizeLinkageLegacy(); 62db279c72SHelena Kotas } 63