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