Author: Remi Meier <remi.me...@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', _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit