Home | History | Annotate | Download | only in LD
      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:
     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