Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66016:81b701256281
Date: 2013-08-08 12:16 +0200
http://bitbucket.org/pypy/pypy/changeset/81b701256281/

Log:    lots of little changes and possible untested fixes

diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -395,15 +395,19 @@
             addr = int(m.group(1), 16)
         addrs.setdefault(addr, []).append(name)
     dumps = {}
-    executables = set(["??"])
+    executables = set(["??",])
     symbols = {}
     for entry in extract_category(log, 'jit-backend-dump'):
         entry = purge_thread_numbers(entry)
         backend, executable, dump, _ = entry.split("\n")
-        _, executable = executable.split(" ")
-        if executable not in executables:
-            symbols.update(load_symbols(executable))
-            executables.add(executable)
+        if "(out of memory!)" not in executable:
+            _, executable = executable.split(" ")
+            if executable not in executables:
+                try:
+                    symbols.update(load_symbols(executable))
+                except Exception as e:
+                    print e
+                executables.add(executable)
         _, addr, _, data = re.split(" +", dump)
         backend_name = backend.split(" ")[1]
         addr = int(addr[1:], 16)
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
@@ -441,14 +441,16 @@
     def __init__(self, gc_ll_descr, stmcat):
         assert stmcat == 'P2R'
         STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
-                                 'stm_DirectReadBarrier')
+                                 'stm_read_barrier') 
+        # XXX: implement fastpath then change to stm_DirectReadBarrier
 
         
 class STMWriteBarrierDescr(STMBarrierDescr):
     def __init__(self, gc_ll_descr, stmcat):
         assert stmcat in ['P2W']
         STMBarrierDescr.__init__(self, gc_ll_descr, stmcat,
-                                 'stm_WriteBarrier')
+                                 'stm_write_barrier')
+        # XXX: implement fastpath, then change to stm_WriteBarrier
     
         
 class GcLLDescr_framework(GcLLDescription):
@@ -560,6 +562,8 @@
         @specialize.argtype(0)
         def do_stm_barrier(gcref, cat):
             if lltype.typeOf(gcref) is lltype.Signed:   # ignore if 'raw'
+                # we are inevitable already because llmodel
+                # does everything with raw-references
                 return gcref
             if cat == 'W':
                 descr = self.P2Wdescr
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
@@ -41,6 +41,8 @@
         if translator and translator.config.translation.gcremovetypeptr:
             self.vtable_offset = None
         else:
+            assert not self.gc_ll_descr.stm, """doesn't work in stm
+                because it would need a read barrier when reading typeptr"""
             self.vtable_offset, _ = symbolic.get_field_token(rclass.OBJECT,
                                                              'typeptr',
                                                         translate_support_code)
@@ -403,6 +405,7 @@
             raise NotImplementedError("size = %d" % size)
 
     def read_ref_at_mem(self, gcref, ofs):
+        gcref = self.gc_ll_descr.do_stm_barrier(gcref, 'R')
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
@@ -411,7 +414,7 @@
         return pval
 
     def write_ref_at_mem(self, gcref, ofs, newvalue):
-        self.gc_ll_descr.do_write_barrier(gcref, newvalue)
+        gcref = self.gc_ll_descr.do_stm_barrier(gcref, 'W')
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
@@ -420,6 +423,7 @@
 
     @specialize.argtype(1)
     def read_float_at_mem(self, gcref, ofs):
+        gcref = self.gc_ll_descr.do_stm_barrier(gcref, 'R')
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
@@ -429,6 +433,7 @@
 
     @specialize.argtype(1)
     def write_float_at_mem(self, gcref, ofs, newvalue):
+        gcref = self.gc_ll_descr.do_stm_barrier(gcref, 'W')
         # --- start of GC unsafe code (no GC operation!) ---
         items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
         items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
@@ -590,7 +595,7 @@
         ofs, size, _ = self.unpack_arraydescr_size(arraydescr)
         ofs += descr.fielddescr.offset
         gcref = self.gc_ll_descr.do_stm_barrier(gcref, 'W')
-        self.gc_ll_descr.do_write_barrier(gcref, newvalue)
+        #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 + size * itemindex)
@@ -698,7 +703,7 @@
         assert lltype.typeOf(struct) is not lltype.Signed, (
             "can't handle write barriers for setfield_raw")
         struct = self.gc_ll_descr.do_stm_barrier(struct, 'W')
-        self.gc_ll_descr.do_write_barrier(struct, newvalue)
+        #self.gc_ll_descr.do_write_barrier(struct, newvalue)
         # --- 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)
