122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===- EhFrameReader.h ----------------------------------------------------===// 222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// The MCLinker Project 422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source 622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details. 722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// 822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_EHFRAMEREADER_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_EHFRAMEREADER_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/EhFrame.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h> 1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Input; 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/** \class EhFrameReader 2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief EhFrameReader reads .eh_frame section 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * EhFrameReader is responsible to parse the input eh_frame sections and create 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * the corresponding CIE and FDE entries. 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass EhFrameReader { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef const char* ConstAddress; 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines typedef char* Address; 3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// read - read an .eh_frame section and create the corresponding 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// CIEs and FDEs 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pInput [in] the Input contains this eh_frame 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pEhFrame [inout] the input eh_frame 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return if we read all CIEs and FDEs successfully, return true. Otherwise, 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// return false; 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines template <size_t BITCLASS, bool SAME_ENDIAN> 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool read(Input& pInput, EhFrame& pEhFrame); 4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum TokenKind { CIE, FDE, Terminator, Unknown, NumOfTokenKinds }; 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum State { Q0, Q1, Accept, NumOfStates = 2, Reject = -1 }; 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao struct Token { 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TokenKind kind; 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t file_off; 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t data_off; 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint64_t size; 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Action - the transition function of autometa. 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pEhFrame - the output .eh_frame section 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pSection - the input .eh_frame section 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param pRegion - the memory region that needs to handle with. 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef bool (*Action)(EhFrame& pEhFrame, 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef pRegion, 6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const Token& pToken); 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// scan - scan pData from pHandler for a token. 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines template <bool SAME_ENDIAN> 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines Token scan(ConstAddress pHandler, 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t pOffset, 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::StringRef pData) const; 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool addCIE(EhFrame& pEhFrame, 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef pRegion, 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const Token& pToken); 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool addFDE(EhFrame& pEhFrame, 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef pRegion, 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const Token& pToken); 7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool addTerm(EhFrame& pEhFrame, 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef pRegion, 7922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const Token& pToken); 8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static bool reject(EhFrame& pEhFrame, 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef pRegion, 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const Token& pToken); 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}; 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool EhFrameReader::read<32, true>(Input& pInput, EhFrame& pEhFrame); 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8937b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <> 9037b74a387bb3993387029859c2d9d051c41c724eStephen HinesEhFrameReader::Token EhFrameReader::scan<true>(ConstAddress pHandler, 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines uint64_t pOffset, 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::StringRef pData) const; 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_EHFRAMEREADER_H_ 97