//===- EhFrameHdr.cpp -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/EhFrameHdr.h>

using namespace mcld;

//==========================
// EhFrameHdr
EhFrameHdr::EhFrameHdr(const EhFrame& pEhFrameData,
                       const LDSection& pEhFrameSect,
                       LDSection& pEhFrameHdrSect)
  : m_EhFrameData(pEhFrameData),
    m_EhFrameSect(pEhFrameSect),
    m_EhFrameHdrSect(pEhFrameHdrSect)
{
}

EhFrameHdr::~EhFrameHdr()
{
}

/// @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

/// sizeOutput - base on the fde count to size output
void EhFrameHdr::sizeOutput()
{
  size_t size = 12;
  if (m_EhFrameData.canRecognizeAllEhFrame()) {
    size_t fde_count = m_EhFrameData.getFDECount();
    size += 8 * fde_count;
  }
  m_EhFrameHdrSect.setSize(size);
}