[pypy-commit] pypy stmgc-c4: fighting layers to make it work
Raemi
noreply at buildbot.pypy.org
Wed Jul 17 11:23:18 CEST 2013
Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c4
Changeset: r65424:8a3c2efecdca
Date: 2013-07-17 11:22 +0200
http://bitbucket.org/pypy/pypy/changeset/8a3c2efecdca/
Log: fighting layers to make it work
diff --git a/rpython/jit/backend/arm/regalloc.py b/rpython/jit/backend/arm/regalloc.py
--- a/rpython/jit/backend/arm/regalloc.py
+++ b/rpython/jit/backend/arm/regalloc.py
@@ -628,7 +628,7 @@
descr = op.getdescr()
fail_descr = cast_instance_to_gcref(descr)
# we know it does not move, but well
- rgc._make_sure_does_not_move(fail_descr)
+ fail_descr = rgc._make_sure_does_not_move(fail_descr)
fail_descr = rffi.cast(lltype.Signed, fail_descr)
if op.numargs() == 1:
loc = self.make_sure_var_in_reg(op.getarg(0))
diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -222,7 +222,7 @@
raise AssertionError(kind)
gcref = cast_instance_to_gcref(value)
- rgc._make_sure_does_not_move(gcref)
+ gcref = rgc._make_sure_does_not_move(gcref)
value = rffi.cast(lltype.Signed, gcref)
je_location = self._call_assembler_check_descr(value, tmploc)
#
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
@@ -107,9 +107,12 @@
gcrefs_output_list.append(new_p)
if op.is_guard() or op.getopnum() == rop.FINISH:
- llref = cast_instance_to_gcref(op.getdescr())
+ # the only ops with descrs that get recorded in a trace
+ from rpython.jit.metainterp.history import AbstractDescr
+ descr = op.getdescr()
+ llref = cast_instance_to_gcref(descr)
new_llref = rgc._make_sure_does_not_move(llref)
- new_d = rgc.try_cast_gcref_to_instance(llref.__class__, new_llref)
+ new_d = rgc.try_cast_gcref_to_instance(AbstractDescr, new_llref)
op.setdescr(new_d)
gcrefs_output_list.append(new_llref)
@@ -298,7 +301,7 @@
self.returns_modified_object = False
self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder
self.HDRPTR = gc_ll_descr.HDRPTR
- self.b_slowpath = [0, 0, 0, 0]
+ self.b_slowpath = [0, 0, 0, 0, 0]
def repr_of_descr(self):
raise NotImplementedError
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -368,7 +368,7 @@
descr = op.getdescr()
fail_descr = cast_instance_to_gcref(descr)
# we know it does not move, but well
- rgc._make_sure_does_not_move(fail_descr)
+ fail_descr = rgc._make_sure_does_not_move(fail_descr)
fail_descr = rffi.cast(lltype.Signed, fail_descr)
if op.numargs() == 1:
loc = self.make_sure_var_in_reg(op.getarg(0))
diff --git a/rpython/memory/gc/stmgc.py b/rpython/memory/gc/stmgc.py
--- a/rpython/memory/gc/stmgc.py
+++ b/rpython/memory/gc/stmgc.py
@@ -65,21 +65,25 @@
return llop.stm_get_tid(llgroup.HALFWORD, obj)
def get_hdr_tid(self, addr):
- return llmemory.cast_adr_to_int(addr + self.H_TID)
+ return llmemory.cast_adr_to_ptr(addr + self.H_TID, rffi.SIGNEDP)
def get_hdr_revision(self, addr):
- return llmemory.cast_adr_to_int(addr + self.H_REVISION)
-
+ return llmemory.cast_adr_to_ptr(addr + self.H_REVISION, rffi.SIGNEDP)
+
def get_hdr_original(self, addr):
- return llmemory.cast_adr_to_int(addr + self.H_ORIGINAL)
+ return llmemory.cast_adr_to_ptr(addr + self.H_ORIGINAL, rffi.SIGNEDP)
- def get_original_object(self, obj):
- if bool(self.get_hdr_tid(obj) & GCFLAG_PREBUILT_ORIGINAL):
+ def get_original_copy(self, obj):
+ addr = llmemory.cast_ptr_to_adr(obj)
+ if bool(self.get_hdr_tid(addr)[0] & GCFLAG_PREBUILT_ORIGINAL):
return obj
- orig = self.get_hdr_original(obj)
+ #
+ orig = self.get_hdr_original(addr)[0]
if orig == 0:
return obj
- return llmemory.cast_int_to_adr(orig)
+ #
+ return llmemory.cast_adr_to_ptr(llmemory.cast_int_to_adr(orig),
+ llmemory.GCREF)
def init_gc_object_immortal(self, addr, typeid16, flags=0):
assert flags == 0
@@ -117,7 +121,7 @@
def can_move(self, obj):
"""Means the reference will stay valid, except if not
seen by the GC, then it can get collected."""
- tid = self.get_hdr_tid(obj)
+ tid = self.get_hdr_tid(obj)[0]
if bool(tid & GCFLAG_OLD):
return False
return True
diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -314,6 +314,13 @@
self.can_move_ptr = getfn(GCClass.can_move.im_func,
[s_gc, annmodel.SomeAddress()],
annmodel.SomeBool())
+ if hasattr(GCClass, 'get_original_copy'):
+ self.get_original_copy_ptr = getfn(
+ GCClass.get_original_copy.im_func,
+ [s_gc, annmodel.SomePtr(llmemory.GCREF)],
+ annmodel.SomePtr(llmemory.GCREF))
+ else:
+ self.get_original_copy_ptr = None
if hasattr(GCClass, 'shrink_array'):
self.shrink_array_ptr = getfn(
@@ -744,6 +751,16 @@
hop.genop("direct_call", [self.can_move_ptr, self.c_const_gc, v_addr],
resultvar=op.result)
+ def gct_gc_get_original_copy(self, hop):
+ if self.get_original_copy_ptr is None:
+ raise Exception("unreachable code")
+ op = hop.spaceop
+ v_addr = hop.genop('cast_ptr_to_adr',
+ [op.args[0]], resulttype=llmemory.Address)
+ hop.genop("direct_call", [self.get_original_copy_ptr,
+ self.c_const_gc, v_addr],
+ resultvar=op.result)
+
def gct_shrink_array(self, hop):
if self.shrink_array_ptr is None:
return GCTransformer.gct_shrink_array(self, hop)
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -26,6 +26,12 @@
return None # means 'not translated at all';
# in "if stm_is_enabled()" it is equivalent to False
+def stm_get_original_copy(obj):
+ """ Returns a non-moving reference to an object (only use if obj is
+ already OLD!)
+ """
+ return lltype.nullptr(llmemory.GCREF)
+
# ____________________________________________________________
# Annotation and specialization
@@ -70,6 +76,20 @@
hop.exception_cannot_occur()
return hop.inputconst(lltype.Bool, hop.s_result.const)
+
+class StmGCGetOriginalCopy(ExtRegistryEntry):
+ _about_ = stm_get_original_copy
+
+ def compute_result_annotation(self, s_obj):
+ from rpython.annotator import model as annmodel
+ return annmodel.SomePtr(llmemory.GCREF)
+
+ def specialize_call(self, hop):
+ hop.exception_cannot_occur()
+ return hop.genop('gc_get_original_copy', hop.args_v,
+ resulttype=hop.r_result)
+
+
def can_move(p):
"""Check if the GC object 'p' is at an address that can move.
Must not be called with None. With non-moving GCs, it is always False.
@@ -108,9 +128,7 @@
i += 1
if stm_is_enabled():
- from rpython.memory.gc.stmgc import StmGC
- assert isinstance(gc, StmGC)
- return gc.get_original_object()
+ return stm_get_original_copy(p)
else:
return p
diff --git a/rpython/rtyper/lltypesystem/lloperation.py b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -526,6 +526,7 @@
'gc_obtain_free_space': LLOp(),
'gc_set_max_heap_size': LLOp(),
'gc_can_move' : LLOp(sideeffects=False),
+ 'gc_get_original_copy': LLOp(sideeffects=False),
'gc_thread_prepare' : LLOp(canmallocgc=True),
'gc_thread_run' : LLOp(),
'gc_thread_start' : LLOp(),
diff --git a/rpython/translator/stm/inevitable.py b/rpython/translator/stm/inevitable.py
--- a/rpython/translator/stm/inevitable.py
+++ b/rpython/translator/stm/inevitable.py
@@ -15,6 +15,7 @@
'jit_record_known_class',
'gc_identityhash', 'gc_id', 'gc_can_move', 'gc__collect',
'gc_adr_of_root_stack_top',
+ 'stmgc_get_original_copy',
'weakref_create', 'weakref_deref',
'stm_threadlocalref_get', 'stm_threadlocalref_set',
'stm_threadlocalref_count', 'stm_threadlocalref_addr',
More information about the pypy-commit
mailing list