81 lines · cpp
1//===- DXILFinalizeLinkage.cpp - Finalize linkage of functions ------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "DXILFinalizeLinkage.h"10#include "DirectX.h"11#include "llvm/IR/Function.h"12#include "llvm/IR/GlobalValue.h"13#include "llvm/IR/Metadata.h"14#include "llvm/IR/Module.h"15 16#define DEBUG_TYPE "dxil-finalize-linkage"17 18using namespace llvm;19 20static bool finalizeLinkage(Module &M) {21 bool MadeChange = false;22 23 // Convert private globals and external globals with no usage to internal24 // linkage.25 for (GlobalVariable &GV : M.globals()) {26 GV.removeDeadConstantUsers();27 if (GV.hasPrivateLinkage() || (GV.hasExternalLinkage() && GV.use_empty())) {28 GV.setLinkage(GlobalValue::InternalLinkage);29 MadeChange = true;30 }31 }32 33 SmallVector<Function *> Funcs;34 35 // Collect non-entry and non-exported functions to set to internal linkage.36 for (Function &EF : M.functions()) {37 if (EF.isIntrinsic())38 continue;39 if (EF.hasExternalLinkage() && EF.hasDefaultVisibility())40 continue;41 if (EF.hasFnAttribute("hlsl.shader"))42 continue;43 Funcs.push_back(&EF);44 }45 46 for (Function *F : Funcs) {47 if (F->getLinkage() == GlobalValue::ExternalLinkage) {48 F->setLinkage(GlobalValue::InternalLinkage);49 MadeChange = true;50 }51 if (F->isDefTriviallyDead()) {52 M.getFunctionList().erase(F);53 MadeChange = true;54 }55 }56 57 return MadeChange;58}59 60PreservedAnalyses DXILFinalizeLinkage::run(Module &M,61 ModuleAnalysisManager &AM) {62 if (finalizeLinkage(M))63 return PreservedAnalyses::none();64 return PreservedAnalyses::all();65}66 67bool DXILFinalizeLinkageLegacy::runOnModule(Module &M) {68 return finalizeLinkage(M);69}70 71char DXILFinalizeLinkageLegacy::ID = 0;72 73INITIALIZE_PASS_BEGIN(DXILFinalizeLinkageLegacy, DEBUG_TYPE,74 "DXIL Finalize Linkage", false, false)75INITIALIZE_PASS_END(DXILFinalizeLinkageLegacy, DEBUG_TYPE,76 "DXIL Finalize Linkage", false, false)77 78ModulePass *llvm::createDXILFinalizeLinkageLegacyPass() {79 return new DXILFinalizeLinkageLegacy();80}81