diff options
author | Anthony Green <green@moxielogic.com> | 2022-09-18 15:06:57 -0400 |
---|---|---|
committer | Anthony Green <green@moxielogic.com> | 2022-09-18 15:06:57 -0400 |
commit | 4c2984c43fbb3db8e65b2b5702b27944eb0ed343 (patch) | |
tree | 0381e065fe1eccb82560021f4928eb0a7c09f5e6 /src | |
parent | b05dc51bbe9aef6fcac66a8e68b59472bfaff126 (diff) | |
download | libffi-4c2984c43fbb3db8e65b2b5702b27944eb0ed343.tar.gz |
Handle win32 ABIs for struct return
Diffstat (limited to 'src')
-rw-r--r-- | src/x86/ffi.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/src/x86/ffi.c b/src/x86/ffi.c index f867c20..b8bb178 100644 --- a/src/x86/ffi.c +++ b/src/x86/ffi.c @@ -117,34 +117,37 @@ ffi_prep_cif_machdep(ffi_cif *cif) flags = X86_RET_INT64; break; case FFI_TYPE_STRUCT: -#ifndef X86 - if (cif->rtype->size == 1) - flags = X86_RET_STRUCT_1B; - else if (cif->rtype->size == 2) - flags = X86_RET_STRUCT_2B; - else if (cif->rtype->size == 4) - flags = X86_RET_INT32; - else if (cif->rtype->size == 8) - flags = X86_RET_INT64; - else + { +#ifdef X86_WIN32 + size_t size = cif->rtype->size; + if (size == 1) + flags = X86_RET_STRUCT_1B; + else if (size == 2) + flags = X86_RET_STRUCT_2B; + else if (size == 4) + flags = X86_RET_INT32; + else if (size == 8) + flags = X86_RET_INT64; + else #endif - { - do_struct: - switch (cabi) - { - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_STDCALL: - case FFI_MS_CDECL: - flags = X86_RET_STRUCTARG; - break; - default: - flags = X86_RET_STRUCTPOP; - break; - } - /* Allocate space for return value pointer. */ - bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); - } + { + do_struct: + switch (cabi) + { + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_STDCALL: + case FFI_MS_CDECL: + flags = X86_RET_STRUCTARG; + break; + default: + flags = X86_RET_STRUCTPOP; + break; + } + /* Allocate space for return value pointer. */ + bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); + } + } break; case FFI_TYPE_COMPLEX: switch (cif->rtype->elements[0]->type) |