1//===-- GlobalDCE.h - DCE unreachable internal 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-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This transform is designed to eliminate unreachable internal globals from the 10// program. It uses an aggressive algorithm, searching out globals that are 11// known to be alive. After it finds all of the globals which are needed, it 12// deletes whatever is left over. This allows it to delete recursive chunks of 13// the program which are unreachable. 14// 15//===----------------------------------------------------------------------===// 16 17#ifndef LLVM_TRANSFORMS_IPO_GLOBALDCE_H 18#define LLVM_TRANSFORMS_IPO_GLOBALDCE_H 19 20#include "llvm/ADT/DenseMap.h" 21#include "llvm/ADT/SmallSet.h" 22#include "llvm/IR/Module.h" 23#include "llvm/IR/PassManager.h" 24#include <unordered_map> 25 26namespace llvm { 27 28/// Pass to remove unused function declarations. 29class GlobalDCEPass : public PassInfoMixin<GlobalDCEPass> { 30public: 31 PreservedAnalyses run(Module &M, ModuleAnalysisManager &); 32 33private: 34 SmallPtrSet<GlobalValue*, 32> AliveGlobals; 35 36 /// Global -> Global that uses this global. 37 DenseMap<GlobalValue *, SmallPtrSet<GlobalValue *, 4>> GVDependencies; 38 39 /// Constant -> Globals that use this global cache. 40 std::unordered_map<Constant *, SmallPtrSet<GlobalValue *, 8>> 41 ConstantDependenciesCache; 42 43 /// Comdat -> Globals in that Comdat section. 44 std::unordered_multimap<Comdat *, GlobalValue *> ComdatMembers; 45 46 /// !type metadata -> set of (vtable, offset) pairs 47 DenseMap<Metadata *, SmallSet<std::pair<GlobalVariable *, uint64_t>, 4>> 48 TypeIdMap; 49 50 // Global variables which are vtables, and which we have enough information 51 // about to safely do dead virtual function elimination. 52 SmallPtrSet<GlobalValue *, 32> VFESafeVTables; 53 54 void UpdateGVDependencies(GlobalValue &GV); 55 void MarkLive(GlobalValue &GV, 56 SmallVectorImpl<GlobalValue *> *Updates = nullptr); 57 bool RemoveUnusedGlobalValue(GlobalValue &GV); 58 59 // Dead virtual function elimination. 60 void AddVirtualFunctionDependencies(Module &M); 61 void ScanVTables(Module &M); 62 void ScanTypeCheckedLoadIntrinsics(Module &M); 63 void ScanVTableLoad(Function *Caller, Metadata *TypeId, uint64_t CallOffset); 64 65 void ComputeDependencies(Value *V, SmallPtrSetImpl<GlobalValue *> &U); 66}; 67 68} 69 70#endif // LLVM_TRANSFORMS_IPO_GLOBALDCE_H 71