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