EhFrame.h revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
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//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#ifndef MCLD_LD_EH_FRAME_H
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#define MCLD_LD_EH_FRAME_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/RegionFragment.h>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData;
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrame represents .eh_frame section
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
26affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
28affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class CIE
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Common Information Entry.
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class CIE : public RegionFragment
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    CIE(MemoryRegion& pRegion);
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; }
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t getFDEEncode() const { return m_FDEEncode; }
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t m_FDEEncode;
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class FDE
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Frame Description Entry
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class FDE : public RegionFragment
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    FDE(MemoryRegion& pRegion,
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        const CIE& pCIE,
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        uint32_t pDataStart);
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const CIE& getCIE() const { return m_CIE; }
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint32_t getDataStart() const { return m_DataStart; }
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const CIE& m_CIE;
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint32_t m_DataStart;
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<CIE*> CIEList;
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // cie_iterator and const_cie_iterator must be a kind of random access iterator
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef CIEList::iterator cie_iterator;
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef CIEList::const_iterator const_cie_iterator;
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<FDE*> FDEList;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // fde_iterator and const_fde_iterator must be a kind of random access iterator
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef FDEList::iterator fde_iterator;
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef FDEList::const_iterator const_fde_iterator;
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
76affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EhFrame(LDSection& pSection);
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ~EhFrame();
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// merge - move all data from pOther to this object.
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EhFrame& merge(EhFrame& pOther);
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSection& getSection() const { return m_Section; }
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection&       getSection()       { return m_Section; }
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SectionData& getSectionData() const { return *m_pSectionData; }
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData&       getSectionData()       { return *m_pSectionData; }
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  fragment  ----- //
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFragment - when we start treating CIEs and FDEs as regular fragments,
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// we call this function instead of addCIE() and addFDE().
9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addFragment(RegionFragment& pFrag);
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addCIE - add a CIE entry in EhFrame
9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addCIE(CIE& pCIE);
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFDE - add a FDE entry in EhFrame
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addFDE(FDE& pFDE);
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  CIE  ----- //
10222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_begin() const { return m_CIEs.begin(); }
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_begin()       { return m_CIEs.begin(); }
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_end  () const { return m_CIEs.end(); }
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_end  ()       { return m_CIEs.end(); }
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_front() const { return *m_CIEs.front(); }
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_front()       { return *m_CIEs.front(); }
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_back () const { return *m_CIEs.back(); }
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_back ()       { return *m_CIEs.back(); }
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfCIEs() const { return m_CIEs.size(); }
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  FDE  ----- //
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_fde_iterator fde_begin() const { return m_FDEs.begin(); }
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  fde_iterator       fde_begin()       { return m_FDEs.begin(); }
11722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_fde_iterator fde_end  () const { return m_FDEs.end(); }
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  fde_iterator       fde_end  ()       { return m_FDEs.end(); }
119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const FDE& fde_front() const { return *m_FDEs.front(); }
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDE&       fde_front()       { return *m_FDEs.front(); }
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const FDE& fde_back () const { return *m_FDEs.back(); }
12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDE&       fde_back ()       { return *m_FDEs.back(); }
124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfFDEs() const { return m_FDEs.size(); }
126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
127affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection& m_Section;
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_pSectionData;
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIEList m_CIEs;
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDEList m_FDEs;
133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
139