Author: Gregor Wegberg <[email protected]>
Branch: gc-incminimark-pinning
Changeset: r72222:1b72f8089e13
Date: 2014-06-25 12:20 +0200
http://bitbucket.org/pypy/pypy/changeset/1b72f8089e13/
Log: (wip) JIT support for pinned objects translates now
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
@@ -19,6 +19,26 @@
from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
from rpython.memory.gctransform import asmgcroot
+class PinnedObjectTracker(object):
+ """Simple helper class to keep informations regarding the 'GcArray'
+ in one place that is used to double load pinned objects.
+ """
+
+ _ref_array_type = lltype.GcArray(llmemory.GCREF)
+
+ def __init__(self, cpu, size):
+ self._next_item = 0
+ self._ref_array = lltype.malloc(PinnedObjectTracker._ref_array_type,
size)
+ self.ref_array_descr =
cpu.arraydescrof(PinnedObjectTracker._ref_array_type)
+ self.ref_array_gcref = lltype.cast_opaque_ptr(llmemory.GCREF,
self._ref_array)
+
+ def add_ref(self, ref):
+ index = self._next_item
+ self._next_item += 1
+ #
+ self._ref_array[index] = ref
+ return index
+
# ____________________________________________________________
class GcLLDescription(GcCache):
@@ -92,25 +112,7 @@
def gc_malloc_unicode(self, num_elem):
return self._bh_malloc_array(num_elem, self.unicode_descr)
- class PinnedObjectTracker(object):
- """Simple helper class to keep informations regarding the 'GcArray'
- in one place that is used to double load pinned objects.
- """
- def __init__(self, cpu, size):
- self._nextItem = 0
- self._refArrayType = lltype.GcArray(llmemory.GCREF)
- self.refArrayDescr = cpu.arraydescrof(self._refArrayType)
- self._refArray = lltype.malloc(self._refArrayType, size)
- self.refArrayGCREF = lltype.cast_opaque_ptr(llmemory.GCREF,
self._refArray)
-
- def add_ref(self, ref):
- index = self._nextItem
- self._nextItem += 1
- #
- self._refArray[index] = ref
- return index
-
- def _record_constptrs(self, op, gcrefs_output_list, pinnedObjTracker):
+ def _record_constptrs(self, op, gcrefs_output_list, pinned_obj_tracker):
newops = []
for i in range(op.numargs()):
v = op.getarg(i)
@@ -119,16 +121,17 @@
if rgc._make_sure_does_not_move(p):
gcrefs_output_list.append(p)
else:
- # encountered a moving pointer. Solve the problem by double
- # loading the address to the pointer each run of the JITed
code.
- resultPtr = BoxPtr()
- arrayIndex = pinnedObjTracker.add_ref(p)
- loadOp = ResOperation(rop.GETARRAYITEM_GC,
- [ConstPtr(pinnedObjTracker.refArrayGCREF),
ConstInt(arrayIndex)],
- resultPtr,
- descr=pinnedObjTracker.refArrayDescr)
- newops.append(loadOp)
- op.setarg(i, resultPtr)
+ # encountered a pointer that points to a possibly moving
object.
+ # Solve the problem by double loading the address to the
object
+ # each run of the JITed code.
+ result_ptr = BoxPtr()
+ array_index = pinned_obj_tracker.add_ref(p)
+ load_op = ResOperation(rop.GETARRAYITEM_GC,
+ [ConstPtr(pinned_obj_tracker.ref_array_gcref),
ConstInt(array_index)],
+ result_ptr,
+ descr=pinned_obj_tracker.ref_array_descr)
+ newops.append(load_op)
+ op.setarg(i, result_ptr)
#
if op.is_guard() or op.getopnum() == rop.FINISH:
llref = cast_instance_to_gcref(op.getdescr())
@@ -138,6 +141,9 @@
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)
@@ -146,14 +152,17 @@
# XXX add comment (groggi)
# XXX handle size in a not constant way? Get it from the GC? (groggi)
- pinnedObjTracker = self.PinnedObjectTracker(cpu, 100)
- gcrefs_output_list.append(pinnedObjTracker.refArrayGCREF)
- rgc._make_sure_does_not_move(pinnedObjTracker.refArrayGCREF)
+ pinned_obj_tracker = PinnedObjectTracker(cpu, 100)
+ if not we_are_translated():
+ self.last_pinned_object_tracker = pinned_obj_tracker
+ print "blub: %r" % self.last_pinned_object_tracker
+ gcrefs_output_list.append(pinned_obj_tracker.ref_array_gcref)
+ rgc._make_sure_does_not_move(pinned_obj_tracker.ref_array_gcref)
newnewops = [] # XXX better name... (groggi)
for op in newops:
- ops = self._record_constptrs(op, gcrefs_output_list,
pinnedObjTracker)
+ ops = self._record_constptrs(op, gcrefs_output_list,
pinned_obj_tracker)
newnewops.extend(ops)
return newnewops
diff --git a/rpython/jit/backend/llsupport/llmodel.py
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -299,6 +299,7 @@
return ofs, size, sign
unpack_fielddescr_size._always_inline_ = True
+ @specialize.memo()
def arraydescrof(self, A):
return get_array_descr(self.gc_ll_descr, A)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit