Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/processor/basic_code_modules.cc

Issue 2029953003: Adding support for overlapping ranges to RangeMap. (Closed) Base URL: https://chromium.googlesource.com/breakpad/breakpad.git@master
Patch Set: Last patch set after git pull. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/processor/basic_code_modules.h ('k') | src/processor/basic_source_line_resolver.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006, Google Inc. 1 // Copyright (c) 2006, Google Inc.
2 // All rights reserved. 2 // All rights reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // * Redistributions of source code must retain the above copyright 8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer. 9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above 10 // * Redistributions in binary form must reproduce the above
(...skipping 28 matching lines...) Expand all
39 #include <assert.h> 39 #include <assert.h>
40 40
41 #include "google_breakpad/processor/code_module.h" 41 #include "google_breakpad/processor/code_module.h"
42 #include "processor/linked_ptr.h" 42 #include "processor/linked_ptr.h"
43 #include "processor/logging.h" 43 #include "processor/logging.h"
44 #include "processor/range_map-inl.h" 44 #include "processor/range_map-inl.h"
45 45
46 namespace google_breakpad { 46 namespace google_breakpad {
47 47
48 BasicCodeModules::BasicCodeModules(const CodeModules *that) 48 BasicCodeModules::BasicCodeModules(const CodeModules *that)
49 : main_address_(0), 49 : main_address_(0), map_() {
50 map_(new RangeMap<uint64_t, linked_ptr<const CodeModule> >()) {
51 BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires " 50 BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires "
52 "|that|"; 51 "|that|";
53 assert(that); 52 assert(that);
54 53
55 const CodeModule *main_module = that->GetMainModule(); 54 const CodeModule *main_module = that->GetMainModule();
56 if (main_module) 55 if (main_module)
57 main_address_ = main_module->base_address(); 56 main_address_ = main_module->base_address();
58 57
59 unsigned int count = that->module_count(); 58 unsigned int count = that->module_count();
60 for (unsigned int module_sequence = 0; 59 for (unsigned int module_sequence = 0;
61 module_sequence < count; 60 module_sequence < count;
62 ++module_sequence) { 61 ++module_sequence) {
63 // Make a copy of the module and insert it into the map. Use 62 // Make a copy of the module and insert it into the map. Use
64 // GetModuleAtIndex because ordering is unimportant when slurping the 63 // GetModuleAtIndex because ordering is unimportant when slurping the
65 // entire list, and GetModuleAtIndex may be faster than 64 // entire list, and GetModuleAtIndex may be faster than
66 // GetModuleAtSequence. 65 // GetModuleAtSequence.
67 linked_ptr<const CodeModule> module( 66 linked_ptr<const CodeModule> module(
68 that->GetModuleAtIndex(module_sequence)->Copy()); 67 that->GetModuleAtIndex(module_sequence)->Copy());
69 if (!map_->StoreRange(module->base_address(), module->size(), module)) { 68 if (!map_.StoreRange(module->base_address(), module->size(), module)) {
70 BPLOG(ERROR) << "Module " << module->code_file() << 69 BPLOG(ERROR) << "Module " << module->code_file() <<
71 " could not be stored"; 70 " could not be stored";
72 } 71 }
73 } 72 }
74 } 73 }
75 74
76 BasicCodeModules::BasicCodeModules() 75 BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { }
77 : main_address_(0),
78 map_(new RangeMap<uint64_t, linked_ptr<const CodeModule> >()) {
79 }
80 76
81 BasicCodeModules::~BasicCodeModules() { 77 BasicCodeModules::~BasicCodeModules() {
82 delete map_;
83 } 78 }
84 79
85 unsigned int BasicCodeModules::module_count() const { 80 unsigned int BasicCodeModules::module_count() const {
86 return map_->GetCount(); 81 return map_.GetCount();
87 } 82 }
88 83
89 const CodeModule* BasicCodeModules::GetModuleForAddress( 84 const CodeModule* BasicCodeModules::GetModuleForAddress(
90 uint64_t address) const { 85 uint64_t address) const {
91 linked_ptr<const CodeModule> module; 86 linked_ptr<const CodeModule> module;
92 if (!map_->RetrieveRange(address, &module, NULL, NULL)) { 87 if (!map_.RetrieveRange(address, &module, NULL /* base */, NULL /* delta */,
88 NULL /* size */)) {
93 BPLOG(INFO) << "No module at " << HexString(address); 89 BPLOG(INFO) << "No module at " << HexString(address);
94 return NULL; 90 return NULL;
95 } 91 }
96 92
97 return module.get(); 93 return module.get();
98 } 94 }
99 95
100 const CodeModule* BasicCodeModules::GetMainModule() const { 96 const CodeModule* BasicCodeModules::GetMainModule() const {
101 return GetModuleForAddress(main_address_); 97 return GetModuleForAddress(main_address_);
102 } 98 }
103 99
104 const CodeModule* BasicCodeModules::GetModuleAtSequence( 100 const CodeModule* BasicCodeModules::GetModuleAtSequence(
105 unsigned int sequence) const { 101 unsigned int sequence) const {
106 linked_ptr<const CodeModule> module; 102 linked_ptr<const CodeModule> module;
107 if (!map_->RetrieveRangeAtIndex(sequence, &module, NULL, NULL)) { 103 if (!map_.RetrieveRangeAtIndex(sequence, &module, NULL /* base */,
104 NULL /* delta */, NULL /* size */)) {
108 BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence; 105 BPLOG(ERROR) << "RetrieveRangeAtIndex failed for sequence " << sequence;
109 return NULL; 106 return NULL;
110 } 107 }
111 108
112 return module.get(); 109 return module.get();
113 } 110 }
114 111
115 const CodeModule* BasicCodeModules::GetModuleAtIndex( 112 const CodeModule* BasicCodeModules::GetModuleAtIndex(
116 unsigned int index) const { 113 unsigned int index) const {
117 // This class stores everything in a RangeMap, without any more-efficient 114 // This class stores everything in a RangeMap, without any more-efficient
118 // way to walk the list of CodeModule objects. Implement GetModuleAtIndex 115 // way to walk the list of CodeModule objects. Implement GetModuleAtIndex
119 // using GetModuleAtSequence, which meets all of the requirements, and 116 // using GetModuleAtSequence, which meets all of the requirements, and
120 // in addition, guarantees ordering. 117 // in addition, guarantees ordering.
121 return GetModuleAtSequence(index); 118 return GetModuleAtSequence(index);
122 } 119 }
123 120
124 const CodeModules* BasicCodeModules::Copy() const { 121 const CodeModules* BasicCodeModules::Copy() const {
125 return new BasicCodeModules(this); 122 return new BasicCodeModules(this);
126 } 123 }
127 124
128 } // namespace google_breakpad 125 } // namespace google_breakpad
OLDNEW
« no previous file with comments | « src/processor/basic_code_modules.h ('k') | src/processor/basic_source_line_resolver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698