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 
16 namespace mcld {
17 
18 class LDSection;
19 class LinkerConfig;
20 class Module;
21 class TargetLDBackend;
22 
23 /** \class GarbageCollection
24  *  \brief Implementation of garbage collection for --gc-section.
25  */
26 class 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:
SectionReachedListMap()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