• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- EhFrameHdr.h -------------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_EHFRAMEHDR_H
10 #define MCLD_EHFRAMEHDR_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 #include <mcld/ADT/SizeTraits.h>
15 #include <cassert>
16 
17 #include <mcld/LD/EhFrame.h>
18 namespace mcld {
19 
20 class LDSection;
21 class MemoryArea;
22 class MemoryRegion;
23 
24 /** \class EhFrameHdr
25  *  \brief EhFrameHdr represents .eh_frame_hdr section.
26  *
27  *  @ref lsb core generic 4.1
28  *  .eh_frame_hdr section format
29  *  uint8_t : version
30  *  uint8_t : eh_frame_ptr_enc
31  *  uint8_t : fde_count_enc
32  *  uint8_t : table_enc
33  *  uint32_t : eh_frame_ptr
34  *  uint32_t : fde_count
35  *  __________________________ when fde_count > 0
36  *  <uint32_t, uint32_t>+ : binary search table
37  */
38 class EhFrameHdr
39 {
40 public:
41   EhFrameHdr(LDSection& pEhFrameHdr, const LDSection& pEhFrame);
42 
43   ~EhFrameHdr();
44 
45   /// sizeOutput - base on the fde count to size output
46   void sizeOutput();
47 
48   /// emitOutput - write out eh_frame_hdr
49   template<size_t size>
emitOutput(MemoryArea & pOutput)50   void emitOutput(MemoryArea& pOutput)
51   { assert(false && "Call invalid EhFrameHdr::emitOutput"); }
52 
53 private:
54   /// computePCBegin - return the address of FDE's pc
55   /// @ref binutils gold: ehframe.cc:222
56   uint32_t computePCBegin(const EhFrame::FDE& pFDE, const MemoryRegion& pEhFrameRegion);
57 
58 private:
59   /// .eh_frame_hdr section
60   LDSection& m_EhFrameHdr;
61 
62   /// eh_frame
63   const LDSection& m_EhFrame;
64 };
65 
66 //===----------------------------------------------------------------------===//
67 // Template Specification Functions
68 //===----------------------------------------------------------------------===//
69 /// emitOutput - write out eh_frame_hdr
70 template<>
71 void EhFrameHdr::emitOutput<32>(MemoryArea& pOutput);
72 
73 template<>
74 void EhFrameHdr::emitOutput<64>(MemoryArea& pOutput);
75 
76 } // namespace of mcld
77 
78 #endif
79 
80