Author: Armin Rigo <ar...@tunes.org> Branch: guard-compatible Changeset: r90035:291ea6b8def5 Date: 2017-02-10 17:19 +0100 http://bitbucket.org/pypy/pypy/changeset/291ea6b8def5/
Log: in-progress diff --git a/rpython/jit/backend/llsupport/guard_compat.py b/rpython/jit/backend/llsupport/guard_compat.py --- a/rpython/jit/backend/llsupport/guard_compat.py +++ b/rpython/jit/backend/llsupport/guard_compat.py @@ -97,19 +97,16 @@ return rffi.cast(lltype.Unsigned, gcref) -P_ARG = lltype.Struct('P_ARG', ('new_gcref', llmemory.GCREF), - ('bchoices', lltype.Ptr(BACKEND_CHOICES)), - ('jump_to', lltype.Signed)) - INVOKE_FIND_COMPATIBLE_FUNC = lltype.Ptr(lltype.FuncType( - [lltype.Ptr(P_ARG), lltype.Ptr(jitframe.JITFRAME)], + [rffi.SIGNEDP, lltype.Ptr(jitframe.JITFRAME)], lltype.Void)) @specialize.memo() def make_invoke_find_compatible(cpu): def invoke_find_compatible(p_arg, jitframe): - bchoices = p_arg.bchoices - new_gcref = p_arg.new_gcref + new_gcref = rffi.cast(llmemory.GCREF, p_arg[0]) + bchoices = rffi.cast(lltype.Ptr(BACKEND_CHOICES), p_arg[1]) + # ---GC operations cannot occur above--- descr = bchoices.bc_faildescr descr = cast_gcref_to_instance(GuardCompatibleDescr, descr) try: @@ -136,8 +133,9 @@ pdb.post_mortem(sys.exc_info()[2]) result = cpu.assembler.guard_compat_recovery jitframe.jf_gcmap = lltype.nullptr(lltype.typeOf(jitframe.jf_gcmap).TO) - p_arg.bchoices = bchoices - p_arg.jump_to = result + # ---GC operations cannot occur below--- + p_arg[0] = result + p_arg[1] = rffi.cast(lltype.Signed, bchoices) return invoke_find_compatible def add_in_tree(bchoices, new_gcref, new_asmaddr): 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 @@ -785,7 +785,6 @@ guard_compat.patch_guard_compatible( tok, self._addr_from_gc_table, self.gc_table_tracer, self.guard_compat_search_tree) - continue descr = tok.faildescr if descr.loop_version(): continue # patch them later diff --git a/rpython/jit/backend/x86/guard_compat.py b/rpython/jit/backend/x86/guard_compat.py --- a/rpython/jit/backend/x86/guard_compat.py +++ b/rpython/jit/backend/x86/guard_compat.py @@ -242,7 +242,7 @@ # The _backend_choices object is still referenced from [RSP+16] # (which becomes [RSP+8] after the POP), where it is the second of a - # three-words array passed as argument to invoke_find_compatible(). + # two-words array passed as argument to invoke_find_compatible(). # The first word is the value, from RAX, which we store in (*) # below. @@ -275,13 +275,13 @@ # restore them all. assembler._pop_all_regs_from_frame(mc, [], withfloats=True) - # jump to the result, which is passed as the third word of the + # jump to the result, which is returned as the first word of the # array. In case this goes to guard_compat_recovery, we also reload # the _backend_choices object from the second word of the array (the # GC may have moved it, or it may be a completely new object). if IS_X86_64: - mc.MOV_rs(r11, 1 * WORD) # MOV R11, [RSP] - mc.JMP_s(2 * WORD) # JMP *[RSP+16] + mc.MOV_rs(r11, 1 * WORD) # MOV R11, [RSP+8] + mc.JMP_s(0) # JMP *[RSP] elif IS_X86_32: XXX mc.JMP_s(0) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit