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