libffi: unwind info for sparc
Jeff Sturm
jsturm@one-point.com
Sat Mar 30 05:09:00 GMT 2002
On Fri, 29 Mar 2002, Jakub Jelinek wrote:
> On Fri, Mar 29, 2002 at 09:22:41AM -0500, Jeff Sturm wrote:
> > Needed to throw exceptions through ffi_call frames. Tested on
> > sparc-sun-solaris2.8. OK?
>
> You should probably use PC relative eh_frame (DW_EH_PE_sdata4)
> if assembler supports %r_disp32() so that it doesn't create runtime
> relocations. See what gcc creates with -fPIC.
Here you go. (I don't see how -fPIC improves things; the single
relocation is now aligned at the expense of a slightly larger CIE.
Since Solaris ld.so performs unaligned relocations just fine, that is
arguably a deoptimization.)
Whether or not I could optimize away the relocation by hand, I'm
afraid that is beyond my ability for now.
2002-03-30 Jeff Sturm <jsturm@one-point.com>
* src/sparc/v8.S: Add unwind info.
* src/sparc/v9.S: Likewise.
Index: src/sparc/v8.S
===================================================================
RCS file: /cvs/gcc/gcc/libffi/src/sparc/v8.S,v
retrieving revision 1.3
diff -u -p -r1.3 v8.S
--- v8.S 2001/03/02 22:21:23 1.3
+++ v8.S 2002/03/30 12:38:12
@@ -36,7 +36,9 @@
ffi_call_V8:
_ffi_call_V8:
+.LLFB1:
save %sp, -STACKFRAME, %sp
+.LLCFI0:
sub %sp, %i2, %sp ! alloca() space in stack for frame to set up
add %sp, STACKFRAME, %l0 ! %l0 has start of
@@ -87,7 +89,43 @@ longlong:
st %o1, [%i4+4]
ret
restore
+.LLFE1:
.ffi_call_V8_end:
- .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
+ .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
+ .section ".eh_frame",#alloc,#write
+.LLframe1:
+ .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry
+.LLSCIE1:
+ .uaword 0x0 ! CIE Identifier Tag
+ .byte 0x1 ! CIE Version
+ .ascii "zR\0" ! CIE Augmentation
+ .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor
+ .byte 0x7c ! sleb128 -4; CIE Data Alignment Factor
+ .byte 0xf ! CIE RA Column
+ .byte 0x1 ! uleb128 0x1; Augmentation size
+ .byte 0x50 ! FDE Encoding (aligned absolute)
+ .byte 0xc ! DW_CFA_def_cfa
+ .byte 0xe ! uleb128 0xe
+ .byte 0x0 ! uleb128 0x0
+ .align 4
+.LLECIE1:
+.LLSFDE1:
+ .uaword .LLEFDE1-.LLASFDE1 ! FDE Length
+.LLASFDE1:
+ .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset
+ .align 4
+ .long .LLFB1
+ .uaword .LLFE1-.LLFB1 ! FDE address range
+ .byte 0x0 ! uleb128 0x0; Augmentation size
+ .byte 0x4 ! DW_CFA_advance_loc4
+ .uaword .LLCFI0-.LLFB1
+ .byte 0xd ! DW_CFA_def_cfa_register
+ .byte 0x1e ! uleb128 0x1e
+ .byte 0x2d ! DW_CFA_GNU_window_save
+ .byte 0x9 ! DW_CFA_register
+ .byte 0xf ! uleb128 0xf
+ .byte 0x1f ! uleb128 0x1f
+ .align 4
+.LLEFDE1:
Index: src/sparc/v9.S
===================================================================
RCS file: /cvs/gcc/gcc/libffi/src/sparc/v9.S,v
retrieving revision 1.2
diff -u -p -r1.2 v9.S
--- v9.S 2001/03/02 22:21:23 1.2
+++ v9.S 2002/03/30 12:38:12
@@ -41,7 +41,9 @@
ffi_call_V9:
_ffi_call_V9:
+.LLFB1:
save %sp, -STACKFRAME, %sp
+.LLCFI0:
sub %sp, %i2, %sp ! alloca() space in stack for frame to set up
add %sp, STACKFRAME+STACK_BIAS, %l0 ! %l0 has start of
@@ -118,8 +120,45 @@ dostruct:
std %f6, [%i4+56]
ret
restore
+.LLFE1:
.ffi_call_V9_end:
- .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
+ .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
+
+ .section ".eh_frame",#alloc,#write
+.LLframe1:
+ .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry
+.LLSCIE1:
+ .uaword 0x0 ! CIE Identifier Tag
+ .byte 0x1 ! CIE Version
+ .ascii "zR\0" ! CIE Augmentation
+ .byte 0x1 ! uleb128 0x1; CIE Code Alignment Factor
+ .byte 0x78 ! sleb128 -8; CIE Data Alignment Factor
+ .byte 0xf ! CIE RA Column
+ .byte 0x1 ! uleb128 0x1; Augmentation size
+ .byte 0x50 ! FDE Encoding (aligned absolute)
+ .byte 0xc ! DW_CFA_def_cfa
+ .byte 0xe ! uleb128 0xe
+ .byte 0xff,0xf ! uleb128 0x7ff
+ .align 8
+.LLECIE1:
+.LLSFDE1:
+ .uaword .LLEFDE1-.LLASFDE1 ! FDE Length
+.LLASFDE1:
+ .uaword .LLASFDE1-.LLframe1 ! FDE CIE offset
+ .align 8
+ .xword .LLFB1
+ .uaxword .LLFE1-.LLFB1 ! FDE address range
+ .byte 0x0 ! uleb128 0x0; Augmentation size
+ .byte 0x4 ! DW_CFA_advance_loc4
+ .uaword .LLCFI0-.LLFB1
+ .byte 0xd ! DW_CFA_def_cfa_register
+ .byte 0x1e ! uleb128 0x1e
+ .byte 0x2d ! DW_CFA_GNU_window_save
+ .byte 0x9 ! DW_CFA_register
+ .byte 0xf ! uleb128 0xf
+ .byte 0x1f ! uleb128 0x1f
+ .align 8
+.LLEFDE1:
#endif
More information about the Gcc-patches
mailing list