1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- EhFrame.h ----------------------------------------------------------===//
2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//                     The MCLinker Project
4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source
6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details.
7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//
8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_EHFRAME_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_EHFRAME_H_
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/RegionFragment.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h"
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h>
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list>
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map>
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector>
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input;
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation;
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrame represents .eh_frame section
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass EhFrame {
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>;
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame();
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  explicit EhFrame(LDSection& pSection);
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~EhFrame();
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  enum RecordType { RECORD_UNKNOWN, RECORD_INPUT, RECORD_GENERATED };
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class CIE;
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class FDE;
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<CIE*> CIEList;
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::iterator cie_iterator;
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::const_iterator const_cie_iterator;
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::list<FDE*> FDEList;
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::iterator fde_iterator;
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::const_iterator const_fde_iterator;
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef std::map</*offset*/ size_t, CIE*> CIEMap;
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // A super class of CIE and FDE, containing the same part
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class Record : public RegionFragment {
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    explicit Record(llvm::StringRef pRegion);
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual ~Record();
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const llvm::StringRef getRegion() const {
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      return RegionFragment::getRegion();
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    llvm::StringRef getRegion() { return RegionFragment::getRegion(); }
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_UNKNOWN; }
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines   private:
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    DISALLOW_COPY_AND_ASSIGN(Record);
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class CIE
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Common Information Entry.
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines   *  The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines   * Frames.
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class CIE : public Record {
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    explicit CIE(llvm::StringRef pRegion);
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~CIE();
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_INPUT; }
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; }
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t getFDEEncode() const { return m_FDEEncode; }
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setMergeable(bool pVal = true) { m_Mergeable = pVal; }
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return m_Mergeable; }
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setRelocation(const Relocation& pReloc) { m_pReloc = &pReloc; }
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* getRelocation() const { return m_pReloc; }
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    void setPersonalityOffset(uint64_t pOffset) {
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_PersonalityOffset = pOffset;
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t getPersonalityOffset() const { return m_PersonalityOffset; }
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    void setPersonalityName(const std::string& pStr) {
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_PersonalityName = pStr;
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const std::string& getPersonalityName() const { return m_PersonalityName; }
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    void setAugmentationData(const std::string& pStr) {
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_AugmentationData = pStr;
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    const std::string& getAugmentationData() const {
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      return m_AugmentationData;
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void add(FDE& pFDE) { m_FDEs.push_back(&pFDE); }
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void remove(FDE& pFDE) { m_FDEs.remove(&pFDE); }
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void clearFDEs() { m_FDEs.clear(); }
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    size_t numOfFDEs() const { return m_FDEs.size(); }
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator begin() const { return m_FDEs.begin(); }
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    fde_iterator begin() { return m_FDEs.begin(); }
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator end() const { return m_FDEs.end(); }
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    fde_iterator end() { return m_FDEs.end(); }
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines   private:
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t m_FDEEncode;
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    bool m_Mergeable;
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* m_pReloc;
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t m_PersonalityOffset;
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_PersonalityName;
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_AugmentationData;
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDEList m_FDEs;
13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class FDE
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Frame Description Entry
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines   *  The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines   * Frames.
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class FDE : public Record {
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDE(llvm::StringRef pRegion, CIE& pCIE);
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~FDE();
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setCIE(CIE& pCIE);
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const CIE& getCIE() const { return *m_pCIE; }
14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    CIE& getCIE() { return *m_pCIE; }
1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines   private:
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE* m_pCIE;  // Referenced CIE may change when merging.
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // These are created for PLT
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class GeneratedCIE : public CIE {
15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    explicit GeneratedCIE(llvm::StringRef pRegion);
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedCIE();
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return true; }
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  class GeneratedFDE : public FDE {
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GeneratedFDE(llvm::StringRef pRegion, CIE& pCIE);
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedFDE();
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static EhFrame* Create(LDSection& pSection);
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Destroy(EhFrame*& pSection);
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Clear();
174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// merge - move all data from pOther to this object.
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  EhFrame& merge(const Input& pInput, EhFrame& pInFrame);
177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const LDSection& getSection() const;
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  LDSection& getSection();
180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
181f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SectionData* getSectionData() const { return m_pSectionData; }
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  SectionData* getSectionData() { return m_pSectionData; }
183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  fragment  ----- //
18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFragment(Fragment& pFrag);
186f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addCIE - add a CIE entry in EhFrame
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addCIE(CIE& pCIE, bool pAlsoAddFragment = true);
189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFDE - add a FDE entry in EhFrame
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFDE(FDE& pFDE, bool pAlsoAddFragment = true);
192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  CIE  ----- //
19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_begin() const { return m_CIEs.begin(); }
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  cie_iterator cie_begin() { return m_CIEs.begin(); }
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const_cie_iterator cie_end() const { return m_CIEs.end(); }
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  cie_iterator cie_end() { return m_CIEs.end(); }
198affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_front() const { return *m_CIEs.front(); }
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  CIE& cie_front() { return *m_CIEs.front(); }
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  const CIE& cie_back() const { return *m_CIEs.back(); }
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  CIE& cie_back() { return *m_CIEs.back(); }
203affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emptyCIEs() const { return m_CIEs.empty(); }
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfCIEs() const { return m_CIEs.size(); }
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t numOfFDEs() const;
207affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const CIEMap& getCIEMap() const { return m_FoundCIEs; }
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  CIEMap& getCIEMap() { return m_FoundCIEs; }
210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t computeOffsetSize();
213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// getDataStartOffset - Get the offset after length and ID field.
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// The offset is 8byte for 32b, and 16byte for 64b.
21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// We can just use "BITCLASS/4" to represent offset.
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  template <size_t BITCLASS>
21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static size_t getDataStartOffset() {
21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    return BITCLASS / 4;
22037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We needs to check if it is mergeable and check personality name
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // before merging them. The important note is we must do this after
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // ALL readSections done, that is the reason why we don't check this
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // immediately when reading.
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setupAttributes(const LDSection* reloc_sect);
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void removeDiscardedFDE(CIE& pCIE, const LDSection* pRelocEhFrameSect);
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void removeAndUpdateCIEForFDE(EhFrame& pInFrame,
23237b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                CIE& pInCIE,
23337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                CIE& pOutCIE,
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                const LDSection* reloc_sect);
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame);
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame, CIE& pInCIE, CIE* pOutCIE = 0);
237affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection* m_pSection;
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_pSectionData;
241affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Each eh_frame has a list of CIE, and each CIE has a list of FDE
24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // pointing to the CIE itself. This is used by management when we are
24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // processing eh_frame merge.
24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // However, don't forget we need to handle the Fragments inside SectionData
24687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // correctly since they are truly used when output emission.
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIEList m_CIEs;
24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We need this map to find the corresponding CIE for FDE. Not all FDE point
25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // to the nearest CIE.
25187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CIEMap m_FoundCIEs;
25237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
25337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  DISALLOW_COPY_AND_ASSIGN(EhFrame);
255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesbool operator==(const EhFrame::CIE&, const EhFrame::CIE&);
25887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
26137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_EHFRAME_H_
262