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