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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_EHFRAME_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_EHFRAME_H_ 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Fragment/RegionFragment.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/SectionData.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h" 176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h> 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list> 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map> 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector> 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input; 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation; 29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief EhFrame represents .eh_frame section 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 3337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass EhFrame { 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>; 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines EhFrame(); 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines explicit EhFrame(LDSection& pSection); 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~EhFrame(); 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines enum RecordType { RECORD_UNKNOWN, RECORD_INPUT, RECORD_GENERATED }; 4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class CIE; 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class FDE; 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<CIE*> CIEList; 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CIEList::iterator cie_iterator; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CIEList::const_iterator const_cie_iterator; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::list<FDE*> FDEList; 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FDEList::iterator fde_iterator; 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FDEList::const_iterator const_fde_iterator; 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines typedef std::map</*offset*/ size_t, CIE*> CIEMap; 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // A super class of CIE and FDE, containing the same part 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines class Record : public RegionFragment { 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit Record(llvm::StringRef pRegion); 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual ~Record(); 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const llvm::StringRef getRegion() const { 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines return RegionFragment::getRegion(); 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::StringRef getRegion() { return RegionFragment::getRegion(); } 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_UNKNOWN; } 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines DISALLOW_COPY_AND_ASSIGN(Record); 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /** \class CIE 7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Common Information Entry. 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines * The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception 7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Frames. 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines class CIE : public Record { 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit CIE(llvm::StringRef pRegion); 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~CIE(); 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_INPUT; } 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; } 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint8_t getFDEEncode() const { return m_FDEEncode; } 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setMergeable(bool pVal = true) { m_Mergeable = pVal; } 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool getMergeable() const { return m_Mergeable; } 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setRelocation(const Relocation& pReloc) { m_pReloc = &pReloc; } 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Relocation* getRelocation() const { return m_pReloc; } 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setPersonalityOffset(uint64_t pOffset) { 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_PersonalityOffset = pOffset; 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t getPersonalityOffset() const { return m_PersonalityOffset; } 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setPersonalityName(const std::string& pStr) { 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_PersonalityName = pStr; 10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& getPersonalityName() const { return m_PersonalityName; } 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setAugmentationData(const std::string& pStr) { 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_AugmentationData = pStr; 10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& getAugmentationData() const { 10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return m_AugmentationData; 11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void add(FDE& pFDE) { m_FDEs.push_back(&pFDE); } 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void remove(FDE& pFDE) { m_FDEs.remove(&pFDE); } 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void clearFDEs() { m_FDEs.clear(); } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t numOfFDEs() const { return m_FDEs.size(); } 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_fde_iterator begin() const { return m_FDEs.begin(); } 11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines fde_iterator begin() { return m_FDEs.begin(); } 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_fde_iterator end() const { return m_FDEs.end(); } 12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines fde_iterator end() { return m_FDEs.end(); } 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint8_t m_FDEEncode; 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_Mergeable; 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Relocation* m_pReloc; 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_PersonalityOffset; 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_PersonalityName; 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_AugmentationData; 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FDEList m_FDEs; 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /** \class FDE 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Frame Description Entry 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines * The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception 13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Frames. 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines class FDE : public Record { 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FDE(llvm::StringRef pRegion, CIE& pCIE); 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~FDE(); 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setCIE(CIE& pCIE); 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const CIE& getCIE() const { return *m_pCIE; } 14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIE& getCIE() { return *m_pCIE; } 1456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIE* m_pCIE; // Referenced CIE may change when merging. 14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // These are created for PLT 15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines class GeneratedCIE : public CIE { 15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines explicit GeneratedCIE(llvm::StringRef pRegion); 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GeneratedCIE(); 15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_GENERATED; } 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool getMergeable() const { return true; } 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines class GeneratedFDE : public FDE { 16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GeneratedFDE(llvm::StringRef pRegion, CIE& pCIE); 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GeneratedFDE(); 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_GENERATED; } 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 167affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 1696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static EhFrame* Create(LDSection& pSection); 170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static void Destroy(EhFrame*& pSection); 1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static void Clear(); 174affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// merge - move all data from pOther to this object. 17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EhFrame& merge(const Input& pInput, EhFrame& pInFrame); 177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LDSection& getSection() const; 17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSection& getSection(); 180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 181f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SectionData* getSectionData() const { return m_pSectionData; } 18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines SectionData* getSectionData() { return m_pSectionData; } 183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- fragment ----- // 18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addFragment(Fragment& pFrag); 186f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addCIE - add a CIE entry in EhFrame 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addCIE(CIE& pCIE, bool pAlsoAddFragment = true); 189affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addFDE - add a FDE entry in EhFrame 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addFDE(FDE& pFDE, bool pAlsoAddFragment = true); 192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- CIE ----- // 19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_cie_iterator cie_begin() const { return m_CIEs.begin(); } 19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines cie_iterator cie_begin() { return m_CIEs.begin(); } 19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_cie_iterator cie_end() const { return m_CIEs.end(); } 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines cie_iterator cie_end() { return m_CIEs.end(); } 198affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const CIE& cie_front() const { return *m_CIEs.front(); } 20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIE& cie_front() { return *m_CIEs.front(); } 20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines const CIE& cie_back() const { return *m_CIEs.back(); } 20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIE& cie_back() { return *m_CIEs.back(); } 203affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool emptyCIEs() const { return m_CIEs.empty(); } 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t numOfCIEs() const { return m_CIEs.size(); } 20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t numOfFDEs() const; 207affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const CIEMap& getCIEMap() const { return m_FoundCIEs; } 20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIEMap& getCIEMap() { return m_FoundCIEs; } 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t computeOffsetSize(); 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// getDataStartOffset - Get the offset after length and ID field. 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// The offset is 8byte for 32b, and 16byte for 64b. 21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// We can just use "BITCLASS/4" to represent offset. 21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines template <size_t BITCLASS> 21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines static size_t getDataStartOffset() { 21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines return BITCLASS / 4; 22037b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // We needs to check if it is mergeable and check personality name 22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // before merging them. The important note is we must do this after 22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // ALL readSections done, that is the reason why we don't check this 22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // immediately when reading. 22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setupAttributes(const LDSection* reloc_sect); 22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void removeDiscardedFDE(CIE& pCIE, const LDSection* pRelocEhFrameSect); 22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 23037b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines void removeAndUpdateCIEForFDE(EhFrame& pInFrame, 23237b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIE& pInCIE, 23337b74a387bb3993387029859c2d9d051c41c724eStephen Hines CIE& pOutCIE, 23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* reloc_sect); 23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void moveInputFragments(EhFrame& pInFrame); 23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void moveInputFragments(EhFrame& pInFrame, CIE& pInCIE, CIE* pOutCIE = 0); 237affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 23837b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 2396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection* m_pSection; 24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionData* m_pSectionData; 241affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Each eh_frame has a list of CIE, and each CIE has a list of FDE 24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // pointing to the CIE itself. This is used by management when we are 24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // processing eh_frame merge. 24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // However, don't forget we need to handle the Fragments inside SectionData 24687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // correctly since they are truly used when output emission. 24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CIEList m_CIEs; 24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 24987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // We need this map to find the corresponding CIE for FDE. Not all FDE point 25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // to the nearest CIE. 25187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIEMap m_FoundCIEs; 25237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 25337b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines DISALLOW_COPY_AND_ASSIGN(EhFrame); 255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 25787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesbool operator==(const EhFrame::CIE&, const EhFrame::CIE&); 25887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 260affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 26137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_EHFRAME_H_ 262