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