@@ -331,10 +331,11 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
331331extern int
332332ffi_call_win64 (void (* )(char * , extended_cif * ), extended_cif * ,
333333 unsigned , unsigned , unsigned * , void (* fn )(void ));
334- #else
334+ #elif defined( X86_WIN32 )
335335extern void
336336ffi_call_win32 (void (* )(char * , extended_cif * ), extended_cif * ,
337337 unsigned , unsigned , unsigned , unsigned * , void (* fn )(void ));
338+ #else
338339extern void ffi_call_SYSV (void (* )(char * , extended_cif * ), extended_cif * ,
339340 unsigned , unsigned , unsigned * , void (* fn )(void ));
340341#endif
@@ -376,16 +377,9 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
376377 ffi_call_win64 (ffi_prep_args , & ecif , cif -> bytes ,
377378 cif -> flags , ecif .rvalue , fn );
378379 break ;
379- #else
380- #ifndef X86_WIN32
381- case FFI_SYSV :
382- ffi_call_SYSV (ffi_prep_args , & ecif , cif -> bytes , cif -> flags , ecif .rvalue ,
383- fn );
384- break ;
385- #else
380+ #elif defined(X86_WIN32 )
386381 case FFI_SYSV :
387382 case FFI_MS_CDECL :
388- #endif
389383 case FFI_STDCALL :
390384 ffi_call_win32 (ffi_prep_args , & ecif , cif -> abi , cif -> bytes , cif -> flags ,
391385 ecif .rvalue , fn );
@@ -419,6 +413,11 @@ void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
419413 ecif .rvalue , fn );
420414 }
421415 break ;
416+ #else
417+ case FFI_SYSV :
418+ ffi_call_SYSV (ffi_prep_args , & ecif , cif -> bytes , cif -> flags , ecif .rvalue ,
419+ fn );
420+ break ;
422421#endif
423422 default :
424423 FFI_ASSERT (0 );
@@ -787,28 +786,36 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
787786 /* If the return value is a struct and we don't have a return */
788787 /* value address then we need to make one */
789788
789+ #ifdef X86_WIN64
790+ if (rvalue == NULL
791+ && cif -> flags == FFI_TYPE_STRUCT
792+ && cif -> rtype -> size != 1 && cif -> rtype -> size != 2
793+ && cif -> rtype -> size != 4 && cif -> rtype -> size != 8 )
794+ {
795+ ecif .rvalue = alloca ((cif -> rtype -> size + 0xF ) & ~0xF );
796+ }
797+ #else
790798 if (rvalue == NULL
791799 && (cif -> flags == FFI_TYPE_STRUCT
792800 || cif -> flags == FFI_TYPE_MS_STRUCT ))
793801 {
794802 ecif .rvalue = alloca (cif -> rtype -> size );
795803 }
804+ #endif
796805 else
797806 ecif .rvalue = rvalue ;
798807
799808
800809 switch (cif -> abi )
801810 {
802- #ifndef X86_WIN32
803- case FFI_SYSV :
804- ffi_call_SYSV (ffi_prep_args_raw , & ecif , cif -> bytes , cif -> flags ,
805- ecif .rvalue , fn );
811+ #ifdef X86_WIN64
812+ case FFI_WIN64 :
813+ ffi_call_win64 (ffi_prep_args_raw , & ecif , cif -> bytes ,
814+ cif -> flags , ecif .rvalue , fn );
806815 break ;
807- #else
816+ #elif defined( X86_WIN32 )
808817 case FFI_SYSV :
809818 case FFI_MS_CDECL :
810- #endif
811- #ifndef X86_WIN64
812819 case FFI_STDCALL :
813820 ffi_call_win32 (ffi_prep_args_raw , & ecif , cif -> abi , cif -> bytes , cif -> flags ,
814821 ecif .rvalue , fn );
@@ -835,13 +842,18 @@ ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *fake_avalue)
835842 ++ passed_regs ;
836843 }
837844 if (passed_regs < 2 && abi == FFI_FASTCALL )
838- cif -> abi = abi = FFI_THISCALL ;
845+ abi = FFI_THISCALL ;
839846 if (passed_regs < 1 && abi == FFI_THISCALL )
840- cif -> abi = abi = FFI_STDCALL ;
847+ abi = FFI_STDCALL ;
841848 ffi_call_win32 (ffi_prep_args_raw , & ecif , abi , cif -> bytes , cif -> flags ,
842849 ecif .rvalue , fn );
843850 }
844851 break ;
852+ #else
853+ case FFI_SYSV :
854+ ffi_call_SYSV (ffi_prep_args_raw , & ecif , cif -> bytes , cif -> flags , ecif .rvalue ,
855+ fn );
856+ break ;
845857#endif
846858 default :
847859 FFI_ASSERT (0 );
0 commit comments