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