| 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 20 matching lines...) Expand all  Loading... | 
|   31 // were loaded into a single process. |   31 // were loaded into a single process. | 
|   32 // |   32 // | 
|   33 // See basic_code_modules.h for documentation. |   33 // See basic_code_modules.h for documentation. | 
|   34 // |   34 // | 
|   35 // Author: Mark Mentovai |   35 // Author: Mark Mentovai | 
|   36  |   36  | 
|   37 #include "processor/basic_code_modules.h" |   37 #include "processor/basic_code_modules.h" | 
|   38  |   38  | 
|   39 #include <assert.h> |   39 #include <assert.h> | 
|   40  |   40  | 
 |   41 #include <vector> | 
 |   42  | 
|   41 #include "google_breakpad/processor/code_module.h" |   43 #include "google_breakpad/processor/code_module.h" | 
|   42 #include "processor/linked_ptr.h" |   44 #include "processor/linked_ptr.h" | 
|   43 #include "processor/logging.h" |   45 #include "processor/logging.h" | 
|   44 #include "processor/range_map-inl.h" |   46 #include "processor/range_map-inl.h" | 
|   45  |   47  | 
|   46 namespace google_breakpad { |   48 namespace google_breakpad { | 
|   47  |   49  | 
 |   50 using std::vector; | 
 |   51  | 
|   48 BasicCodeModules::BasicCodeModules(const CodeModules *that) |   52 BasicCodeModules::BasicCodeModules(const CodeModules *that) | 
|   49     : main_address_(0), map_() { |   53     : main_address_(0), map_() { | 
|   50   BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires " |   54   BPLOG_IF(ERROR, !that) << "BasicCodeModules::BasicCodeModules requires " | 
|   51                             "|that|"; |   55                             "|that|"; | 
|   52   assert(that); |   56   assert(that); | 
|   53  |   57  | 
 |   58   map_.SetEnableShrinkDown(that->IsModuleShrinkEnabled()); | 
 |   59  | 
|   54   const CodeModule *main_module = that->GetMainModule(); |   60   const CodeModule *main_module = that->GetMainModule(); | 
|   55   if (main_module) |   61   if (main_module) | 
|   56     main_address_ = main_module->base_address(); |   62     main_address_ = main_module->base_address(); | 
|   57  |   63  | 
|   58   unsigned int count = that->module_count(); |   64   unsigned int count = that->module_count(); | 
|   59   for (unsigned int module_sequence = 0; |   65   for (unsigned int i = 0; i < count; ++i) { | 
|   60        module_sequence < count; |  | 
|   61        ++module_sequence) { |  | 
|   62     // Make a copy of the module and insert it into the map.  Use |   66     // Make a copy of the module and insert it into the map.  Use | 
|   63     // GetModuleAtIndex because ordering is unimportant when slurping the |   67     // GetModuleAtIndex because ordering is unimportant when slurping the | 
|   64     // entire list, and GetModuleAtIndex may be faster than |   68     // entire list, and GetModuleAtIndex may be faster than | 
|   65     // GetModuleAtSequence. |   69     // GetModuleAtSequence. | 
|   66     linked_ptr<const CodeModule> module( |   70     linked_ptr<const CodeModule> module(that->GetModuleAtIndex(i)->Copy()); | 
|   67         that->GetModuleAtIndex(module_sequence)->Copy()); |  | 
|   68     if (!map_.StoreRange(module->base_address(), module->size(), module)) { |   71     if (!map_.StoreRange(module->base_address(), module->size(), module)) { | 
|   69       BPLOG(ERROR) << "Module " << module->code_file() << |   72       BPLOG(ERROR) << "Module " << module->code_file() | 
|   70                       " could not be stored"; |   73                    << " could not be stored"; | 
|   71     } |   74     } | 
|   72   } |   75   } | 
 |   76  | 
 |   77   // Report modules with shrunk ranges. | 
 |   78   for (unsigned int i = 0; i < count; ++i) { | 
 |   79     linked_ptr<const CodeModule> module(that->GetModuleAtIndex(i)->Copy()); | 
 |   80     uint64_t delta = 0; | 
 |   81     if (map_.RetrieveRange(module->base_address() + module->size() - 1, | 
 |   82                            &module, NULL /* base */, &delta, NULL /* size */) && | 
 |   83         delta > 0) { | 
 |   84       BPLOG(INFO) << "The range for module " << module->code_file() | 
 |   85                   << " was shrunk down by " << HexString(delta) << " bytes."; | 
 |   86       linked_ptr<CodeModule> shrunk_range_module(module->Copy()); | 
 |   87       shrunk_range_module->SetShrinkDownDelta(delta); | 
 |   88       shrunk_range_modules_.push_back(shrunk_range_module); | 
 |   89     } | 
 |   90   } | 
 |   91  | 
 |   92   // TODO(ivanpe): Report modules with conflicting ranges.  The list of such | 
 |   93   // modules should be copied from |that|. | 
|   73 } |   94 } | 
|   74  |   95  | 
|   75 BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { } |   96 BasicCodeModules::BasicCodeModules() : main_address_(0), map_() { } | 
|   76  |   97  | 
|   77 BasicCodeModules::~BasicCodeModules() { |   98 BasicCodeModules::~BasicCodeModules() { | 
|   78 } |   99 } | 
|   79  |  100  | 
|   80 unsigned int BasicCodeModules::module_count() const { |  101 unsigned int BasicCodeModules::module_count() const { | 
|   81   return map_.GetCount(); |  102   return map_.GetCount(); | 
|   82 } |  103 } | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  115   // way to walk the list of CodeModule objects.  Implement GetModuleAtIndex |  136   // way to walk the list of CodeModule objects.  Implement GetModuleAtIndex | 
|  116   // using GetModuleAtSequence, which meets all of the requirements, and |  137   // using GetModuleAtSequence, which meets all of the requirements, and | 
|  117   // in addition, guarantees ordering. |  138   // in addition, guarantees ordering. | 
|  118   return GetModuleAtSequence(index); |  139   return GetModuleAtSequence(index); | 
|  119 } |  140 } | 
|  120  |  141  | 
|  121 const CodeModules* BasicCodeModules::Copy() const { |  142 const CodeModules* BasicCodeModules::Copy() const { | 
|  122   return new BasicCodeModules(this); |  143   return new BasicCodeModules(this); | 
|  123 } |  144 } | 
|  124  |  145  | 
 |  146 vector<linked_ptr<const CodeModule> > | 
 |  147 BasicCodeModules::GetShrunkRangeModules() const { | 
 |  148   return shrunk_range_modules_; | 
 |  149 } | 
 |  150  | 
 |  151 bool BasicCodeModules::IsModuleShrinkEnabled() const { | 
 |  152   return map_.IsShrinkDownEnabled(); | 
 |  153 } | 
 |  154  | 
|  125 }  // namespace google_breakpad |  155 }  // namespace google_breakpad | 
| OLD | NEW |