| //===- EhFrameReader.h ----------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_EH_FRAME_READER_H |
| #define MCLD_EH_FRAME_READER_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| #include <mcld/Support/MemoryRegion.h> |
| |
| namespace mcld { |
| |
| class Input; |
| class EhFrame; |
| class LDSection; |
| |
| /** \class EhFrameReader |
| * \brief EhFrameReader reads .eh_frame section |
| * |
| * EhFrameReader is responsible to parse the input eh_frame sections and create |
| * the corresponding CIE and FDE entries. |
| */ |
| class EhFrameReader |
| { |
| public: |
| typedef const uint8_t* ConstAddress; |
| typedef uint8_t* Address; |
| |
| public: |
| /// read - read an .eh_frame section and create the corresponding |
| /// CIEs and FDEs |
| /// @param pInput [in] the Input contains this eh_frame |
| /// @param pEhFrame [inout] the input eh_frame |
| /// @return if we read all CIEs and FDEs successfully, return true. Otherwise, |
| /// return false; |
| template<size_t BITCLASS, bool SAME_ENDIAN> |
| bool read(Input& pInput, EhFrame& pEhFrame); |
| |
| private: |
| enum TokenKind { |
| CIE, |
| FDE, |
| Terminator, |
| Unknown, |
| NumOfTokenKinds |
| }; |
| |
| enum State { |
| Q0, |
| Q1, |
| Accept, |
| NumOfStates = 2, |
| Reject = -1 |
| }; |
| |
| struct Token { |
| TokenKind kind; |
| size_t file_off; |
| size_t data_off; |
| uint64_t size; |
| }; |
| |
| /// Action - the transition function of autometa. |
| /// @param pEhFrame - the output .eh_frame section |
| /// @param pSection - the input .eh_frame section |
| /// @param pRegion - the memory region that needs to handle with. |
| typedef bool (*Action)(EhFrame& pEhFrame, |
| MemoryRegion& pRegion, |
| const Token& pToken); |
| private: |
| /// scan - scan pData from pHandler for a token. |
| template<bool SAME_ENDIAN> Token |
| scan(ConstAddress pHandler, uint64_t pOffset, const MemoryRegion& pData) const; |
| |
| static bool addCIE(EhFrame& pEhFrame, |
| MemoryRegion& pRegion, |
| const Token& pToken); |
| |
| static bool addFDE(EhFrame& pEhFrame, |
| MemoryRegion& pRegion, |
| const Token& pToken); |
| |
| static bool addTerm(EhFrame& pEhFrame, |
| MemoryRegion& pRegion, |
| const Token& pToken); |
| |
| static bool reject(EhFrame& pEhFrame, |
| MemoryRegion& pRegion, |
| const Token& pToken); |
| |
| }; |
| |
| template<> bool |
| EhFrameReader::read<32, true>(Input& pInput, EhFrame& pEhFrame); |
| |
| template<> EhFrameReader::Token |
| EhFrameReader::scan<true>(ConstAddress pHandler, |
| uint64_t pOffset, |
| const MemoryRegion& pData) const; |
| |
| } // namespace of mcld |
| |
| #endif |
| |