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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_EHFRAME_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_EHFRAME_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Config/Config.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/RegionFragment.h>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/LD/SectionData.h>
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/Allocators.h>
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h>
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list>
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map>
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set>
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input;
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectLinker;
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation;
30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrame represents .eh_frame section
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
34affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>;
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame();
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  explicit EhFrame(LDSection& pSection);
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~EhFrame();
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame(const EhFrame&);            // DO NOT IMPLEMENT
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame& operator=(const EhFrame&); // DO NOT IMPLEMENT
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
47affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum RecordType {
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_UNKNOWN,
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_INPUT,
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_GENERATED
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class CIE;
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class FDE;
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<CIE*> CIEList;
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::iterator cie_iterator;
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::const_iterator const_cie_iterator;
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::list<FDE*> FDEList;
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::iterator fde_iterator;
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::const_iterator const_fde_iterator;
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::map</*offset*/size_t, CIE*> CIEMap;
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // A super class of CIE and FDE, containing the same part
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class Record : public RegionFragment
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record(llvm::StringRef pRegion);
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual ~Record();
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const llvm::StringRef getRegion() const { return RegionFragment::getRegion(); }
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          llvm::StringRef getRegion()       { return RegionFragment::getRegion(); }
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_UNKNOWN; }
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  private:
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record(const Record&);            // DO NOT IMPLEMENT
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record& operator=(const Record&); // DO NOT IMPLEMENT
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class CIE
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Common Information Entry.
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class CIE : public Record
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE(llvm::StringRef pRegion);
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~CIE();
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_INPUT; }
9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; }
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t getFDEEncode() const { return m_FDEEncode; }
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setMergeable(bool pVal = true) { m_Mergeable = pVal; }
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return m_Mergeable; }
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setRelocation(const Relocation& pReloc) { m_pReloc = &pReloc; }
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* getRelocation() const { return m_pReloc; }
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setPersonalityOffset(uint64_t pOffset) { m_PersonalityOffset = pOffset; }
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t getPersonalityOffset() const { return m_PersonalityOffset; }
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setPersonalityName(const std::string& pStr) { m_PersonalityName = pStr; }
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const std::string& getPersonalityName() const { return m_PersonalityName; }
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setAugmentationData(const std::string& pStr) { m_AugmentationData = pStr; }
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const std::string& getAugmentationData() const { return m_AugmentationData; }
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void add(FDE& pFDE) { m_FDEs.push_back(&pFDE); }
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void remove(FDE& pFDE) { m_FDEs.remove(&pFDE); }
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void clearFDEs() { m_FDEs.clear(); }
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    size_t numOfFDEs() const { return m_FDEs.size(); }
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator begin() const { return m_FDEs.begin(); }
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    fde_iterator       begin()       { return m_FDEs.begin(); }
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator end() const { return m_FDEs.end(); }
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    fde_iterator       end()       { return m_FDEs.end(); }
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t m_FDEEncode;
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    bool m_Mergeable;
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* m_pReloc;
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t m_PersonalityOffset;
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_PersonalityName;
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_AugmentationData;
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDEList m_FDEs;
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class FDE
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Frame Description Entry
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class FDE : public Record
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDE(llvm::StringRef pRegion, CIE& pCIE);
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~FDE();
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setCIE(CIE& pCIE);
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const CIE& getCIE() const { return *m_pCIE; }
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE&       getCIE()       { return *m_pCIE; }
1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE* m_pCIE;  // Referenced CIE may change when merging.
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // These are created for PLT
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class GeneratedCIE : public CIE
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GeneratedCIE(llvm::StringRef pRegion);
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedCIE();
15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return true; }
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class GeneratedFDE : public FDE
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GeneratedFDE(llvm::StringRef pRegion, CIE& pCIE);
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedFDE();
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
171affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static EhFrame* Create(LDSection& pSection);
173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Destroy(EhFrame*& pSection);
1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Clear();
177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// merge - move all data from pOther to this object.
17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  EhFrame& merge(const Input& pInput, EhFrame& pInFrame);
180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const LDSection& getSection() const;
1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection&       getSection();
183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
184f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SectionData* getSectionData() const { return m_pSectionData; }
185f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SectionData*       getSectionData()       { return m_pSectionData; }
186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  fragment  ----- //
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFragment(Fragment& pFrag);
189f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addCIE - add a CIE entry in EhFrame
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addCIE(CIE& pCIE, bool pAlsoAddFragment = true);
192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFDE - add a FDE entry in EhFrame
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFDE(FDE& pFDE, bool pAlsoAddFragment = true);
195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  CIE  ----- //
19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_begin() const { return m_CIEs.begin(); }
19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_begin()       { return m_CIEs.begin(); }
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_end  () const { return m_CIEs.end(); }
20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_end  ()       { return m_CIEs.end(); }
201affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_front() const { return *m_CIEs.front(); }
20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_front()       { return *m_CIEs.front(); }
20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_back () const { return *m_CIEs.back(); }
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_back ()       { return *m_CIEs.back(); }
206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emptyCIEs() const { return m_CIEs.empty(); }
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfCIEs() const { return m_CIEs.size(); }
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t numOfFDEs() const;
210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const CIEMap& getCIEMap() const { return m_FoundCIEs; }
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CIEMap&       getCIEMap()       { return m_FoundCIEs; }
213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t computeOffsetSize();
216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// getDataStartOffset - Get the offset after length and ID field.
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// The offset is 8byte for 32b, and 16byte for 64b.
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// We can just use "BITCLASS/4" to represent offset.
22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  template <size_t BITCLASS>
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static size_t getDataStartOffset() { return BITCLASS / 4; }
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We needs to check if it is mergeable and check personality name
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // before merging them. The important note is we must do this after
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // ALL readSections done, that is the reason why we don't check this
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // immediately when reading.
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setupAttributes(const LDSection* reloc_sect);
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void removeDiscardedFDE(CIE& pCIE, const LDSection* pRelocEhFrameSect);
23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void removeAndUpdateCIEForFDE(EhFrame& pInFrame, CIE& pInCIE, CIE& pOutCIE,
23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                const LDSection* reloc_sect);
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame);
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame, CIE& pInCIE, CIE* pOutCIE = 0);
236affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
237affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection* m_pSection;
23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_pSectionData;
240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
24187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Each eh_frame has a list of CIE, and each CIE has a list of FDE
24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // pointing to the CIE itself. This is used by management when we are
24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // processing eh_frame merge.
24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // However, don't forget we need to handle the Fragments inside SectionData
24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // correctly since they are truly used when output emission.
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIEList m_CIEs;
24787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We need this map to find the corresponding CIE for FDE. Not all FDE point
24987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // to the nearest CIE.
25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CIEMap m_FoundCIEs;
251affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
252affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesbool operator==(const EhFrame::CIE&, const EhFrame::CIE&);
25487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
257affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
259