OLD | NEW |
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 Loading... |
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 |
OLD | NEW |