[pypy-commit] pypy vmprof: test_codemap now passes
arigo
noreply at buildbot.pypy.org
Thu Mar 12 11:18:21 CET 2015
Author: Armin Rigo <arigo at 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)
- at 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():
More information about the pypy-commit
mailing list