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