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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_EHFRAMEHDR_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_EHFRAMEHDR_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/SizeTraits.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <cassert>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/EhFrame.h>
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Support/FileOutputBuffer.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
18affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass LDSection;
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass FileOutputBuffer;
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrameHdr
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrameHdr represents .eh_frame_hdr section.
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  @ref lsb core generic 4.1
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  .eh_frame_hdr section format
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint8_t : version
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint8_t : eh_frame_ptr_enc
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint8_t : fde_count_enc
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint8_t : table_enc
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint32_t : eh_frame_ptr
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  uint32_t : fde_count
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  __________________________ when fde_count > 0
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *  <uint32_t, uint32_t>+ : binary search table
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
35affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrameHdr
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
37affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  EhFrameHdr(LDSection& pEhFrameHdr, const LDSection& pEhFrame);
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~EhFrameHdr();
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// sizeOutput - base on the fde count to size output
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  void sizeOutput();
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// emitOutput - write out eh_frame_hdr
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  template<size_t size>
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void emitOutput(FileOutputBuffer& pOutput)
4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  { assert(false && "Call invalid EhFrameHdr::emitOutput"); }
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
50affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// computePCBegin - return the address of FDE's pc
5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @ref binutils gold: ehframe.cc:222
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint32_t computePCBegin(const EhFrame::FDE& pFDE,
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                          const MemoryRegion& pEhFrameRegion);
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
56affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  /// .eh_frame_hdr section
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  LDSection& m_EhFrameHdr;
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// eh_frame
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const LDSection& m_EhFrame;
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// Template Specification Functions
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// emitOutput - write out eh_frame_hdr
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaotemplate<>
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvoid EhFrameHdr::emitOutput<32>(FileOutputBuffer& pOutput);
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
75