Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66084:a285d16c08c8
Date: 2013-08-12 10:54 +0200
http://bitbucket.org/pypy/pypy/changeset/a285d16c08c8/
Log: make exception thread-local stm-aware
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -172,10 +172,8 @@
break
exc = guardtok.exc
target = self.failure_recovery_code[exc + 2 * withfloats]
- fail_descr = rgc.cast_instance_to_gcref(guardtok.faildescr)
- # already done by gc.py record_constptrs, just to be safe:
- fail_descr = rgc._make_sure_does_not_move(fail_descr)
- fail_descr = rgc.cast_gcref_to_int(fail_descr)
+ fail_descr = cast_instance_to_gcref(guardtok.faildescr)
+ fail_descr = rffi.cast(lltype.Signed, fail_descr)
base_ofs = self.cpu.get_baseofs_of_frame_field()
positions = [0] * len(guardtok.fail_locs)
for i, loc in enumerate(guardtok.fail_locs):
@@ -228,10 +226,10 @@
else:
raise AssertionError(kind)
- gcref = rgc.cast_instance_to_gcref(value)
+ import pdb;pdb.set_trace()
+ gcref = cast_instance_to_gcref(value)
gcref = rgc._make_sure_does_not_move(gcref)
- value = rgc.cast_gcref_to_int(gcref)
-
+ value = rffi.cast(lltype.Signed, gcref)
je_location = self._call_assembler_check_descr(value, tmploc)
#
# Path A: use assembler_helper_adr
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
@@ -260,6 +260,21 @@
self.propagate_exception_path = rawstart
self.mc = None
+ def _get_stm_tl(self, adr):
+ """Makes 'adr' relative to threadlocal-base if we run in STM.
+ Before using such a relative address, call
+ self._stm_tl_segment_prefix_if_necessary."""
+ if self.cpu.gc_ll_descr.stm and we_are_translated():
+ # also not during tests
+ result = adr - stmtlocal.threadlocal_base()
+ assert rx86.fits_in_32bits(result)
+ return result
+ return adr
+
+ def _stm_tl_segment_prefix_if_necessary(self, mc):
+ if self.cpu.gc_ll_descr.stm and we_are_translated():
+ stmtlocal.tl_segment_prefix(mc)
+
def _build_stack_check_slowpath(self):
_, _, slowpathaddr = self.cpu.insert_stack_check()
if slowpathaddr == 0 or not self.cpu.propagate_exception_descr:
@@ -294,7 +309,9 @@
else:
mc.ADD_ri(esp.value, WORD)
#
- mc.MOV(eax, heap(self.cpu.pos_exception()))
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(eax, heap(ea))
mc.TEST_rr(eax.value, eax.value)
mc.J_il8(rx86.Conditions['NZ'], 0)
jnz_location = mc.get_relative_pos()
@@ -1740,7 +1757,9 @@
def genop_guard_guard_no_exception(self, ign_1, guard_op, guard_token,
locs, ign_2):
- self.mc.CMP(heap(self.cpu.pos_exception()), imm0)
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(self.mc)
+ self.mc.CMP(heap(ea), imm0)
self.implement_guard(guard_token, 'NZ')
def genop_guard_guard_not_invalidated(self, ign_1, guard_op, guard_token,
@@ -1753,7 +1772,9 @@
locs, resloc):
loc = locs[0]
loc1 = locs[1]
- self.mc.MOV(loc1, heap(self.cpu.pos_exception()))
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(self.mc)
+ self.mc.MOV(loc1, heap(ea))
self.mc.CMP(loc1, loc)
self.implement_guard(guard_token, 'NE')
self._store_and_reset_exception(self.mc, resloc)
@@ -1763,30 +1784,43 @@
""" Resest the exception. If excvalloc is None, then store it on the
frame in jf_guard_exc
"""
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ #
+ self._stm_tl_segment_prefix_if_necessary(mc)
if excvalloc is not None:
assert excvalloc.is_core_reg()
- mc.MOV(excvalloc, heap(self.cpu.pos_exc_value()))
+ mc.MOV(excvalloc, heap(eva))
elif tmploc is not None: # if both are None, just ignore
ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
- mc.MOV(tmploc, heap(self.cpu.pos_exc_value()))
+ mc.MOV(tmploc, heap(eva))
mc.MOV(RawEbpLoc(ofs), tmploc)
+ #
if exctploc is not None:
assert exctploc.is_core_reg()
- mc.MOV(exctploc, heap(self.cpu.pos_exception()))
-
- mc.MOV(heap(self.cpu.pos_exception()), imm0)
- mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(exctploc, heap(ea))
+ #
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), imm0)
def _restore_exception(self, mc, excvalloc, exctploc, tmploc=None):
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
if excvalloc is not None:
- mc.MOV(heap(self.cpu.pos_exc_value()), excvalloc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), excvalloc)
else:
assert tmploc is not None
ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
mc.MOV(tmploc, RawEbpLoc(ofs))
mc.MOV_bi(ofs, 0)
- mc.MOV(heap(self.cpu.pos_exc_value()), tmploc)
- mc.MOV(heap(self.cpu.pos_exception()), exctploc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), tmploc)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), exctploc)
def _gen_guard_overflow(self, guard_op, guard_token):
guard_opnum = guard_op.getopnum()
@@ -1983,9 +2017,14 @@
if exc:
# We might have an exception pending. Load it into ebx...
- mc.MOV(ebx, heap(self.cpu.pos_exc_value()))
- mc.MOV(heap(self.cpu.pos_exception()), imm0)
- mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
+ eva = self._get_stm_tl(self.cpu.pos_exc_value())
+ ea = self._get_stm_tl(self.cpu.pos_exception())
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(ebx, heap(eva))
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(ea), imm0)
+ self._stm_tl_segment_prefix_if_necessary(mc)
+ mc.MOV(heap(eva), imm0)
# ...and save ebx into 'jf_guard_exc'
offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
mc.MOV_br(offset, ebx.value)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit