Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60048:7ca517276be9
Date: 2013-01-14 15:23 +0200
http://bitbucket.org/pypy/pypy/changeset/7ca517276be9/

Log:    simplification and fixes. runner test seems to pass

diff --git a/pypy/jit/backend/llsupport/llmodel.py 
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -78,31 +78,9 @@
             return (rffi.cast(lltype.Signed, _exception_emulator) +
                     rffi.sizeof(lltype.Signed))
 
-        def propagate_exception():
-            exc = _exception_emulator[1]
-            _exception_emulator[0] = 0
-            _exception_emulator[1] = 0
-            assert self.propagate_exception_v >= 0
-            faildescr = self.get_fail_descr_from_number(
-                self.propagate_exception_v)
-            faildescr = faildescr.hide(self)
-            if not exc:
-                deadframe = self.deadframe_memoryerror
-                if not deadframe.jf_descr:
-                    deadframe.jf_descr = faildescr
-                else:
-                    assert deadframe.jf_descr == faildescr
-            else:
-                XXX
-                deadframe = lltype.malloc(jitframe.DEADFRAME, 0)
-                deadframe.jf_guard_exc = rffi.cast(llmemory.GCREF, exc)
-                deadframe.jf_descr = faildescr
-            return lltype.cast_opaque_ptr(llmemory.GCREF, deadframe)
-
         self.pos_exception = pos_exception
         self.pos_exc_value = pos_exc_value
         self.insert_stack_check = lambda: (0, 0, 0)
-        self._propagate_exception = propagate_exception
 
     def _setup_exception_handling_translated(self):
 
@@ -124,46 +102,9 @@
             slowpathaddr = rffi.cast(lltype.Signed, f)
             return endaddr, lengthaddr, slowpathaddr
 
-        def propagate_exception():
-            addr = llop.get_exception_addr(llmemory.Address)
-            addr.address[0] = llmemory.NULL
-            addr = llop.get_exc_value_addr(llmemory.Address)
-            exc = rffi.cast(llmemory.GCREF, addr.address[0])
-            addr.address[0] = llmemory.NULL
-            assert self.propagate_exception_v >= 0
-            faildescr = self.get_fail_descr_from_number(
-                self.propagate_exception_v)
-            faildescr = faildescr.hide(self)
-            XXX
-            deadframe = lltype.nullptr(jitframe.DEADFRAME)
-            if exc:
-                try:
-                    deadframe = lltype.malloc(jitframe.DEADFRAME, 0)
-                    deadframe.jf_guard_exc = rffi.cast(llmemory.GCREF, exc)
-                    deadframe.jf_descr = faildescr
-                except MemoryError:
-                    deadframe = lltype.nullptr(jitframe.DEADFRAME)
-            if not deadframe:
-                deadframe = self.deadframe_memoryerror
-                if not deadframe.jf_descr:
-                    exc = MemoryError()
-                    exc = cast_instance_to_base_ptr(exc)
-                    exc = lltype.cast_opaque_ptr(llmemory.GCREF, exc)
-                    deadframe.jf_guard_exc = exc
-                    deadframe.jf_descr = faildescr
-                else:
-                    assert deadframe.jf_descr == faildescr
-            return lltype.cast_opaque_ptr(llmemory.GCREF, deadframe)
-
         self.pos_exception = pos_exception
         self.pos_exc_value = pos_exc_value
         self.insert_stack_check = insert_stack_check
-        self._propagate_exception = propagate_exception
-
-    PROPAGATE_EXCEPTION = lltype.Ptr(lltype.FuncType([], llmemory.GCREF))
-
-    def get_propagate_exception(self):
-        return llhelper(self.PROPAGATE_EXCEPTION, self._propagate_exception)
 
     def grab_exc_value(self, deadframe):
         deadframe = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, deadframe)
diff --git a/pypy/jit/backend/test/runner_test.py 
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -3364,7 +3364,7 @@
         fail = self.cpu.get_latest_descr(deadframe)
         assert fail.identifier == excdescr.identifier
         exc = self.cpu.grab_exc_value(deadframe)
-        assert exc == "memoryerror!"
+        assert not exc
 
     def test_math_sqrt(self):
         if not self.cpu.supports_floats:
diff --git a/pypy/jit/backend/x86/arch.py b/pypy/jit/backend/x86/arch.py
--- a/pypy/jit/backend/x86/arch.py
+++ b/pypy/jit/backend/x86/arch.py
@@ -43,6 +43,7 @@
 if WORD == 4:
     # XXX rethink the fixed size
     # ebp + ebx + esi + edi + 4 extra words + force_index = 9 words
