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