OSDN Git Service

Andreas Tobler <a.tobler@schweiz.ch>
authorandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Mar 2003 19:10:26 +0000 (19:10 +0000)
committerandreast <andreast@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 Mar 2003 19:10:26 +0000 (19:10 +0000)
        * 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

libffi/ChangeLog
libffi/src/powerpc/darwin_closure.S

index 319315e..89dded9 100644 (file)
@@ -1,3 +1,7 @@
+2003-03-03  Andreas Tobler <a.tobler@schweiz.ch>
+
+        * src/powerpc/darwin_closure.S: Recode to fit dynamic libraries.
+
 2003-02-06  Andreas Tobler <a.tobler@schweiz.ch>
 
        * libffi/src/powerpc/darwin_closure.S:
index 9ae17d8..9f721de 100644 (file)
    ----------------------------------------------------------------------- */
 
 #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