summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'libbacktrace/include/backtrace/BacktraceMap.h')
-rw-r--r--libbacktrace/include/backtrace/BacktraceMap.h54
1 files changed, 46 insertions, 8 deletions
diff --git a/libbacktrace/include/backtrace/BacktraceMap.h b/libbacktrace/include/backtrace/BacktraceMap.h
index d0783929a..4ae68dde0 100644
--- a/libbacktrace/include/backtrace/BacktraceMap.h
+++ b/libbacktrace/include/backtrace/BacktraceMap.h
@@ -30,6 +30,7 @@
30#endif 30#endif
31 31
32#include <deque> 32#include <deque>
33#include <iterator>
33#include <string> 34#include <string>
34#include <vector> 35#include <vector>
35 36
@@ -61,6 +62,49 @@ public:
61 62
62 virtual ~BacktraceMap(); 63 virtual ~BacktraceMap();
63 64
65 class iterator : public std::iterator<std::bidirectional_iterator_tag, backtrace_map_t*> {
66 public:
67 iterator(BacktraceMap* map, size_t index) : map_(map), index_(index) {}
68
69 iterator& operator++() {
70 index_++;
71 return *this;
72 }
73 iterator& operator++(int increment) {
74 index_ += increment;
75 return *this;
76 }
77 iterator& operator--() {
78 index_--;
79 return *this;
80 }
81 iterator& operator--(int decrement) {
82 index_ -= decrement;
83 return *this;
84 }
85
86 bool operator==(const iterator& rhs) { return this->index_ == rhs.index_; }
87 bool operator!=(const iterator& rhs) { return this->index_ != rhs.index_; }
88
89 const backtrace_map_t* operator*() {
90 if (index_ >= map_->size()) {
91 return nullptr;
92 }
93 backtrace_map_t* map = &map_->maps_[index_];
94 if (map->load_bias == static_cast<uintptr_t>(-1)) {
95 map->load_bias = map_->GetLoadBias(index_);
96 }
97 return map;
98 }
99
100 private:
101 BacktraceMap* map_ = nullptr;
102 size_t index_ = 0;
103 };
104
105 iterator begin() { return iterator(this, 0); }
106 iterator end() { return iterator(this, maps_.size()); }
107
64 // Fill in the map data structure for the given address. 108 // Fill in the map data structure for the given address.
65 virtual void FillIn(uintptr_t addr, backtrace_map_t* map); 109 virtual void FillIn(uintptr_t addr, backtrace_map_t* map);
66 110
@@ -89,14 +133,6 @@ public:
89 virtual void LockIterator() {} 133 virtual void LockIterator() {}
90 virtual void UnlockIterator() {} 134 virtual void UnlockIterator() {}
91 135
92 typedef std::deque<backtrace_map_t>::iterator iterator;
93 iterator begin() { return maps_.begin(); }
94 iterator end() { return maps_.end(); }
95
96 typedef std::deque<backtrace_map_t>::const_iterator const_iterator;
97 const_iterator begin() const { return maps_.begin(); }
98 const_iterator end() const { return maps_.end(); }
99
100 size_t size() const { return maps_.size(); } 136 size_t size() const { return maps_.size(); }
101 137
102 virtual bool Build(); 138 virtual bool Build();
@@ -114,6 +150,8 @@ public:
114 protected: 150 protected:
115 BacktraceMap(pid_t pid); 151 BacktraceMap(pid_t pid);
116 152
153 virtual uint64_t GetLoadBias(size_t /* index */) { return 0; }
154
117 virtual bool ParseLine(const char* line, backtrace_map_t* map); 155 virtual bool ParseLine(const char* line, backtrace_map_t* map);
118 156
119 pid_t pid_; 157 pid_t pid_;