diff --git a/rpython/jit/backend/tool/viewcode.py 
b/rpython/jit/backend/tool/viewcode.py
--- a/rpython/jit/backend/tool/viewcode.py
+++ b/rpython/jit/backend/tool/viewcode.py
@@ -114,8 +114,9 @@
     p = subprocess.Popen(symbollister % filename, shell=True,
                          stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     stdout, stderr = p.communicate()
-    assert not p.returncode, ('Encountered an error running nm: %s' %
-                              stderr)
+    if not p.returncode:
+        raise Exception('Encountered an error running nm: %s' %
+                        stderr)
     for line in stdout.splitlines(True):
         match = re_symbolentry.match(line)
         if match:
@@ -274,7 +275,10 @@
             elif line.startswith('SYS_EXECUTABLE '):
                 filename = line[len('SYS_EXECUTABLE '):].strip()
                 if filename != self.executable_name and filename != '??':
-                    self.symbols.update(load_symbols(filename))
+                    try:
+                        self.symbols.update(load_symbols(filename))
+                    except Exception as e:
+                        print e
                     self.executable_name = filename
 
     def find_cross_references(self):
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1039,6 +1039,7 @@
     def genop_ptr_eq(self, op, arglocs, result_loc):
         if not self.cpu.gc_ll_descr.stm:
             self.genop_int_eq(op, arglocs, result_loc)
+            return
         assert self.cpu.gc_ll_descr.stm
         rl = result_loc.lowest8bits()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
@@ -1048,6 +1049,7 @@
     def genop_ptr_ne(self, op, arglocs, result_loc):
         if not self.cpu.gc_ll_descr.stm:
             self.genop_int_ne(op, arglocs, result_loc)
+            return
         assert self.cpu.gc_ll_descr.stm
         rl = result_loc.lowest8bits()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
@@ -1059,26 +1061,30 @@
         if not self.cpu.gc_ll_descr.stm:
             self.genop_guard_int_eq(op, guard_op, guard_token,
                                     arglocs, result_loc)
+            return
+        assert self.cpu.gc_ll_descr.stm
+        guard_opnum = guard_op.getopnum()
+        self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
+        if guard_opnum == rop.GUARD_FALSE:
+            # jump to failure-code if ptrs are equal
+            self.implement_guard(guard_token, "NZ")
+        else:
+            # jump to failure-code if ptrs are not equal
+            self.implement_guard(guard_token, "Z")
+
+    def genop_guard_ptr_ne(self, op, guard_op, guard_token, 
+                           arglocs, result_loc):
+        if not self.cpu.gc_ll_descr.stm:
+            self.genop_guard_int_ne(op, guard_op, guard_token,
+                                    arglocs, result_loc)
+            return
         assert self.cpu.gc_ll_descr.stm
         guard_opnum = guard_op.getopnum()
         self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
         if guard_opnum == rop.GUARD_FALSE:
             self.implement_guard(guard_token, "Z")
         else:
-            self.implement_guard(guard_token, "NZ")
-
-    def genop_guard_ptr_ne(self, op, guard_op, guard_token, 
-                           arglocs, result_loc):
-        if not self.cpu.gc_ll_descr.stm:
-            self.genop_guard_int_ne(op, guard_op, guard_token,
-                                    arglocs, result_loc)
-        assert self.cpu.gc_ll_descr.stm
-        guard_opnum = guard_op.getopnum()
-        self._stm_ptr_eq_fastpath(self.mc, arglocs, result_loc)
-        if guard_opnum == rop.GUARD_FALSE:
-            self.implement_guard(guard_token, "NZ")
-        else:
-            self.implement_guard(guard_token, "Z")        
+            self.implement_guard(guard_token, "NZ")        
         
     def _cmpop(cond, rev_cond):
         def genop_cmp(self, op, arglocs, result_loc):
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
@@ -414,6 +414,7 @@
             # We force immed64 into registers here.
             x = self.make_sure_var_in_reg(args[0], args, selected_reg=ecx)
             y = self.make_sure_var_in_reg(args[1], args, selected_reg=eax)
+            self.rm.possibly_free_var(args[1])
         else:
             x = self.make_sure_var_in_reg(args[0], args)
             y = self.loc(args[1])
diff --git a/rpython/translator/c/src/rtyper.c 
b/rpython/translator/c/src/rtyper.c
--- a/rpython/translator/c/src/rtyper.c
+++ b/rpython/translator/c/src/rtyper.c
@@ -16,6 +16,7 @@
 
 char *RPyString_AsCharP(RPyString *rps)
 {
+       rps = (RPyString *)stm_read_barrier((gcptr)rps);
        Signed len = RPyString_Size(rps);
        struct _RPyString_dump_t *dump = \
                        malloc(sizeof(struct _RPyString_dump_t) + len);
diff --git a/rpython/translator/stm/src_stm/et.c 
b/rpython/translator/stm/src_stm/et.c
--- a/rpython/translator/stm/src_stm/et.c
+++ b/rpython/translator/stm/src_stm/et.c
@@ -7,7 +7,6 @@
  */
 #include "stmimpl.h"
 
-#ifdef _GC_DEBUG
 char tmp_buf[128];
 char* stm_dbg_get_hdr_str(gcptr obj)
 {
@@ -27,7 +26,6 @@
     cur += sprintf(cur, "tid=%ld", stm_get_tid(obj));
     return tmp_buf;
 }
-#endif
 
 
 
diff --git a/rpython/translator/stm/src_stm/revision 
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-12cf412eb2d7
+12cf412eb2d7+
diff --git a/rpython/translator/stm/src_stm/stmgc.h 
b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -167,6 +167,23 @@
 
 #define UNLIKELY(test)  __builtin_expect(test, 0)
 
+
+static inline gcptr stm_read_barrier(gcptr obj) {
+    /* XXX optimize to get the smallest code */
+    if (UNLIKELY((obj->h_revision != stm_private_rev_num) &&
+                 (FXCACHE_AT(obj) != obj)))
+        obj = stm_DirectReadBarrier(obj);
+    return obj;
+}
+ 
+static inline gcptr stm_write_barrier(gcptr obj) {
+    if (UNLIKELY((obj->h_revision != stm_private_rev_num) |
+                 ((obj->h_tid & GCFLAG_WRITE_BARRIER) != 0)))
+        obj = stm_WriteBarrier(obj);
+    return obj;
+}
+
+#if 0
 #define stm_read_barrier(obj)                                   \
     (UNLIKELY(((obj)->h_revision != stm_private_rev_num) &&     \
               (FXCACHE_AT(obj) != (obj))) ?                     \
@@ -178,6 +195,6 @@
               (((obj)->h_tid & GCFLAG_WRITE_BARRIER) != 0)) ?   \
         stm_WriteBarrier(obj)                                   \
      :  (obj))
-
+#endif
 
 #endif
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to