+    XX
     FRAME_FIXED_SIZE = 6
     SAVED_REGISTERS = 1    # range(1, 5)
     MY_COPY_OF_REGS = 5    # range(5, 9)
@@ -50,10 +51,9 @@
     JITFRAME_FIXED_SIZE = 29 # 13 GPR + 16 XMM
                              # reg, we don't save it
 else:
-    # rbp + rbx + r12 + r13 + r14 + r15 + 11 extra words + force_index = 18
-    FRAME_FIXED_SIZE = 6
-    SAVED_REGISTERS = 1    # range(1, 7)
-    MY_COPY_OF_REGS = 7    # range(7, 18)
+    # rbp + rbx + r12 + r13 + r14 + r15 + 12 extra words + return address = 18
+    FRAME_FIXED_SIZE = 19
+    PASS_ON_MY_FRAME = 12
     JITFRAME_FIXED_SIZE = 29 # 13 GPR + 16 XMM
                              # reg, we don't save it
     
diff --git a/pypy/jit/backend/x86/assembler.py 
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -13,7 +13,8 @@
 from pypy.jit.backend.x86.regalloc import (RegAlloc, get_ebp_ofs, _get_scale,
     gpr_reg_mgr_cls, xmm_reg_mgr_cls, _valid_addressing_size)
 from pypy.jit.backend.x86.arch import (FRAME_FIXED_SIZE, WORD, IS_X86_64,
-                                       JITFRAME_FIXED_SIZE, IS_X86_32)
+                                       JITFRAME_FIXED_SIZE, IS_X86_32,
+                                       PASS_ON_MY_FRAME)
 from pypy.jit.backend.x86.regloc import (eax, ecx, edx, ebx, esp, ebp, esi, 
edi,
     xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, r8, r9, r10, r11,
     r12, r13, r14, r15, X86_64_SCRATCH_REG, X86_64_XMM_SCRATCH_REG,
@@ -194,6 +195,7 @@
             mc.MOV_br(ofs, reg.value)
         #
         if shadow_stack:
+            xxx
             # ---- shadowstack ----
             mc.SUB_ri(esp.value, 16 - WORD)      # stack alignment of 16 bytes
             if IS_X86_32:
@@ -253,10 +255,12 @@
         #
         self.mc = codebuf.MachineCodeBlockWrapper()
         #
-        # Call the helper, which will return a dead frame object with
-        # the correct exception set, or MemoryError by default
-        addr = rffi.cast(lltype.Signed, self.cpu.get_propagate_exception())
-        self.mc.CALL(imm(addr))
+        # read and reset the current exception
+
+        self._store_and_reset_exception(eax)
+        ofs = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
+        self.mc.MOV_br(ofs, eax.value)
+        self.mc.MOV_ri(eax.value, self.cpu.propagate_exception_v)
         #
         self._call_footer()
         rawstart = self.mc.materialize(self.cpu.asmmemmgr, [])
@@ -267,6 +271,7 @@
         _, _, slowpathaddr = self.cpu.insert_stack_check()
         if slowpathaddr == 0 or self.cpu.propagate_exception_v < 0:
             return      # no stack check (for tests, or non-translated)
+        xxx
         #
         # make a "function" that is called immediately at the start of
         # an assembler function.  In particular, the stack looks like:
@@ -750,16 +755,15 @@
         # Also, make sure this is consistent with FRAME_FIXED_SIZE.
         # XXX should be LEA?
         self.mc.SUB_ri(esp.value, FRAME_FIXED_SIZE * WORD)
-        self.mc.MOV_sr(0, ebp.value)
+        self.mc.MOV_sr(PASS_ON_MY_FRAME * WORD, ebp.value)
         if IS_X86_64:
-            descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
-            _, ofs, _ = unpack_arraydescr(descrs.arraydescr)
+            ofs = self.cpu.get_baseofs_of_frame_field()
             self.mc.LEA_rm(ebp.value, (edi.value, ofs))
         else:
             xxx
 
         for i, loc in enumerate(self.cpu.CALLEE_SAVE_REGISTERS):
-            self.mc.MOV_sr((i + 1) * WORD, loc.value)
+            self.mc.MOV_sr((PASS_ON_MY_FRAME + i + 1) * WORD, loc.value)
 
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
@@ -769,6 +773,7 @@
         if self.stack_check_slowpath == 0:
             pass                # no stack check (e.g. not translated)
         else:
+            xxx
             endaddr, lengthaddr, _ = self.cpu.insert_stack_check()
             self.mc.MOV(eax, heap(endaddr))             # MOV eax, [start]
             self.mc.SUB(eax, esp)                       # SUB eax, current
@@ -790,9 +795,9 @@
 
         for i in range(len(self.cpu.CALLEE_SAVE_REGISTERS)-1, -1, -1):
             self.mc.MOV_rs(self.cpu.CALLEE_SAVE_REGISTERS[i].value,
-                           (i + 1) * WORD)
+                           (i + 1 + PASS_ON_MY_FRAME) * WORD)
 
