From 2104b2a4fc923b8d82647c3fbbd8a8ca20bb24c8 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 26 Jan 2015 12:43:57 -0800 Subject: [PATCH] sparc: Re-introduce hand-written unwind info Fixes the build with the Solaris assembler. --- src/sparc/v8.S | 102 +++++++++++++++++++++++++++++++++++++++---------- src/sparc/v9.S | 97 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 159 insertions(+), 40 deletions(-) diff --git a/src/sparc/v8.S b/src/sparc/v8.S index 3f483826..a2e4908f 100644 --- a/src/sparc/v8.S +++ b/src/sparc/v8.S @@ -28,7 +28,6 @@ #define LIBFFI_ASM #include #include -#include #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 diff --git a/src/sparc/v9.S b/src/sparc/v9.S index 05ef54c3..55f8f432 100644 --- a/src/sparc/v9.S +++ b/src/sparc/v9.S @@ -27,7 +27,6 @@ #define LIBFFI_ASM #include #include -#include #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