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