Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66285:7abd061e246f
Date: 2013-08-21 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/7abd061e246f/
Log: fix an error in richards.py caused by missing barriers in llmodel.py
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
@@ -426,8 +426,8 @@
@specialize.arg(2)
def _do_barrier(self, gcref_struct, returns_modified_object):
+ raise NotImplementedError("implement in subclasses!")
assert self.returns_modified_object == returns_modified_object
- # XXX: fastpath for Read and Write variants
funcptr = self.get_barrier_funcptr(returns_modified_object)
res = funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
@@ -451,7 +451,8 @@
priv_rev = self.llop1.stm_get_adr_of_private_rev_num(rffi.SIGNEDP)
if objhdr.h_revision == priv_rev[0]:
return gcref_struct
-
+
+ # readcache[obj] == obj
read_cache = self.llop1.stm_get_adr_of_read_barrier_cache(rffi.SIGNEDP)
objint = llmemory.cast_adr_to_int(objadr)
assert WORD == 8, "check for 32bit compatibility"
@@ -461,7 +462,6 @@
if rcp[index] == objint:
return gcref_struct
- # XXX: readcache!
funcptr = self.get_barrier_funcptr(returns_modified_object)
res = funcptr(objadr)
return llmemory.cast_adr_to_ptr(res, llmemory.GCREF)
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
@@ -52,6 +52,10 @@
self._setup_exception_handling_untranslated()
self.asmmemmgr = AsmMemoryManager()
self._setup_frame_realloc(translate_support_code)
+ self._setup_descrs()
+ self.setup()
+
+ def _setup_descrs(self):
ad = self.gc_ll_descr.getframedescrs(self).arraydescr
self.signedarraydescr = ad
# the same as normal JITFRAME, however with an array of pointers
@@ -63,7 +67,6 @@
else:
self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize,
ad.lendescr, FLAG_FLOAT)
- self.setup()
def getarraydescr_for_frame(self, type):
if type == history.FLOAT:
@@ -475,6 +478,7 @@
def bh_arraylen_gc(self, array, arraydescr):
assert isinstance(arraydescr, ArrayDescr)
+ array = self.gc_ll_descr.do_stm_barrier(array, 'R')
ofs = arraydescr.lendescr.offset
return rffi.cast(rffi.CArrayPtr(lltype.Signed), array)[ofs/WORD]
@@ -617,18 +621,22 @@
# --- end of GC unsafe code ---
def bh_strlen(self, string):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'R')
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
return len(s.chars)
def bh_unicodelen(self, string):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'R')
u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
return len(u.chars)
def bh_strgetitem(self, string, index):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'R')
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
return ord(s.chars[index])
def bh_unicodegetitem(self, string, index):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'R')
u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
return ord(u.chars[index])
@@ -759,6 +767,8 @@
def bh_new_with_vtable(self, vtable, sizedescr):
res = self.gc_ll_descr.gc_malloc(sizedescr)
if self.vtable_offset is not None:
+ assert not self.gc_ll_descr.stm
+ res = self.gc_ll_descr.do_stm_barrier(res, 'W')
as_array = rffi.cast(rffi.CArrayPtr(lltype.Signed), res)
as_array[self.vtable_offset/WORD] = vtable
return res
@@ -767,6 +777,7 @@
return lltype.malloc(rffi.CCHARP.TO, size, flavor='raw')
def bh_classof(self, struct):
+ struct = self.gc_ll_descr.do_stm_barrier(struct, 'R')
struct = lltype.cast_opaque_ptr(rclass.OBJECTPTR, struct)
result_adr = llmemory.cast_ptr_to_adr(struct.typeptr)
return heaptracker.adr2int(result_adr)
@@ -781,19 +792,25 @@
return self.gc_ll_descr.gc_malloc_unicode(length)
def bh_strsetitem(self, string, index, newvalue):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'W')
s = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), string)
s.chars[index] = chr(newvalue)
def bh_unicodesetitem(self, string, index, newvalue):
+ string = self.gc_ll_descr.do_stm_barrier(string, 'W')
u = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), string)
u.chars[index] = unichr(newvalue)
def bh_copystrcontent(self, src, dst, srcstart, dststart, length):
+ src = self.gc_ll_descr.do_stm_barrier(src, 'R')
+ dst = self.gc_ll_descr.do_stm_barrier(dst, 'W')
src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), src)
dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), dst)
rstr.copy_string_contents(src, dst, srcstart, dststart, length)
def bh_copyunicodecontent(self, src, dst, srcstart, dststart, length):
+ src = self.gc_ll_descr.do_stm_barrier(src, 'R')
+ dst = self.gc_ll_descr.do_stm_barrier(dst, 'W')
src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), src)
dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), dst)
rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
diff --git a/rpython/jit/backend/x86/test/test_stm_integration.py
b/rpython/jit/backend/x86/test/test_stm_integration.py
--- a/rpython/jit/backend/x86/test/test_stm_integration.py
+++ b/rpython/jit/backend/x86/test/test_stm_integration.py
@@ -188,15 +188,21 @@
RESULT=lltype.Signed)
def malloc_big_fixedsize(size, tid):
+ print "malloc:", size, tid
+ if size > sys.maxint / 2:
+ # for testing exception
+ return lltype.nullptr(llmemory.GCREF.TO)
+
entries = size + StmGC.GCHDRSIZE
TP = rffi.CArray(lltype.Char)
obj = lltype.malloc(TP, n=entries, flavor='raw',
- track_allocation=False, zero=True)
+ track_allocation=False, zero=True)
objptr = rffi.cast(StmGC.GCHDRP, obj)
objptr.h_tid = rffi.cast(lltype.Unsigned,
- StmGC.GCFLAG_OLD|StmGC.GCFLAG_WRITE_BARRIER
- | tid)
+ StmGC.GCFLAG_OLD
+ | StmGC.GCFLAG_WRITE_BARRIER | tid)
objptr.h_revision = rffi.cast(lltype.Signed, -sys.maxint)
+ print "return:", obj, objptr
return rffi.cast(llmemory.GCREF, objptr)
self.generate_function('malloc_big_fixedsize', malloc_big_fixedsize,
[lltype.Signed] * 2)
@@ -659,6 +665,108 @@
deadframe = self.cpu.execute_token(othertoken, *args)
assert called == [id(finish_descr2)]
+
+ def test_call_malloc_gc(self):
+ cpu = self.cpu
+ cpu.gc_ll_descr.init_nursery(100)
+ cpu.setup_once()
+
+ size = WORD*3
+ addr = cpu.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
+ typeid = 11
+ descr = cpu.gc_ll_descr.malloc_big_fixedsize_descr
+
+ p0 = BoxPtr()
+ ops1 = [ResOperation(rop.CALL_MALLOC_GC,
+ [ConstInt(addr), ConstInt(size),
ConstInt(typeid)],
+ p0, descr),
+ ResOperation(rop.FINISH, [p0], None,
+ descr=BasicFinalDescr(0)),
+ ]
+
+ inputargs = []
+ looptoken = JitCellToken()
+ c_loop = cpu.compile_loop(inputargs, ops1,
+ looptoken)
+
+ args = []
+ print "======"
+ print "inputargs:", inputargs, args
+ print "\n".join(map(str,c_loop[1]))
+
+ frame = self.cpu.execute_token(looptoken, *args)
+
+
+ def test_assembler_call_propagate_exc(self):
+ cpu = self.cpu
+ cpu._setup_descrs()
+ cpu.gc_ll_descr.init_nursery(100)
+
+ excdescr = BasicFailDescr(666)
+ cpu.propagate_exception_descr = excdescr
+ cpu.setup_once() # xxx redo it, because we added
+ # propagate_exception
+
+ def assembler_helper(deadframe, virtualizable):
+ #assert cpu.get_latest_descr(deadframe) is excdescr
+ # let's assume we handled that
+ return 3
+
+ FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF,
+ llmemory.GCREF],
+ lltype.Signed))
+ class FakeJitDriverSD:
+ index_of_virtualizable = -1
+ _assembler_helper_ptr = llhelper(FUNCPTR, assembler_helper)
+ assembler_helper_adr = llmemory.cast_ptr_to_adr(
+ _assembler_helper_ptr)
+
+
+
+ addr = cpu.gc_ll_descr.get_malloc_fn_addr('malloc_big_fixedsize')
+ typeid = 11
+ descr = cpu.gc_ll_descr.malloc_big_fixedsize_descr
+
+ p0 = BoxPtr()
+ i0 = BoxInt()
+ ops = [ResOperation(rop.CALL_MALLOC_GC,
+ [ConstInt(addr), i0, ConstInt(typeid)],
+ p0, descr),
+ ResOperation(rop.FINISH, [p0], None,
+ descr=BasicFinalDescr(0)),
+ ]
+
+ inputargs = [i0]
+ looptoken = JitCellToken()
+ looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
+ c_loop = cpu.compile_loop(inputargs, ops, looptoken)
+
+
+ ARGS = [lltype.Signed] * 10
+ RES = lltype.Signed
+ FakeJitDriverSD.portal_calldescr = cpu.calldescrof(
+ lltype.Ptr(lltype.FuncType(ARGS, RES)), ARGS, RES,
+ EffectInfo.MOST_GENERAL)
+ i1 = ConstInt(sys.maxint - 1)
+ i2 = BoxInt()
+ finaldescr = BasicFinalDescr(1)
+ not_forced = ResOperation(rop.GUARD_NOT_FORCED, [], None,
+ descr=BasicFailDescr(1))
+ not_forced.setfailargs([])
+ ops = [ResOperation(rop.CALL_ASSEMBLER, [i1], i2, descr=looptoken),
+ not_forced,
+ ResOperation(rop.FINISH, [i1], None, descr=finaldescr),
+ ]
+ othertoken = JitCellToken()
+ cpu.done_with_this_frame_descr_int = BasicFinalDescr()
+ loop = cpu.compile_loop([], ops, othertoken)
+
+ deadframe = cpu.execute_token(othertoken)
+ frame = rffi.cast(JITFRAMEPTR, deadframe)
+ frame_adr = rffi.cast(lltype.Signed, frame.jf_descr)
+ assert frame_adr != id(finaldescr)
+
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit