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