Path: blob/main/contrib/llvm-project/llvm/lib/Target/DirectX/DXILFinalizeLinkage.cpp
213799 views
//===- DXILFinalizeLinkage.cpp - Finalize linkage of functions ------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "DXILFinalizeLinkage.h"9#include "DirectX.h"10#include "llvm/IR/Function.h"11#include "llvm/IR/GlobalValue.h"12#include "llvm/IR/Metadata.h"13#include "llvm/IR/Module.h"1415#define DEBUG_TYPE "dxil-finalize-linkage"1617using namespace llvm;1819static bool finalizeLinkage(Module &M) {20bool MadeChange = false;2122// Convert private global variables to internal linkage.23for (GlobalVariable &GV : M.globals()) {24if (GV.hasPrivateLinkage()) {25GV.setLinkage(GlobalValue::InternalLinkage);26MadeChange = true;27}28}2930SmallVector<Function *> Funcs;3132// Collect non-entry and non-exported functions to set to internal linkage.33for (Function &EF : M.functions()) {34if (EF.isIntrinsic())35continue;36if (EF.hasExternalLinkage() && EF.hasDefaultVisibility())37continue;38if (EF.hasFnAttribute("hlsl.shader"))39continue;40Funcs.push_back(&EF);41}4243for (Function *F : Funcs) {44if (F->getLinkage() == GlobalValue::ExternalLinkage) {45F->setLinkage(GlobalValue::InternalLinkage);46MadeChange = true;47}48if (F->isDefTriviallyDead()) {49M.getFunctionList().erase(F);50MadeChange = true;51}52}5354return MadeChange;55}5657PreservedAnalyses DXILFinalizeLinkage::run(Module &M,58ModuleAnalysisManager &AM) {59if (finalizeLinkage(M))60return PreservedAnalyses::none();61return PreservedAnalyses::all();62}6364bool DXILFinalizeLinkageLegacy::runOnModule(Module &M) {65return finalizeLinkage(M);66}6768char DXILFinalizeLinkageLegacy::ID = 0;6970INITIALIZE_PASS_BEGIN(DXILFinalizeLinkageLegacy, DEBUG_TYPE,71"DXIL Finalize Linkage", false, false)72INITIALIZE_PASS_END(DXILFinalizeLinkageLegacy, DEBUG_TYPE,73"DXIL Finalize Linkage", false, false)7475ModulePass *llvm::createDXILFinalizeLinkageLegacyPass() {76return new DXILFinalizeLinkageLegacy();77}787980