[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