aboutsummaryrefslogtreecommitdiff
path: root/src/processor/basic_code_modules.cc
diff options
context:
space:
mode:
authorIvan Penkov <ivanpe@chromium.org>2016-06-05 22:41:10 -0700
committerIvan Penkov <ivanpe@chromium.org>2016-06-05 22:41:10 -0700
commit240ed57ee1ac6a87b91526b8331717d494801826 (patch)
tree93c085a3fd036fde3bee99c4496db1adae5d2cc6 /src/processor/basic_code_modules.cc
parentMake the getting started section in the README better (diff)
downloadbreakpad-240ed57ee1ac6a87b91526b8331717d494801826.tar.xz
Adding support for overlapping ranges to RangeMap.
When enabled, adding of a new range that overlaps with an existing one can be a successful operation. The range which ends at the higher address will be shrunk down by moving its start position to a higher address so that it does not overlap anymore. This change is required to fix http://crbug/611824. The actual fix will come in a separate CL. R=mmandlis@chromium.org Review URL: https://codereview.chromium.org/2029953003 .
Diffstat (limited to 'src/processor/basic_code_modules.cc')
-rw-r--r--src/processor/basic_code_modules.cc19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/processor/basic_code_modules.cc b/src/processor/basic_code_modules.cc
index 40b45a8b..00dc6fcb 100644
--- a/src/processor/basic_code_modules.cc
+++ b/src/processor/basic_code_modules.cc
@@ -46,8 +46,7 @@
namespace google_breakpad {
BasicCodeModules::BasicCodeModules(const CodeModules *that)
- : main_address_(0),
- map_(new RangeMap<uint64_t, linked_ptr<const CodeModule> >()) {
+ : main_address_(0), map_() {
BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires "
"|that|";
assert(that);
@@ -66,30 +65,27 @@ BasicCodeModules::BasicCodeModules(const CodeModules *that)
// GetModuleAtSequence.
linked_ptr<const CodeModule> module(
that->GetModuleAtIndex(module_sequence)->Copy());
- if (!map_->StoreRange(module->base_address(), module->size(), module)) {
+ if (!map_.StoreRange(module->base_address(), module->size(), module)) {
BPLOG(ERROR) << "Module " << module->code_file() <<
" could not be stored";
}
}
}
-BasicCodeModules::BasicCodeModules()
- : main_address_(0),
- map_(new RangeMap<uint64_t, linked_ptr<const CodeModule> >()) {
-}
+BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { }
BasicCodeModules::~BasicCodeModules() {
- delete map_;
}
unsigned int BasicCodeModules::module_count() const {
- return map_->GetCount();
+ return map_.GetCount();
}
const CodeModule* BasicCodeModules::GetModuleForAddress(
uint64_t address) const {
linked_ptr<const CodeModule> module;
- if (!map_->RetrieveRange(address, &module, NULL, NULL)) {
+ if (!map_.RetrieveRange(address, &module, NULL /* base */, NULL /* delta */,
+ NULL /* size */)) {
BPLOG(INFO) << "No module at " << HexString(address);
return NULL;
}
@@ -104,7 +100,8 @@ const CodeModule* BasicCodeModules::GetMainModule() const {
const CodeModule* BasicCodeModules::GetModuleAtSequence(
unsigned int sequence) const {
linked_ptr<const CodeModule> module;
- if (!map_->RetrieveRangeAtIndex(sequence, &module, NULL, NULL)) {
+ if (!map_.RetrieveRangeAtIndex(sequence, &module, NULL /* base */,
+ NULL /* delta */, NULL /* size */)) {
BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence;
return NULL;
}