Author: David Schneider <david.schnei...@picle.org>
Branch: jitframe-on-heap
Changeset: r62097:2f6787b0601f
Date: 2013-03-05 19:32 +0100
http://bitbucket.org/pypy/pypy/changeset/2f6787b0601f/

Log:    merge heads

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -598,7 +598,7 @@
             jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
         clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
         clt.allgcrefs = []
-        clt.frame_info.update_frame_depth(0, 0) # for now
+        clt.frame_info.clear() # for now
 
         if False and log:
             operations = self._inject_debugging_code(looptoken, operations,
diff --git a/rpython/jit/backend/llsupport/jitframe.py 
b/rpython/jit/backend/llsupport/jitframe.py
--- a/rpython/jit/backend/llsupport/jitframe.py
+++ b/rpython/jit/backend/llsupport/jitframe.py
@@ -20,6 +20,10 @@
         jfi.jfi_frame_depth = new_depth
         jfi.jfi_frame_size = base_ofs + new_depth * SIZEOFSIGNED
 
+def jitframeinfo_clear(jfi):
+    jfi.jfi_frame_size = 0
+    jfi.jfi_frame_depth = 0
+
 JITFRAMEINFO_SIZE = 2 * SIZEOFSIGNED # make sure this stays correct
 
 JITFRAMEINFO = lltype.Struct(
@@ -30,6 +34,7 @@
     ('jfi_frame_size', lltype.Signed),
     adtmeths = {
         'update_frame_depth': jitframeinfo_update_depth,
+        'clear': jitframeinfo_clear,
     },
 )
 
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
@@ -103,6 +103,10 @@
                 print "Unhandled exception", e, "in realloc_frame"
                 return lltype.nullptr(llmemory.GCREF.TO)
 
+        def realloc_frame_crash(frame, size):
+            print "frame", frame, "size", size
+            return lltype.nullptr(llmemory.GCREF.TO)
+
         if not translate_support_code:
             fptr = llhelper(FUNC_TP, realloc_frame)
         else:
@@ -115,6 +119,18 @@
             mixlevelann.finish()
         self.realloc_frame = 
heaptracker.adr2int(llmemory.cast_ptr_to_adr(fptr))
 
+        if not translate_support_code:
+            fptr = llhelper(FUNC_TP, realloc_frame_crash)
+        else:
+            FUNC = FUNC_TP.TO
+            args_s = [annmodel.lltype_to_annotation(ARG) for ARG in FUNC.ARGS]
+            s_result = annmodel.lltype_to_annotation(FUNC.RESULT)
+            mixlevelann = MixLevelHelperAnnotator(self.rtyper)
+            graph = mixlevelann.getgraph(realloc_frame_crash, args_s, s_result)
+            fptr = mixlevelann.graph2delayed(graph, FUNC)
+            mixlevelann.finish()
+        self.realloc_frame_crash = 
heaptracker.adr2int(llmemory.cast_ptr_to_adr(fptr))
+
     def _setup_exception_handling_untranslated(self):
         # for running un-translated only, all exceptions occurring in the
         # llinterpreter are stored in '_exception_emulator', which is then
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
@@ -51,6 +51,8 @@
     _output_loop_log = None
     _second_tmp_reg = ecx
 
+    DEBUG_FRAME_DEPTH = True
+
     def __init__(self, cpu, translate_support_code=False):
         BaseAssembler.__init__(self, cpu, translate_support_code)
         self.verbose = False
@@ -92,6 +94,7 @@
         self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr,
                                                         allblocks)
         self.target_tokens_currently_compiling = {}
+        self.frame_depth_to_patch = []
 
     def teardown(self):
         self.pending_guard_tokens = None
@@ -471,7 +474,7 @@
             jitframe.JITFRAMEINFO_SIZE, alignment=WORD)
         clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info)
         clt.allgcrefs = []
