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