1//===- GarbageCollection.h ------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_LD_GARBAGECOLLECTION_H_
10#define MCLD_LD_GARBAGECOLLECTION_H_
11
12#include <map>
13#include <set>
14#include <vector>
15
16namespace mcld {
17
18class LDSection;
19class LinkerConfig;
20class Module;
21class TargetLDBackend;
22
23/** \class GarbageCollection
24 *  \brief Implementation of garbage collection for --gc-section.
25 */
26class GarbageCollection {
27 public:
28  typedef std::set<const LDSection*> SectionListTy;
29  typedef std::vector<const LDSection*> SectionVecTy;
30
31  /** \class SectionReachedListMap
32   *  \brief Map the section to the list of sections which it can reach directly
33   */
34  class SectionReachedListMap {
35   public:
36    SectionReachedListMap() {}
37
38    /// addReference - add a reference from pFrom to pTo
39    void addReference(const LDSection& pFrom, const LDSection& pTo);
40
41    /// getReachedList - get the list of sections which can be reached by
42    /// pSection, create one if the list has not existed
43    SectionListTy& getReachedList(const LDSection& pSection);
44
45    /// findReachedList - find the list of sections which can be reached by
46    /// pSection, return NULL if the list not exists
47    SectionListTy* findReachedList(const LDSection& pSection);
48
49   private:
50    typedef std::map<const LDSection*, SectionListTy> ReachedSectionsTy;
51
52   private:
53    /// m_ReachedSections - map a section to the reachable sections list
54    ReachedSectionsTy m_ReachedSections;
55  };
56
57 public:
58  GarbageCollection(const LinkerConfig& pConfig,
59                    const TargetLDBackend& pBackend,
60                    Module& pModule);
61  ~GarbageCollection();
62
63  /// run - do garbage collection
64  bool run();
65
66 private:
67  void setUpReachedSections();
68  void findReferencedSections(SectionVecTy& pEntry);
69  void getEntrySections(SectionVecTy& pEntry);
70  void stripSections();
71
72 private:
73  /// m_SectionReachedListMap - map the section to the list of sections which it
74  /// can reach directly
75  SectionReachedListMap m_SectionReachedListMap;
76
77  /// m_ReferencedSections - a list of sections which can be reached from entry
78  SectionListTy m_ReferencedSections;
79
80  const LinkerConfig& m_Config;
81  const TargetLDBackend& m_Backend;
82  Module& m_Module;
83};
84
85}  // namespace mcld
86
87#endif  // MCLD_LD_GARBAGECOLLECTION_H_
88