[pypy-commit] pypy gc-incminimark-pinning: (wip) first test for JIT's object pinning support
groggi
noreply at buildbot.pypy.org
Wed Jun 25 18:32:09 CEST 2014
Author: Gregor Wegberg <code at gregorwegberg.com>
Branch: gc-incminimark-pinning
Changeset: r72224:373e93cab4c5
Date: 2014-06-25 18:30 +0200
http://bitbucket.org/pypy/pypy/changeset/373e93cab4c5/
Log: (wip) first test for JIT's object pinning support
diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -141,9 +141,6 @@
newops.append(op)
return newops
- if not we_are_translated():
- last_pinned_object_tracker = None
-
def rewrite_assembler(self, cpu, operations, gcrefs_output_list):
rewriter = GcRewriterAssembler(self, cpu)
newops = rewriter.rewrite(operations)
diff --git a/rpython/jit/backend/llsupport/test/test_object_pinning_rewrite.py b/rpython/jit/backend/llsupport/test/test_object_pinning_rewrite.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/llsupport/test/test_object_pinning_rewrite.py
@@ -0,0 +1,127 @@
+from test_rewrite import get_size_descr, get_array_descr, get_description, BaseFakeCPU
+from rpython.jit.backend.llsupport.descr import get_size_descr,\
+ get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\
+ SizeDescrWithVTable, get_interiorfield_descr
+from rpython.jit.backend.llsupport.gc import GcLLDescr_boehm,\
+ GcLLDescr_framework, PinnedObjectTracker
+from rpython.jit.backend.llsupport import jitframe, gc
+from rpython.jit.metainterp.gc import get_description
+from rpython.jit.tool.oparser import parse
+from rpython.jit.metainterp.optimizeopt.util import equaloplists
+from rpython.jit.codewriter.heaptracker import register_known_gctype
+from rpython.jit.metainterp.history import JitCellToken, FLOAT
+from rpython.rtyper.lltypesystem import lltype, rclass, rffi, lltype, llmemory
+from rpython.jit.backend.x86.arch import WORD
+from rpython.rlib import rgc
+
+class Evaluator(object):
+ def __init__(self, scope):
+ self.scope = scope
+ def __getitem__(self, key):
+ return eval(key, self.scope)
+
+
+class FakeLoopToken(object):
+ pass
+
+# The following class is based on rpython.jit.backend.llsupport.test.test_rewrite.RewriteTests.
+# It's modified to be able to test the object pinning specific features.
+class RewriteTests(object):
+ def check_rewrite(self, frm_operations, to_operations, **namespace):
+ # objects to use inside the test
+ A = lltype.GcArray(lltype.Signed)
+ adescr = get_array_descr(self.gc_ll_descr, A)
+ adescr.tid = 4321
+ alendescr = adescr.lendescr
+ #
+ pinned_obj_type = lltype.GcStruct('PINNED_STRUCT', ('my_int', lltype.Signed))
+ pinned_obj_my_int_descr = get_field_descr(self.gc_ll_descr, pinned_obj_type, 'my_int')
+ pinned_obj_ptr = lltype.malloc(pinned_obj_type)
+ pinned_obj_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, pinned_obj_ptr)
+ assert rgc.pin(pinned_obj_gcref)
+ #
+ ref_array_descr = self.cpu.arraydescrof(PinnedObjectTracker._ref_array_type)
+ #
+ vtable_descr = self.gc_ll_descr.fielddescr_vtable
+ O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
+ ('x', lltype.Signed))
+ o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
+ register_known_gctype(self.cpu, o_vtable, O)
+ #
+ tiddescr = self.gc_ll_descr.fielddescr_tid
+ wbdescr = self.gc_ll_descr.write_barrier_descr
+ WORD = globals()['WORD']
+ #
+ strdescr = self.gc_ll_descr.str_descr
+ unicodedescr = self.gc_ll_descr.unicode_descr
+ strlendescr = strdescr.lendescr
+ unicodelendescr = unicodedescr.lendescr
+
+ casmdescr = JitCellToken()
+ clt = FakeLoopToken()
+ clt._ll_initial_locs = [0, 8]
+ frame_info = lltype.malloc(jitframe.JITFRAMEINFO, flavor='raw')
+ clt.frame_info = frame_info
+ frame_info.jfi_frame_depth = 13
+ frame_info.jfi_frame_size = 255
+ framedescrs = self.gc_ll_descr.getframedescrs(self.cpu)
+ framelendescr = framedescrs.arraydescr.lendescr
+ jfi_frame_depth = framedescrs.jfi_frame_depth
+ jfi_frame_size = framedescrs.jfi_frame_size
+ jf_frame_info = framedescrs.jf_frame_info
+ signedframedescr = self.cpu.signedframedescr
+ floatframedescr = self.cpu.floatframedescr
+ casmdescr.compiled_loop_token = clt
+ tzdescr = None # noone cares
+ #
+ namespace.update(locals())
+ #
+ for funcname in self.gc_ll_descr._generated_functions:
+ namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
+ namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
+ '%s_descr' % funcname)
+ #
+ ops = parse(frm_operations, namespace=namespace)
+ operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
+ ops.operations,
+ [])
+ # make the array containing the GCREF's accessible inside the tests.
+ # This must be done after we call 'rewrite_assembler'. Before that
+ # call 'last_pinned_object_tracker' is None or filled with some old
+ # value.
+ namespace['ref_array_gcref'] = self.gc_ll_descr.last_pinned_object_tracker.ref_array_gcref
+ expected = parse(to_operations % Evaluator(namespace),
+ namespace=namespace)
+ equaloplists(operations, expected.operations)
+ lltype.free(frame_info, flavor='raw')
+
+class TestFramework(RewriteTests):
+ def setup_method(self, meth):
+ class config_(object):
+ class translation(object):
+ gc = 'minimark'
+ gcrootfinder = 'asmgcc'
+ gctransformer = 'framework'
+ gcremovetypeptr = False
+ gcdescr = get_description(config_)
+ self.gc_ll_descr = GcLLDescr_framework(gcdescr, None, None, None,
+ really_not_translated=True)
+ self.gc_ll_descr.write_barrier_descr.has_write_barrier_from_array = (
+ lambda cpu: True)
+ #
+ class FakeCPU(BaseFakeCPU):
+ def sizeof(self, STRUCT):
+ descr = SizeDescrWithVTable(104)
+ descr.tid = 9315
+ return descr
+ self.cpu = FakeCPU()
+
+ def test_simple_getfield(self):
+ self.check_rewrite("""
+ []
+ i0 = getfield_gc(ConstPtr(pinned_obj_gcref), descr=pinned_obj_my_int_descr)
+ """, """
+ []
+ p1 = getarrayitem_gc(ConstPtr(ref_array_gcref), 0, descr=ref_array_descr)
+ i0 = getfield_gc(p1, descr=pinned_obj_my_int_descr)
+ """)
More information about the pypy-commit
mailing list