2006-09-06 04:56:44 +02:00
|
|
|
// Copyright (C) 2006 Google Inc.
|
|
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
|
|
// range_map.h: Range maps.
|
|
|
|
|
//
|
|
|
|
|
// A range map associates a range of addresses with a specific object. This
|
|
|
|
|
// is useful when certain objects of variable size are located within an
|
|
|
|
|
// address space. The range map makes it simple to determine which object is
|
|
|
|
|
// associated with a specific address, which may be any address within the
|
|
|
|
|
// range associated with an object.
|
|
|
|
|
//
|
|
|
|
|
// Author: Mark Mentovai
|
|
|
|
|
|
|
|
|
|
#ifndef PROCESSOR_RANGE_MAP_H__
|
|
|
|
|
#define PROCESSOR_RANGE_MAP_H__
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace google_airbag {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<typename AddressType, typename EntryType>
|
|
|
|
|
class RangeMap {
|
2006-09-07 17:56:38 +02:00
|
|
|
public:
|
|
|
|
|
RangeMap() : map_() {}
|
|
|
|
|
|
|
|
|
|
// Inserts a range into the map. Returns false for a parameter error,
|
|
|
|
|
// or if the location of the range would conflict with a range already
|
|
|
|
|
// stored in the map.
|
2006-09-14 21:19:24 +02:00
|
|
|
bool StoreRange(const AddressType &base,
|
|
|
|
|
const AddressType &size,
|
|
|
|
|
const EntryType &entry);
|
2006-09-07 17:56:38 +02:00
|
|
|
|
|
|
|
|
// Locates the range encompassing the supplied address. If there is
|
|
|
|
|
// no such range, or if there is a parameter error, returns false.
|
2006-09-14 21:19:24 +02:00
|
|
|
bool RetrieveRange(const AddressType &address, EntryType *entry) const;
|
2006-09-07 17:56:38 +02:00
|
|
|
|
|
|
|
|
// Empties the range map, restoring it to the state it was when it was
|
|
|
|
|
// initially created.
|
|
|
|
|
void Clear();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
class Range {
|
|
|
|
|
public:
|
2006-09-14 21:19:24 +02:00
|
|
|
Range(const AddressType &base, const EntryType &entry)
|
2006-09-07 17:56:38 +02:00
|
|
|
: base_(base), entry_(entry) {}
|
|
|
|
|
|
|
|
|
|
AddressType base() const { return base_; }
|
|
|
|
|
EntryType entry() const { return entry_; }
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
// The base address of the range. The high address does not need to
|
|
|
|
|
// be stored, because RangeMap uses it as the key to the map.
|
|
|
|
|
const AddressType base_;
|
|
|
|
|
|
2006-09-14 21:19:24 +02:00
|
|
|
// The entry corresponding to a range.
|
|
|
|
|
const EntryType entry_;
|
2006-09-07 17:56:38 +02:00
|
|
|
};
|
|
|
|
|
|
2006-09-14 21:19:24 +02:00
|
|
|
// Convenience types.
|
|
|
|
|
typedef std::map<AddressType, Range> AddressToRangeMap;
|
2006-09-20 18:20:15 +02:00
|
|
|
typedef typename AddressToRangeMap::const_iterator MapConstIterator;
|
|
|
|
|
typedef typename AddressToRangeMap::value_type MapValue;
|
2006-09-07 17:56:38 +02:00
|
|
|
|
|
|
|
|
// Maps the high address of each range to a EntryType.
|
|
|
|
|
AddressToRangeMap map_;
|
2006-09-06 04:56:44 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2006-09-14 21:19:24 +02:00
|
|
|
} // namespace google_airbag
|
2006-09-06 04:56:44 +02:00
|
|
|
|
|
|
|
|
|
2006-09-14 21:19:24 +02:00
|
|
|
#endif // PROCESSOR_RANGE_MAP_H__
|