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