Index: src/processor/range_map.h |
diff --git a/src/processor/range_map.h b/src/processor/range_map.h |
index 2572e4927d85d15a747d07c268599360ed777961..985d992f991ac993e7bb177296ef97b2dc80248c 100644 |
--- a/src/processor/range_map.h |
+++ b/src/processor/range_map.h |
@@ -52,40 +52,55 @@ template<class, class> class RangeMapSerializer; |
template<typename AddressType, typename EntryType> |
class RangeMap { |
public: |
- RangeMap() : map_() {} |
+ RangeMap() : enable_shrink_down_(false), map_() {} |
+ |
+ // |enable_shrink_down| tells whether overlapping ranges can be shrunk down. |
+ // If true, then adding a new range that overlaps with an existing one can |
+ // be a successful operation. The range which ends at the higher address |
+ // will be shrunk down by moving its start position to a higher address so |
+ // that it does not overlap anymore. |
+ void SetEnableShrinkDown(bool enable_shrink_down); |
// 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. |
- bool StoreRange(const AddressType &base, |
- const AddressType &size, |
+ // stored in the map. If enable_shrink_down is true and there is an overlap |
+ // between the current range and some other range (already in the map), |
+ // shrink down the range which ends at a higher address. |
+ bool StoreRange(const AddressType &base, const AddressType &size, |
const EntryType &entry); |
- // Locates the range encompassing the supplied address. If there is |
- // no such range, returns false. entry_base and entry_size, if non-NULL, |
- // are set to the base and size of the entry's range. |
+ // Locates the range encompassing the supplied address. If there is no such |
+ // range, returns false. entry_base, entry_delta, and entry_size, if |
+ // non-NULL, are set to the base, delta, and size of the entry's range. |
+ // A positive entry delta (> 0) indicates that there was an overlap and the |
+ // entry was shrunk down (original start address was increased by delta). |
bool RetrieveRange(const AddressType &address, EntryType *entry, |
- AddressType *entry_base, AddressType *entry_size) const; |
+ AddressType *entry_base, AddressType *entry_delta, |
+ AddressType *entry_size) const; |
// Locates the range encompassing the supplied address, if one exists. |
// If no range encompasses the supplied address, locates the nearest range |
// to the supplied address that is lower than the address. Returns false |
- // if no range meets these criteria. entry_base and entry_size, if |
- // non-NULL, are set to the base and size of the entry's range. |
+ // if no range meets these criteria. entry_base, entry_delta, and entry_size, |
+ // if non-NULL, are set to the base, delta, and size of the entry's range. |
+ // A positive entry delta (> 0) indicates that there was an overlap and the |
+ // entry was shrunk down (original start address was increased by delta). |
bool RetrieveNearestRange(const AddressType &address, EntryType *entry, |
- AddressType *entry_base, AddressType *entry_size) |
- const; |
+ AddressType *entry_base, AddressType *entry_delta, |
+ AddressType *entry_size) const; |
// Treating all ranges as a list ordered by the address spaces that they |
// occupy, locates the range at the index specified by index. Returns |
- // false if index is larger than the number of ranges stored. entry_base |
- // and entry_size, if non-NULL, are set to the base and size of the entry's |
- // range. |
+ // false if index is larger than the number of ranges stored. entry_base, |
+ // entry_delta, and entry_size, if non-NULL, are set to the base, delta, and |
+ // size of the entry's range. |
+ // A positive entry delta (> 0) indicates that there was an overlap and the |
+ // entry was shrunk down (original start address was increased by delta). |
// |
// RetrieveRangeAtIndex is not optimized for speedy operation. |
bool RetrieveRangeAtIndex(int index, EntryType *entry, |
- AddressType *entry_base, AddressType *entry_size) |
- const; |
+ AddressType *entry_base, AddressType *entry_delta, |
+ AddressType *entry_size) const; |
// Returns the number of ranges stored in the RangeMap. |
int GetCount() const; |
@@ -99,12 +114,19 @@ class RangeMap { |
friend class ModuleComparer; |
friend class RangeMapSerializer<AddressType, EntryType>; |
+ // Same a StoreRange() with the only exception that the |delta| can be |
+ // passed in. |
+ bool StoreRangeInternal(const AddressType &base, const AddressType &delta, |
+ const AddressType &size, const EntryType &entry); |
+ |
class Range { |
public: |
- Range(const AddressType &base, const EntryType &entry) |
- : base_(base), entry_(entry) {} |
+ Range(const AddressType &base, const AddressType &delta, |
+ const EntryType &entry) |
+ : base_(base), delta_(delta), entry_(entry) {} |
AddressType base() const { return base_; } |
+ AddressType delta() const { return delta_; } |
EntryType entry() const { return entry_; } |
private: |
@@ -112,6 +134,9 @@ class RangeMap { |
// be stored, because RangeMap uses it as the key to the map. |
const AddressType base_; |
+ // The delta when the range is shrunk down. |
+ const AddressType delta_; |
+ |
// The entry corresponding to a range. |
const EntryType entry_; |
}; |
@@ -121,6 +146,9 @@ class RangeMap { |
typedef typename AddressToRangeMap::const_iterator MapConstIterator; |
typedef typename AddressToRangeMap::value_type MapValue; |
+ // Whether overlapping ranges can be shrunk down. |
+ bool enable_shrink_down_; |
+ |
// Maps the high address of each range to a EntryType. |
AddressToRangeMap map_; |
}; |