EhFrame.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- EhFrame.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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_LD_EHFRAME_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_EHFRAME_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Config/Config.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/RegionFragment.h>
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/LD/SectionData.h>
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/Allocators.h>
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h>
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list>
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map>
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set>
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector>
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input;
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection;
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectLinker;
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation;
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  \brief EhFrame represents .eh_frame section
36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
37affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame
38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate:
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>;
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame();
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  explicit EhFrame(LDSection& pSection);
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  ~EhFrame();
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame(const EhFrame&);            // DO NOT IMPLEMENT
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  EhFrame& operator=(const EhFrame&); // DO NOT IMPLEMENT
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
50affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum RecordType {
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_UNKNOWN,
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_INPUT,
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    RECORD_GENERATED
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class CIE;
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class FDE;
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<CIE*> CIEList;
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::iterator cie_iterator;
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CIEList::const_iterator const_cie_iterator;
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::list<FDE*> FDEList;
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::iterator fde_iterator;
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef FDEList::const_iterator const_fde_iterator;
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::map</*offset*/size_t, CIE*> CIEMap;
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // A super class of CIE and FDE, containing the same part
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class Record : public RegionFragment
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record(llvm::StringRef pRegion);
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual ~Record();
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const llvm::StringRef getRegion() const { return RegionFragment::getRegion(); }
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          llvm::StringRef getRegion()       { return RegionFragment::getRegion(); }
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_UNKNOWN; }
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  private:
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record(const Record&);            // DO NOT IMPLEMENT
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Record& operator=(const Record&); // DO NOT IMPLEMENT
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class CIE
8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Common Information Entry.
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class CIE : public Record
9122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE(llvm::StringRef pRegion);
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~CIE();
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_INPUT; }
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; }
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t getFDEEncode() const { return m_FDEEncode; }
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setMergeable(bool pVal = true) { m_Mergeable = pVal; }
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return m_Mergeable; }
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setRelocation(const Relocation& pReloc) { m_pReloc = &pReloc; }
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* getRelocation() const { return m_pReloc; }
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setPersonalityOffset(uint64_t pOffset) { m_PersonalityOffset = pOffset; }
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t getPersonalityOffset() const { return m_PersonalityOffset; }
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setPersonalityName(const std::string& pStr) { m_PersonalityName = pStr; }
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const std::string& getPersonalityName() const { return m_PersonalityName; }
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setAugmentationData(const std::string& pStr) { m_AugmentationData = pStr; }
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const std::string& getAugmentationData() const { return m_AugmentationData; }
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void add(FDE& pFDE) { m_FDEs.push_back(&pFDE); }
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void remove(FDE& pFDE) { m_FDEs.remove(&pFDE); }
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void clearFDEs() { m_FDEs.clear(); }
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    size_t numOfFDEs() const { return m_FDEs.size(); }
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator begin() const { return m_FDEs.begin(); }
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    fde_iterator       begin()       { return m_FDEs.begin(); }
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const_fde_iterator end() const { return m_FDEs.end(); }
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    fde_iterator       end()       { return m_FDEs.end(); }
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    uint8_t m_FDEEncode;
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    bool m_Mergeable;
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const Relocation* m_pReloc;
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    uint64_t m_PersonalityOffset;
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_PersonalityName;
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    std::string m_AugmentationData;
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDEList m_FDEs;
13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /** \class FDE
13722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  \brief Frame Description Entry
13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   *  The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames.
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   */
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class FDE : public Record
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  {
14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  public:
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    FDE(llvm::StringRef pRegion, CIE& pCIE);
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~FDE();
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    void setCIE(CIE& pCIE);
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    const CIE& getCIE() const { return *m_pCIE; }
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE&       getCIE()       { return *m_pCIE; }
1496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  private:
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    CIE* m_pCIE;  // Referenced CIE may change when merging.
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  };
15322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // These are created for PLT
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class GeneratedCIE : public CIE
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GeneratedCIE(llvm::StringRef pRegion);
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedCIE();
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual bool getMergeable() const { return true; }
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  class GeneratedFDE : public FDE
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  public:
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    GeneratedFDE(llvm::StringRef pRegion, CIE& pCIE);
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ~GeneratedFDE();
17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    virtual RecordType getRecordType() const { return RECORD_GENERATED; }
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
174affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static EhFrame* Create(LDSection& pSection);
176affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Destroy(EhFrame*& pSection);
1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  static void Clear();
180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// merge - move all data from pOther to this object.
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  EhFrame& merge(const Input& pInput, EhFrame& pInFrame);
183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
1846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  const LDSection& getSection() const;
1856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection&       getSection();
186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
187f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SectionData* getSectionData() const { return m_pSectionData; }
188f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SectionData*       getSectionData()       { return m_pSectionData; }
189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  fragment  ----- //
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFragment(Fragment& pFrag);
192f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addCIE - add a CIE entry in EhFrame
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addCIE(CIE& pCIE, bool pAlsoAddFragment = true);
195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// addFDE - add a FDE entry in EhFrame
19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addFDE(FDE& pFDE, bool pAlsoAddFragment = true);
198affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // -----  CIE  ----- //
20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_begin() const { return m_CIEs.begin(); }
20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_begin()       { return m_CIEs.begin(); }
20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const_cie_iterator cie_end  () const { return m_CIEs.end(); }
20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  cie_iterator       cie_end  ()       { return m_CIEs.end(); }
204affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_front() const { return *m_CIEs.front(); }
20622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_front()       { return *m_CIEs.front(); }
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const CIE& cie_back () const { return *m_CIEs.back(); }
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIE&       cie_back ()       { return *m_CIEs.back(); }
209affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool emptyCIEs() const { return m_CIEs.empty(); }
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t numOfCIEs() const { return m_CIEs.size(); }
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t numOfFDEs() const;
213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const CIEMap& getCIEMap() const { return m_FoundCIEs; }
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CIEMap&       getCIEMap()       { return m_FoundCIEs; }
216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t computeOffsetSize();
219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// getDataStartOffset - Get the offset after length and ID field.
22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// The offset is 8byte for 32b, and 16byte for 64b.
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// We can just use "BITCLASS/4" to represent offset.
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  template <size_t BITCLASS>
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static size_t getDataStartOffset() { return BITCLASS / 4; }
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We needs to check if it is mergeable and check personality name
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // before merging them. The important note is we must do this after
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // ALL readSections done, that is the reason why we don't check this
23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // immediately when reading.
23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setupAttributes(const LDSection* reloc_sect);
23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void removeDiscardedFDE(CIE& pCIE, const LDSection* pRelocEhFrameSect);
23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void removeAndUpdateCIEForFDE(EhFrame& pInFrame, CIE& pInCIE, CIE& pOutCIE,
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                const LDSection* reloc_sect);
23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame);
23887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void moveInputFragments(EhFrame& pInFrame, CIE& pInCIE, CIE* pOutCIE = 0);
239affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
240affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
2416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  LDSection* m_pSection;
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionData* m_pSectionData;
243affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // Each eh_frame has a list of CIE, and each CIE has a list of FDE
24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // pointing to the CIE itself. This is used by management when we are
24687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // processing eh_frame merge.
24787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // However, don't forget we need to handle the Fragments inside SectionData
24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // correctly since they are truly used when output emission.
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  CIEList m_CIEs;
25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
25187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // We need this map to find the corresponding CIE for FDE. Not all FDE point
25287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  // to the nearest CIE.
25387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CIEMap m_FoundCIEs;
254affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesbool operator==(const EhFrame::CIE&, const EhFrame::CIE&);
25787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
259affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
261affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
262