toolkit/crashreporter/google-breakpad/src/processor/static_range_map.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 // Copyright (c) 2010, Google Inc.
michael@0 2 // All rights reserved.
michael@0 3 //
michael@0 4 // Redistribution and use in source and binary forms, with or without
michael@0 5 // modification, are permitted provided that the following conditions are
michael@0 6 // met:
michael@0 7 //
michael@0 8 // * Redistributions of source code must retain the above copyright
michael@0 9 // notice, this list of conditions and the following disclaimer.
michael@0 10 // * Redistributions in binary form must reproduce the above
michael@0 11 // copyright notice, this list of conditions and the following disclaimer
michael@0 12 // in the documentation and/or other materials provided with the
michael@0 13 // distribution.
michael@0 14 // * Neither the name of Google Inc. nor the names of its
michael@0 15 // contributors may be used to endorse or promote products derived from
michael@0 16 // this software without specific prior written permission.
michael@0 17 //
michael@0 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
michael@0 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
michael@0 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
michael@0 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
michael@0 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
michael@0 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
michael@0 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
michael@0 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
michael@0 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
michael@0 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
michael@0 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
michael@0 29 //
michael@0 30 // static_range_map.h: StaticRangeMap.
michael@0 31 //
michael@0 32 // StaticRangeMap is similar as RangeMap. However, StaticRangeMap wraps a
michael@0 33 // StaticMap instead of std::map, and does not support dynamic operations like
michael@0 34 // StoreRange(...). StaticRangeMap provides same Retrieve*() interfaces as
michael@0 35 // RangeMap. Please see range_map.h for more documentation.
michael@0 36 //
michael@0 37 // Author: Siyang Xie (lambxsy@google.com)
michael@0 38
michael@0 39 #ifndef PROCESSOR_STATIC_RANGE_MAP_H__
michael@0 40 #define PROCESSOR_STATIC_RANGE_MAP_H__
michael@0 41
michael@0 42
michael@0 43 #include "processor/static_map-inl.h"
michael@0 44
michael@0 45 namespace google_breakpad {
michael@0 46
michael@0 47 // AddressType is basic type, e.g.: integer types, pointers etc
michael@0 48 // EntryType could be a complex type, so we retrieve its pointer instead.
michael@0 49 template<typename AddressType, typename EntryType>
michael@0 50 class StaticRangeMap {
michael@0 51 public:
michael@0 52 StaticRangeMap(): map_() { }
michael@0 53 explicit StaticRangeMap(const char *memory): map_(memory) { }
michael@0 54
michael@0 55 // Locates the range encompassing the supplied address. If there is
michael@0 56 // no such range, returns false. entry_base and entry_size, if non-NULL,
michael@0 57 // are set to the base and size of the entry's range.
michael@0 58 bool RetrieveRange(const AddressType &address, const EntryType *&entry,
michael@0 59 AddressType *entry_base, AddressType *entry_size) const;
michael@0 60
michael@0 61 // Locates the range encompassing the supplied address, if one exists.
michael@0 62 // If no range encompasses the supplied address, locates the nearest range
michael@0 63 // to the supplied address that is lower than the address. Returns false
michael@0 64 // if no range meets these criteria. entry_base and entry_size, if
michael@0 65 // non-NULL, are set to the base and size of the entry's range.
michael@0 66 bool RetrieveNearestRange(const AddressType &address, const EntryType *&entry,
michael@0 67 AddressType *entry_base, AddressType *entry_size)
michael@0 68 const;
michael@0 69
michael@0 70 // Treating all ranges as a list ordered by the address spaces that they
michael@0 71 // occupy, locates the range at the index specified by index. Returns
michael@0 72 // false if index is larger than the number of ranges stored. entry_base
michael@0 73 // and entry_size, if non-NULL, are set to the base and size of the entry's
michael@0 74 // range.
michael@0 75 //
michael@0 76 // RetrieveRangeAtIndex is not optimized for speedy operation.
michael@0 77 bool RetrieveRangeAtIndex(int index, const EntryType *&entry,
michael@0 78 AddressType *entry_base, AddressType *entry_size)
michael@0 79 const;
michael@0 80
michael@0 81 // Returns the number of ranges stored in the RangeMap.
michael@0 82 inline int GetCount() const { return map_.size(); }
michael@0 83
michael@0 84 private:
michael@0 85 friend class ModuleComparer;
michael@0 86 class Range {
michael@0 87 public:
michael@0 88 AddressType base() const {
michael@0 89 return *(reinterpret_cast<const AddressType*>(this));
michael@0 90 }
michael@0 91 const EntryType* entryptr() const {
michael@0 92 return reinterpret_cast<const EntryType*>(this + sizeof(AddressType));
michael@0 93 }
michael@0 94 };
michael@0 95
michael@0 96 // Convenience types.
michael@0 97 typedef StaticRangeMap* SelfPtr;
michael@0 98 typedef StaticMap<AddressType, Range> AddressToRangeMap;
michael@0 99 typedef typename AddressToRangeMap::const_iterator MapConstIterator;
michael@0 100
michael@0 101 AddressToRangeMap map_;
michael@0 102 };
michael@0 103
michael@0 104 } // namespace google_breakpad
michael@0 105
michael@0 106 #endif // PROCESSOR_STATIC_RANGE_MAP_H__

mercurial