[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