Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 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/GlobalValue.h"
23
#include "llvm/IR/PassManager.h"
24
#include <unordered_map>
25
 
26
namespace llvm {
27
class Comdat;
28
class Constant;
29
class Function;
30
class GlobalVariable;
31
class Metadata;
32
class Module;
33
class Value;
34
 
35
/// Pass to remove unused function declarations.
36
class GlobalDCEPass : public PassInfoMixin<GlobalDCEPass> {
37
public:
38
  PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
39
 
40
private:
41
  SmallPtrSet<GlobalValue*, 32> AliveGlobals;
42
 
43
  /// Global -> Global that uses this global.
44
  DenseMap<GlobalValue *, SmallPtrSet<GlobalValue *, 4>> GVDependencies;
45
 
46
  /// Constant -> Globals that use this global cache.
47
  std::unordered_map<Constant *, SmallPtrSet<GlobalValue *, 8>>
48
      ConstantDependenciesCache;
49
 
50
  /// Comdat -> Globals in that Comdat section.
51
  std::unordered_multimap<Comdat *, GlobalValue *> ComdatMembers;
52
 
53
  /// !type metadata -> set of (vtable, offset) pairs
54
  DenseMap<Metadata *, SmallSet<std::pair<GlobalVariable *, uint64_t>, 4>>
55
      TypeIdMap;
56
 
57
  // Global variables which are vtables, and which we have enough information
58
  // about to safely do dead virtual function elimination.
59
  SmallPtrSet<GlobalValue *, 32> VFESafeVTables;
60
 
61
  void UpdateGVDependencies(GlobalValue &GV);
62
  void MarkLive(GlobalValue &GV,
63
                SmallVectorImpl<GlobalValue *> *Updates = nullptr);
64
  bool RemoveUnusedGlobalValue(GlobalValue &GV);
65
 
66
  // Dead virtual function elimination.
67
  void AddVirtualFunctionDependencies(Module &M);
68
  void ScanVTables(Module &M);
69
  void ScanTypeCheckedLoadIntrinsics(Module &M);
70
  void ScanVTableLoad(Function *Caller, Metadata *TypeId, uint64_t CallOffset);
71
 
72
  void ComputeDependencies(Value *V, SmallPtrSetImpl<GlobalValue *> &U);
73
};
74
 
75
}
76
 
77
#endif // LLVM_TRANSFORMS_IPO_GLOBALDCE_H