aboutsummaryrefslogtreecommitdiff
path: root/libffi/src/pa/linux.S
diff options
context:
space:
mode:
Diffstat (limited to 'libffi/src/pa/linux.S')
-rw-r--r--libffi/src/pa/linux.S160
1 files changed, 100 insertions, 60 deletions
diff --git a/libffi/src/pa/linux.S b/libffi/src/pa/linux.S
index 6026904..33ef0b1 100644
--- a/libffi/src/pa/linux.S
+++ b/libffi/src/pa/linux.S
@@ -1,7 +1,6 @@
/* -----------------------------------------------------------------------
linux.S - (c) 2003-2004 Randolph Chung <tausq@debian.org>
(c) 2008 Red Hat, Inc.
- (c) 2016 John David Anglin
HPPA Foreign Function Interface
@@ -38,26 +37,24 @@
unsigned bytes,
unsigned flags,
unsigned *rvalue,
- void (*fn)(void),
- ffi_go_closure *closure);
+ void (*fn)(void));
*/
.export ffi_call_pa32,code
.import ffi_prep_args_pa32,code
.type ffi_call_pa32, @function
- .cfi_startproc
+.LFB1:
ffi_call_pa32:
.proc
.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4
.entry
stw %rp, -20(%sp)
copy %r3, %r1
- .cfi_offset 2, -20
- .cfi_register 3, 1
+.LCFI11:
copy %sp, %r3
- .cfi_def_cfa_register 3
+.LCFI12:
/* Setup the stack for calling prep_args...
We want the stack to look like this:
@@ -73,8 +70,8 @@ ffi_call_pa32:
*/
stwm %r1, 64(%sp)
- .cfi_offset 3, 0
stw %r4, 12(%r3)
+.LCFI13:
copy %sp, %r4
addl %arg2, %r4, %arg0 /* arg stack */
@@ -101,7 +98,6 @@ ffi_call_pa32:
we need to give it a place to put the result. */
ldw -52(%r3), %ret0 /* %ret0 <- rvalue */
ldw -56(%r3), %r22 /* %r22 <- function to call */
- ldw -60(%r3), %ret1 /* %ret1 <- closure */
bl $$dyncall, %r31 /* Call the user function */
copy %r31, %rp
@@ -253,27 +249,27 @@ ffi_call_pa32:
nop
.exit
.procend
- .cfi_endproc
+.LFE1:
/* void ffi_closure_pa32(void);
- Called with ffi_closure argument in %r21. */
+ Called with closure argument in %r19 */
.export ffi_closure_pa32,code
.import ffi_closure_inner_pa32,code
+
.type ffi_closure_pa32, @function
- .cfi_startproc
+.LFB2:
ffi_closure_pa32:
.proc
.callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
.entry
stw %rp, -20(%sp)
+.LCFI20:
copy %r3, %r1
- .cfi_offset 2, -20
- .cfi_register 3, 1
+.LCFI21:
copy %sp, %r3
- .cfi_def_cfa_register 3
+.LCFI22:
stwm %r1, 64(%sp)
- .cfi_offset 3, 0
/* Put arguments onto the stack and call ffi_closure_inner. */
stw %arg0, -36(%r3)
@@ -281,9 +277,9 @@ ffi_closure_pa32:
stw %arg2, -44(%r3)
stw %arg3, -48(%r3)
- /* Closure type 0. */
- copy %r21, %arg0
- copy %r0, %arg2
+ /* Retrieve closure pointer and real gp. */
+ copy %r19, %arg0
+ ldw 8(%r19), %r19
bl ffi_closure_inner_pa32, %r2
copy %r3, %arg1
@@ -295,46 +291,90 @@ ffi_closure_pa32:
.exit
.procend
- .cfi_endproc
-
- /* void ffi_go_closure_pa32(void);
- Called with ffi_go_closure argument in %ret1. */
- .export ffi_go_closure_pa32,code
- .import ffi_closure_inner_pa32,code
- .type ffi_go_closure_pa32, @function
- .cfi_startproc
-ffi_go_closure_pa32:
- .proc
- .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3
- .entry
-
- stw %rp, -20(%sp)
- copy %r3, %r1
- .cfi_offset 2, -20
- .cfi_register 3, 1
- copy %sp, %r3
- .cfi_def_cfa_register 3
- stwm %r1, 64(%sp)
- .cfi_offset 3, 0
-
- /* Put arguments onto the stack and call ffi_closure_inner. */
- stw %arg0, -36(%r3)
- stw %arg1, -40(%r3)
- stw %arg2, -44(%r3)
- stw %arg3, -48(%r3)
-
- /* Closure type 1. */
- copy %ret1, %arg0
- ldi 1, %arg2
- bl ffi_closure_inner_pa32, %r2
- copy %r3, %arg1
+.LFE2:
+
+ .section ".eh_frame",EH_FRAME_FLAGS,@progbits
+.Lframe1:
+ .word .LECIE1-.LSCIE1 ;# Length of Common Information Entry
+.LSCIE1:
+ .word 0x0 ;# CIE Identifier Tag
+ .byte 0x1 ;# CIE Version
+#ifdef __PIC__
+ .ascii "zR\0" ;# CIE Augmentation: 'z' - data, 'R' - DW_EH_PE_... data
+#else
+ .ascii "\0" ;# CIE Augmentation
+#endif
+ .uleb128 0x1 ;# CIE Code Alignment Factor
+ .sleb128 4 ;# CIE Data Alignment Factor
+ .byte 0x2 ;# CIE RA Column
+#ifdef __PIC__
+ .uleb128 0x1 ;# Augmentation size
+ .byte 0x1b ;# FDE Encoding (DW_EH_PE_pcrel|DW_EH_PE_sdata4)
+#endif
+ .byte 0xc ;# DW_CFA_def_cfa
+ .uleb128 0x1e
+ .uleb128 0x0
+ .align 4
+.LECIE1:
+.LSFDE1:
+ .word .LEFDE1-.LASFDE1 ;# FDE Length
+.LASFDE1:
+ .word .LASFDE1-.Lframe1 ;# FDE CIE offset
+#ifdef __PIC__
+ .word .LFB1-. ;# FDE initial location
+#else
+ .word .LFB1 ;# FDE initial location
+#endif
+ .word .LFE1-.LFB1 ;# FDE address range
+#ifdef __PIC__
+ .uleb128 0x0 ;# Augmentation size: no data
+#endif
+ .byte 0x4 ;# DW_CFA_advance_loc4
+ .word .LCFI11-.LFB1
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
+ .uleb128 0x0
+ .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20]
+ .uleb128 0x2
+ .sleb128 -5
+
+ .byte 0x4 ;# DW_CFA_advance_loc4
+ .word .LCFI12-.LCFI11
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
+ .uleb128 0x3
+
+ .byte 0x4 ;# DW_CFA_advance_loc4
+ .word .LCFI13-.LCFI12
+ .byte 0x84 ;# DW_CFA_offset, column 0x4
+ .uleb128 0x3
- ldwm -64(%sp), %r3
- ldw -20(%sp), %rp
- ldw -36(%sp), %ret0
- bv %r0(%r2)
- ldw -40(%sp), %ret1
+ .align 4
+.LEFDE1:
+
+.LSFDE2:
+ .word .LEFDE2-.LASFDE2 ;# FDE Length
+.LASFDE2:
+ .word .LASFDE2-.Lframe1 ;# FDE CIE offset
+#ifdef __PIC__
+ .word .LFB2-. ;# FDE initial location
+#else
+ .word .LFB2 ;# FDE initial location
+#endif
+ .word .LFE2-.LFB2 ;# FDE address range
+#ifdef __PIC__
+ .uleb128 0x0 ;# Augmentation size: no data
+#endif
+ .byte 0x4 ;# DW_CFA_advance_loc4
+ .word .LCFI21-.LFB2
+ .byte 0x83 ;# DW_CFA_offset, column 0x3
+ .uleb128 0x0
+ .byte 0x11 ;# DW_CFA_offset_extended_sf
+ .uleb128 0x2
+ .sleb128 -5
+
+ .byte 0x4 ;# DW_CFA_advance_loc4
+ .word .LCFI22-.LCFI21
+ .byte 0xd ;# DW_CFA_def_cfa_register = r3
+ .uleb128 0x3
- .exit
- .procend
- .cfi_endproc
+ .align 4
+.LEFDE2: