GarbageCollection.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
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//===----------------------------------------------------------------------===// 987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_GARBAGECOLLECTION_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_GARBAGECOLLECTION_H 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifdef ENABLE_UNITTEST 1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <gtest.h> 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map> 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set> 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld { 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSection; 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass TargetLDBackend; 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class GarbageCollection 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Implementation of garbage collection for --gc-section. 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * @ref GNU gold, gc. 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass GarbageCollection 3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{ 3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::set<const LDSection*> SectionListTy; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<const LDSection*> SectionVecTy; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** \class SectionReachedListMap 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief Map the section to the list of sections which it can reach directly 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class SectionReachedListMap 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines public: 4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionReachedListMap() {} 4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// addReference - add a reference from pFrom to pTo 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addReference(const LDSection& pFrom, const LDSection& pTo); 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// getReachedList - get the list of sections which can be reached by 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// pSection, create one if the list has not existed 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy& getReachedList(const LDSection& pSection); 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// findReachedList - find the list of sections which can be reached by 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// pSection, return NULL if the list not exists 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy* findReachedList(const LDSection& pSection); 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::map<const LDSection*, SectionListTy> ReachedSectionsTy; 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_ReachedSections - map a section to the reachable sections list 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ReachedSectionsTy m_ReachedSections; 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GarbageCollection(const LinkerConfig& pConfig, 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend& pBackend, 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module& pModule); 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GarbageCollection(); 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// run - do garbage collection 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool run(); 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setUpReachedSections(); 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void findReferencedSections(SectionVecTy& pEntry); 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void getEntrySections(SectionVecTy& pEntry); 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void stripSections(); 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_SectionReachedListMap - map the section to the list of sections which it 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// can reach directly 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionReachedListMap m_SectionReachedListMap; 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// m_ReferencedSections - a list of sections which can be reached from entry 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SectionListTy m_ReferencedSections; 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LinkerConfig& m_Config; 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const TargetLDBackend& m_Backend; 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Module& m_Module; 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 95