This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 4.1/4.2 PATCH: Fix building libffi with Solaris 10/x86 as (PR libffi/26048)


Jakub Jelinek writes:

[resuming a 2+ year old thread:

	http://gcc.gnu.org/ml/gcc-patches/2006-02/msg00702.html

> On Wed, Feb 08, 2006 at 09:16:40PM +0100, Rainer Orth wrote:
> >  
> >  	.align	4
> > @@ -288,10 +299,12 @@ ffi_closure_raw_SYSV:
> >  	.long	.LEFDE1-.LASFDE1	/* FDE Length */
> >  .LASFDE1:
> >  	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
> > -#ifdef __PIC__
> > -	.long	.LFB1-.	/* FDE initial location */
> > +#if defined __PIC__ && defined HAVE_AS_X86_PCREL
> > +	.long	.LFB1-.		/* FDE initial location */
> > +#elif defined __PIC__
> > +	.long	.LFB1@GOTOFF	/* FDE initial location */
> >  #else
> > -	.long	.LFB1	/* FDE initial location */
> > +	.long	.LFB1		/* FDE initial location */
> >  #endif
> >  	.long	.LFE1-.LFB1	/* FDE address range */
> >  #ifdef __PIC__
> ...
> 
> This is insufficient.  You also need to say what encoding you are
> using.  Currently the CIE has:
> #ifdef __PIC__
>         .byte   0x1     /* .uleb128 0x1; Augmentation size */
>         .byte   0x1b    /* FDE Encoding (pcrel sdata4) */
> #endif
> 
> so for defined __PIC__ && !defined HAVE_AS_X86_PCREL you need
> to change the encoding to:
> 
> #ifdef __PIC__
>         .byte   0x1     /* .uleb128 0x1; Augmentation size */
> #ifdef HAVE_AS_X86_PCREL
>         .byte   0x1b    /* FDE Encoding (pcrel sdata4) */
> #else
> 	.byte	0x30	/* FDE Encoding (datarel) */
> #endif
> #endif
> 
> or so.

When I reported the problems with Sun as not being able to handle
SYMBOL-. to Sun, I learned that Sun as has a different syntax to achieve
the same result:

	SYMBOL@rel (resp. SYMBOL@rel64 in the 64-bit case)

I used the oldest Solaris/x86 assembler available to me to verify this:

% as -V
as: Forte Developer 7 Compiler Common 7.0 IA32-iteam 2001/12/12
Usage: as-7.0 [-V] [-Q{y,n}] [-s]
          [-S[aAbBcClL]] [-K {pic,PIC}] [-o objfile] [-L] [-T]
          [-P [[-Ipath] [-Dname] [-Dname=def] [-Uname]]...]
          [-m [-Ym,path]] [-n] [-xF] [-F] [-b] [-i] file.s ...
% cat rel-as32.s
        .data
L:
        .long   0
        .text
        .long   L@rel
% as -o rel-as32.o rel-as32.s
% elfdump -r rel-as32.o

Relocation Section:  .rel.text
    type                       offset             section        symbol
  R_386_PC32                        0             .rel.text      L

The following patch uses this and allows libffi (both 32 and 64 bit) to be
build on Solaris10/x86 with Sun as.  I'll submit a separate patch to
support Sun as for 64-bit Solaris 10/x86 shortly.

There was one other change necessary to x86/unix64.S:

* As is already the case in x86/sysv.S, .Lstore_table and .Lload_table need
  to be moved to text section to avoid an error about subtracting symbols
  from different sections.

With this patch, the libffi testsuite shows no regressions relative to a
build with gas.

Ok for mainline?

	Rainer

-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University


Wed Feb  8 20:50:29 2006  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>

	PR libffi/26048
	* configure.ac (HAVE_AS_X86_PCREL): New test.
	* configure: Regenerate.
	* fficonfig.h.in: Regenerate.
	* src/x86/sysv.S [!FFI_NO_RAW_API]: Precalculate
	RAW_CLOSURE_CIF_OFFSET, RAW_CLOSURE_FUN_OFFSET,
	RAW_CLOSURE_USER_DATA_OFFSET for the Solaris 10/x86 assembler.
	(.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL.
	* src/x86/unix64.S (.Lstore_table): Move to .text section.
	(.Lload_table): Likewise.
	(.eh_frame): Only use SYMBOL-. iff HAVE_AS_X86_PCREL.

Index: configure.ac
===================================================================
--- configure.ac	(revision 142371)
+++ configure.ac	(working copy)
@@ -240,6 +240,21 @@ if test x$TARGET = xSPARC; then
     fi
 fi
 
+if test x$TARGET = xX86 || test x$TARGET = xX86_64; then
+    AC_CACHE_CHECK([assembler supports pc related relocs],
+	libffi_cv_as_x86_pcrel, [
+	libffi_cv_as_x86_pcrel=yes
+	echo '.text; foo: nop; .data; .long foo-.; .text' > conftest.s
+	if $CC $CFLAGS -c conftest.s 2>&1 | grep -i warning > /dev/null; then
+	    libffi_cv_as_x86_pcrel=no
+	fi
+	])
+    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
+	AC_DEFINE(HAVE_AS_X86_PCREL, 1,
+		  [Define if your assembler supports PC relative relocs.])
+    fi
+fi
+
 AC_CACHE_CHECK([whether .eh_frame section should be read-only],
     libffi_cv_ro_eh_frame, [
 	libffi_cv_ro_eh_frame=no
Index: src/x86/sysv.S
===================================================================
--- src/x86/sysv.S	(revision 142371)
+++ src/x86/sysv.S	(working copy)
@@ -1,5 +1,6 @@
 /* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005  Red Hat, Inc.
+   sysv.S - Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005, 2008
+   Red Hat, Inc.
    
    X86 Foreign Function Interface 
 
@@ -241,9 +242,20 @@ ffi_closure_SYSV:
 
 #if !FFI_NO_RAW_API
 
+/* Precalculate for e.g. the Solaris 10/x86 assembler.  */
+#if FFI_TRAMPOLINE_SIZE == 10
+#define RAW_CLOSURE_CIF_OFFSET 12
+#define RAW_CLOSURE_FUN_OFFSET 16
+#define RAW_CLOSURE_USER_DATA_OFFSET 20
+#elif FFI_TRAMPOLINE_SIZE == 24
+#define RAW_CLOSURE_CIF_OFFSET 24
+#define RAW_CLOSURE_FUN_OFFSET 28
+#define RAW_CLOSURE_USER_DATA_OFFSET 32
+#else
 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
+#endif
 #define CIF_FLAGS_OFFSET 20
 
 	.align	4
@@ -342,10 +354,12 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE1-.LASFDE1	/* FDE Length */
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB1-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB1@rel
 #else
-	.long	.LFB1	/* FDE initial location */
+	.long	.LFB1
 #endif
 	.long	.LFE1-.LFB1	/* FDE address range */
 #ifdef __PIC__
@@ -367,8 +381,10 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE2-.LASFDE2	/* FDE Length */
 .LASFDE2:
 	.long	.LASFDE2-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB2-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB2@rel
 #else
 	.long	.LFB2
 #endif
@@ -401,8 +417,10 @@ ffi_closure_raw_SYSV:
 	.long	.LEFDE3-.LASFDE3	/* FDE Length */
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
-#ifdef __PIC__
+#if defined __PIC__ && defined HAVE_AS_X86_PCREL
 	.long	.LFB3-.	/* FDE initial location */
+#elif defined __PIC__
+	.long	.LFB3@rel
 #else
 	.long	.LFB3
 #endif
Index: src/x86/unix64.S
===================================================================
--- src/x86/unix64.S	(revision 142371)
+++ src/x86/unix64.S	(working copy)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------
-   unix64.S - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
+   unix64.S - Copyright (c) 2002, 2008  Bo Thorsen <bo@suse.de>
 
    x86-64 Foreign Function Interface 
 
@@ -87,7 +87,6 @@ ffi_call_unix64:
 	addq	%r11, %r10
 	jmp	*%r10
 
-	.section .rodata
 .Lstore_table:
 	.long	.Lst_void-.Lstore_table		/* FFI_TYPE_VOID */
 	.long	.Lst_sint32-.Lstore_table	/* FFI_TYPE_INT */
@@ -105,7 +104,6 @@ ffi_call_unix64:
 	.long	.Lst_struct-.Lstore_table	/* FFI_TYPE_STRUCT */
 	.long	.Lst_int64-.Lstore_table	/* FFI_TYPE_POINTER */
 
-	.text
 	.align 2
 .Lst_void:
 	ret
@@ -238,7 +236,6 @@ ffi_closure_unix64:
 	addq	%r11, %r10
 	jmp	*%r10
 
-	.section .rodata
 .Lload_table:
 	.long	.Lld_void-.Lload_table		/* FFI_TYPE_VOID */
 	.long	.Lld_int32-.Lload_table		/* FFI_TYPE_INT */
@@ -256,7 +253,6 @@ ffi_closure_unix64:
 	.long	.Lld_struct-.Lload_table	/* FFI_TYPE_STRUCT */
 	.long	.Lld_int64-.Lload_table		/* FFI_TYPE_POINTER */
 
-	.text
 	.align 2
 .Lld_void:
 	ret
@@ -349,7 +345,11 @@ ffi_closure_unix64:
 	.long	.LEFDE1-.LASFDE1	/* FDE Length */
 .LASFDE1:
 	.long	.LASFDE1-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
 	.long	.LUW0-.			/* FDE initial location */
+#else
+	.long	.LUW0@rel
+#endif
 	.long	.LUW4-.LUW0		/* FDE address range */
 	.uleb128 0x0			/* Augmentation size */
 
@@ -387,7 +387,11 @@ ffi_closure_unix64:
 	.long	.LEFDE3-.LASFDE3	/* FDE Length */
 .LASFDE3:
 	.long	.LASFDE3-.Lframe1	/* FDE CIE offset */
+#if HAVE_AS_X86_PCREL
 	.long	.LUW5-.			/* FDE initial location */
+#else
+	.long	.LUW5@rel
+#endif
 	.long	.LUW9-.LUW5		/* FDE address range */
 	.uleb128 0x0			/* Augmentation size */
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]