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  *  @ref GNU gold, gc.
     26  */
     27 class GarbageCollection
     28 {
     29 public:
     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 
     60 public:
     61   GarbageCollection(const LinkerConfig& pConfig,
     62                     const TargetLDBackend& pBackend,
     63                     Module& pModule);
     64   ~GarbageCollection();
     65 
     66   /// run - do garbage collection
     67   bool run();
     68 
     69 private:
     70   void setUpReachedSections();
     71   void findReferencedSections(SectionVecTy& pEntry);
     72   void getEntrySections(SectionVecTy& pEntry);
     73   void stripSections();
     74 
     75 private:
     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