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