sparc: Re-introduce hand-written unwind info
Fixes the build with the Solaris assembler.
This commit is contained in:
102
src/sparc/v8.S
102
src/sparc/v8.S
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user