108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Copyright (c) 2010, Google Inc. 208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// All rights reserved. 308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without 508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// modification, are permitted provided that the following conditions are 608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// met: 708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// * Redistributions of source code must retain the above copyright 908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer. 1008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// * Redistributions in binary form must reproduce the above 1108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer 1208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// in the documentation and/or other materials provided with the 1308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// distribution. 1408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// * Neither the name of Google Inc. nor the names of its 1508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from 1608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// this software without specific prior written permission. 1708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 1808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 3008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// static_range_map.h: StaticRangeMap. 3108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 3208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// StaticRangeMap is similar as RangeMap. However, StaticRangeMap wraps a 3308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// StaticMap instead of std::map, and does not support dynamic operations like 3408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// StoreRange(...). StaticRangeMap provides same Retrieve*() interfaces as 3508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// RangeMap. Please see range_map.h for more documentation. 3608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// 3708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com) 3808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 3908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#ifndef PROCESSOR_STATIC_RANGE_MAP_H__ 4008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#define PROCESSOR_STATIC_RANGE_MAP_H__ 4108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 4208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 4308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#include "processor/static_map-inl.h" 4408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 4508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comnamespace google_breakpad { 4608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 4708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// AddressType is basic type, e.g.: integer types, pointers etc 4808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com// EntryType could be a complex type, so we retrieve its pointer instead. 4908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comtemplate<typename AddressType, typename EntryType> 5008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.comclass StaticRangeMap { 5108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com public: 5208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com StaticRangeMap(): map_() { } 5308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com explicit StaticRangeMap(const char *memory): map_(memory) { } 5408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 5508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // Locates the range encompassing the supplied address. If there is 5608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // no such range, returns false. entry_base and entry_size, if non-NULL, 5708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // are set to the base and size of the entry's range. 5808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com bool RetrieveRange(const AddressType &address, const EntryType *&entry, 5908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com AddressType *entry_base, AddressType *entry_size) const; 6008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 6108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // Locates the range encompassing the supplied address, if one exists. 6208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // If no range encompasses the supplied address, locates the nearest range 6308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // to the supplied address that is lower than the address. Returns false 6408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // if no range meets these criteria. entry_base and entry_size, if 6508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // non-NULL, are set to the base and size of the entry's range. 6608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com bool RetrieveNearestRange(const AddressType &address, const EntryType *&entry, 6708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com AddressType *entry_base, AddressType *entry_size) 6808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com const; 6908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 7008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // Treating all ranges as a list ordered by the address spaces that they 7108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // occupy, locates the range at the index specified by index. Returns 7208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // false if index is larger than the number of ranges stored. entry_base 7308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // and entry_size, if non-NULL, are set to the base and size of the entry's 7408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // range. 7508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // 7608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // RetrieveRangeAtIndex is not optimized for speedy operation. 7708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com bool RetrieveRangeAtIndex(int index, const EntryType *&entry, 7808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com AddressType *entry_base, AddressType *entry_size) 7908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com const; 8008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 8108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // Returns the number of ranges stored in the RangeMap. 822971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com inline int GetCount() const { return map_.size(); } 8308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 8408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com private: 8508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com friend class ModuleComparer; 8608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com class Range { 8708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com public: 8808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com AddressType base() const { 8908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com return *(reinterpret_cast<const AddressType*>(this)); 9008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com } 9108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com const EntryType* entryptr() const { 9208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com return reinterpret_cast<const EntryType*>(this + sizeof(AddressType)); 9308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com } 9408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com }; 9508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 9608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com // Convenience types. 9708730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com typedef StaticRangeMap* SelfPtr; 9808730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com typedef StaticMap<AddressType, Range> AddressToRangeMap; 9908730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com typedef typename AddressToRangeMap::const_iterator MapConstIterator; 10008730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 10108730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com AddressToRangeMap map_; 10208730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com}; 10308730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 10408730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com} // namespace google_breakpad 10508730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com 10608730fc9a639e5b962f9a803ae8f5e91630e9484SiyangXie@gmail.com#endif // PROCESSOR_STATIC_RANGE_MAP_H__ 107