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 *  @ref GNU gold, gc.
26 */
27class GarbageCollection
28{
29public:
30  typedef std::set<const LDSection*> SectionListTy;
31  typedef std::vector<const LDSection*> SectionVecTy;
32
33  /** \class SectionReachedListMap
34   *  \brief Map the section to the list of sections which it can reach directly
35   */
36  class SectionReachedListMap
37  {
38  public:
39    SectionReachedListMap() {}
40
41    /// addReference - add a reference from pFrom to pTo
42    void addReference(const LDSection& pFrom, const LDSection& pTo);
43
44    /// getReachedList - get the list of sections which can be reached by
45    /// pSection, create one if the list has not existed
46    SectionListTy& getReachedList(const LDSection& pSection);
47
48    /// findReachedList - find the list of sections which can be reached by
49    /// pSection, return NULL if the list not exists
50    SectionListTy* findReachedList(const LDSection& pSection);
51
52  private:
53    typedef std::map<const LDSection*, SectionListTy> ReachedSectionsTy;
54
55  private:
56    /// m_ReachedSections - map a section to the reachable sections list
57    ReachedSectionsTy m_ReachedSections;
58  };
59
60public:
61  GarbageCollection(const LinkerConfig& pConfig,
62                    const TargetLDBackend& pBackend,
63                    Module& pModule);
64  ~GarbageCollection();
65
66  /// run - do garbage collection
67  bool run();
68
69private:
70  void setUpReachedSections();
71  void findReferencedSections(SectionVecTy& pEntry);
72  void getEntrySections(SectionVecTy& pEntry);
73  void stripSections();
74
75private:
76  /// m_SectionReachedListMap - map the section to the list of sections which it
77  /// can reach directly
78  SectionReachedListMap m_SectionReachedListMap;
79
80  /// m_ReferencedSections - a list of sections which can be reached from entry
81  SectionListTy m_ReferencedSections;
82
83  const LinkerConfig& m_Config;
84  const TargetLDBackend& m_Backend;
85  Module& m_Module;
86};
87
88} // namespace of mcld
89
90#endif
91
92