Author: Armin Rigo <ar...@tunes.org> Branch: guard-compatible Changeset: r84638:ddb6db2eb91a Date: 2016-05-23 22:00 +0200 http://bitbucket.org/pypy/pypy/changeset/ddb6db2eb91a/
Log: Bah, I added the "jitframe" argument to the commented code and forgot to add it to the real code. Fix tests in consequences (which was a bit of a mess). Simplify the commented code even more to make it clear it is pseudo-code. 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 @@ -121,29 +121,23 @@ # # # invoke_find_compatible(bchoices, new_gcref, jitframe): -# descr = bchoices.bc_faildescr -# try: -# jitframe.jf_gcmap = descr._backend_gcmap -# result = descr.find_compatible(cpu, new_gcref) -# if result == 0: -# result = descr._backend_failure_recovery -# else: -# if result == -1: -# result = descr._backend_sequel_label -# bchoices = add_in_tree(bchoices, new_gcref, result) -# descr.bchoices_addr[0] = bchoices # GC table -# bchoices.bc_most_recent.gcref = new_gcref -# bchoices.bc_most_recent.asmaddr = result -# jitframe.jf_gcmap = 0 -# return result -# except: # oops! -# return descr._backend_failure_recovery +# IN PSEUDO-CODE: +# result = bchoices.bc_faildescr.find_compatible(cpu, new_gcref) +# if result == 0: +# result = descr._backend_failure_recovery +# else: +# if result == -1: +# result = descr._backend_sequel_label +# bchoices = add_in_tree(bchoices, new_gcref, result) +# <if bchoices changed, update the GC table> +# bchoices.bc_most_recent.gcref = new_gcref +# bchoices.bc_most_recent.asmaddr = result +# return result # # add_in_tree(bchoices, new_gcref, new_addr): -# if bchoices.bc_list[len(bchoices.bc_list) - 1] != -1: -# ...reallocate... -# bchoices.bc_list[len(bchoices.bc_list) - 1].gcref = new_gcref -# bchoices.bc_list[len(bchoices.bc_list) - 1].asmaddr = new_addr +# if bchoices.bc_list does not end in -1, reallocate a bigger one +# bchoices.bc_list[last].gcref = new_gcref +# bchoices.bc_list[last].asmaddr = new_addr # quicksort(bchoices.bc_list) # return bchoices # @@ -255,15 +249,17 @@ INVOKE_FIND_COMPATIBLE_FUNC = lltype.Ptr(lltype.FuncType( - [lltype.Ptr(BACKEND_CHOICES), llmemory.GCREF], + [lltype.Ptr(BACKEND_CHOICES), llmemory.GCREF, + lltype.Ptr(jitframe.JITFRAME)], lltype.Signed)) @specialize.memo() def make_invoke_find_compatible(cpu): - def invoke_find_compatible(bchoices, new_gcref): + def invoke_find_compatible(bchoices, new_gcref, jitframe): descr = bchoices.bc_faildescr descr = cast_gcref_to_instance(GuardCompatibleDescr, descr) try: + jitframe.jf_gcmap = descr._backend_gcmap result = descr.find_compatible(cpu, new_gcref) if result == 0: result = descr._backend_failure_recovery @@ -280,12 +276,13 @@ bchoices.bc_most_recent.gcref = gcref_to_unsigned(new_gcref) bchoices.bc_most_recent.asmaddr = result llop.gc_writebarrier(lltype.Void, bchoices) - return result except: # oops! if not we_are_translated(): import sys, pdb pdb.post_mortem(sys.exc_info()[2]) - return descr._backend_failure_recovery + result = descr._backend_failure_recovery + jitframe.jf_gcmap = lltype.nullptr(lltype.typeOf(jitframe.jf_gcmap).TO) + return result return invoke_find_compatible def add_in_tree(bchoices, new_gcref, new_asmaddr): diff --git a/rpython/jit/backend/x86/test/test_compatible.py b/rpython/jit/backend/x86/test/test_compatible.py --- a/rpython/jit/backend/x86/test/test_compatible.py +++ b/rpython/jit/backend/x86/test/test_compatible.py @@ -78,41 +78,43 @@ mc.writechar('\x00') # 4 gctable entries; 'bchoices' will be #3 # if IS_X86_64: + mc.MOV(regloc.ecx, regloc.edx) mc.MOV(regloc.edx, regloc.edi) mc.MOV(regloc.eax, regloc.esi) elif IS_X86_32: mc.MOV_rs(regloc.edx.value, 4) mc.MOV_rs(regloc.eax.value, 8) + mc.MOV_rs(regloc.ecx.value, 12) # mc.PUSH(regloc.ebp) - mc.SUB(regloc.esp, regloc.imm(448 - 2*WORD)) # make a frame, and align stack - mc.LEA_rs(regloc.ebp.value, 48) + mc.SUB(regloc.esp, regloc.imm(148 - 2*WORD)) # make a frame, and align stack + mc.MOV(regloc.ebp, regloc.ecx) # mc.PUSH(regloc.imm(0xdddd)) mc.PUSH(regloc.imm(0xaaaa)) mc.JMP(regloc.imm(cpu.assembler.guard_compat_search_tree)) sequel = mc.get_relative_pos() # - mc.force_frame_size(448) + mc.force_frame_size(148) mc.SUB(regloc.eax, regloc.edx) - mc.ADD(regloc.esp, regloc.imm(448 - 2*WORD)) + mc.ADD(regloc.esp, regloc.imm(148 - 2*WORD)) mc.POP(regloc.ebp) mc.RET() # extra_paths = [] for i in range(11): - mc.force_frame_size(448) + mc.force_frame_size(148) extra_paths.append(mc.get_relative_pos()) mc.MOV(regloc.eax, regloc.imm(1000000 + i)) - mc.ADD(regloc.esp, regloc.imm(448 - 2*WORD)) + mc.ADD(regloc.esp, regloc.imm(148 - 2*WORD)) mc.POP(regloc.ebp) mc.RET() failure = extra_paths[10] rawstart = mc.materialize(cpu, []) - call_me = rffi.cast(lltype.Ptr(lltype.FuncType([lltype.Ptr(BACKEND_CHOICES), - llmemory.GCREF], - lltype.Signed)), - rawstart + 4 * WORD) + call_me = rffi.cast(lltype.Ptr(lltype.FuncType( + [lltype.Ptr(BACKEND_CHOICES), llmemory.GCREF, + lltype.Ptr(jitframe.JITFRAME)], lltype.Signed)), + rawstart + 4 * WORD) guard_compat_descr = GuardCompatibleDescr() bchoices = initial_bchoices(guard_compat_descr, @@ -132,11 +134,16 @@ # ---- ready ---- + frame_info = lltype.malloc(jitframe.JITFRAMEINFO, flavor='raw') + frame_info.clear() + frame_info.update_frame_depth(cpu.get_baseofs_of_frame_field(), 1000) + frame = jitframe.JITFRAME.allocate(frame_info) + for i in range(5): guard_compat_descr.find_compatible = "don't call" gcref = rffi.cast(llmemory.GCREF, 111111) print 'calling with the standard gcref' - res = call_me(bchoices, gcref) + res = call_me(bchoices, gcref, frame) assert res == 0xaaaa - 0xdddd assert bchoices.bc_most_recent.gcref == 111111 assert bchoices.bc_most_recent.asmaddr == rawstart + sequel @@ -151,7 +158,7 @@ guard_compat_descr.find_compatible = call gcref = rffi.cast(llmemory.GCREF, 123456 + i) print 'calling with a gcref never seen before' - res = call_me(bchoices, gcref) + res = call_me(bchoices, gcref, frame) assert res == 1000010 assert len(seen) == 1 + i assert bchoices.bc_most_recent.gcref == 123456 + i @@ -174,11 +181,13 @@ guard_compat_descr.find_compatible = "don't call" gcref = rffi.cast(llmemory.GCREF, intgcref) print 'calling with new choice', intgcref - res = call_me(bchoices, gcref) + res = call_me(bchoices, gcref, frame) assert res == expected_res assert bchoices.bc_most_recent.gcref == intgcref assert bchoices.bc_most_recent.asmaddr == expected_asmaddr + lltype.free(frame_info, flavor='raw') + class TestCompatible(Jit386Mixin, test_compatible.TestCompatible): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit