Author: Armin Rigo <ar...@tunes.org> Branch: vmprof Changeset: r76340:92b353fa58de Date: 2015-03-12 11:18 +0100 http://bitbucket.org/pypy/pypy/changeset/92b353fa58de/
Log: test_codemap now passes diff --git a/rpython/jit/backend/llsupport/codemap.py b/rpython/jit/backend/llsupport/codemap.py --- a/rpython/jit/backend/llsupport/codemap.py +++ b/rpython/jit/backend/llsupport/codemap.py @@ -55,6 +55,13 @@ pypy_jit_codemap_firstkey = llexternal('pypy_jit_codemap_firstkey', [], lltype.Signed) +pypy_jit_depthmap_add = llexternal('pypy_jit_depthmap_add', + [lltype.Signed, lltype.Signed, + lltype.Signed], lltype.Signed) +pypy_jit_depthmap_clear = llexternal('pypy_jit_depthmap_clear', + [lltype.Signed, lltype.Signed], + lltype.Void) + stack_depth_at_loc = llexternal('pypy_jit_stack_depth_at_loc', [lltype.Signed], lltype.Signed) find_codemap_at_addr = llexternal('pypy_find_codemap_at_addr', @@ -64,14 +71,6 @@ rffi.CArrayPtr(lltype.Signed)], lltype.Signed) -@specialize.ll() -def copy_item(source, dest, si, di, baseline=0): - TP = lltype.typeOf(dest) - if isinstance(TP.TO.OF, lltype.Struct): - rgc.copy_struct_item(source, dest, si, di) - else: - dest[di] = source[si] + baseline - class CodemapStorage(object): """ An immortal wrapper around underlaying jit codemap data @@ -93,45 +92,20 @@ items = pypy_jit_codemap_del(start) if items: lltype.free(items, flavor='raw', track_allocation=False) - ## # fix up jit_addr_map - ## g = pypy_get_codemap_storage() - ## jit_adr_start = bisect_left(g.jit_addr_map, start, - ## g.jit_addr_map_used) - ## jit_adr_stop = bisect_left(g.jit_addr_map, stop, - ## g.jit_addr_map_used) - ## pypy_codemap_invalid_set(1) - ## self.remove('jit_addr_map', jit_adr_start, jit_adr_stop) - ## self.remove('jit_frame_depth_map', jit_adr_start, jit_adr_stop) - ## # fix up codemap - ## # (there should only be zero or one codemap entry in that range, - ## # but still we use a range to distinguish between zero and one) - ## codemap_adr_start = bisect_left_addr(g.jit_codemap, start, - ## g.jit_codemap_used) - ## codemap_adr_stop = bisect_left_addr(g.jit_codemap, stop, - ## g.jit_codemap_used) - ## self.remove('jit_codemap', codemap_adr_start, codemap_adr_stop) - ## pypy_codemap_invalid_set(0) + pypy_jit_depthmap_clear(start, stop - start) - def register_frame_depth_map(self, rawstart, frame_positions, + def register_frame_depth_map(self, rawstart, rawstop, frame_positions, frame_assignments): if not frame_positions: return - pypy_codemap_invalid_set(1) - g = pypy_get_codemap_storage() - if (not g.jit_addr_map_used or - rawstart > g.jit_addr_map[g.jit_addr_map_used - 1]): - start = g.jit_addr_map_used - self.extend_with('jit_addr_map', frame_positions, - g.jit_addr_map_used, rawstart) - self.extend_with('jit_frame_depth_map', frame_assignments, - g.jit_frame_depth_map_used) - else: - start = bisect_left(g.jit_addr_map, rawstart, - g.jit_addr_map_used) - self.extend_with('jit_addr_map', frame_positions, start, rawstart) - self.extend_with('jit_frame_depth_map', frame_assignments, - start) - pypy_codemap_invalid_set(0) + assert len(frame_positions) == len(frame_assignments) + for i in range(len(frame_positions)-1, -1, -1): + pos = rawstart + frame_positions[i] + length = rawstop - pos + if length > 0: + print "ADD:", pos, length, frame_assignments[i] + pypy_jit_depthmap_add(pos, length, frame_assignments[i]) + rawstop = pos def register_codemap(self, (start, size, l)): items = lltype.malloc(INT_LIST_PTR.TO, len(l), flavor='raw', diff --git a/rpython/jit/backend/llsupport/src/codemap.c b/rpython/jit/backend/llsupport/src/codemap.c --- a/rpython/jit/backend/llsupport/src/codemap.c +++ b/rpython/jit/backend/llsupport/src/codemap.c @@ -131,6 +131,7 @@ /*** interface used from codemap.py ***/ +RPY_EXTERN long pypy_jit_depthmap_add(uintptr_t addr, unsigned int size, unsigned int stackdepth) { @@ -150,10 +151,9 @@ return 0; } +RPY_EXTERN void pypy_jit_depthmap_clear(uintptr_t addr, unsigned int size) { - abort(); -#if 0 uintptr_t search_key = addr + size - 1; if (size == 0) return; @@ -162,16 +162,17 @@ while (1) { /* search for all nodes belonging to the range, and remove them */ skipnode_t *node = skiplist_search(&jit_depthmap_head, search_key); - if (node->addr < addr) + if (node->key < addr) break; /* exhausted */ - skiplist_remove(&jit_depthmap_head, node->addr); + skiplist_remove(&jit_depthmap_head, node->key); + free(node); } pypy_codemap_invalid_set(0); -#endif } /*** interface used from pypy/module/_vmprof ***/ +RPY_EXTERN long pypy_jit_stack_depth_at_loc(long loc) { skipnode_t *depthmap = skiplist_search(&jit_depthmap_head, (uintptr_t)loc); diff --git a/rpython/jit/backend/llsupport/test/test_codemap.py b/rpython/jit/backend/llsupport/test/test_codemap.py --- a/rpython/jit/backend/llsupport/test/test_codemap.py +++ b/rpython/jit/backend/llsupport/test/test_codemap.py @@ -24,46 +24,32 @@ # codemap.free() -def test_list_storage_mixin(): - class X(ListStorageMixin): - def unpack(self): - return [g.jit_addr_map[i] for i in range(g.jit_addr_map_used)] - - x = X() - x.extend_with('jit_addr_map', [1, 2, 3], 0) - assert x.unpack() == [1, 2, 3] - x.extend_with('jit_addr_map', [4, 5, 6], 3) - assert x.unpack() == [1, 2, 3, 4, 5, 6] - x.extend_with('jit_addr_map', [7, 8, 9], 2, baseline=10) - assert x.unpack() == [1, 2, 17, 18, 19, 3, 4, 5, 6] - x.remove('jit_addr_map', 3, 6) - assert x.unpack() == [1, 2, 17, 4, 5, 6] - x.extend_with('jit_addr_map', [1] * 6, 6) - assert x.unpack() == [1, 2, 17, 4, 5, 6, 1, 1, 1, 1, 1, 1] - x.extend_with('jit_addr_map', [10] * 4, 5) - assert x.unpack() == [1, 2, 17, 4, 5, 10, 10, 10, 10, 6, - 1, 1, 1, 1, 1, 1] - x.free() - def test_find_jit_frame_depth(): codemap = CodemapStorage() codemap.setup() - codemap.register_frame_depth_map(11, [0, 5, 10], [1, 2, 3]) - codemap.register_frame_depth_map(30, [0, 5, 10], [4, 5, 6]) - codemap.register_frame_depth_map(0, [0, 5, 10], [7, 8, 9]) + codemap.register_frame_depth_map(11, 26, [0, 5, 10], [1, 2, 3]) + codemap.register_frame_depth_map(30, 41, [0, 5, 10], [4, 5, 6]) + codemap.register_frame_depth_map(0, 11, [0, 5, 10], [7, 8, 9]) assert stack_depth_at_loc(13) == 1 assert stack_depth_at_loc(-3) == -1 + assert stack_depth_at_loc(40) == 6 assert stack_depth_at_loc(41) == -1 assert stack_depth_at_loc(5) == 8 assert stack_depth_at_loc(17) == 2 assert stack_depth_at_loc(38) == 5 - codemap.free_asm_block(11, 22) - assert stack_depth_at_loc(13) == 9 + assert stack_depth_at_loc(25) == 3 + assert stack_depth_at_loc(26) == -1 + assert stack_depth_at_loc(11) == 1 + assert stack_depth_at_loc(10) == 9 + codemap.free_asm_block(11, 26) + assert stack_depth_at_loc(11) == -1 + assert stack_depth_at_loc(13) == -1 assert stack_depth_at_loc(-3) == -1 + assert stack_depth_at_loc(40) == 6 assert stack_depth_at_loc(41) == -1 assert stack_depth_at_loc(5) == 8 - assert stack_depth_at_loc(17) == 9 assert stack_depth_at_loc(38) == 5 + assert stack_depth_at_loc(10) == 9 codemap.free() def test_codemaps(): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit