[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