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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_EXCEPTION_HANDLING_FRAME_H 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_EXCEPTION_HANDLING_FRAME_H 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h> 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <vector> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/TypeTraits.h> 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/CIE.h> 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/FDE.h> 19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/RegionFragment.h> 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/GCFactory.h> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 22affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Input; 26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Layout; 27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData; 28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass TargetLDBackend; 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief EhFrame represents .eh_frame section 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * EhFrame is responsible to parse the input eh_frame sections and create 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * the corresponding CIE and FDE entries. 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 35affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 37affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef ConstTraits<unsigned char>::pointer ConstAddress; 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef std::vector<CIE*> CIEListType; 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef std::vector<FDE*> FDEListType; 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef CIEListType::iterator cie_iterator; 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef CIEListType::const_iterator const_cie_iterator; 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef FDEListType::iterator fde_iterator; 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef FDEListType::const_iterator const_fde_iterator; 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 46affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang EhFrame(); 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~EhFrame(); 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// readEhFrame - read an .eh_frame section and create the corresponding 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// CIEs and FDEs 52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// @param pSD - the SectionData of this input eh_frame 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pSection - the input eh_frame 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pArea - the memory area which pSection is within. 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @ return - size of this eh_frame section, 0 if we do not recognize 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// this eh_frame or this is an empty section 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint64_t readEhFrame(Layout& pLayout, 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const TargetLDBackend& pBackend, 59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao SectionData& pSD, 6067e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao const Input& pInput, 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& pSection, 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea& pArea); 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- observers ----- // 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang cie_iterator cie_begin() 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_CIEs.begin(); } 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_cie_iterator cie_begin() const 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_CIEs.begin(); } 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang cie_iterator cie_end() 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_CIEs.end(); } 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_cie_iterator cie_end() const 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_CIEs.end(); } 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang fde_iterator fde_begin() 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.begin(); } 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_fde_iterator fde_begin() const 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.begin(); } 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang fde_iterator fde_end() 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.end(); } 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const_fde_iterator fde_end() const 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.end(); } 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// getFDECount - the number of FDE entries 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size_t getFDECount() 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.size(); } 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang size_t getFDECount() const 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_FDEs.size(); } 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// canRecognizeAllEhFrame - return if we are able to parse all input 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// eh_frame sections 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return false - if there is any input .eh_frame section that 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// we are not able to recognize 100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool canRecognizeAllEhFrame() 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_fCanRecognizeAll; } 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool canRecognizeAllEhFrame() const 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return m_fCanRecognizeAll; } 105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 106affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao typedef std::vector<Fragment*> FragListType; 108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 109affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// addCIE - parse and create a CIE entry 111affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return false - cannot recognize this CIE 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool addCIE(MemoryRegion& pFrag, 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const TargetLDBackend& pBackend, 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FragListType& pFragList); 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// addFDE - parse and create an FDE entry 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return false - cannot recognize this FDE 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool addFDE(MemoryRegion& pFrag, 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const TargetLDBackend& pBackend, 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FragListType& pFragList); 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// readVal - read a 32 bit data from pAddr, swap it if needed 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang uint32_t readVal(ConstAddress pAddr, bool pIsTargetLittleEndian); 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// skipLEB128 - skip the first LEB128 encoded value from *pp, update *pp 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// to the next character. 127affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @return - false if we ran off the end of the string. 128affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @ref - GNU gold 1.11, ehframe.h, Eh_frame::skip_leb128. 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool skipLEB128(ConstAddress* pp, ConstAddress pend); 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao /// deleteFragments - release the MemoryRegion and delete Fragments in pList 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void deleteFragments(FragListType& pList, MemoryArea& pArea); 133affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 134affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 135affc150dc44fab1911775a49636d0ce85333b634Zonr Chang CIEListType m_CIEs; 136affc150dc44fab1911775a49636d0ce85333b634Zonr Chang FDEListType m_FDEs; 137affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool m_fCanRecognizeAll; 139affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 143affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 144affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 145