@ -1,3 +1,5 @@
# include " c o m m o n . S "
#
# This f i l e d e f i n e s s o m e t r a m p o l i n e s f o r c a l l i n g b l o c k s . A b l o c k f u n c t i o n
# looks l i k e t h i s :
@ -15,33 +17,33 @@
.file " block_ t r a m p o l i n e s . S "
# if _ _ a r m _ _
.syntax unified
.globl __objc_block_trampoline_sret
.type _ _ objc _ b l o c k _ t r a m p o l i n e _ s r e t , % f u n c t i o n
.globl __objc_block_trampoline_end_sret
.globl __objc_block_trampoline
.type _ _ objc _ b l o c k _ t r a m p o l i n e , % f u n c t i o n
.globl __objc_block_trampoline_end
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t )
TYPE_ D I R E C T I V E ( C D E C L ( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) , % f u n c t i o n )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e )
TYPE_ D I R E C T I V E ( C D E C L ( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) , % f u n c t i o n )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d )
# else
.globl __objc_block_trampoline_sret
.type _ _ objc _ b l o c k _ t r a m p o l i n e _ s r e t , @function
.globl __objc_block_trampoline_end_sret
.globl __objc_block_trampoline
.type _ _ objc _ b l o c k _ t r a m p o l i n e , @function
.globl __objc_block_trampoline_end
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t )
TYPE_ D I R E C T I V E ( C D E C L ( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) , @function )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e )
TYPE_ D I R E C T I V E ( C D E C L ( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) , @function )
.globl CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d )
# endif
# if _ _ x86 _ 6 4
__objc_block_trampoline :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
mov - 1 5 ( % r i p ) , % r s i # L o a d t h e b l o c k p o i n t e r i n t o t h e s e c o n d a r g u m e n t
xchg % r d i , % r s i # S w a p t h e f i r s t a n d s e c o n d a r g u m e n t s
jmp * - 3 2 ( % r i p ) # C a l l t h e b l o c k f u n c t i o n
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
mov - 1 5 ( % r i p ) , % r d x # L o a d t h e b l o c k p o i n t e r i n t o t h e s e c o n d a r g u m e n t
xchg % r d x , % r s i # S w a p t h e f i r s t a n d s e c o n d a r g u m e n t s
jmp * - 3 2 ( % r i p ) # C a l l t h e b l o c k f u n c t i o n
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# elif _ _ i 3 8 6
__objc_block_trampoline :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
call n e x t _ l i n e # S t o r e t h e i n s t r u c t i o n p o i n t e r o n t h e s t a c k
next_line :
pop % e a x # L o a d t h e o l d i n s t r u c t i o n p o i n t e r
@ -50,8 +52,8 @@ next_line:
mov - 9 ( % e a x ) , % e b x # L o a d t h e b l o c k p o i n t e r t o % e b x
mov % e b x , 4 ( % e s p ) # S t o r e t h e b l o c k p o i n t e r i n t h e f i r s t a r g u m e n t
jmp * - 1 3 ( % e a x ) # C a l l t h e b l o c k f u n c t i o n
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
call n e x t _ l i n e 2 # S t o r e t h e i n s t r u c t i o n p o i n t e r o n t h e s t a c k
next_line2 :
pop % e a x # L o a d t h e o l d i n s t r u c t i o n p o i n t e r
@ -60,51 +62,53 @@ next_line2:
mov - 9 ( % e a x ) , % e b x # L o a d t h e b l o c k p o i n t e r t o % e b x
mov % e b x , 8 ( % e s p ) # S t o r e t h e b l o c k p o i n t e r i n t h e f i r s t a r g u m e n t
jmp * - 1 3 ( % e a x ) # C a l l t h e b l o c k f u n c t i o n
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# elif _ _ m i p s _ _
# ifdef _ A B I 6 4
__objc_block_trampoline :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
move $ a1 , $ a0
ld $ a0 , - 1 6 ( $ 2 5 )
ld $ 2 5 , - 8 ( $ 2 5 )
jr $ 2 5
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
move $ a2 , $ a1
ld $ a1 , - 1 6 ( $ 2 5 )
ld $ 2 5 , - 8 ( $ 2 5 )
jr $ 2 5
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# else
__objc_block_trampoline :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
move $ a1 , $ a0
lw $ a0 , - 8 ( $ 2 5 )
lw $ 2 5 , - 4 ( $ 2 5 )
jr $ 2 5
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
move $ a2 , $ a1
lw $ a1 , - 8 ( $ 2 5 )
lw $ 2 5 , - 4 ( $ 2 5 )
jr $ 2 5
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# endif
# elif _ _ a r m _ _
__objc_block_trampoline :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
mov r1 , r0 / / M o v e s e l f o v e r _ c m d
ldr r0 , [ p c , #- 16 ] / / L o a d t h e b l o c k p o i n t e r o v e r s e l f
ldr p c , [ p c , #- 24 ] / / J u m p t o t h e b l o c k f u n c t i o n
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
mov r2 , r1 / / M o v e s e l f o v e r _ c m d
ldr r1 , [ p c , #- 16 ] / / L o a d t h e b l o c k p o i n t e r o v e r s e l f
ldr p c , [ p c , #- 24 ] / / J u m p t o t h e b l o c k f u n c t i o n
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# else
# warning i m p _ i m p l e m e n t a t i o n W i t h B l o c k ( ) n o t i m p l e m e n t e d f o r y o u r a r c h i t e c t u r e
__objc_block_trampoline :
__objc_block_trampoline_end :
__objc_block_trampoline_sret :
__objc_block_trampoline_end_sret :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ s r e t ) :
CDECL( _ _ o b j c _ b l o c k _ t r a m p o l i n e _ e n d _ s r e t ) :
# endif
# if H A S _ S E C T I O N _ D I R E C T I V E
.section .note .GNU - stack," " ,% p r o g b i t s
# endif