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