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