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 126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Config/Config.h> 1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Fragment/RegionFragment.h> 1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/LD/SectionData.h> 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/Allocators.h> 166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/ADT/StringRef.h> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <list> 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <map> 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <set> 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <vector> 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input; 2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LDSection; 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ObjectLinker; 2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Relocation; 30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class EhFrame 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * \brief EhFrame represents .eh_frame section 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */ 34affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass EhFrame 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines friend class Chunk<EhFrame, MCLD_SECTIONS_PER_INPUT>; 386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines EhFrame(); 406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines explicit EhFrame(LDSection& pSection); 416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ~EhFrame(); 436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines EhFrame(const EhFrame&); // DO NOT IMPLEMENT 456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines EhFrame& operator=(const EhFrame&); // DO NOT IMPLEMENT 466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 47affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum RecordType { 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RECORD_UNKNOWN, 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RECORD_INPUT, 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RECORD_GENERATED 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class CIE; 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class FDE; 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<CIE*> CIEList; 5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CIEList::iterator cie_iterator; 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CIEList::const_iterator const_cie_iterator; 6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::list<FDE*> FDEList; 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FDEList::iterator fde_iterator; 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FDEList::const_iterator const_fde_iterator; 6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::map</*offset*/size_t, CIE*> CIEMap; 6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // A super class of CIE and FDE, containing the same part 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class Record : public RegionFragment 6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines public: 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Record(llvm::StringRef pRegion); 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual ~Record(); 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const llvm::StringRef getRegion() const { return RegionFragment::getRegion(); } 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines llvm::StringRef getRegion() { return RegionFragment::getRegion(); } 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_UNKNOWN; } 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines private: 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Record(const Record&); // DO NOT IMPLEMENT 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Record& operator=(const Record&); // DO NOT IMPLEMENT 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /** \class CIE 8422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Common Information Entry. 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * The CIE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames. 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class CIE : public Record 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIE(llvm::StringRef pRegion); 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~CIE(); 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_INPUT; } 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao void setFDEEncode(uint8_t pEncode) { m_FDEEncode = pEncode; } 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint8_t getFDEEncode() const { return m_FDEEncode; } 9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setMergeable(bool pVal = true) { m_Mergeable = pVal; } 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool getMergeable() const { return m_Mergeable; } 10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setRelocation(const Relocation& pReloc) { m_pReloc = &pReloc; } 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Relocation* getRelocation() const { return m_pReloc; } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setPersonalityOffset(uint64_t pOffset) { m_PersonalityOffset = pOffset; } 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t getPersonalityOffset() const { return m_PersonalityOffset; } 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setPersonalityName(const std::string& pStr) { m_PersonalityName = pStr; } 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& getPersonalityName() const { return m_PersonalityName; } 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setAugmentationData(const std::string& pStr) { m_AugmentationData = pStr; } 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& getAugmentationData() const { return m_AugmentationData; } 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void add(FDE& pFDE) { m_FDEs.push_back(&pFDE); } 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void remove(FDE& pFDE) { m_FDEs.remove(&pFDE); } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void clearFDEs() { m_FDEs.clear(); } 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t numOfFDEs() const { return m_FDEs.size(); } 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_fde_iterator begin() const { return m_FDEs.begin(); } 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines fde_iterator begin() { return m_FDEs.begin(); } 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_fde_iterator end() const { return m_FDEs.end(); } 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines fde_iterator end() { return m_FDEs.end(); } 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao private: 12422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao uint8_t m_FDEEncode; 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_Mergeable; 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Relocation* m_pReloc; 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines uint64_t m_PersonalityOffset; 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_PersonalityName; 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_AugmentationData; 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FDEList m_FDEs; 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /** \class FDE 13422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * \brief Frame Description Entry 13522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * The FDE structure refers to LSB Core Spec 4.1, chap.10.6. Exception Frames. 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */ 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class FDE : public Record 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao public: 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines FDE(llvm::StringRef pRegion, CIE& pCIE); 14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~FDE(); 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setCIE(CIE& pCIE); 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const CIE& getCIE() const { return *m_pCIE; } 14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIE& getCIE() { return *m_pCIE; } 1466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao private: 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIE* m_pCIE; // Referenced CIE may change when merging. 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao }; 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // These are created for PLT 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class GeneratedCIE : public CIE 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines public: 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GeneratedCIE(llvm::StringRef pRegion); 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GeneratedCIE(); 15722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_GENERATED; } 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual bool getMergeable() const { return true; } 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 16122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines class GeneratedFDE : public FDE 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines { 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines public: 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GeneratedFDE(llvm::StringRef pRegion, CIE& pCIE); 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~GeneratedFDE(); 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines virtual RecordType getRecordType() const { return RECORD_GENERATED; } 16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 170affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 171affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic: 1726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static EhFrame* Create(LDSection& pSection); 173affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static void Destroy(EhFrame*& pSection); 1756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines static void Clear(); 177affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// merge - move all data from pOther to this object. 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EhFrame& merge(const Input& pInput, EhFrame& pInFrame); 180affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines const LDSection& getSection() const; 1826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection& getSection(); 183affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 184f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines const SectionData* getSectionData() const { return m_pSectionData; } 185f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines SectionData* getSectionData() { return m_pSectionData; } 186affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- fragment ----- // 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addFragment(Fragment& pFrag); 189f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addCIE - add a CIE entry in EhFrame 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addCIE(CIE& pCIE, bool pAlsoAddFragment = true); 192affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// addFDE - add a FDE entry in EhFrame 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addFDE(FDE& pFDE, bool pAlsoAddFragment = true); 195affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- CIE ----- // 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_cie_iterator cie_begin() const { return m_CIEs.begin(); } 19822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao cie_iterator cie_begin() { return m_CIEs.begin(); } 19922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const_cie_iterator cie_end () const { return m_CIEs.end(); } 20022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao cie_iterator cie_end () { return m_CIEs.end(); } 201affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 20222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const CIE& cie_front() const { return *m_CIEs.front(); } 20322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CIE& cie_front() { return *m_CIEs.front(); } 20422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const CIE& cie_back () const { return *m_CIEs.back(); } 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CIE& cie_back () { return *m_CIEs.back(); } 206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool emptyCIEs() const { return m_CIEs.empty(); } 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao size_t numOfCIEs() const { return m_CIEs.size(); } 20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t numOfFDEs() const; 210affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const CIEMap& getCIEMap() const { return m_FoundCIEs; } 21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIEMap& getCIEMap() { return m_FoundCIEs; } 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic: 21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t computeOffsetSize(); 216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// getDataStartOffset - Get the offset after length and ID field. 21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// The offset is 8byte for 32b, and 16byte for 64b. 21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// We can just use "BITCLASS/4" to represent offset. 22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines template <size_t BITCLASS> 22187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static size_t getDataStartOffset() { return BITCLASS / 4; } 22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // We needs to check if it is mergeable and check personality name 22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // before merging them. The important note is we must do this after 22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // ALL readSections done, that is the reason why we don't check this 22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // immediately when reading. 22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setupAttributes(const LDSection* reloc_sect); 22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void removeDiscardedFDE(CIE& pCIE, const LDSection* pRelocEhFrameSect); 23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate: 23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void removeAndUpdateCIEForFDE(EhFrame& pInFrame, CIE& pInCIE, CIE& pOutCIE, 23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LDSection* reloc_sect); 23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void moveInputFragments(EhFrame& pInFrame); 23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void moveInputFragments(EhFrame& pInFrame, CIE& pInCIE, CIE* pOutCIE = 0); 236affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 237affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate: 2386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines LDSection* m_pSection; 23922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao SectionData* m_pSectionData; 240affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 24187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // Each eh_frame has a list of CIE, and each CIE has a list of FDE 24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // pointing to the CIE itself. This is used by management when we are 24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // processing eh_frame merge. 24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // However, don't forget we need to handle the Fragments inside SectionData 24587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // correctly since they are truly used when output emission. 24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao CIEList m_CIEs; 24787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 24887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // We need this map to find the corresponding CIE for FDE. Not all FDE point 24987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // to the nearest CIE. 25087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CIEMap m_FoundCIEs; 251affc150dc44fab1911775a49636d0ce85333b634Zonr Chang}; 252affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 25387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesbool operator==(const EhFrame::CIE&, const EhFrame::CIE&); 25487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 255affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld 256affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 257affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif 258affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 259