sparc: Re-introduce hand-written unwind info

Fixes the build with the Solaris assembler.
This commit is contained in:
Richard Henderson
2015-01-26 12:43:57 -08:00
parent 31a6185307
commit 2104b2a4fc
2 changed files with 159 additions and 40 deletions

View File

@@ -28,7 +28,6 @@
#define LIBFFI_ASM
#include <fficonfig.h>
#include <ffi.h>
#include <ffi_cfi.h>
#include "internal.h"
#ifndef SPARC64
@@ -52,7 +51,6 @@
FFI_HIDDEN(C(ffi_flush_icache))
C(ffi_flush_icache):
cfi_startproc
1: iflush %o0
iflush %o+8
nop
@@ -62,7 +60,6 @@ C(ffi_flush_icache):
nop
retl
nop
cfi_endproc
.size C(ffi_flush_icache), . - C(ffi_flush_icache)
#endif
@@ -78,13 +75,10 @@ C(ffi_flush_icache):
FFI_HIDDEN(C(ffi_call_v8))
C(ffi_call_v8):
cfi_startproc
.LUW0:
! Allocate a stack frame sized by ffi_call.
save %sp, %o4, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW1:
mov %i0, %o0 ! copy cif
add %sp, 64+32, %o1 ! load args area
mov %i2, %o2 ! copy rvalue
@@ -233,7 +227,7 @@ E(SPARC_RET_F_1)
rept256; rept256; rept256; rept256
rept256; rept256; rept256; rept256
cfi_endproc
.LUW2:
.size C(ffi_call_v8),. - C(ffi_call_v8)
@@ -255,17 +249,14 @@ E(SPARC_RET_F_1)
FFI_HIDDEN(C(ffi_go_closure_v8))
C(ffi_go_closure_v8):
cfi_startproc
.LUW3:
save %sp, -STACKFRAME, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW4:
ld [%g2+4], %o0 ! load cif
ld [%g2+8], %o1 ! load fun
b 0f
mov %g2, %o2 ! load user_data
cfi_endproc
.LUW5:
.size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8)
.align 8
@@ -274,12 +265,9 @@ C(ffi_go_closure_v8):
FFI_HIDDEN(C(ffi_closure_v8))
C(ffi_closure_v8):
cfi_startproc
.LUW6:
save %sp, -STACKFRAME, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW7:
ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif
ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun
ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data
@@ -375,8 +363,80 @@ E(SPARC_RET_F_1)
ret
restore
cfi_endproc
.LUW8:
.size C(ffi_closure_v8), . - C(ffi_closure_v8)
#ifdef HAVE_RO_EH_FRAME
.section ".eh_frame",#alloc
#else
.section ".eh_frame",#alloc,#write
#endif
#ifdef HAVE_AS_SPARC_UA_PCREL
# define FDE_ADDR(X) %r_disp32(X)
#else
# define FDE_ADDR(X) X
#endif
.align 4
.LCIE:
.long .LECIE - .LSCIE ! CIE Length
.LSCIE:
.long 0 ! CIE Identifier Tag
.byte 1 ! CIE Version
.ascii "zR\0" ! CIE Augmentation
.byte 4 ! CIE Code Alignment Factor
.byte 0x7c ! CIE Data Alignment Factor
.byte 15 ! CIE RA Column
.byte 1 ! Augmentation size
#ifdef HAVE_AS_SPARC_UA_PCREL
.byte 0x1b ! FDE Encoding (pcrel sdata4)
#else
.byte 0x50 ! FDE Encoding (aligned absolute)
#endif
.byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0
.align 4
.LECIE:
.long .LEFDE1 - .LSFDE1 ! FDE Length
.LSFDE1:
.long .LSFDE1 - .LCIE ! FDE CIE offset
.long FDE_ADDR(.LUW0) ! Initial location
.long .LUW2 - .LUW0 ! Address range
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 4
.LEFDE1:
.long .LEFDE2 - .LSFDE2 ! FDE Length
.LSFDE2:
.long .LSFDE2 - .LCIE ! FDE CIE offset
.long FDE_ADDR(.LUW3) ! Initial location
.long .LUW5 - .LUW3 ! Address range
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 4
.LEFDE2:
.long .LEFDE3 - .LSFDE3 ! FDE Length
.LSFDE3:
.long .LSFDE3 - .LCIE ! FDE CIE offset
.long FDE_ADDR(.LUW6) ! Initial location
.long .LUW8 - .LUW6 ! Address range
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 4
.LEFDE3:
#endif /* !SPARC64 */
#if defined __ELF__ && defined __linux__
.section .note.GNU-stack,"",@progbits

