Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r46960:df4c638240d8 Date: 2011-08-31 21:09 +0200 http://bitbucket.org/pypy/pypy/changeset/df4c638240d8/
Log: Fix for stdcall. 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 @@ -34,6 +34,7 @@ from pypy.rlib.debug import (debug_print, debug_start, debug_stop, have_debug_prints) from pypy.rlib import rgc +from pypy.rlib.clibffi import FFI_DEFAULT_ABI from pypy.jit.backend.x86.jump import remap_frame_layout from pypy.jit.metainterp.history import ConstInt, BoxInt from pypy.jit.codewriter.effectinfo import EffectInfo @@ -1120,7 +1121,7 @@ return genop_cmp_guard_float def _emit_call(self, force_index, x, arglocs, start=0, tmp=eax, - argtypes=None): + argtypes=None, callconv=FFI_DEFAULT_ABI): if IS_X86_64: return self._emit_call_64(force_index, x, arglocs, start, argtypes) @@ -1149,6 +1150,16 @@ # x is a location self.mc.CALL(x) self.mark_gc_roots(force_index) + # + if callconv != FFI_DEFAULT_ABI: + self._fix_stdcall(callconv, p) + + def _fix_stdcall(self, callconv, p): + from pypy.rlib.clibffi import FFI_STDCALL + assert callconv == FFI_STDCALL + # it's a bit stupid, but we're just going to cancel the fact that + # the called function just added 'p' to ESP, by subtracting it again. + self.mc.SUB_ri(esp.value, p) def _emit_call_64(self, force_index, x, arglocs, start, argtypes): src_locs = [] @@ -2127,7 +2138,8 @@ tmp = eax self._emit_call(force_index, x, arglocs, 3, tmp=tmp, - argtypes=op.getdescr().get_arg_types()) + argtypes=op.getdescr().get_arg_types(), + callconv=op.getdescr().get_call_conv()) if IS_X86_32 and isinstance(resloc, StackLoc) and resloc.width == 8: # a float or a long long return diff --git a/pypy/jit/backend/x86/test/test_runner.py b/pypy/jit/backend/x86/test/test_runner.py --- a/pypy/jit/backend/x86/test/test_runner.py +++ b/pypy/jit/backend/x86/test/test_runner.py @@ -439,20 +439,18 @@ from pypy.jit.backend.x86.regloc import eax, edx from pypy.jit.backend.x86 import codebuf from pypy.jit.codewriter.effectinfo import EffectInfo - from pypy.rlib.libffi import types - from pypy.rlib.clibffi import FFI_DEFAULT_ABI - try: - from pypy.rlib.clibffi import FFI_STDCALL - except ImportError: - FFI_STDCALL = 12345 # not on Windows, but we can still test - - for ffi in [FFI_DEFAULT_ABI, FFI_STDCALL]: + from pypy.rlib.libffi import types, clibffi + had_stdcall = hasattr(clibffi, 'FFI_STDCALL') + if not had_stdcall: # not running on Windows, but we can still test + clibffi.FFI_STDCALL = 12345 + # + for ffi in [clibffi.FFI_DEFAULT_ABI, clibffi.FFI_STDCALL]: cpu = self.cpu mc = codebuf.MachineCodeBlockWrapper() mc.MOV_rs(eax.value, 4) # argument 1 mc.MOV_rs(edx.value, 40) # argument 10 mc.SUB_rr(eax.value, edx.value) # return arg1 - arg10 - if ffi == FFI_DEFAULT_ABI: + if ffi == clibffi.FFI_DEFAULT_ABI: mc.RET() else: mc.RET16_i(40) @@ -516,6 +514,9 @@ assert self.cpu.get_latest_value_int(2) == 42 assert self.cpu.get_latest_value_int(3) == 42 + if not had_stdcall: + del clibffi.FFI_STDCALL + class TestDebuggingAssembler(object): def setup_method(self, meth): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit