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