1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- EhFrameHdr.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_EHFRAMEHDR_H
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_EHFRAMEHDR_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/Dwarf.h>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/SizeTraits.h>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryArea.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryRegion.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDOutput.h>
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLinker.h>
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/EhFrame.h>
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/LDSection.h>
23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/CIE.h>
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/FDE.h>
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/Layout.h>
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
27affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
29affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame;
30affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass LDSection;
31affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass Output;
32affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass FDE;
33affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MCLinker;
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrameHdr
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrameHdr represents .eh_frame_hdr section.
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
38affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrameHdr
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
40affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  EhFrameHdr(const EhFrame& pEhFrameData,
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang             const LDSection& pEhFrameSect,
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang             LDSection& pEhFrameHdrSect);
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~EhFrameHdr();
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sizeOutput - base on the fde count to size output
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void sizeOutput();
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// emitOutput - write out eh_frame_hdr
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  template<size_t size>
52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void emitOutput(Output& pOutput, MCLinker& pLinker);
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
54affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// getFDEPC - return the address of FDE's pc
56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param pFDE - FDE
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// @param pOffset - the output offset of FDE
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  template<size_t size>
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typename SizeTraits<size>::Address
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  getFDEPC(const FDE& pFDE,
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang           typename SizeTraits<size>::Offset pOffset,
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang           const MemoryRegion& pEhFrameRegion);
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  template<size_t size>
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  class BSTEntry
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  public:
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    typedef std::pair<typename SizeTraits<size>::Address,
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                      typename SizeTraits<size>::Address> EntryType;
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  template<size_t size>
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  struct BSTEntryCompare
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    : public std::binary_function<const typename BSTEntry<size>::EntryType&,
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  const typename BSTEntry<size>::EntryType&,
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                                  bool>
77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  {
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    bool operator()(const typename BSTEntry<size>::EntryType& X,
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang                    const typename BSTEntry<size>::EntryType& Y) const
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    { return X.first < Y.first; }
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
83affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// eh_frame data
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const EhFrame& m_EhFrameData;
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// .eh_frame section
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const LDSection& m_EhFrameSect;
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// .eh_frame_hdr section
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  LDSection& m_EhFrameHdrSect;
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "EhFrameHdr.tcc"
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
100