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