73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
//===- EhFrameHdr.h -------------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_LD_EHFRAMEHDR_H_
|
|
#define MCLD_LD_EHFRAMEHDR_H_
|
|
#include "mcld/ADT/SizeTraits.h"
|
|
#include "mcld/LD/EhFrame.h"
|
|
#include "mcld/Support/FileOutputBuffer.h"
|
|
|
|
#include <cassert>
|
|
namespace mcld {
|
|
|
|
class LDSection;
|
|
class FileOutputBuffer;
|
|
|
|
/** \class EhFrameHdr
|
|
* \brief EhFrameHdr represents .eh_frame_hdr section.
|
|
*
|
|
* @ref lsb core generic 4.1
|
|
* .eh_frame_hdr section format
|
|
* uint8_t : version
|
|
* uint8_t : eh_frame_ptr_enc
|
|
* uint8_t : fde_count_enc
|
|
* uint8_t : table_enc
|
|
* uint32_t : eh_frame_ptr
|
|
* uint32_t : fde_count
|
|
* __________________________ when fde_count > 0
|
|
* <uint32_t, uint32_t>+ : binary search table
|
|
*/
|
|
class EhFrameHdr {
|
|
public:
|
|
EhFrameHdr(LDSection& pEhFrameHdr, const LDSection& pEhFrame);
|
|
|
|
~EhFrameHdr();
|
|
|
|
/// sizeOutput - base on the fde count to size output
|
|
void sizeOutput();
|
|
|
|
/// emitOutput - write out eh_frame_hdr
|
|
template <size_t size>
|
|
void emitOutput(FileOutputBuffer& pOutput) {
|
|
assert(false && "Call invalid EhFrameHdr::emitOutput");
|
|
}
|
|
|
|
private:
|
|
/// computePCBegin - return the address of FDE's pc
|
|
uint32_t computePCBegin(const EhFrame::FDE& pFDE,
|
|
const MemoryRegion& pEhFrameRegion);
|
|
|
|
private:
|
|
/// .eh_frame_hdr section
|
|
LDSection& m_EhFrameHdr;
|
|
|
|
/// eh_frame
|
|
const LDSection& m_EhFrame;
|
|
};
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Template Specification Functions
|
|
//===----------------------------------------------------------------------===//
|
|
/// emitOutput - write out eh_frame_hdr
|
|
template <>
|
|
void EhFrameHdr::emitOutput<32>(FileOutputBuffer& pOutput);
|
|
|
|
} // namespace mcld
|
|
|
|
#endif // MCLD_LD_EHFRAMEHDR_H_
|