sparc: Re-introduce hand-written unwind info
authorRichard Henderson <rth@twiddle.net>
Mon, 26 Jan 2015 20:43:57 +0000 (12:43 -0800)
committerRichard Henderson <rth@twiddle.net>
Wed, 28 Jan 2015 17:41:07 +0000 (09:41 -0800)
Fixes the build with the Solaris assembler.

src/sparc/v8.S
src/sparc/v9.S

index 3f48382..a2e4908 100644 (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
index 05ef54c..55f8f43 100644 (file)
@@ -27,7 +27,6 @@
 #define LIBFFI_ASM     
 #include <fficonfig.h>
 #include <ffi.h>
-#include <ffi_cfi.h>
 #include "internal.h"
 
 #ifdef SPARC64
        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