This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: 4.1/4.2 PATCH: Fix building libffi with Solaris 10/x86 as (PR libffi/26048)
- From: Rainer Orth <ro at techfak dot uni-bielefeld dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 8 Dec 2008 18:29:22 +0100 (MET)
- Subject: Re: 4.1/4.2 PATCH: Fix building libffi with Solaris 10/x86 as (PR libffi/26048)
- References: <17386.20904.441118.422094@manam.TechFak.Uni-Bielefeld.DE> <20060208202938.GR24295@devserv.devel.redhat.com>
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 */