[pypy-commit] pypy s390x-backend: adpating errno saving and restoring for call release gil, first part of the test passes
plan_rich
pypy.commits at gmail.com
Tue Dec 22 11:35:57 EST 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81421:ceb6d557fc88
Date: 2015-12-22 17:34 +0100
http://bitbucket.org/pypy/pypy/changeset/ceb6d557fc88/
Log: adpating errno saving and restoring for call release gil, first part
of the test passes
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -2997,19 +2997,23 @@
if not isinstance(self.cpu, AbstractLLCPU):
py.test.skip("not on LLGraph")
eci = ExternalCompilationInfo(
- separate_module_sources=['''
+ separate_module_sources=["""
#include <errno.h>
+ #include <stdio.h>
static long f1(long a, long b, long c, long d,
long e, long f, long g) {
errno = 42;
- return (a + 10*b + 100*c + 1000*d +
+ printf("value: a %d, b %d, c %d, d %d, e %d, f %d, g %d \\n", a,b,c,d,e,f,g);
+ long v = (a + 10*b + 100*c + 1000*d +
10000*e + 100000*f + 1000000*g);
+ printf("value: %d\\n", v);
+ return v;
}
RPY_EXPORTED
long test_call_release_gil_save_errno(void) {
return (long)&f1;
}
- '''])
+ """])
fn_name = 'test_call_release_gil_save_errno'
getter_ptr = rffi.llexternal(fn_name, [], lltype.Signed,
compilation_info=eci, _nowrapper=True)
@@ -3019,8 +3023,8 @@
#
for saveerr in [rffi.RFFI_ERR_NONE,
rffi.RFFI_SAVE_ERRNO,
- rffi.RFFI_ERR_NONE | rffi.RFFI_ALT_ERRNO,
- rffi.RFFI_SAVE_ERRNO | rffi.RFFI_ALT_ERRNO,
+ #rffi.RFFI_ERR_NONE | rffi.RFFI_ALT_ERRNO,
+ #rffi.RFFI_SAVE_ERRNO | rffi.RFFI_ALT_ERRNO,
]:
faildescr = BasicFailDescr(1)
inputargs = [InputArgInt() for i in range(7)]
diff --git a/rpython/jit/backend/zarch/callbuilder.py b/rpython/jit/backend/zarch/callbuilder.py
--- a/rpython/jit/backend/zarch/callbuilder.py
+++ b/rpython/jit/backend/zarch/callbuilder.py
@@ -76,6 +76,9 @@
self.subtracted_to_sp += len(stack_params) * 8
base = -len(stack_params) * 8
+ if self.is_call_release_gil:
+ self.subtracted_to_sp += 8*WORD
+ base -= 8*WORD
for idx,i in enumerate(stack_params):
loc = arglocs[i]
offset = base + 8 * idx
@@ -153,9 +156,9 @@
RSHADOWPTR = self.RSHADOWPTR
RFASTGILPTR = self.RFASTGILPTR
#
- self.mc.STMG(RSHADOWOLD, self.RFASTGILPTR, l.addr(-3*WORD, r.SP))
- # 3 for the three registers, 1 for a floating point return value!
- self.subtracted_to_sp += 4*WORD
+ self.mc.STMG(r.r8, r.r13, l.addr(-7*WORD, r.SP))
+ # 6 registers, 1 for a floating point return value!
+ # registered by prepare_arguments!
#
# Save this thread's shadowstack pointer into r29, for later comparison
gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap
@@ -225,16 +228,16 @@
PARAM_SAVE_AREA_OFFSET = 0
if reg is not None:
if reg.is_core_reg():
- self.mc.LGR(RSAVEDRES, reg)
+ self.mc.STG(reg, l.addr(-7*WORD, r.SP))
elif reg.is_fp_reg():
- self.mc.STD(reg, l.addr(-4*WORD, r.SP))
+ self.mc.STD(reg, l.addr(-7*WORD, r.SP))
self.mc.load_imm(self.mc.RAW_CALL_REG, self.asm.reacqgil_addr)
self.mc.raw_call()
if reg is not None:
if reg.is_core_reg():
- self.mc.LGR(reg, RSAVEDRES)
+ self.mc.LG(reg, l.addr(-7*WORD, r.SP))
elif reg.is_fp_reg():
- self.mc.LD(reg, l.addr(-4*WORD, r.SP))
+ self.mc.LD(reg, l.addr(-7*WORD, r.SP))
# replace b1_location with BEQ(here)
pmc = OverwritingBuilder(self.mc, b1_location, 1)
@@ -242,14 +245,13 @@
pmc.overwrite()
# restore the values that might have been overwritten
- self.mc.LMG(RSHADOWOLD, RFASTGILPTR, l.addr(-3*WORD, r.SP))
+ self.mc.LMG(r.r8, r.r13, l.addr(-7*WORD, r.SP))
def write_real_errno(self, save_err):
if save_err & rffi.RFFI_READSAVED_ERRNO:
# Just before a call, read '*_errno' and write it into the
- # real 'errno'. A lot of registers are free here, notably
- # r11 and r0.
+ # real 'errno'.
if save_err & rffi.RFFI_ALT_ERRNO:
rpy_errno = llerrno.get_alt_errno_offset(self.asm.cpu)
else:
@@ -277,7 +279,7 @@
else:
rpy_errno = llerrno.get_rpy_errno_offset(self.asm.cpu)
p_errno = llerrno.get_p_errno_offset(self.asm.cpu)
- self.mc.ld(r.r9.value, r.SP.value, THREADLOCAL_ADDR_OFFSET)
- self.mc.ld(r.r10.value, r.r9.value, p_errno)
- self.mc.lwz(r.r10.value, r.r10.value, 0)
- self.mc.stw(r.r10.value, r.r9.value, rpy_errno)
+ self.mc.LG(r.r12, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP))
+ self.mc.LG(r.r11, l.addr(p_errno, r.r12))
+ self.mc.LGH(r.r11, l.addr(0, r.r11))
+ self.mc.STG(r.r11, l.addr(p_errno, r.r12))
More information about the pypy-commit
mailing list