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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_EHFRAMEHDR_H 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_EHFRAMEHDR_H 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h> 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/Dwarf.h> 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/Support/DataTypes.h> 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/SizeTraits.h> 17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryArea.h> 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryRegion.h> 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDOutput.h> 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLinker.h> 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/EhFrame.h> 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/LDSection.h> 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/CIE.h> 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/FDE.h> 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/LD/Layout.h> 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 27affc150dc44fab1911775a49636d0ce85333b634Zonr Changnamespace mcld 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 29affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame; 30affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass LDSection; 31affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass Output; 32affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass FDE; 33affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MCLinker; 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrameHdr 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief EhFrameHdr represents .eh_frame_hdr section. 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 38affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrameHdr 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 40affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang EhFrameHdr(const EhFrame& pEhFrameData, 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const LDSection& pEhFrameSect, 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& pEhFrameHdrSect); 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~EhFrameHdr(); 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// sizeOutput - base on the fde count to size output 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void sizeOutput(); 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// emitOutput - write out eh_frame_hdr 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang template<size_t size> 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void emitOutput(Output& pOutput, MCLinker& pLinker); 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 54affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// getFDEPC - return the address of FDE's pc 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pFDE - FDE 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param pOffset - the output offset of FDE 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang template<size_t size> 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typename SizeTraits<size>::Address 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang getFDEPC(const FDE& pFDE, 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typename SizeTraits<size>::Offset pOffset, 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const MemoryRegion& pEhFrameRegion); 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang template<size_t size> 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang class BSTEntry 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang public: 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typedef std::pair<typename SizeTraits<size>::Address, 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang typename SizeTraits<size>::Address> EntryType; 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang template<size_t size> 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang struct BSTEntryCompare 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang : public std::binary_function<const typename BSTEntry<size>::EntryType&, 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const typename BSTEntry<size>::EntryType&, 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool> 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bool operator()(const typename BSTEntry<size>::EntryType& X, 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const typename BSTEntry<size>::EntryType& Y) const 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { return X.first < Y.first; } 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang }; 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 83affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// eh_frame data 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const EhFrame& m_EhFrameData; 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// .eh_frame section 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const LDSection& m_EhFrameSect; 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// .eh_frame_hdr section 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang LDSection& m_EhFrameHdrSect; 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include "EhFrameHdr.tcc" 95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 100