From b2a343ffc68f1af5368281e063c0ca5571c611cc Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 25 Oct 2017 04:36:49 -0700 Subject: [PATCH 1/2] Don't include WIN64/EFI64 for x32 Since x32 doesn't support WIN64/EFI64, don't include it for x32. Also x32 has sizeof size_t == 4. But TARGET should be X86_64. --- configure.host | 16 ++++++++++++++-- testsuite/lib/libffi.exp | 3 ++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.host b/configure.host index b5e1ec7..34e83f7 100644 --- a/configure.host +++ b/configure.host @@ -106,10 +106,18 @@ case "${host}" in if test $ac_cv_sizeof_size_t = 4; then case "$host" in x86_64-*x32|x86_64-x32-*) + TARGET_X32=yes TARGET=X86_64 ;; *) - TARGET=X86 + echo 'int foo (void) { return __x86_64__; }' > conftest.c + if $CC $CFLAGS -Werror -S conftest.c -o conftest.s > /dev/null 2>&1; then + TARGET_X32=yes + TARGET=X86_64 + else + TARGET=X86; + fi + rm -f conftest.* ;; esac else @@ -255,7 +263,11 @@ case "${TARGET}" in SOURCES="ffi.c sysv.S" ;; X86_64) - SOURCES="ffi64.c unix64.S ffiw64.c win64.S" + if test x"$TARGET_X32" = xyes; then + SOURCES="ffi64.c unix64.S" + else + SOURCES="ffi64.c unix64.S ffiw64.c win64.S" + fi ;; X86_WIN64) if test "$MSVC" = 1; then diff --git a/testsuite/lib/libffi.exp b/testsuite/lib/libffi.exp index 37e4cf6..7c65f81 100644 --- a/testsuite/lib/libffi.exp +++ b/testsuite/lib/libffi.exp @@ -324,7 +324,8 @@ proc run-many-tests { testcases extra_flags } { "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" } - } elseif [istarget "x86_64-*-*"] { + } elseif { [istarget "x86_64-*-*"] \ + && [libffi_feature_test "#ifndef __ILP32__"] } { set targetabis { "" "-DABI_NUM=FFI_WIN64 -DABI_ATTR=__MSABI__" From 9d9d92b47f3f73644f808ae38e97d1ea8f4d22df Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Wed, 25 Oct 2017 04:59:31 -0700 Subject: [PATCH 2/2] Skip WIN64/EFI64 support for x32 Since x32 doesn't support WIN64/EFI64, skip it if __ILP32__ is defined. --- src/x86/ffi64.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/x86/ffi64.c b/src/x86/ffi64.c index 757930b..d5ec8b7 100644 --- a/src/x86/ffi64.c +++ b/src/x86/ffi64.c @@ -389,8 +389,10 @@ examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], /* Perform machine dependent cif processing. */ +#ifndef __ILP32__ extern ffi_status ffi_prep_cif_machdep_efi64(ffi_cif *cif); +#endif ffi_status ffi_prep_cif_machdep (ffi_cif *cif) @@ -400,8 +402,10 @@ ffi_prep_cif_machdep (ffi_cif *cif) size_t bytes, n, rtype_size; ffi_type *rtype; +#ifndef __ILP32__ if (cif->abi == FFI_EFI64) return ffi_prep_cif_machdep_efi64(cif); +#endif if (cif->abi != FFI_UNIX64) return FFI_BAD_ABI; @@ -663,27 +667,35 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, flags, rvalue, fn); } +#ifndef __ILP32__ extern void ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +#endif void ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { +#ifndef __ILP32__ if (cif->abi == FFI_EFI64) return ffi_call_efi64(cif, fn, rvalue, avalue); +#endif ffi_call_int (cif, fn, rvalue, avalue, NULL); } +#ifndef __ILP32__ extern void ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue, void *closure); +#endif void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue, void *closure) { +#ifndef __ILP32__ if (cif->abi == FFI_EFI64) ffi_call_go_efi64(cif, fn, rvalue, avalue, closure); +#endif ffi_call_int (cif, fn, rvalue, avalue, closure); } @@ -691,12 +703,14 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, extern void ffi_closure_unix64(void) FFI_HIDDEN; extern void ffi_closure_unix64_sse(void) FFI_HIDDEN; +#ifndef __ILP32__ extern ffi_status ffi_prep_closure_loc_efi64(ffi_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*), void *user_data, void *codeloc); +#endif ffi_status ffi_prep_closure_loc (ffi_closure* closure, @@ -716,8 +730,10 @@ ffi_prep_closure_loc (ffi_closure* closure, void (*dest)(void); char *tramp = closure->tramp; +#ifndef __ILP32__ if (cif->abi == FFI_EFI64) return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc); +#endif if (cif->abi != FFI_UNIX64) return FFI_BAD_ABI; @@ -832,16 +848,20 @@ ffi_closure_unix64_inner(ffi_cif *cif, extern void ffi_go_closure_unix64(void) FFI_HIDDEN; extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN; +#ifndef __ILP32__ extern ffi_status ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*)); +#endif ffi_status ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, void (*fun)(ffi_cif*, void*, void**, void*)) { +#ifndef __ILP32__ if (cif->abi == FFI_EFI64) return ffi_prep_go_closure_efi64(closure, cif, fun); +#endif if (cif->abi != FFI_UNIX64) return FFI_BAD_ABI;