Index: src/allocation-tracker.cc |
diff --git a/src/allocation-tracker.cc b/src/allocation-tracker.cc |
index ecc7a4ca4d25e8d3660538a47c85394e117550d3..7135dc40dbdd681930c91123d191fb817335a8b0 100644 |
--- a/src/allocation-tracker.cc |
+++ b/src/allocation-tracker.cc |
@@ -139,6 +139,78 @@ AllocationTracker::FunctionInfo::FunctionInfo() |
} |
+void AddressToTraceMap::AddRange(Address start, int size, |
+ unsigned trace_node_id) { |
+ Address end = start + size; |
+ RemoveRange(start, end); |
+ |
+ RangeStack new_range(start, trace_node_id); |
+ ranges_.insert(RangeMap::value_type(end, new_range)); |
+} |
+ |
+ |
+unsigned AddressToTraceMap::GetTraceNodeId(Address addr) { |
+ RangeMap::const_iterator it = ranges_.upper_bound(addr); |
+ if (it == ranges_.end()) return 0; |
+ if (it->second.start <= addr) { |
+ return it->second.trace_node_id; |
+ } |
+ return 0; |
+} |
+ |
+ |
+void AddressToTraceMap::MoveObject(Address from, Address to, int size) { |
+ unsigned trace_node_id = GetTraceNodeId(from); |
+ if (trace_node_id == 0) return; |
+ RemoveRange(from, from + size); |
+ AddRange(to, size, trace_node_id); |
+} |
+ |
+ |
+void AddressToTraceMap::Clear() { |
+ ranges_.clear(); |
+} |
+ |
+ |
+void AddressToTraceMap::Print() { |
+ PrintF("[AddressToTraceMap (%lu): \n", ranges_.size()); |
+ for (RangeMap::iterator it = ranges_.begin(); it != ranges_.end(); ++it) { |
+ PrintF("[%p - %p] => %u\n", it->second.start, it->first, |
+ it->second.trace_node_id); |
+ } |
+ PrintF("]\n"); |
+} |
+ |
+ |
+void AddressToTraceMap::RemoveRange(Address start, Address end) { |
+ RangeMap::iterator it = ranges_.upper_bound(start); |
+ if (it == ranges_.end()) return; |
+ |
+ RangeStack prev_range(0, 0); |
+ |
+ RangeMap::iterator to_remove_begin = it; |
+ if (it->second.start < start) { |
+ prev_range = it->second; |
+ } |
+ do { |
+ if (it->first > end) { |
+ if (it->second.start < end) { |
+ it->second.start = end; |
+ } |
+ break; |
+ } |
+ ++it; |
+ } |
+ while (it != ranges_.end()); |
+ |
+ ranges_.erase(to_remove_begin, it); |
+ |
+ if (prev_range.start != 0) { |
+ ranges_.insert(RangeMap::value_type(start, prev_range)); |
+ } |
+} |
+ |
+ |
static bool AddressesMatch(void* key1, void* key2) { |
return key1 == key2; |
} |
@@ -208,6 +280,8 @@ void AllocationTracker::AllocationEvent(Address addr, int size) { |
AllocationTraceNode* top_node = trace_tree_.AddPathFromEnd( |
Vector<unsigned>(allocation_trace_buffer_, length)); |
top_node->AddAllocation(size); |
+ |
+ address_to_trace_.AddRange(addr, size, top_node->id()); |
} |