View File

@@ -27,7 +27,6 @@
#define LIBFFI_ASM
#include <fficonfig.h>
#include <ffi.h>
#include <ffi_cfi.h>
#include "internal.h"
#ifdef SPARC64
@@ -57,12 +56,9 @@
FFI_HIDDEN(C(ffi_call_v9))
C(ffi_call_v9):
cfi_startproc
.LUW0:
save %sp, %o4, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW1:
mov %i0, %o0 ! copy cif
add %sp, STACK_BIAS+128+48, %o1 ! load args area
mov %i2, %o2 ! copy rvalue
@@ -199,7 +195,7 @@ E(SPARC_RET_F_1)
return %i7+8
nop
cfi_endproc
.LUW2:
.size C(ffi_call_v9), . - C(ffi_call_v9)
@@ -219,18 +215,15 @@ E(SPARC_RET_F_1)
FFI_HIDDEN(C(ffi_go_closure_v9))
C(ffi_go_closure_v9):
cfi_startproc
.LUW3:
save %sp, -STACKFRAME, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW4:
ldx [%g5+8], %o0
ldx [%g5+16], %o1
b 0f
mov %g5, %o2
cfi_endproc
.LUW5:
.size C(ffi_go_closure_v9), . - C(ffi_go_closure_v9)
.align 8
@@ -239,12 +232,9 @@ C(ffi_go_closure_v9):
FFI_HIDDEN(C(ffi_closure_v9))
C(ffi_closure_v9):
cfi_startproc
.LUW6:
save %sp, -STACKFRAME, %sp
cfi_def_cfa_register(%fp)
cfi_window_save
cfi_register(%o7, %i7)
.LUW7:
ldx [%g1+FFI_TRAMPOLINE_SIZE], %o0
ldx [%g1+FFI_TRAMPOLINE_SIZE+8], %o1
ldx [%g1+FFI_TRAMPOLINE_SIZE+16], %o2
@@ -373,8 +363,77 @@ E(SPARC_RET_F_1)
return %i7+8
nop
cfi_endproc
.LUW8:
.size C(ffi_closure_v9), . - C(ffi_closure_v9)
#ifdef HAVE_RO_EH_FRAME
.section ".eh_frame",#alloc
#else
.section ".eh_frame",#alloc,#write
#endif
#ifdef HAVE_AS_SPARC_UA_PCREL
# define FDE_RANGE(B, E) .long %r_disp32(B), E - B
#else
# define FDE_RANGE(B, E) .align 8; .xword B, E - B
#endif
.align 8
.LCIE:
.long .LECIE - .LSCIE ! CIE Length
.LSCIE:
.long 0 ! CIE Identifier Tag
.byte 1 ! CIE Version
.ascii "zR\0" ! CIE Augmentation
.byte 4 ! CIE Code Alignment Factor
.byte 0x78 ! CIE Data Alignment Factor
.byte 15 ! CIE RA Column
.byte 1 ! Augmentation size
#ifdef HAVE_AS_SPARC_UA_PCREL
.byte 0x1b ! FDE Encoding (pcrel sdata4)
#else
.byte 0x50 ! FDE Encoding (aligned absolute)
#endif
.byte 0xc, 14, 0xff, 0xf ! DW_CFA_def_cfa, %o6, offset 0x7ff
.align 8
.LECIE:
.long .LEFDE1 - .LSFDE1 ! FDE Length
.LSFDE1:
.long .LSFDE1 - .LCIE ! FDE CIE offset
FDE_RANGE(.LUW0, .LUW2)
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 8
.LEFDE1:
.long .LEFDE2 - .LSFDE2 ! FDE Length
.LSFDE2:
.long .LSFDE2 - .LCIE ! FDE CIE offset
FDE_RANGE(.LUW3, .LUW5)
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 8
.LEFDE2:
.long .LEFDE3 - .LSFDE3 ! FDE Length
.LSFDE3:
.long .LSFDE3 - .LCIE ! FDE CIE offset
FDE_RANGE(.LUW6, .LUW8)
.byte 0 ! Augmentation size
.byte 0x40+1 ! DW_CFA_advance_loc 4
.byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6
.byte 0x2d ! DW_CFA_GNU_window_save
.byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7
.align 8
.LEFDE3:
#endif /* SPARC64 */
#ifdef __linux__
.section .note.GNU-stack,"",@progbits