diff options
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/ChangeLog | 9 | ||||
-rw-r--r-- | libffi/src/powerpc/aix_closure.S | 37 | ||||
-rw-r--r-- | libffi/src/powerpc/darwin_closure.S | 51 | ||||
-rw-r--r-- | libffi/src/powerpc/ffi_darwin.c | 44 |
4 files changed, 77 insertions, 64 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog index f0b6853..319315e 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,12 @@ +2003-02-06 Andreas Tobler <a.tobler@schweiz.ch> + + * libffi/src/powerpc/darwin_closure.S: + Fix alignement bug, allocate 8 bytes for the result. + * libffi/src/powerpc/aix_closure.S: + Likewise. + * libffi/src/powerpc/ffi_darwin.c: + Update stackframe description for aix/darwin_closure.S. + 2003-02-06 Jakub Jelinek <jakub@redhat.com> * src/s390/ffi.c (ffi_closure_helper_SYSV): Add hidden visibility diff --git a/libffi/src/powerpc/aix_closure.S b/libffi/src/powerpc/aix_closure.S index 7fa96f1..d0d50ca 100644 --- a/libffi/src/powerpc/aix_closure.S +++ b/libffi/src/powerpc/aix_closure.S @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------- - aix_closures.S - Copyright (c) 2002 Free Software Foundation, Inc. - based on darwin_closures.S + aix_closure.S - Copyright (c) 2002 2003 Free Software Foundation, Inc. + based on darwin_closure.S PowerPC Assembly glue. @@ -106,24 +106,25 @@ ffi_closure_ASM: /* 24 Bytes (Linkage Area) */ /* 32 Bytes (params) */ /* 104 Bytes (13*8 from FPR) */ - /* 4 Bytes (result) - /* 164 Bytes */ + /* 8 Bytes (result) + /* 168 Bytes */ - stwu r1,-164(r1) /* skip over caller save area */ + stwu r1,-176(r1) /* skip over caller save area + keep stack aligned to 16 */ /* we want to build up an area for the parameters passed */ /* in registers (both floating point and integer) */ - /* we store gpr 3 to gpr 10 (aligned to 4) */ - /* in the parents outgoing area */ - stw r3, 188(r1) - stw r4, 192(r1) - stw r5, 196(r1) - stw r6, 200(r1) - stw r7, 204(r1) - stw r8, 208(r1) - stw r9, 212(r1) - stw r10, 216(r1) + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + stw r3, 200(r1) + stw r4, 204(r1) + stw r5, 208(r1) + stw r6, 212(r1) + stw r7, 216(r1) + stw r8, 220(r1) + stw r9, 224(r1) + stw r10, 228(r1) /* next save fpr 1 to fpr 13 (aligned to 8) */ stfd f1, 56(r1) @@ -148,14 +149,14 @@ ffi_closure_ASM: addi r4,r1,160 /* now load up the pointer to the saved gpr registers */ - addi r5,r1,188 + addi r5,r1,200 /* now load up the pointer to the saved fpr registers */ addi r6,r1,56 /* now load up the pointer to the outgoing parameter */ /* stack in the previous frame */ - addi r7,r1,220 + addi r7,r1,232 /* make the call */ bl .ffi_closure_helper_DARWIN @@ -243,7 +244,7 @@ L..58: /* case void / done */ L..44: - addi r1,r1,164 /* restore stack pointer */ + addi r1,r1,176 /* restore stack pointer */ lwz r0,8(r1) /* get return address */ mtlr r0 /* reset link register */ blr diff --git a/libffi/src/powerpc/darwin_closure.S b/libffi/src/powerpc/darwin_closure.S index 5420c77..9ae17d8 100644 --- a/libffi/src/powerpc/darwin_closure.S +++ b/libffi/src/powerpc/darwin_closure.S @@ -41,27 +41,28 @@ LFB1: mflr r0 /* extract return address */ stw r0, 8(r1) /* save the return address */ LCFI0: - /* 24 Bytes (Linkage Area) */ - /* 32 Bytes (outgoing parameter area, always reserved) */ - /* 104 Bytes (13*8 from FPR) */ - /* 4 Bytes (result) - /* 164 Bytes */ + /* 24 Bytes (Linkage Area) + 32 Bytes (outgoing parameter area, always reserved) + 104 Bytes (13*8 from FPR) + 8 Bytes (result) + 168 Bytes */ - stwu r1,-164(r1) /* skip over caller save area */ + stwu r1,-176(r1) /* skip over caller save area + keep stack aligned to 16 */ LCFI1: /* we want to build up an area for the parameters passed in registers (both floating point and integer) */ - /* we store gpr 3 to gpr 10 (aligned to 4) */ - /* in the parents outgoing area */ - stw r3, 188(r1) - stw r4, 192(r1) - stw r5, 196(r1) - stw r6, 200(r1) - stw r7, 204(r1) - stw r8, 208(r1) - stw r9, 212(r1) - stw r10, 216(r1) + /* we store gpr 3 to gpr 10 (aligned to 4) + in the parents outgoing area */ + stw r3, 200(r1) + stw r4, 204(r1) + stw r5, 208(r1) + stw r6, 212(r1) + stw r7, 216(r1) + stw r8, 220(r1) + stw r9, 224(r1) + stw r10, 228(r1) /* we save fpr 1 to fpr 13 (aligned to 8) */ stfd f1, 56(r1) @@ -85,15 +86,15 @@ LCFI1: /* now load up the pointer to the result storage */ addi r4,r1,160 - /* now load up the pointer to the saved gpr registers */ - addi r5,r1,188 + /* now load up the pointer to the saved gpr registers */ + addi r5,r1,200 /* now load up the pointer to the saved fpr registers */ addi r6,r1,56 - /* now load up the pointer to the outgoing parameter */ - /* stack in the previous frame */ - addi r7,r1,220 + /* now load up the pointer to the outgoing parameter + stack in the previous frame */ + addi r7,r1,232 /* make the call */ bl L(_ffi_closure_helper_DARWIN) @@ -182,9 +183,9 @@ LFE1: /* case void / done */ .L44: - addi r1,r1,164 /* restore stack pointer */ - lwz r0,8(r1) /* get return address */ - mtlr r0 /* reset link register */ + addi r1,r1,176 /* restore stack pointer */ + lwz r0,8(r1) /* get return address */ + mtlr r0 /* reset link register */ blr /* END(ffi_closure_ASM) */ @@ -223,7 +224,7 @@ LASFDE1: .set L$set$3,LCFI1-LCFI0 .long L$set$3 .byte 0xe ; DW_CFA_def_cfa_offset - .byte 164,1 ; uleb128 164 + .byte 176,1 ; uleb128 176 .byte 0x4 ; DW_CFA_advance_loc4 .set L$set$4,LCFI0-LFB1 .long L$set$4 diff --git a/libffi/src/powerpc/ffi_darwin.c b/libffi/src/powerpc/ffi_darwin.c index 5773644..3f70527 100644 --- a/libffi/src/powerpc/ffi_darwin.c +++ b/libffi/src/powerpc/ffi_darwin.c @@ -410,38 +410,40 @@ typedef struct aix_fd_struct { +---------------------------------------+ 20 | saved TOC pointer 4 | +---------------------------------------+ 24 - | always reserved 8*4=32 (revious GPRs)| + | always reserved 8*4=32 (previous GPRs)| | according to the linkage convention | - | from AIX | + | from AIX | +---------------------------------------+ 56 - | our FPR area 13*8=104 | - | f1 | - | . | - | f13 | + | our FPR area 13*8=104 | + | f1 | + | . | + | f13 | +---------------------------------------+ 160 - | result area 4 | -SP current --> +---------------------------------------+ 164 <- parent frame - | back chain to caller 4 | + | result area 8 | +---------------------------------------+ 168 + | alignement to the next multiple of 16 | +SP current --> +---------------------------------------+ 176 <- parent frame + | back chain to caller 4 | + +---------------------------------------+ 180 | saved CR 4 | - +---------------------------------------+ 172 + +---------------------------------------+ 184 | saved LR 4 | - +---------------------------------------+ 176 + +---------------------------------------+ 188 | reserved for compilers 4 | - +---------------------------------------+ 180 + +---------------------------------------+ 192 | reserved for binders 4 | - +---------------------------------------+ 184 + +---------------------------------------+ 196 | saved TOC pointer 4 | - +---------------------------------------+ 188 + +---------------------------------------+ 200 | always reserved 8*4=32 we store our | - | GPRs here | - | r3 | - | . | - | r10 | - +---------------------------------------+ 220 - | PST area, overflow part | + | GPRs here | + | r3 | + | . | + | r10 | + +---------------------------------------+ 232 + | PST area, overflow part | +---------------------------------------+ xxx - | ???? | + | ???? | +---------------------------------------+ xxx */ |