diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2004-07-11 11:45:39 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2004-07-11 11:45:39 +0000 |
commit | e5dce82f98a9602dfb781c3cf64ee2c3d0cc05d1 (patch) | |
tree | ffcf91dcf4e4fcde395484b3635490cc3f088097 /libffi | |
parent | 578d1468411d6b29ff198e17eb0f87b83e825980 (diff) | |
download | gcc-e5dce82f98a9602dfb781c3cf64ee2c3d0cc05d1.zip gcc-e5dce82f98a9602dfb781c3cf64ee2c3d0cc05d1.tar.gz gcc-e5dce82f98a9602dfb781c3cf64ee2c3d0cc05d1.tar.bz2 |
ffi.c (ffi_prep_args): Fix C aliasing violation.
* src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation.
(ffi_check_float_struct): Remove unused prototype.
From-SVN: r84505
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/ChangeLog | 5 | ||||
-rw-r--r-- | libffi/src/s390/ffi.c | 18 |
2 files changed, 13 insertions, 10 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog index b76047f..30d9548 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,8 @@ +2004-07-11 Ulrich Weigand <uweigand@de.ibm.com> + + * src/s390/ffi.c (ffi_prep_args): Fix C aliasing violation. + (ffi_check_float_struct): Remove unused prototype. + 2004-06-30 Geoffrey Keating <geoffk@apple.com> * src/powerpc/ffi_darwin.c (flush_icache): ';' is a comment diff --git a/libffi/src/s390/ffi.c b/libffi/src/s390/ffi.c index d672b3c..399fa2a 100644 --- a/libffi/src/s390/ffi.c +++ b/libffi/src/s390/ffi.c @@ -69,7 +69,6 @@ /*====================================================================*/ static void ffi_prep_args (unsigned char *, extended_cif *); -static int ffi_check_float_struct (ffi_type *); void #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) __attribute__ ((visibility ("hidden"))) @@ -222,15 +221,7 @@ ffi_prep_args (unsigned char *stack, extended_cif *ecif) } } - /* Pointers are passed like UINTs of the same size. */ - if (type == FFI_TYPE_POINTER) -#ifdef __s390x__ - type = FFI_TYPE_UINT64; -#else - type = FFI_TYPE_UINT32; -#endif - - /* Now handle all primitive int/float data types. */ + /* Now handle all primitive int/pointer/float data types. */ switch (type) { case FFI_TYPE_DOUBLE: @@ -251,6 +242,13 @@ ffi_prep_args (unsigned char *stack, extended_cif *ecif) else p_ov[n_ov++] = *(unsigned int *) arg; break; + + case FFI_TYPE_POINTER: + if (n_gpr < MAX_GPRARGS) + p_gpr[n_gpr++] = (unsigned long)*(unsigned char **) arg; + else + p_ov[n_ov++] = (unsigned long)*(unsigned char **) arg; + break; case FFI_TYPE_UINT64: case FFI_TYPE_SINT64: |