187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- GarbageCollection.h ------------------------------------------------===// 287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// The MCLinker Project 487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source 687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details. 787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_GARBAGECOLLECTION_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_GARBAGECOLLECTION_H_ 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector> 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld { 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend; 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class GarbageCollection 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Implementation of garbage collection for --gc-section. 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass GarbageCollection { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::set<const LDSection*> SectionListTy; 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<const LDSection*> SectionVecTy; 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** \class SectionReachedListMap 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Map the section to the list of sections which it can reach directly 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines class SectionReachedListMap { 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionReachedListMap() {} 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// addReference - add a reference from pFrom to pTo 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addReference(const LDSection& pFrom, const LDSection& pTo); 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// getReachedList - get the list of sections which can be reached by 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// pSection, create one if the list has not existed 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy& getReachedList(const LDSection& pSection); 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// findReachedList - find the list of sections which can be reached by 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// pSection, return NULL if the list not exists 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy* findReachedList(const LDSection& pSection); 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::map<const LDSection*, SectionListTy> ReachedSectionsTy; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_ReachedSections - map a section to the reachable sections list 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ReachedSectionsTy m_ReachedSections; 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GarbageCollection(const LinkerConfig& pConfig, 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend& pBackend, 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module& pModule); 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GarbageCollection(); 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// run - do garbage collection 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool run(); 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setUpReachedSections(); 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void findReferencedSections(SectionVecTy& pEntry); 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void getEntrySections(SectionVecTy& pEntry); 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void stripSections(); 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_SectionReachedListMap - map the section to the list of sections which it 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// can reach directly 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionReachedListMap m_SectionReachedListMap; 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_ReferencedSections - a list of sections which can be reached from entry 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy m_ReferencedSections; 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LinkerConfig& m_Config; 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend& m_Backend; 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module& m_Module; 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_GARBAGECOLLECTION_H_ 88