blob: 70f915ce678c6d7490f4de2b9b3c05c3b015a16f [file] [log] [blame]
//===- EhFrameHdr.h -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_EHFRAMEHDR_H
#define MCLD_EHFRAMEHDR_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/Support/Dwarf.h>
#include <llvm/Support/DataTypes.h>
#include <mcld/ADT/SizeTraits.h>
#include <mcld/Support/MemoryArea.h>
#include <mcld/Support/MemoryRegion.h>
#include <mcld/MC/MCLDOutput.h>
#include <mcld/MC/MCLinker.h>
#include <mcld/LD/EhFrame.h>
#include <mcld/LD/LDSection.h>
#include <mcld/LD/CIE.h>
#include <mcld/LD/FDE.h>
#include <mcld/LD/Layout.h>
namespace mcld
{
class EhFrame;
class LDSection;
class Output;
class FDE;
class MCLinker;
/** \class EhFrameHdr
* \brief EhFrameHdr represents .eh_frame_hdr section.
*/
class EhFrameHdr
{
public:
EhFrameHdr(const EhFrame& pEhFrameData,
const LDSection& pEhFrameSect,
LDSection& pEhFrameHdrSect);
~EhFrameHdr();
/// sizeOutput - base on the fde count to size output
void sizeOutput();
/// emitOutput - write out eh_frame_hdr
template<size_t size>
void emitOutput(Output& pOutput, MCLinker& pLinker);
private:
/// getFDEPC - return the address of FDE's pc
/// @param pFDE - FDE
/// @param pOffset - the output offset of FDE
template<size_t size>
typename SizeTraits<size>::Address
getFDEPC(const FDE& pFDE,
typename SizeTraits<size>::Offset pOffset,
const MemoryRegion& pEhFrameRegion);
template<size_t size>
class BSTEntry
{
public:
typedef std::pair<typename SizeTraits<size>::Address,
typename SizeTraits<size>::Address> EntryType;
};
template<size_t size>
struct BSTEntryCompare
: public std::binary_function<const typename BSTEntry<size>::EntryType&,
const typename BSTEntry<size>::EntryType&,
bool>
{
bool operator()(const typename BSTEntry<size>::EntryType& X,
const typename BSTEntry<size>::EntryType& Y) const
{ return X.first < Y.first; }
};
private:
/// eh_frame data
const EhFrame& m_EhFrameData;
/// .eh_frame section
const LDSection& m_EhFrameSect;
/// .eh_frame_hdr section
LDSection& m_EhFrameHdrSect;
};
#include "EhFrameHdr.tcc"
} // namespace of mcld
#endif