xref: /llvm-project/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp (revision 3eca15cbb9888a992749ddd24f0fb666dad733bf)
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