1a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines//===- ARMException.h -----------------------------------------------------===// 2a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// 3a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// The MCLinker Project 4a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// 5a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// This file is distributed under the University of Illinois Open Source 6a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// License. See LICENSE.TXT for details. 7a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines// 8a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines//===----------------------------------------------------------------------===// 9a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#ifndef TARGET_ARM_ARMEXCEPTION_H_ 10a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#define TARGET_ARM_ARMEXCEPTION_H_ 11a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 12a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include <llvm/ADT/PointerUnion.h> 13a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include <llvm/ADT/StringRef.h> 14a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 15a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include <map> 16a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include <memory> 17a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#include <string> 18a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 19a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesnamespace mcld { 20a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 21a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass Fragment; 22a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass Input; 23a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass LDSection; 24a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass RegionFragment; 25a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass RelocData; 26a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 27a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines/// ARMExSectionTuple - Tuple of associated exception handling sections 28a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass ARMExSectionTuple { 29a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines public: 30a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple() 31a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines : m_pTextSection(NULL), 32a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExIdxSection(NULL), 33a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExTabSection(NULL), 34a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pRelExIdxSection(NULL), 35a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pRelExTabSection(NULL) { 36a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 37a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 38a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* getTextSection() const { 39a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pTextSection; 40a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 41a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 42a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* getExIdxSection() const { 43a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExIdxSection; 44a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 45a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 46a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* getExTabSection() const { 47a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExTabSection; 48a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 49a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 50a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* getRelExIdxSection() const { 51a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pRelExIdxSection; 52a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 53a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 54a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* getRelExTabSection() const { 55a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pRelExTabSection; 56a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 57a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 58a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setTextSection(LDSection* pSection) { 59a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pTextSection = pSection; 60a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 61a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 62a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExIdxSection(LDSection* pSection) { 63a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExIdxSection = pSection; 64a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 65a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 66a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExTabSection(LDSection* pSection) { 67a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExTabSection = pSection; 68a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 69a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 70a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setRelExIdxSection(LDSection* pSection) { 71a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pRelExIdxSection = pSection; 72a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 73a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 74a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setRelExTabSection(LDSection* pSection) { 75a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pRelExTabSection = pSection; 76a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 77a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 78a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* getTextFragment() const { 79a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pTextFragment; 80a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 81a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 82a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* getExIdxFragment() const { 83a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExIdxFragment; 84a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 85a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 86a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* getExTabFragment() const { 87a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExTabFragment; 88a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 89a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 90a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RelocData* getExIdxRelocData() const { 91a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExIdxRelocData; 92a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 93a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 94a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RelocData* getExTabRelocData() const { 95a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return m_pExTabRelocData; 96a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 97a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 98a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setTextFragment(RegionFragment* pFragment) { 99a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pTextFragment = pFragment; 100a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 101a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 102a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExIdxFragment(RegionFragment* pFragment) { 103a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExIdxFragment = pFragment; 104a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 105a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 106a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExTabFragment(RegionFragment* pFragment) { 107a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExTabFragment = pFragment; 108a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 109a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 110a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExIdxRelocData(RelocData* pRelocData) { 111a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExIdxRelocData = pRelocData; 112a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 113a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 114a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void setExTabRelocData(RelocData* pRelocData) { 115a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines m_pExTabRelocData = pRelocData; 116a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 117a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 118a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines private: 119a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // .text section 120a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines union { 121a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* m_pTextSection; 122a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* m_pTextFragment; 123a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines }; 124a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 125a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // .ARM.exidx section 126a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines union { 127a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* m_pExIdxSection; 128a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* m_pExIdxFragment; 129a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines }; 130a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 131a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // .ARM.extab section 132a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines union { 133a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* m_pExTabSection; 134a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RegionFragment* m_pExTabFragment; 135a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines }; 136a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 137a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // .rel.ARM.exidx section 138a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines union { 139a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* m_pRelExIdxSection; 140a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RelocData* m_pExIdxRelocData; 141a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines }; 142a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 143a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // .rel.ARM.extab section 144a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines union { 145a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines LDSection* m_pRelExTabSection; 146a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines RelocData* m_pExTabRelocData; 147a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines }; 148a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines}; 149a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 150a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines/// ARMInputExMap - ARM exception handling data of an Input 151a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass ARMInputExMap { 152a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines public: 153a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines typedef std::map<std::string, std::unique_ptr<ARMExSectionTuple> > NameMap; 154a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines typedef NameMap::iterator iterator; 155a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines typedef NameMap::const_iterator const_iterator; 156a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 157a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines public: 158a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMInputExMap() { } 159a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 160a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// get - Get the ARMExSectionTuple by the corresponding text section name. 161a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// As an exception, to get the ARMExSectionTuple for .text section, use "" 162a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// as the section name instead. 163a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* get(const char* pName) const { 164a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines NameMap::const_iterator it = m_NameToExData.find(pName); 165a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines if (it == m_NameToExData.end()) { 166a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return NULL; 167a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 168a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return it->second.get(); 169a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 170a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 171a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getByExSection(llvm::StringRef pName) const { 172a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines assert((pName.startswith(".ARM.exidx") || 173a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines pName.startswith(".ARM.extab")) && 174a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines "Not a .ARM.exidx section name"); 175a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return get(pName.data() + sizeof(".ARM.ex***") - 1); 176a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 177a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 178a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getByRelExSection(llvm::StringRef pName) const { 179a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines assert((pName.startswith(".rel.ARM.exidx") || 180a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines pName.startswith(".rel.ARM.extab")) && 181a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines "Not a .rel.ARM.exidx section name"); 182a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return get(pName.data() + sizeof(".rel.ARM.ex***") - 1); 183a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 184a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 185a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// getOrCreate - Get an existing or create a new ARMExSectionTuple which is 186a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// associated with the text section name. As an exception, use "" as the 187a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// section name for .text section. 188a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getOrCreate(const char* pName) { 189a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines std::unique_ptr<ARMExSectionTuple>& result = m_NameToExData[pName]; 190a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines if (!result) { 191a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines result.reset(new ARMExSectionTuple()); 192a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 193a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return result.get(); 194a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 195a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 196a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getOrCreateByExSection(llvm::StringRef pName) { 197a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines assert((pName.startswith(".ARM.exidx") || 198a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines pName.startswith(".ARM.extab")) && 199a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines "Not a .ARM.exidx section name"); 200a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return getOrCreate(pName.data() + sizeof(".ARM.ex***") - 1); 201a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 202a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 203a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getOrCreateByRelExSection(llvm::StringRef pName) { 204a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines assert((pName.startswith(".rel.ARM.exidx") || 205a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines pName.startswith(".rel.ARM.extab")) && 206a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines "Not a .rel.ARM.exidx section name"); 207a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return getOrCreate(pName.data() + sizeof(".rel.ARM.ex***") - 1); 208a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 209a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 210a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// begin - return the iterator to the begin of the map 211a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines iterator begin() { return m_NameToExData.begin(); } 212a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines const_iterator begin() const { return m_NameToExData.begin(); } 213a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 214a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// end - return the iterator to the end of the map 215a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines iterator end() { return m_NameToExData.end(); } 216a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines const_iterator end() const { return m_NameToExData.end(); } 217a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 218a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines /// erase - remove an entry from the map 219a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void erase(iterator it) { m_NameToExData.erase(it); } 220a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 221a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines private: 222a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines NameMap m_NameToExData; 223a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines}; 224a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 225a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines/// ARMExData - ARM exception handling data of a module 226a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hinesclass ARMExData { 227a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines private: 228a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines typedef std::map<Input*, std::unique_ptr<ARMInputExMap> > InputMap; 229a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 230a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines typedef std::map<const Fragment*, ARMExSectionTuple*> ExIdxMap; 231a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 232a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines public: 233a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExData() { } 234a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 235a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // addInputMap - register the ARMInputExMap with associated pInput 236a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines void addInputMap(Input* pInput, 237a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines std::unique_ptr<ARMInputExMap>&& pExMap); 238a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 239a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // getInputMap - get the ARMInputExMap corresponding to pInput 240a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMInputExMap* getInputMap(Input* pInput) const { 241a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines InputMap::const_iterator it = m_Inputs.find(pInput); 242a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines if (it == m_Inputs.end()) { 243a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return NULL; 244a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 245a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return it->second.get(); 246a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 247a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 248a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // getTupleByExIdx - get the ARMExSectionTuple corresponding to pExIdxFragment 249a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ARMExSectionTuple* getTupleByExIdx(const Fragment* pExIdxFragment) const { 250a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ExIdxMap::const_iterator it = m_ExIdxToTuple.find(pExIdxFragment); 251a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines if (it == m_ExIdxToTuple.end()) { 252a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return NULL; 253a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 254a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines return it->second; 255a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines } 256a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 257a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines private: 258a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // Map from Input to ARMInputExMap 259a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines InputMap m_Inputs; 260a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 261a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines // Map from .ARM.exidx RegionFragment to ARMExSectionTuple 262a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines ExIdxMap m_ExIdxToTuple; 263a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines}; 264a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 265a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines} // namespace mcld 266a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines 267a6c24dff8b7fa2551a3a885e77a2e814f5b764a2Stephen Hines#endif // TARGET_ARM_ARMEXCEPTION_H_ 268