[pypy-svn] r76571 - in pypy/branch/memrecord: . pypy/jit/backend/llsupport pypy/jit/backend/x86 pypy/translator/c pypy/translator/c/src
arigo at codespeak.net
arigo at codespeak.net
Tue Aug 10 18:08:31 CEST 2010
Author: arigo
Date: Tue Aug 10 18:08:28 2010
New Revision: 76571
Added:
pypy/branch/memrecord/dump.py (contents, props changed)
Modified:
pypy/branch/memrecord/pypy/jit/backend/llsupport/gc.py
pypy/branch/memrecord/pypy/jit/backend/llsupport/llmodel.py
pypy/branch/memrecord/pypy/jit/backend/x86/assembler.py
pypy/branch/memrecord/pypy/translator/c/funcgen.py
pypy/branch/memrecord/pypy/translator/c/src/debug_memrecord.h
Log:
In-progress.
Added: pypy/branch/memrecord/dump.py
==============================================================================
--- (empty file)
+++ pypy/branch/memrecord/dump.py Tue Aug 10 18:08:28 2010
@@ -0,0 +1,10 @@
+#! /usr/bin/env python
+import struct
+
+f = open('debug_memrecord', 'rb')
+while 1:
+ data = f.read(20)
+ if len(data) < 20:
+ break
+ print ' %8x %8x %8x %8x %8x' % struct.unpack("iiiii", data)
+f.close()
Modified: pypy/branch/memrecord/pypy/jit/backend/llsupport/gc.py
==============================================================================
--- pypy/branch/memrecord/pypy/jit/backend/llsupport/gc.py (original)
+++ pypy/branch/memrecord/pypy/jit/backend/llsupport/gc.py Tue Aug 10 18:08:28 2010
@@ -623,3 +623,7 @@
raise NotImplementedError("GC transformer %r not supported by "
"the JIT backend" % (name,))
return cls(gcdescr, translator, rtyper)
+
+
+debug_memrec = rffi.llexternal('DEBUG_MEMREC', [lltype.Signed]*5,
+ lltype.Void, _nowrapper=True)
Modified: pypy/branch/memrecord/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/memrecord/pypy/jit/backend/llsupport/llmodel.py (original)
+++ pypy/branch/memrecord/pypy/jit/backend/llsupport/llmodel.py Tue Aug 10 18:08:28 2010
@@ -18,6 +18,7 @@
from pypy.jit.backend.llsupport.descr import BaseIntCallDescr, GcPtrCallDescr
from pypy.jit.backend.llsupport.descr import FloatCallDescr, VoidCallDescr
from pypy.rpython.annlowlevel import cast_instance_to_base_ptr
+from pypy.jit.backend.llsupport.gc import debug_memrec
class AbstractLLCPU(AbstractCPU):
@@ -302,8 +303,15 @@
self.gc_ll_descr.do_write_barrier(gcref, newvalue)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
+ items = rffi.ptradd(items, itemindex * 4) # XXX
items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
- items[itemindex] = self.cast_gcref_to_int(newvalue)
+ oldvalue = items[0]
+ items[0] = self.cast_gcref_to_int(newvalue)
+ debug_memrec(6,
+ rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[0],
+ rffi.cast(lltype.Signed, items),
+ oldvalue,
+ items[0])
# --- end of GC unsafe code ---
@specialize.argtype(2)
@@ -399,7 +407,13 @@
# --- start of GC unsafe code (no GC operation!) ---
fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
fieldptr = rffi.cast(rffi.CArrayPtr(lltype.Signed), fieldptr)
+ oldvalue = fieldptr[0]
fieldptr[0] = self.cast_gcref_to_int(newvalue)
+ debug_memrec(5,
+ rffi.cast(rffi.CArrayPtr(lltype.Signed), struct)[0],
+ rffi.cast(lltype.Signed, fieldptr),
+ oldvalue,
+ fieldptr[0])
# --- end of GC unsafe code ---
@specialize.argtype(1)
Modified: pypy/branch/memrecord/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/memrecord/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/memrecord/pypy/jit/backend/x86/assembler.py Tue Aug 10 18:08:28 2010
@@ -221,6 +221,7 @@
self._build_float_constants()
if hasattr(gc_ll_descr, 'get_malloc_fixedsize_slowpath_addr'):
self._build_malloc_fixedsize_slowpath()
+ self._build_debug_memrecord()
s = os.environ.get('PYPYLOG')
if s:
if s.find(':') != -1:
@@ -263,6 +264,11 @@
self.float_const_neg_addr = float_constants
self.float_const_abs_addr = float_constants + 16
+ def _build_debug_memrecord(self):
+ fptr = llhelper(lltype.Ptr(FOUR_INT_ARGS),
+ debug_memrecord_setfield_gc)
+ self.debug_memrecord_setfield_gc_code = rffi.cast(lltype.Signed, fptr)
+
def _build_malloc_fixedsize_slowpath(self):
# ---------- first helper for the slow path of malloc ----------
self.malloc_fixedsize_slowpath1 = self.mc.tell()
@@ -1079,6 +1085,24 @@
if isinstance(value_loc, RegLoc) and value_loc.is_xmm:
self.mc.MOVSD(dest_addr, value_loc)
elif size == WORD:
+ #
+ if op.args[0].type == REF and op.args[1].type == REF:
+ self.mc.PUSH(eax)
+ self.mc.PUSH(ecx)
+ self.mc.PUSH(edx)
+ self.mc.PUSH(value_loc)
+ self.mc.PUSH(ofs_loc)
+ self.mc.PUSH(base_loc)
+ self.mc.PUSH(imm(self.mc.tell()))
+ self.mc.CALL(imm(self.debug_memrecord_setfield_gc_code))
+ self.mc.POP(eax)
+ self.mc.POP(eax)
+ self.mc.POP(eax)
+ self.mc.POP(eax)
+ self.mc.POP(edx)
+ self.mc.POP(ecx)
+ self.mc.POP(eax)
+ #
self.mc.MOV(dest_addr, value_loc)
elif size == 2:
self.mc.MOV16(dest_addr, value_loc)
@@ -1856,3 +1880,13 @@
def heap(addr):
return AddressLoc(ImmedLoc(addr), ImmedLoc(0), 0, 0)
+
+
+from pypy.jit.backend.llsupport.gc import debug_memrec
+FOUR_INT_ARGS = lltype.FuncType([lltype.Signed]*4, lltype.Void)
+def debug_memrecord_setfield_gc(asmaddr, base, ofs, value):
+ debug_memrec(asmaddr,
+ rffi.cast(rffi.CArrayPtr(lltype.Signed), base)[0],
+ base + ofs,
+ rffi.cast(rffi.CArrayPtr(lltype.Signed), base + ofs)[0],
+ value)
Modified: pypy/branch/memrecord/pypy/translator/c/funcgen.py
==============================================================================
--- pypy/branch/memrecord/pypy/translator/c/funcgen.py (original)
+++ pypy/branch/memrecord/pypy/translator/c/funcgen.py Tue Aug 10 18:08:28 2010
@@ -20,7 +20,7 @@
LOCALVAR = 'l_%s'
KEEP_INLINED_GRAPHS = False
-DMR_COUNT = 0
+DMR_COUNT = 16
class FunctionCodeGenerator(object):
"""
@@ -485,8 +485,8 @@
self.lltypemap(op.args[0]).TO._gckind == 'gc'):
global DMR_COUNT
DMR_COUNT += 1
- result = 'RPyWrite(%d, %s, %s);' % (
- DMR_COUNT, targetexpr, newvalue)
+ result = 'RPyWrite(0x%x, %s, %s, %s);' % (
+ DMR_COUNT, self.expr(op.args[0]), targetexpr, newvalue)
return result
def OP_GETFIELD(self, op, ampersand=''):
Modified: pypy/branch/memrecord/pypy/translator/c/src/debug_memrecord.h
==============================================================================
--- pypy/branch/memrecord/pypy/translator/c/src/debug_memrecord.h (original)
+++ pypy/branch/memrecord/pypy/translator/c/src/debug_memrecord.h Tue Aug 10 18:08:28 2010
@@ -7,27 +7,29 @@
struct debug_memrecord_s {
long a;
- void *b, *c, *d;
+ void *b, *c, *d, *e;
};
-#define DEBUG_MEMREC(a1, b1, c1, d1) do { \
+#define DEBUG_MEMREC(a1, b1, c1, d1, e1) do { \
struct debug_memrecord_s _dmr_s; \
_dmr_s.a = a1; \
_dmr_s.b = b1; \
_dmr_s.c = c1; \
_dmr_s.d = d1; \
+ _dmr_s.e = e1; \
fwrite_unlocked(&_dmr_s, sizeof(struct debug_memrecord_s), 1, \
debug_memrecord_f); \
} while(0)
-#define RPyWrite(posid, targetexpr, newvalue) \
- DEBUG_MEMREC(posid, &(targetexpr), targetexpr, newvalue); \
+#define RPyWrite(posid, container, targetexpr, newvalue) \
+ DEBUG_MEMREC(posid, *(void**)(container), &(targetexpr), \
+ targetexpr, newvalue); \
targetexpr = newvalue
#undef OP_RAW_MEMCLEAR
-#define OP_RAW_MEMCLEAR(p, size, r) \
- memset((void*)p, 0, size); \
- DEBUG_MEMREC(0, (void*)p, (void*)size, (void*)0)
+#define OP_RAW_MEMCLEAR(p, size, r) \
+ memset((void*)p, 0, size); \
+ DEBUG_MEMREC(-1, (void*)p, (void*)size, (void*)0, (void*)0)
/************************************************************/
More information about the Pypy-commit
mailing list