diff --git a/gdb-port/parser.py b/gdb-port/parser.py index 7a907b42724ac24f5d5efd8db7f8b489b3e34d5f..cbc97e60bc4bf81d3d7e4dd5142f3ea9001e876a 100644 --- a/gdb-port/parser.py +++ b/gdb-port/parser.py @@ -301,7 +301,8 @@ class ParserStack: #current_event[2].add_mem_use(int(self.arena), current_frame_alloc) self.committed = len(self.stack_events)-1 # print("commit_at_pop: pop_allocs:", { current_event[2].address: current_frame_alloc }) # DEBUG - pop_allocs[current_event[2].address] = pop_allocs.get(current_event[2].address, 0) + current_frame_alloc + # This assumes the value of self.arena and self.arena_int won't change while there are pending allocations, otherwise it might drop allocations belonging to the old arena + pop_allocs[current_event[2].address] = { self.arena_int : pop_allocs.get(self.arena_int, {}).get(current_event[2].address, 0) + current_frame_alloc } parser_cache[current_event[2].address] = current_event[2] current_event[2].add_mem_use(self.arena_int, current_frame_alloc) #profiler.disable() # DEBUG @@ -318,7 +319,7 @@ class ParserStack: for index, event in enumerate(ev_list[:-1]): parser_cache[int(event[2].address)] = event[2] alloc = bigger[index][1] - smaller[index][1] - pop_allocs[event[2].address] = pop_allocs.get(event[2].address, 0) + alloc + pop_allocs[event[2].address] = { self.arena_int : pop_allocs.get(self.arena_int, {}).get(event[2].address, 0) + alloc } #alloc = next(differences) #print("commit_at_pop: alloc:", alloc) # DEBUG #print("commit_at_pop: adding to parser", event[2].name, hex(event[2].address)) @@ -356,7 +357,7 @@ class ParserStack: for index, event in enumerate(ev_list[:-1]): alloc = next(differences) #event[2].add_mem_use(self.arena_int, alloc) - push_allocs[event[2].address] = push_allocs.get(event[2].address, 0) + alloc + push_allocs[event[2].address] = { self.arena_int : push_allocs.get(self.arena_int, {}).get(event[2].address, 0) + alloc } #print("commit_at_push: push_allocs:", push_allocs) # DEBUG # Most recent event is a push event, and we have no information on its allocations yet. So we only increment self.committed up to the index of the previous event @@ -372,4 +373,6 @@ class ParserStack: return self.pending_allocs def clear_pending_allocations(self): - self.pending_allocs = { self.arena_int : {} } + for k, v in self.pending_allocs.items(): + v.clear() + self.pending_allocs = {} diff --git a/gdb-port/top-level-parse.py b/gdb-port/top-level-parse.py index ff2af3b12e9674ecaf5ca691a8ca9c6811a2f827..77e553f1982d80c145f73fc30d08896dcb175db7 100644 --- a/gdb-port/top-level-parse.py +++ b/gdb-port/top-level-parse.py @@ -274,12 +274,12 @@ class TopLevelParse: def gather_allocations_in_parser_stacks(self): for ps in self.parser_stacks: - new_allocs_by_arena = ps.get_pending_allocations() - new_allocs = new_allocs_by_arena.get(ps.arena_int, {}) - pending_allocs = self.pending_allocs.get(ps.arena_int, {}) - for addr, alloc in new_allocs.items(): - pending_allocs[addr] = pending_allocs.get(addr, 0) + alloc - self.pending_allocs[ps.arena_int] = pending_allocs + new_allocs_by_parser = ps.get_pending_allocations() + for parser, alloc in new_allocs_by_parser.items(): + pending_allocs = self.pending_allocs.get(parser, {}) + pending_allocs[ps.arena_int] = pending_allocs.get(ps.arena_int, 0) + alloc.get(ps.arena_int, 0) + self.pending_allocs[parser] = pending_allocs + ps.clear_pending_allocations() # TODO: allocations are grouped by arena, then parser address. we get the arena address from the parser stack, which may be shared between parser stacks @@ -287,9 +287,9 @@ class TopLevelParse: # However, the problem is that doing this naively would require two nested for loops minimum # TODO: check if grouping { parser : { arena : alloc } } would work better def commit_pending_allocations(self): - for arena, allocs in self.pending_allocs.items(): - for addr, alloc in allocs.items(): - self.parser_by_address(addr).add_mem_use(arena, alloc) + for parser, allocs in self.pending_allocs.items(): + for arena, alloc in allocs.items(): + self.parser_by_address(parser).add_mem_use(arena, alloc) self.pending_allocs = {} top_level_parse = TopLevelParse()