-        clt.frame_info.update_frame_depth(0, 0) # for now
+        clt.frame_info.clear() # for now
 
         if log:
             operations = self._inject_debugging_code(looptoken, operations,
@@ -480,6 +483,7 @@
         regalloc = RegAlloc(self, self.cpu.translate_support_code)
         #
         self._call_header_with_stack_check()
+        self._check_frame_depth_debug(self.mc)
         operations = regalloc.prepare_loop(inputargs, operations, looptoken,
                                            clt.allgcrefs)
         looppos = self.mc.get_relative_pos()
@@ -492,6 +496,8 @@
         full_size = self.mc.get_relative_pos()
         #
         rawstart = self.materialize_loop(looptoken)
+        self.patch_stack_checks(frame_depth_no_fixed_size + 
JITFRAME_FIXED_SIZE,
+                                rawstart)
         looptoken._ll_loop_code = looppos + rawstart
         debug_start("jit-backend-addr")
         debug_print("Loop %d (%s) has address 0x%x to 0x%x (bootstrap 0x%x)" % 
(
@@ -539,14 +545,15 @@
                                              operations,
                                              self.current_clt.allgcrefs,
                                              self.current_clt.frame_info)
-        stack_check_patch_ofs, ofs2 = self._check_frame_depth(self.mc,
-                                                       regalloc.get_gcmap())
+        self._check_frame_depth(self.mc, regalloc.get_gcmap())
         frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, 
operations)
         codeendpos = self.mc.get_relative_pos()
         self.write_pending_failure_recoveries()
         fullsize = self.mc.get_relative_pos()
         #
         rawstart = self.materialize_loop(original_loop_token)
+        self.patch_stack_checks(frame_depth_no_fixed_size + 
JITFRAME_FIXED_SIZE,
+                                rawstart)
         debug_start("jit-backend-addr")
         debug_print("bridge out of Guard 0x%x has address 0x%x to 0x%x" %
                     (r_uint(descr_number), r_uint(rawstart),
@@ -558,8 +565,6 @@
         ops_offset = self.mc.ops_offset
         frame_depth = max(self.current_clt.frame_info.jfi_frame_depth,
                           frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
-        self._patch_stackadjust(stack_check_patch_ofs + rawstart, frame_depth)
-        self._patch_stackadjust(ofs2 + rawstart, frame_depth)
         self.fixup_target_tokens(rawstart)
         self.update_frame_depth(frame_depth)
         self.teardown()
@@ -624,6 +629,10 @@
         baseofs = self.cpu.get_baseofs_of_frame_field()
         self.current_clt.frame_info.update_frame_depth(baseofs, frame_depth)
 
+    def patch_stack_checks(self, framedepth, rawstart):
+        for ofs in self.frame_depth_to_patch:
+            self._patch_frame_depth(ofs + rawstart, framedepth)
+
     def _check_frame_depth(self, mc, gcmap, expected_size=-1):
         """ check if the frame is of enough depth to follow this bridge.
         Otherwise reallocate the frame in a helper.
@@ -650,9 +659,33 @@
         offset = mc.get_relative_pos() - jg_location
         assert 0 < offset <= 127
         mc.overwrite(jg_location-1, chr(offset))
-        return stack_check_cmp_ofs, ofs2
+        self.frame_depth_to_patch.append(stack_check_cmp_ofs)
+        self.frame_depth_to_patch.append(ofs2)
 
-    def _patch_stackadjust(self, adr, allocated_depth):
+    def _check_frame_depth_debug(self, mc):
+        """ double check the depth size. It prints the error (and potentially
+        segfaults later)
+        """
+        if not self.DEBUG_FRAME_DEPTH:
+            return
+        descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+        ofs = self.cpu.unpack_fielddescr(descrs.arraydescr.lendescr)
+        mc.CMP_bi(ofs, 0xffffff)
+        stack_check_cmp_ofs = mc.get_relative_pos() - 4
+        mc.J_il8(rx86.Conditions['GE'], 0)
+        jg_location = mc.get_relative_pos()
+        mc.MOV_rr(edi.value, ebp.value)
+        mc.MOV_ri(esi.value, 0xffffff)
+        ofs2 = mc.get_relative_pos() - 4
+        mc.CALL(imm(self.cpu.realloc_frame_crash))
+        # patch the JG above
+        offset = mc.get_relative_pos() - jg_location
+        assert 0 < offset <= 127
+        mc.overwrite(jg_location-1, chr(offset))
+        self.frame_depth_to_patch.append(stack_check_cmp_ofs)
+        self.frame_depth_to_patch.append(ofs2)
+
+    def _patch_frame_depth(self, adr, allocated_depth):
         mc = codebuf.MachineCodeBlockWrapper()
         mc.writeimm32(allocated_depth)
         mc.copy_to_raw_memory(adr)
@@ -2401,7 +2434,7 @@
             self.mc.JMP(imm(target))
 
     def label(self):
-        pass
+        self._check_frame_depth_debug(self.mc)
 
     def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, gcmap):
         assert size & (WORD-1) == 0     # must be correctly aligned
diff --git a/rpython/jit/backend/x86/tool/test/test_viewcode.py 
b/rpython/jit/backend/x86/tool/test/test_viewcode.py
--- a/rpython/jit/backend/x86/tool/test/test_viewcode.py
+++ b/rpython/jit/backend/x86/tool/test/test_viewcode.py
@@ -1,6 +1,6 @@
 from cStringIO import StringIO
-from rpython.jit.backend.x86.tool.viewcode import format_code_dump_with_labels
-from rpython.jit.backend.x86.tool.viewcode import find_objdump
+from rpython.jit.backend.tool.viewcode import format_code_dump_with_labels
+from rpython.jit.backend.tool.viewcode import find_objdump
 import os
 import py
 import tempfile
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to