summaryrefslogtreecommitdiff
path: root/libffi/src
diff options
context:
space:
mode:
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-11 23:54:40 +0000
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-11 23:54:40 +0000
commitf397026ae36c2e23553d905c27f95b7eac53677e (patch)
tree04f3459481dd95299d45c55d0dfb47440783644e /libffi/src
parent1f5cb383529e14aa9b7d03740c0f085431f82e05 (diff)
downloadgcc-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/src')
-rw-r--r--libffi/src/powerpc/linux64_closure.S2
-rw-r--r--libffi/src/prep_cif.c9
2 files changed, 10 insertions, 1 deletions
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