Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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
  78.