Author: Remi Meier <meier...@student.ethz.ch> Branch: stmgc-c4 Changeset: r65346:e1aa4591dc07 Date: 2013-07-11 18:12 +0200 http://bitbucket.org/pypy/pypy/changeset/e1aa4591dc07/
Log: hopefully in the right direction: now a single cond_call_stm_b because there may be many more variants in the future. diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -958,11 +958,8 @@ def execute_cond_call_gc_wb_array(self, descr, a, b, c): py.test.skip("cond_call_gc_wb_array not supported") - def execute_cond_call_stm_wb(self, descr, a): - py.test.skip("cond_call_stm_wb not supported") - - def execute_cond_call_stm_rb(self, descr, a): - py.test.skip("cond_call_stm_rb not supported") + def execute_cond_call_stm_b(self, descr, a): + py.test.skip("cond_call_stm_b not supported") def execute_keepalive(self, descr, x): pass 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 @@ -270,23 +270,43 @@ rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address) return rffi.cast(lltype.Signed, rst_addr) +class GcRootMap_stm(object): + is_shadow_stack = False # XXX: should it have an is_stmgc? -class WriteBarrierDescr(AbstractDescr): + def __init__(self, gcdescr): + pass + + def register_asm_addr(self, start, mark): + pass + + def get_root_stack_top_addr(self): + rst_addr = llop.gc_adr_of_root_stack_top(llmemory.Address) + return rffi.cast(lltype.Signed, rst_addr) + + +class BarrierDescr(AbstractDescr): def __init__(self, gc_ll_descr): self.llop1 = gc_ll_descr.llop1 self.returns_modified_object = False - self.WB_FUNCPTR = lltype.Ptr(lltype.FuncType( + self.FUNCPTR = lltype.Ptr(lltype.FuncType( [llmemory.Address], lltype.Void)) - self.fielddescr_tid = gc_ll_descr.fielddescr_tid self.gcheaderbuilder = gc_ll_descr.gcheaderbuilder self.HDRPTR = gc_ll_descr.HDRPTR - # + + def repr_of_descr(self): + raise NotImplementedError + + def __repr(self): + raise NotImplementedError + +class WriteBarrierDescr(BarrierDescr): + def __init__(self, gc_ll_descr): + BarrierDescr.__init__(self, gc_ll_descr) + self.fielddescr_tid = gc_ll_descr.fielddescr_tid + GCClass = gc_ll_descr.GCClass - if GCClass is None: # for tests - return - self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = ( self.extract_flag_byte(self.jit_wb_if_flag)) @@ -325,14 +345,9 @@ return (i, struct.unpack('b', value[i])[0]) def get_barrier_funcptr(self, returns_modified_object): - assert returns_modified_object == self.returns_modified_object - llop1 = self.llop1 - if returns_modified_object: - funcptr = self.wb_failing_case_ptr - else: - FUNCTYPE = self.WB_FUNCPTR - funcptr = llop1.get_write_barrier_failing_case(FUNCTYPE) - return funcptr + assert not returns_modified_object + FUNCTYPE = self.FUNCPTR + return llop1.get_write_barrier_failing_case(FUNCTYPE) def get_write_barrier_fn(self, cpu, returns_modified_object): # must pass in 'self.returns_modified_object', to make sure that @@ -343,16 +358,13 @@ def get_write_barrier_from_array_fn(self, cpu): # returns a function with arguments [array, index, newvalue] - assert not self.returns_modified_object llop1 = self.llop1 funcptr = llop1.get_write_barrier_from_array_failing_case( - self.WB_FUNCPTR) + self.FUNCPTR) funcaddr = llmemory.cast_ptr_to_adr(funcptr) return cpu.cast_adr_to_int(funcaddr) # this may return 0 def has_write_barrier_from_array(self, cpu): - if self.returns_modified_object: - return False return self.get_write_barrier_from_array_fn(cpu) != 0 def get_wb_slowpath(self, withcards, withfloats): @@ -372,15 +384,11 @@ # the GC, and call it immediately funcptr = self.get_barrier_funcptr(returns_modified_object) res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct)) - if returns_modified_object: - return llmemory.cast_adr_to_ptr(res, llmemory.GCREF) - else: - if returns_modified_object: - return gcref_struct -class STMBarrierDescr(WriteBarrierDescr): + +class STMBarrierDescr(BarrierDescr): def __init__(self, gc_ll_descr, stmcat, cfunc_name): - WriteBarrierDescr.__init__(self, gc_ll_descr) + BarrierDescr.__init__(self, gc_ll_descr) self.stmcat = stmcat self.returns_modified_object = True self.WB_FUNCPTR_MOD = lltype.Ptr(lltype.FuncType( @@ -394,8 +402,14 @@ _nowrapper=True) def repr_of_descr(self): - cat = self.stmcat - return cat + return self.stmcat + + def __repr__(self): + return '<STMBarrierDescr %r>' % (self.repr_of_descr(),) + + def get_barrier_funcptr(self, returns_modified_object): + assert returns_modified_object + return self.wb_failing_case_ptr @specialize.arg(2) def _do_barrier(self, gcref_struct, returns_modified_object): @@ -403,8 +417,7 @@ # XXX: fastpath for Read and Write variants funcptr = self.get_barrier_funcptr(returns_modified_object) res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct)) - if returns_modified_object: - return llmemory.cast_adr_to_ptr(res, llmemory.GCREF) + return llmemory.cast_adr_to_ptr(res, llmemory.GCREF) class STMReadBarrierDescr(STMBarrierDescr): @@ -412,9 +425,8 @@ assert stmcat == 'P2R' STMBarrierDescr.__init__(self, gc_ll_descr, stmcat, 'stm_read_barrier') - - + class STMWriteBarrierDescr(STMBarrierDescr): def __init__(self, gc_ll_descr, stmcat): assert stmcat in ['P2W', 'R2W'] @@ -448,7 +460,9 @@ self._make_layoutbuilder() self._make_gcrootmap() self._setup_gcclass() - self._setup_tid() + if not self.stm: + # XXX: not needed with stm/shadowstack?? + self._setup_tid() self._setup_write_barrier() self._setup_str() self._make_functions(really_not_translated) diff --git a/rpython/jit/backend/llsupport/stmrewrite.py b/rpython/jit/backend/llsupport/stmrewrite.py --- a/rpython/jit/backend/llsupport/stmrewrite.py +++ b/rpython/jit/backend/llsupport/stmrewrite.py @@ -9,8 +9,8 @@ # # Any SETFIELD_GC, SETARRAYITEM_GC, SETINTERIORFIELD_GC must be done on a # W object. The operation that forces an object p1 to be W is -# COND_CALL_STM_WB(p1, descr=x2Wdescr), for x in 'PGORL'. This -# COND_CALL_STM_WB is a bit special because if p1 is not W, it *replaces* +# COND_CALL_STM_B(p1, descr=x2Wdescr), for x in 'PGORL'. This +# COND_CALL_STM_B is a bit special because if p1 is not W, it *replaces* # its value with the W copy (by changing the register's value and # patching the stack location if any). It's still conceptually the same # object, but the pointer is different. @@ -121,10 +121,7 @@ except KeyError: return v_base # no barrier needed args = [v_base,] - if target_category == 'W': - op = rop.COND_CALL_STM_WB - else: - op = rop.COND_CALL_STM_RB + op = rop.COND_CALL_STM_B self.newops.append(ResOperation(op, args, None, descr=write_barrier_descr)) diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py b/rpython/jit/backend/llsupport/test/test_stmrewrite.py --- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py +++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py @@ -44,7 +44,7 @@ jump() """, """ [p1, p2] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, p2, descr=tzdescr) jump() """) @@ -59,7 +59,7 @@ """, """ [p1, p2] p3 = same_as(ConstPtr(t)) - cond_call_stm_wb(p3, descr=P2Wdescr) + cond_call_stm_b(p3, descr=P2Wdescr) setfield_gc(p3, p2, descr=tzdescr) jump() """, t=NULL) @@ -87,9 +87,9 @@ jump() """, """ [p1, p2, p3, p4] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, p2, descr=tzdescr) - cond_call_stm_wb(p3, descr=P2Wdescr) + cond_call_stm_b(p3, descr=P2Wdescr) setfield_gc(p3, p4, descr=tzdescr) jump() """) @@ -102,7 +102,7 @@ jump() """, """ [p1, p2, i3] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, p2, descr=tzdescr) setfield_gc(p1, i3, descr=tydescr) jump() @@ -117,10 +117,10 @@ jump(p1) """, """ [p1, p2, i3] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, p2, descr=tzdescr) label(p1, i3) - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, i3, descr=tydescr) jump(p1) """) @@ -162,7 +162,7 @@ jump(p2) """, """ [p1] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) p2 = getfield_gc(p1, descr=tzdescr) jump(p2) """) @@ -177,7 +177,7 @@ """, """ [p1] p3 = same_as(ConstPtr(t)) - cond_call_stm_rb(p3, descr=P2Rdescr) + cond_call_stm_b(p3, descr=P2Rdescr) p2 = getfield_gc(p3, descr=tzdescr) jump(p2) """, t=NULL) @@ -190,7 +190,7 @@ jump(i3) """, """ [p1, i2] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) i3 = getarrayitem_gc(p1, i2, descr=adescr) jump(i3) """) @@ -202,7 +202,7 @@ jump(i3) """, """ [p1, i2] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) i3 = getinteriorfield_gc(p1, i2, descr=adescr) jump(i3) """) @@ -215,7 +215,7 @@ jump(p2, i2) """, """ [p1] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) p2 = getfield_gc(p1, descr=tzdescr) i2 = getfield_gc(p1, descr=tydescr) jump(p2, i2) @@ -229,9 +229,9 @@ jump(p2, i2) """, """ [p1] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) p2 = getfield_gc(p1, descr=tzdescr) - cond_call_stm_rb(p2, descr=P2Rdescr) + cond_call_stm_b(p2, descr=P2Rdescr) i2 = getfield_gc(p2, descr=tydescr) jump(p2, i2) """) @@ -247,10 +247,10 @@ jump(p1) """, """ [p1] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) i1 = getfield_gc(p1, descr=tydescr) i2 = int_add(i1, 1) - cond_call_stm_wb(p1, descr=R2Wdescr) + cond_call_stm_b(p1, descr=R2Wdescr) setfield_gc(p1, i2, descr=tydescr) jump(p1) """) @@ -263,7 +263,7 @@ jump(p2) """, """ [p1] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, 123, descr=tydescr) p2 = getfield_gc(p1, descr=tzdescr) jump(p2) @@ -295,10 +295,10 @@ jump(p2) """, """ [p1] - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p1, descr=P2Rdescr) p2 = getfield_gc(p1, descr=tzdescr) call(p2) - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, 5, descr=tydescr) jump(p2) """) @@ -358,9 +358,9 @@ jump() """, """ [p1, i1, p2, p3, i3, p4] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setarrayitem_gc(p1, i1, p2, descr=adescr) - cond_call_stm_wb(p3, descr=P2Wdescr) + cond_call_stm_b(p3, descr=P2Wdescr) setarrayitem_gc(p3, i3, p4, descr=adescr) jump() """) @@ -374,7 +374,7 @@ jump() """, """ [p1, p2, i2, p3, i3] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setarrayitem_gc(p1, i2, p2, descr=adescr) i4 = read_timestamp() setarrayitem_gc(p1, i3, p3, descr=adescr) @@ -390,7 +390,7 @@ jump() """, """ [p1, p2, i2, p3, i3] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setinteriorfield_gc(p1, i2, p2, descr=adescr) i4 = read_timestamp() setinteriorfield_gc(p1, i3, p3, descr=adescr) @@ -405,7 +405,7 @@ jump() """, """ [p1, i2, i3] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) strsetitem(p1, i2, i3) unicodesetitem(p1, i2, i3) jump() @@ -432,11 +432,11 @@ jump(i2, p7) """ % op, """ [i1, i2, i3, p7] - cond_call_stm_wb(p7, descr=P2Wdescr) + cond_call_stm_b(p7, descr=P2Wdescr) setfield_gc(p7, 10, descr=tydescr) $INEV %s - cond_call_stm_wb(p7, descr=P2Wdescr) + cond_call_stm_b(p7, descr=P2Wdescr) setfield_gc(p7, 20, descr=tydescr) jump(i2, p7) """ % op, calldescr2=calldescr2) @@ -448,8 +448,8 @@ jump() """, """ [p1, p2, i1, i2, i3] - cond_call_stm_wb(p2, descr=P2Wdescr) - cond_call_stm_rb(p1, descr=P2Rdescr) + cond_call_stm_b(p2, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Rdescr) copystrcontent(p1, p2, i1, i2, i3) jump() """) @@ -468,7 +468,7 @@ jump(p1) """ % op, """ [p1] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, 10, descr=tydescr) %s setfield_gc(p1, 20, descr=tydescr) @@ -491,10 +491,10 @@ jump(p1) """ % op, """ [p1] - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, 10, descr=tydescr) %s - cond_call_stm_wb(p1, descr=P2Wdescr) + cond_call_stm_b(p1, descr=P2Wdescr) setfield_gc(p1, 20, descr=tydescr) jump(p1) """ % op, calldescr2=calldescr2) diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -346,8 +346,7 @@ rop.CALL_ASSEMBLER, rop.COND_CALL_GC_WB, rop.COND_CALL_GC_WB_ARRAY, - rop.COND_CALL_STM_WB, - rop.COND_CALL_STM_RB, + rop.COND_CALL_STM_B, rop.DEBUG_MERGE_POINT, rop.JIT_DEBUG, rop.SETARRAYITEM_RAW, diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -500,8 +500,7 @@ 'STRSETITEM/3', 'UNICODESETITEM/3', #'RUNTIMENEW/1', # ootype operation - 'COND_CALL_STM_WB/1d', # objptr (write barrier) - 'COND_CALL_STM_RB/1d', # objptr (read barrier) + 'COND_CALL_STM_B/1d', # objptr (write/read barrier) 'COND_CALL_GC_WB/2d', # [objptr, newvalue] (for the write barrier) 'COND_CALL_GC_WB_ARRAY/3d', # [objptr, arrayindex, newvalue] (write barr.) 'DEBUG_MERGE_POINT/*', # debugging only 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 @@ -45,7 +45,10 @@ VISIT_FPTR = lltype.Ptr(lltype.FuncType([llmemory.Address], lltype.Void)) - TRANSLATION_PARAMS = {} + minimal_size_in_nursery = llmemory.sizeof(HDR) + + TRANSLATION_PARAMS = { + } def setup(self): # Hack: MovingGCBase.setup() sets up stuff related to id(), which @@ -90,6 +93,15 @@ (obj + offset_to_length).signed[0] = length return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF) + + @classmethod + def JIT_max_size_of_young_obj(cls): + return -1 # XXX: should not be used + + @classmethod + def JIT_minimal_size_in_nursery(cls): + return cls.minimal_size_in_nursery + def collect(self, gen=1): """Do a minor (gen=0) or major (gen>0) collection.""" if gen > 0: diff --git a/rpython/memory/gctransform/stmframework.py b/rpython/memory/gctransform/stmframework.py --- a/rpython/memory/gctransform/stmframework.py +++ b/rpython/memory/gctransform/stmframework.py @@ -46,6 +46,9 @@ def gc_header_for(self, obj, needs_hash=False): return self.gcdata.gc.gcheaderbuilder.header_of_object(obj) + def gct_gc_adr_of_root_stack_top(self, hop): + hop.genop("stm_get_root_stack_top") + def _gct_with_roots_pushed(self, hop): livevars = self.push_roots(hop) self.default(hop) diff --git a/rpython/translator/stm/funcgen.py b/rpython/translator/stm/funcgen.py --- a/rpython/translator/stm/funcgen.py +++ b/rpython/translator/stm/funcgen.py @@ -94,6 +94,11 @@ return '%s = (%s)stm_pop_root();' % ( arg0, cdecl(funcgen.lltypename(op.args[0]), '')) +def stm_get_root_stack_top(funcgen, op): + result = funcgen.expr(op.result) + return '%s = (%s)stm_shadowstack;' % ( + result, cdecl(funcgen.lltypename(op.result), '')) + def stm_allocate(funcgen, op): arg0 = funcgen.expr(op.args[0]) arg1 = funcgen.expr(op.args[1]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit