aboutsummaryrefslogtreecommitdiff
path: root/libffi/src/prep_cif.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2000-04-17 04:15:32 +0200
committerAnthony Green <green@gcc.gnu.org>2000-04-17 02:15:32 +0000
commit3791773c9395246e5fb860a20bb3dddd8e5edeb6 (patch)
tree5eee77be9c61a0f60260a8f47e6085ac5e0738a5 /libffi/src/prep_cif.c
parent11033ba5226589d2e7a7055cda6ddf0379f7cad1 (diff)
downloadgcc-3791773c9395246e5fb860a20bb3dddd8e5edeb6.zip
gcc-3791773c9395246e5fb860a20bb3dddd8e5edeb6.tar.gz
gcc-3791773c9395246e5fb860a20bb3dddd8e5edeb6.tar.bz2
Port to sparc 32 and 64 Linux.
From-SVN: r33196
Diffstat (limited to 'libffi/src/prep_cif.c')
-rw-r--r--libffi/src/prep_cif.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/libffi/src/prep_cif.c b/libffi/src/prep_cif.c
index 4c731b9..3f21411 100644
--- a/libffi/src/prep_cif.c
+++ b/libffi/src/prep_cif.c
@@ -107,7 +107,11 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
#ifndef M68K
/* Make space for the return structure pointer */
- if (cif->rtype->type == FFI_TYPE_STRUCT)
+ if (cif->rtype->type == FFI_TYPE_STRUCT
+#ifdef SPARC
+ && (cif->abi != FFI_V9 || cif->rtype->size > 32)
+#endif
+ )
bytes = STACK_ARG_SIZE(sizeof(void*));
#endif
@@ -121,8 +125,10 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
return FFI_BAD_TYPEDEF;
#ifdef SPARC
- if ((*ptr)->type == FFI_TYPE_STRUCT
- || (*ptr)->type == FFI_TYPE_LONGDOUBLE)
+ if (((*ptr)->type == FFI_TYPE_STRUCT
+ && ((*ptr)->size > 16 || cif->abi != FFI_V9))
+ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE
+ && cif->abi != FFI_V9))
bytes += sizeof(void*);
else
#endif
@@ -140,4 +146,3 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
/* Perform machine dependent cif processing */
return ffi_prep_cif_machdep(cif);
}
-