From: andreast Date: Mon, 10 Mar 2003 19:10:26 +0000 (+0000) Subject: Andreas Tobler X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=5fee68c6512a7da2e24bc2f15cbe96f440bd7740 Andreas Tobler * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64106 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 319315e5159..89dded925a1 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,7 @@ +2003-03-03 Andreas Tobler + + * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries. + 2003-02-06 Andreas Tobler * libffi/src/powerpc/darwin_closure.S: diff --git a/libffi/src/powerpc/darwin_closure.S b/libffi/src/powerpc/darwin_closure.S index 9ae17d8cce8..9f721de8a61 100644 --- a/libffi/src/powerpc/darwin_closure.S +++ b/libffi/src/powerpc/darwin_closure.S @@ -25,21 +25,19 @@ ----------------------------------------------------------------------- */ #define LIBFFI_ASM -#define JUMPTARGET(name) name #define L(x) x -.text -.globl _ffi_closure_helper_DARWIN + .file "darwin_closure.S" .text - .align 2 + .align 2 .globl _ffi_closure_ASM - + .text .align 2 _ffi_closure_ASM: LFB1: - mflr r0 /* extract return address */ - stw r0, 8(r1) /* save the return address */ + 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) @@ -47,7 +45,7 @@ LCFI0: 8 Bytes (result) 168 Bytes */ - stwu r1,-176(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 @@ -97,98 +95,147 @@ LCFI1: addi r7,r1,232 /* make the call */ - bl L(_ffi_closure_helper_DARWIN) - + bl Lffi_closure_helper_DARWIN$stub + /* now r3 contains the return type */ /* so use it to look up in a table */ /* so we know how to deal with each type */ /* look up the proper starting point in table */ /* by using return type as offset */ - addi r5,r1,160 /* get pointer to results area */ - addis r4,0,ha16(.L60) /* get address of jump table */ - addi r4,r4,lo16(.L60) - slwi r3,r3,2 /* now multiply return type by 4 */ - lwzx r3,r4,r3 /* get the contents of that table value */ - add r3,r3,r4 /* add contents of table to table address */ + addi r5,r1,160 /* get pointer to results area */ + bl Lget_ret_type0_addr /* get pointer to Lret_type0 into LR */ + mflr r4 /* move to r4 */ + slwi r3,r3,4 /* now multiply return type by 16 */ + add r3,r3,r4 /* add contents of table to table address */ mtctr r3 - bctr /* jump to it */ + bctr /* jump to it */ LFE1: - .align 2 - -.L60: - .long .L44-.L60 /* FFI_TYPE_VOID */ - .long .L50-.L60 /* FFI_TYPE_INT */ - .long .L47-.L60 /* FFI_TYPE_FLOAT */ - .long .L46-.L60 /* FFI_TYPE_DOUBLE */ - .long .L46-.L60 /* FFI_TYPE_LONGDOUBLE */ - .long .L56-.L60 /* FFI_TYPE_UINT8 */ - .long .L55-.L60 /* FFI_TYPE_SINT8 */ - .long .L58-.L60 /* FFI_TYPE_UINT16 */ - .long .L57-.L60 /* FFI_TYPE_SINT16 */ - .long .L50-.L60 /* FFI_TYPE_UINT32 */ - .long .L50-.L60 /* FFI_TYPE_SINT32 */ - .long .L48-.L60 /* FFI_TYPE_UINT64 */ - .long .L48-.L60 /* FFI_TYPE_SINT64 */ - .long .L44-.L60 /* FFI_TYPE_STRUCT */ - .long .L50-.L60 /* FFI_TYPE_POINTER */ - - -/* case double */ -.L46: - lfd f1,0(r5) - b .L44 - -/* case float */ -.L47: - lfs f1,0(r5) - b .L44 - -/* case long long */ -.L48: - lwz r3,0(r5) - lwz r4,4(r5) - b .L44 +/* Each of the ret_typeX code fragments has to be exactly 16 bytes long */ +/* (4 instructions). For cache effectiveness we align to a 16 byte boundary */ +/* first. */ -/* case default / int32 / pointer */ -.L50: - lwz r3,0(r5) - b .L44 - -/* case signed int8 */ -.L55: - addi r5,r5,3 - lbz r3,0(r5) - extsb r3,r3 - b .L44 - -/* case unsigned int8 */ -.L56: - addi r5,r5,3 - lbz r3,0(r5) - b .L44 - -/* case signed int16 */ -.L57: - addi r5,r5,2 - lhz r3,0(r5) - extsh r3,r3 - b .L44 - -/* case unsigned int16 */ -.L58: - addi r5,r5,2 - lhz r3,0(r5) - -/* case void / done */ -.L44: - - addi r1,r1,176 /* restore stack pointer */ - lwz r0,8(r1) /* get return address */ - mtlr r0 /* reset link register */ + .align 4 + + nop + nop + nop +Lget_ret_type0_addr: + blrl + +/* case FFI_TYPE_VOID */ +Lret_type0: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_INT */ +Lret_type1: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_FLOAT */ +Lret_type2: + lfs f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_DOUBLE */ +Lret_type3: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_LONGDOUBLE */ +Lret_type4: + lfd f1,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT8 */ +Lret_type5: + lbz r3,3(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT8 */ +Lret_type6: + lbz r3,3(r5) + extsb r3,r3 + b Lfinish + nop + +/* case FFI_TYPE_UINT16 */ +Lret_type7: + lhz r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT16 */ +Lret_type8: + lha r3,2(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT32 */ +Lret_type9: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_SINT32 */ +Lret_type10: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case FFI_TYPE_UINT64 */ +Lret_type11: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_SINT64 */ +Lret_type12: + lwz r3,0(r5) + lwz r4,4(r5) + b Lfinish + nop + +/* case FFI_TYPE_STRUCT */ +Lret_type13: + b Lfinish + nop + nop + nop + +/* case FFI_TYPE_POINTER */ +Lret_type14: + lwz r3,0(r5) + b Lfinish + nop + nop + +/* case done */ +Lfinish: + addi r1,r1,176 /* restore stack pointer */ + lwz r0,8(r1) /* get return address */ + mtlr r0 /* reset link register */ blr - -/* END(ffi_closure_ASM) */ + +/* END(ffi_closure_ASM) */ .data .section __TEXT,__eh_frame @@ -233,4 +280,24 @@ LASFDE1: .byte 0x7e ; sleb128 -2 .align 2 LEFDE1: - +.data + .align 2 +LDFCM0: +.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 + .align 2 +Lffi_closure_helper_DARWIN$stub: + .indirect_symbol _ffi_closure_helper_DARWIN + mflr r0 + bcl 20,31,LO$ffi_closure_helper_DARWIN +LO$ffi_closure_helper_DARWIN: + mflr r11 + addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) + mtlr r0 + lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) + mtctr r12 + bctr +.data +.lazy_symbol_pointer +L_ffi_closure_helper_DARWIN$lazy_ptr: + .indirect_symbol _ffi_closure_helper_DARWIN + .long dyld_stub_binding_helper