diff options
author | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-11 23:54:40 +0000 |
---|---|---|
committer | amodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-11 23:54:40 +0000 |
commit | f397026ae36c2e23553d905c27f95b7eac53677e (patch) | |
tree | 04f3459481dd95299d45c55d0dfb47440783644e /libffi | |
parent | 1f5cb383529e14aa9b7d03740c0f085431f82e05 (diff) | |
download | gcc-f397026ae36c2e23553d905c27f95b7eac53677e.tar.gz |
* src/prep_cif.c (initialize_aggregate): Include tail padding in
structure size.
* src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct
placement of float result.
* testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct
cast of "resp" for big-endian 64 bit machines.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71323 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/ChangeLog | 9 | ||||
-rw-r--r-- | libffi/src/powerpc/linux64_closure.S | 2 | ||||
-rw-r--r-- | libffi/src/prep_cif.c | 9 | ||||
-rw-r--r-- | libffi/testsuite/libffi.special/unwindtest.cc | 4 |
4 files changed, 21 insertions, 3 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 2efe64b2129..15f9c6d5417 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,12 @@ +2003-09-12 Alan Modra <amodra@bigpond.net.au> + + * src/prep_cif.c (initialize_aggregate): Include tail padding in + structure size. + * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Correct + placement of float result. + * testsuite/libffi.special/unwindtest.cc (closure_test_fn1): Correct + cast of "resp" for big-endian 64 bit machines. + 2003-09-11 Alan Modra <amodra@bigpond.net.au> * src/types.c (double, longdouble): Merge identical SH and ARM diff --git a/libffi/src/powerpc/linux64_closure.S b/libffi/src/powerpc/linux64_closure.S index 6cad16ad77d..2d44d67c20f 100644 --- a/libffi/src/powerpc/linux64_closure.S +++ b/libffi/src/powerpc/linux64_closure.S @@ -97,7 +97,7 @@ ffi_closure_LINUX64: addi %r1, %r1, 224 blr # case FFI_TYPE_FLOAT - lfs %f1, 112+4(%r1) + lfs %f1, 112+0(%r1) mtlr %r0 addi %r1, %r1, 224 blr diff --git a/libffi/src/prep_cif.c b/libffi/src/prep_cif.c index d3c89c365e9..d60d98ee9f5 100644 --- a/libffi/src/prep_cif.c +++ b/libffi/src/prep_cif.c @@ -64,6 +64,15 @@ static ffi_status initialize_aggregate(/*@out@*/ ffi_type *arg) ptr++; } + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = ALIGN (arg->size, arg->alignment); + if (arg->size == 0) return FFI_BAD_TYPEDEF; else diff --git a/libffi/testsuite/libffi.special/unwindtest.cc b/libffi/testsuite/libffi.special/unwindtest.cc index 97b1536b214..b6be367857a 100644 --- a/libffi/testsuite/libffi.special/unwindtest.cc +++ b/libffi/testsuite/libffi.special/unwindtest.cc @@ -37,9 +37,9 @@ void closure_test_fn1(ffi_cif* cif,void* resp,void** args, (int)(*(int *)args[10]), (int)(*(float *)args[11]), (int)*(int *)args[12], (int)(*(int *)args[13]), (int)(*(int *)args[14]), *(int *)args[15], - (int)(long)userdata, *(int*)resp); + (int)(long)userdata, (int)*(ffi_arg*)resp); - throw *(int*)resp; + throw (int)*(ffi_arg*)resp; } typedef int (*closure_test_type1)(float, float, float, float, signed short, |