-        self.mc.MOV_rs(ebp.value, 0)
+        self.mc.MOV_rs(ebp.value, PASS_ON_MY_FRAME * WORD)
         self.mc.ADD_ri(esp.value, FRAME_FIXED_SIZE * WORD)
         self.mc.RET()
 
@@ -1105,6 +1110,20 @@
         unused_xmm = [xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0]
 
         on_stack = 0
+        # count the stack depth
+        floats = 0
+        for i in range(start, len(arglocs)):
+            arg = arglocs[i]
+            if arg.is_float() or argtypes and argtypes[i - start] == 'S':
+                floats += 1
+        all_args = len(arglocs) - start
+        stack_depth = (max(all_args - floats - len(unused_gpr), 0) +
+                       max(floats - len(unused_xmm), 0))
+        align = 0
+        if stack_depth > PASS_ON_MY_FRAME:
+            stack_depth = align_stack_words(stack_depth)
+            align = (stack_depth - PASS_ON_MY_FRAME)
+            self.mc.SUB_ri(esp.value, align * WORD)
         for i in range(start, len(arglocs)):
             loc = arglocs[i]
             if loc.is_float():
@@ -1131,10 +1150,6 @@
                     dst_locs.append(RawEspLoc(on_stack * WORD, INT))
                     on_stack += 1
 
-        align = align_stack_words(on_stack + 1) - 1
-        if align:
-            self.mc.SUB_ri(esp.value, align * WORD)
-
         # Handle register arguments: first remap the xmm arguments
         remap_frame_layout(self, xmm_src_locs, xmm_dst_locs,
                            X86_64_XMM_SCRATCH_REG)
@@ -1663,6 +1678,9 @@
         self.mc.MOV(loc1, heap(self.cpu.pos_exception()))
         self.mc.CMP(loc1, loc)
         self.implement_guard(guard_token, 'NE')
+        self._store_and_reset_exception(resloc)
+
+    def _store_and_reset_exception(self, resloc=None):
         if resloc is not None:
             self.mc.MOV(resloc, heap(self.cpu.pos_exc_value()))
         self.mc.MOV(heap(self.cpu.pos_exception()), imm0)
@@ -1856,11 +1874,8 @@
 
         if exc:
             # save ebx into 'jf_guard_exc'
-            from pypy.jit.backend.llsupport.descr import unpack_fielddescr
-            descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
-            offset, size, _ = unpack_fielddescr(descrs.jf_guard_exc)
-            _, base_offset, _ = unpack_arraydescr(descrs.arraydescr)
-            mc.MOV_br(offset - base_offset, ebx.value)
+            offset = self.cpu.get_ofs_of_frame_field('jf_guard_exc')
+            mc.MOV_br(offset, ebx.value)
 
         # now we return from the complete frame, which starts from
         # _call_header_with_stack_check().  The LEA in _call_footer below
@@ -1961,17 +1976,13 @@
     def _store_force_index(self, guard_op):
         faildescr = guard_op.getdescr()
         fail_index = self.cpu.get_fail_descr_number(faildescr)
-        descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
-        base_ofs = self.cpu.unpack_arraydescr(descrs.arraydescr)
-        ofs = self.cpu.unpack_fielddescr(descrs.jf_force_index)
-        self.mc.MOV_bi(ofs - base_ofs, fail_index)
+        ofs = self.cpu.get_ofs_of_frame_field('jf_force_index')
+        self.mc.MOV_bi(ofs, fail_index)
         return fail_index
 
     def _emit_guard_not_forced(self, guard_token):
