Merge pull request #383 from hjl-tools/hjl/master Hjl/master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
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/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;
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__"