Author: Armin Rigo <[email protected]>
Branch: vmprof2
Changeset: r76852:02cfea4f1675
Date: 2015-04-20 17:32 +0200
http://bitbucket.org/pypy/pypy/changeset/02cfea4f1675/

Log:    Test and fix: due to alignment, the address given to
        pypy_jit_codemap_del() might be slightly lower than the address
        given to pypy_jit_codemap_add().

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
@@ -31,7 +31,7 @@
                                      unsigned int machine_code_size,
                                      long *bytecode_info,
                                      unsigned int bytecode_info_size);
-RPY_EXTERN long *pypy_jit_codemap_del(uintptr_t addr);
+RPY_EXTERN long *pypy_jit_codemap_del(uintptr_t addr, unsigned int size);
 RPY_EXTERN uintptr_t pypy_jit_codemap_firstkey(void);
 RPY_EXTERN void *pypy_find_codemap_at_addr(long addr, long* start_addr);
 RPY_EXTERN long pypy_yield_codemap_at_addr(void *codemap_raw, long addr,
@@ -55,7 +55,7 @@
                                    INT_LIST_PTR, lltype.Signed],
                                   lltype.Signed)
 pypy_jit_codemap_del = llexternal('pypy_jit_codemap_del',
-                                  [lltype.Signed], INT_LIST_PTR)
+                                  [lltype.Signed, lltype.Signed], INT_LIST_PTR)
 pypy_jit_codemap_firstkey = llexternal('pypy_jit_codemap_firstkey',
                                        [], lltype.Signed)
 
@@ -89,11 +89,11 @@
             key = pypy_jit_codemap_firstkey()
             if not key:
                 break
-            items = pypy_jit_codemap_del(key)
+            items = pypy_jit_codemap_del(key, 1)
             lltype.free(items, flavor='raw', track_allocation=False)
 
     def free_asm_block(self, start, stop):
-        items = pypy_jit_codemap_del(start)
+        items = pypy_jit_codemap_del(start, stop - start)
         if items:
             lltype.free(items, flavor='raw', track_allocation=False)
         pypy_jit_depthmap_clear(start, stop - start)
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
@@ -1,4 +1,5 @@
 #include "src/precommondefs.h"
+#include <assert.h>
 
 #ifndef HAS_SKIPLIST
 # error "skiplist.c needs to be included before"
@@ -51,17 +52,26 @@
 }
 
 RPY_EXTERN
-long *pypy_jit_codemap_del(uintptr_t addr)
+long *pypy_jit_codemap_del(uintptr_t addr, unsigned int size)
 {
+    uintptr_t search_key = addr + size - 1;
     long *result;
     skipnode_t *node;
 
+    /* There should be either zero or one codemap entry in the range.
+       In theory it should take the complete range, but for alignment
+       reasons the [addr, addr+size] range can be slightly bigger. */
+    node = skiplist_search(&jit_codemap_head, search_key);
+    if (node->key < addr)
+        return NULL;
+
     pypy_codemap_invalid_set(1);
-    node = skiplist_remove(&jit_codemap_head, addr);
+    skiplist_remove(&jit_codemap_head, node->key);
     pypy_codemap_invalid_set(0);
 
-    if (node == NULL)
-        return NULL;
+    /* there should be at most one */
+    assert(skiplist_search(&jit_codemap_head, search_key)->key < addr);
+
     result = ((codemap_data_t *)node->data)->bytecode_info;
     free(node);
     return result;
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
@@ -91,3 +91,17 @@
     codemap.free_asm_block(200, 300)
     assert unpack_traceback(225) == []
     codemap.free()
+
+def test_free_with_alignment():
+    codemap = CodemapStorage()
+    codemap.setup()
+    builder = CodemapBuilder()
+    builder.enter_portal_frame(23, 34, 0)
+    builder.enter_portal_frame(45, 56, 20)
+    codemap.register_codemap(builder.get_final_bytecode(200, 100))
+    assert unpack_traceback(215) == [34]
+    assert unpack_traceback(225) == [34, 56]
+    codemap.free_asm_block(190, 310)   # a bit larger
+    assert unpack_traceback(215) == []
+    assert unpack_traceback(225) == []
+    codemap.free()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to