Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: jitframe-on-heap
Changeset: r60712:b7bd1559a188
Date: 2013-01-30 11:24 +0200
http://bitbucket.org/pypy/pypy/changeset/b7bd1559a188/

Log:    some ugly checks

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
@@ -72,6 +72,16 @@
             llop.gc_assume_young_pointers(lltype.Void, new_frame)
             return lltype.cast_opaque_ptr(llmemory.GCREF, new_frame)
 
+        def realloc_frame_check(frame, size):
+            frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame)
+            if size > len(frame.jf_frame) or size > 
frame.jf_frame_info.jfi_frame_depth:
+                print "CHECK FAILED"
+                import pdb
+                pdb.set_trace()
+                assert False
+            print "SOMETHING INCREDIBLY FISHY"
+            return lltype.cast_opaque_ptr(llmemory.GCREF, frame)
+
         if not translate_support_code:
             fptr = llhelper(FUNC_TP, realloc_frame)
         else:
@@ -84,6 +94,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_check)
+        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, args_s, s_result)
+            fptr = mixlevelann.graph2delayed(graph, FUNC)
+            mixlevelann.finish()
+        self.realloc_frame_check = 
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
@@ -220,6 +220,27 @@
         mc.RET()
         self._stack_check_failure = mc.materialize(self.cpu.asmmemmgr, [])
 
+        mc = codebuf.MachineCodeBlockWrapper()
+        self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats)
+        assert not IS_X86_32
+        # this is the gcmap stored by push_gcmap(mov=True) in 
_check_stack_frame
+        mc.MOV_rs(ecx.value, WORD)
+        gcmap_ofs = self.cpu.get_ofs_of_frame_field('jf_gcmap')
+        mc.MOV_br(gcmap_ofs, ecx.value)
+        # this is size that we're after, sanity checking only
+        mc.MOV_rs(esi.value, WORD*2)
+        # push first arg
+        mc.LEA_rb(edi.value, -base_ofs)
+        # align
+        mc.SUB_ri(esp.value, WORD)
+        mc.CALL(imm(self.cpu.realloc_frame_check))
+        mc.ADD_ri(esp.value, WORD)
+        mc.LEA_rm(ebp.value, (eax.value, base_ofs))
+        mc.MOV_bi(gcmap_ofs, 0)
+        self._pop_all_regs_from_frame(mc, [], self.cpu.supports_floats)
+        mc.RET()
+        self._stack_check_failure_2 = mc.materialize(self.cpu.asmmemmgr, [])
+
     def _build_malloc_slowpath(self):
         """ While arriving on slowpath, we have a gcpattern on stack,
         nursery_head in eax and the size in edi - eax
@@ -553,6 +574,9 @@
             looptoken._x86_fullsize = full_size
             looptoken._x86_ops_offset = ops_offset
         looptoken._x86_function_addr = rawstart
+        for label in self.labels_to_patch:
+            self._patch_stackadjust(label + rawstart, frame_depth + 
JITFRAME_FIXED_SIZE)
+        self.labels_to_patch = None
 
         self.fixup_target_tokens(rawstart)
         self.teardown()
@@ -603,6 +627,9 @@
                           frame_depth + JITFRAME_FIXED_SIZE)
         self._patch_stackadjust(stack_check_patch_ofs + rawstart, frame_depth)
         self._patch_stackadjust(ofs2 + rawstart, frame_depth)
+        for label in self.labels_to_patch:
+            self._patch_stackadjust(label + rawstart, frame_depth)
+        self.labels_to_patch = None
         self.fixup_target_tokens(rawstart)
         self.update_frame_depth(frame_depth)
         self.teardown()
@@ -667,7 +694,7 @@
         baseofs = self.cpu.get_baseofs_of_frame_field()
         self.current_clt.frame_info.set_frame_depth(baseofs, frame_depth)
 
-    def _check_frame_depth(self, mc, gcmap, expected_size=-1):
+    def _check_frame_depth(self, mc, gcmap, expected_size=-1, 
check_only=False):
         """ check if the frame is of enough depth to follow this bridge.
         Otherwise reallocate the frame in a helper.
         There are other potential solutions
@@ -690,7 +717,10 @@
             mc.MOV_si(WORD, expected_size)            
         ofs2 = mc.get_relative_pos() - 4
         self.push_gcmap(mc, gcmap, mov=True)
-        mc.CALL(imm(self._stack_check_failure))
+        if check_only:
+            mc.CALL(imm(self._stack_check_failure_2))
+        else:
+            mc.CALL(imm(self._stack_check_failure))
         # patch the JG above
         offset = mc.get_relative_pos() - jg_location
         assert 0 < offset <= 127
@@ -792,6 +822,7 @@
 
     def _assemble(self, regalloc, inputargs, operations):
         self._regalloc = regalloc
+        self.labels_to_patch = []
         regalloc.compute_hint_frame_locations(operations)
         regalloc.walk_operations(inputargs, operations)
         if we_are_translated() or self.cpu.dont_keepalive_stuff:
@@ -2486,6 +2517,12 @@
                                         expected_size=expected_size)
             self.mc.JMP(imm(target))
 
+    def label(self):
+        ofs, ofs2 = self._check_frame_depth(self.mc, 
self._regalloc.get_gcmap(),
+                                            check_only=True)
+        self.labels_to_patch.append(ofs)
+        self.labels_to_patch.append(ofs2)
+
     def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, gcmap):
         assert size & (WORD-1) == 0     # must be correctly aligned
         self.mc.MOV(eax, heap(nursery_free_adr))
diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1322,6 +1322,7 @@
         descr._x86_clt = self.assembler.current_clt
         self.assembler.target_tokens_currently_compiling[descr] = None
         self.possibly_free_vars_for_op(op)
+        self.assembler.label()
         #
         # if the LABEL's descr is precisely the target of the JUMP at the
         # end of the same loop, i.e. if what we are compiling is a single
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to