| Index: src/processor/basic_code_modules.cc
|
| diff --git a/src/processor/basic_code_modules.cc b/src/processor/basic_code_modules.cc
|
| index 00dc6fcb7f2f8de67a6d2a6fbbb7998e2c8f4444..48d971677cda184f551ae3ca71ee3a86f3eef081 100644
|
| --- a/src/processor/basic_code_modules.cc
|
| +++ b/src/processor/basic_code_modules.cc
|
| @@ -38,6 +38,8 @@
|
|
|
| #include <assert.h>
|
|
|
| +#include <vector>
|
| +
|
| #include "google_breakpad/processor/code_module.h"
|
| #include "processor/linked_ptr.h"
|
| #include "processor/logging.h"
|
| @@ -45,31 +47,50 @@
|
|
|
| namespace google_breakpad {
|
|
|
| +using std::vector;
|
| +
|
| BasicCodeModules::BasicCodeModules(const CodeModules *that)
|
| : main_address_(0), map_() {
|
| BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires "
|
| "|that|";
|
| assert(that);
|
|
|
| + map_.SetEnableShrinkDown(that->IsModuleShrinkEnabled());
|
| +
|
| const CodeModule *main_module = that->GetMainModule();
|
| if (main_module)
|
| main_address_ = main_module->base_address();
|
|
|
| unsigned int count = that->module_count();
|
| - for (unsigned int module_sequence = 0;
|
| - module_sequence < count;
|
| - ++module_sequence) {
|
| + for (unsigned int i = 0; i < count; ++i) {
|
| // Make a copy of the module and insert it into the map. Use
|
| // GetModuleAtIndex because ordering is unimportant when slurping the
|
| // entire list, and GetModuleAtIndex may be faster than
|
| // GetModuleAtSequence.
|
| - linked_ptr<const CodeModule> module(
|
| - that->GetModuleAtIndex(module_sequence)->Copy());
|
| + linked_ptr<const CodeModule> module(that->GetModuleAtIndex(i)->Copy());
|
| if (!map_.StoreRange(module->base_address(), module->size(), module)) {
|
| - BPLOG(ERROR) << "Module " << module->code_file() <<
|
| - " could not be stored";
|
| + BPLOG(ERROR) << "Module " << module->code_file()
|
| + << " could not be stored";
|
| + }
|
| + }
|
| +
|
| + // Report modules with shrunk ranges.
|
| + for (unsigned int i = 0; i < count; ++i) {
|
| + linked_ptr<const CodeModule> module(that->GetModuleAtIndex(i)->Copy());
|
| + uint64_t delta = 0;
|
| + if (map_.RetrieveRange(module->base_address() + module->size() - 1,
|
| + &module, NULL /* base */, &delta, NULL /* size */) &&
|
| + delta > 0) {
|
| + BPLOG(INFO) << "The range for module " << module->code_file()
|
| + << " was shrunk down by " << HexString(delta) << " bytes.";
|
| + linked_ptr<CodeModule> shrunk_range_module(module->Copy());
|
| + shrunk_range_module->SetShrinkDownDelta(delta);
|
| + shrunk_range_modules_.push_back(shrunk_range_module);
|
| }
|
| }
|
| +
|
| + // TODO(ivanpe): Report modules with conflicting ranges. The list of such
|
| + // modules should be copied from |that|.
|
| }
|
|
|
| BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { }
|
| @@ -122,4 +143,13 @@ const CodeModules* BasicCodeModules::Copy() const {
|
| return new BasicCodeModules(this);
|
| }
|
|
|
| +vector<linked_ptr<const CodeModule> >
|
| +BasicCodeModules::GetShrunkRangeModules() const {
|
| + return shrunk_range_modules_;
|
| +}
|
| +
|
| +bool BasicCodeModules::IsModuleShrinkEnabled() const {
|
| + return map_.IsShrinkDownEnabled();
|
| +}
|
| +
|
| } // namespace google_breakpad
|
|
|