EhFrame.h revision 6f75755c9204b1d8817ae5a65a2f7e5af0ec3f70
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
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Config/Config.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/RegionFragment.h>
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/Allocators.h>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector>
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData;
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrame represents .eh_frame section
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
29affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>;
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame();
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  explicit EhFrame(LDSection& pSection);
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~EhFrame();
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame(const EhFrame&);            // DO NOT IMPLEMENT
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame& operator=(const EhFrame&); // DO NOT IMPLEMENT
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
42affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class CIE
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Common Information Entry.
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class CIE : public RegionFragment
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    CIE(MemoryRegion& pRegion);
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; }
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t getFDEEncode() const { return m_FDEEncode; }
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t m_FDEEncode;
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class FDE
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Frame Description Entry
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  class FDE : public RegionFragment
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    FDE(MemoryRegion& pRegion,
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        const CIE& pCIE,
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao        uint32_t pDataStart);
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const CIE& getCIE() const { return m_CIE; }
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint32_t getDataStart() const { return m_DataStart; }
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    const CIE& m_CIE;
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint32_t m_DataStart;
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<CIE*> CIEList;
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // cie_iterator and const_cie_iterator must be a kind of random access iterator
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef CIEList::iterator cie_iterator;
8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef CIEList::const_iterator const_cie_iterator;
8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef std::vector<FDE*> FDEList;
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // fde_iterator and const_fde_iterator must be a kind of random access iterator
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef FDEList::iterator fde_iterator;
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef FDEList::const_iterator const_fde_iterator;
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
91affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static EhFrame* Create(LDSection& pSection);
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Destroy(EhFrame*& pSection);
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Clear();
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// merge - move all data from pOther to this object.
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EhFrame& merge(EhFrame& pOther);
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const LDSection& getSection() const;
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection&       getSection();
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SectionData& getSectionData() const { return *m_pSectionData; }
10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData&       getSectionData()       { return *m_pSectionData; }
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  fragment  ----- //
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFragment - when we start treating CIEs and FDEs as regular fragments,
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// we call this function instead of addCIE() and addFDE().
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addFragment(RegionFragment& pFrag);
111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addCIE - add a CIE entry in EhFrame
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addCIE(CIE& pCIE);
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFDE - add a FDE entry in EhFrame
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  void addFDE(FDE& pFDE);
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
11822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  CIE  ----- //
11922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_begin() const { return m_CIEs.begin(); }
12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_begin()       { return m_CIEs.begin(); }
12122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_end  () const { return m_CIEs.end(); }
12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_end  ()       { return m_CIEs.end(); }
123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_front() const { return *m_CIEs.front(); }
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_front()       { return *m_CIEs.front(); }
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_back () const { return *m_CIEs.back(); }
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_back ()       { return *m_CIEs.back(); }
128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfCIEs() const { return m_CIEs.size(); }
130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  FDE  ----- //
13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_fde_iterator fde_begin() const { return m_FDEs.begin(); }
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  fde_iterator       fde_begin()       { return m_FDEs.begin(); }
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_fde_iterator fde_end  () const { return m_FDEs.end(); }
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  fde_iterator       fde_end  ()       { return m_FDEs.end(); }
136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const FDE& fde_front() const { return *m_FDEs.front(); }
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDE&       fde_front()       { return *m_FDEs.front(); }
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const FDE& fde_back () const { return *m_FDEs.back(); }
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDE&       fde_back ()       { return *m_FDEs.back(); }
141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfFDEs() const { return m_FDEs.size(); }
143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
144affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection* m_pSection;
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_pSectionData;
147affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIEList m_CIEs;
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  FDEList m_FDEs;
150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
155affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
156