From 276b8374284be9a04feb52e3c9613c90bc6d3cb9 Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Sun, 14 May 2023 19:46:45 +0200 Subject: [PATCH] (WIP) Reorganize pending allocations data structure --- gdb-port/parser.py | 11 +++++++---- gdb-port/top-level-parse.py | 18 +++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/gdb-port/parser.py b/gdb-port/parser.py index 7a907b4..cbc97e6 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 ff2af3b..77e553f 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() -- GitLab