-        descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
-        base_ofs = self.cpu.unpack_arraydescr(descrs.arraydescr)
-        ofs_fail = self.cpu.unpack_fielddescr(descrs.jf_descr)
-        self.mc.CMP_bi(ofs_fail - base_ofs, 0)
+        ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
+        self.mc.CMP_bi(ofs, 0)
         self.implement_guard(guard_token, 'NE')
 
     def genop_guard_call_may_force(self, op, guard_op, guard_token,
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -24,7 +24,7 @@
 from pypy.jit.backend.llsupport.regalloc import FrameManager, RegisterManager,\
      TempBox, compute_vars_longevity, is_comparison_or_ovf_op
 from pypy.jit.backend.x86.arch import WORD, JITFRAME_FIXED_SIZE
-from pypy.jit.backend.x86.arch import IS_X86_32, IS_X86_64, MY_COPY_OF_REGS
+from pypy.jit.backend.x86.arch import IS_X86_32, IS_X86_64
 from pypy.jit.backend.x86 import rx86
 from pypy.rlib.rarithmetic import r_longlong
 
@@ -41,12 +41,12 @@
         esi: 2,
         edi: 3,
     }
-    REGLOC_TO_COPY_AREA_OFS = {
-        ecx: MY_COPY_OF_REGS + 0 * WORD,
-        ebx: MY_COPY_OF_REGS + 1 * WORD,
-        esi: MY_COPY_OF_REGS + 2 * WORD,
-        edi: MY_COPY_OF_REGS + 3 * WORD,
-    }
+    #REGLOC_TO_COPY_AREA_OFS = {
+    #    ecx: MY_COPY_OF_REGS + 0 * WORD,
+    #    ebx: MY_COPY_OF_REGS + 1 * WORD,
+    #    esi: MY_COPY_OF_REGS + 2 * WORD,
+    #    edi: MY_COPY_OF_REGS + 3 * WORD,
+    #}
 
     def call_result_location(self, v):
         return eax
@@ -75,19 +75,19 @@
         r14: 4,
         r15: 5,
     }
-    REGLOC_TO_COPY_AREA_OFS = {
-        ecx: MY_COPY_OF_REGS + 0 * WORD,
-        ebx: MY_COPY_OF_REGS + 1 * WORD,
-        esi: MY_COPY_OF_REGS + 2 * WORD,
-        edi: MY_COPY_OF_REGS + 3 * WORD,
-        r8:  MY_COPY_OF_REGS + 4 * WORD,
-        r9:  MY_COPY_OF_REGS + 5 * WORD,
-        r10: MY_COPY_OF_REGS + 6 * WORD,
-        r12: MY_COPY_OF_REGS + 7 * WORD,
-        r13: MY_COPY_OF_REGS + 8 * WORD,
-        r14: MY_COPY_OF_REGS + 9 * WORD,
-        r15: MY_COPY_OF_REGS + 10 * WORD,
-    }
+    #REGLOC_TO_COPY_AREA_OFS = {
+    #    ecx: MY_COPY_OF_REGS + 0 * WORD,
+    #    ebx: MY_COPY_OF_REGS + 1 * WORD,
+    #    esi: MY_COPY_OF_REGS + 2 * WORD,
+    #    edi: MY_COPY_OF_REGS + 3 * WORD,
+    #    r8:  MY_COPY_OF_REGS + 4 * WORD,
+    #    r9:  MY_COPY_OF_REGS + 5 * WORD,
+    #    r10: MY_COPY_OF_REGS + 6 * WORD,
+    #    r12: MY_COPY_OF_REGS + 7 * WORD,
+    #    r13: MY_COPY_OF_REGS + 8 * WORD,
+    #    r14: MY_COPY_OF_REGS + 9 * WORD,
+    #3    r15: MY_COPY_OF_REGS + 10 * WORD,
+    #}
 
 class X86XMMRegisterManager(RegisterManager):
 
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -208,6 +208,18 @@
         ofs = self.unpack_arraydescr(descr)
         self.write_float_at_mem(newframe, ofs + index, value)
 
+    @specialize.arg(1)
+    def get_ofs_of_frame_field(self, name):
+        descrs = self.gc_ll_descr.getframedescrs(self)
+        base_ofs = self.unpack_arraydescr(descrs.arraydescr)
+        ofs = self.unpack_fielddescr(getattr(descrs, name))
+        return ofs - base_ofs
+
+    def get_baseofs_of_frame_field(self):
+        descrs = self.gc_ll_descr.getframedescrs(self)
+        base_ofs = self.unpack_arraydescr(descrs.arraydescr)
+        return base_ofs
+
 class CPU386(AbstractX86CPU):
     backend_name = 'x86'
     WORD = 4
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to