]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libffi/26048 (libffi doesn't build on Solaris 10/x86 with native assembler)
authorRainer Orth <ro@TechFak.Uni-Bielefeld.DE>
Fri, 19 Dec 2008 14:59:42 +0000 (14:59 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Fri, 19 Dec 2008 14:59:42 +0000 (14:59 +0000)
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.

From-SVN: r142835

libffi/ChangeLog
libffi/configure
libffi/configure.ac
libffi/fficonfig.h.in
libffi/src/x86/sysv.S
libffi/src/x86/unix64.S

index 802b88c0f1de57355c45f26cdb1eca0f84b574f3..52ab411bda7eb811bba1ddbba7d63449a4bfadd1 100644 (file)
@@ -1,3 +1,17 @@
+2008-12-18  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.
+
 2008-12-18  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
        * configure: Regenerate.
index aaf3b81e824f5f2134e7749e0ade4ab158f71a82..c40a859ddd59a691352791d860a3c3b810c02c6b 100755 (executable)
@@ -13263,6 +13263,31 @@ _ACEOF
     fi
 fi
 
+if test x$TARGET = xX86 || test x$TARGET = xX86_64; then
+    echo "$as_me:$LINENO: checking assembler supports pc related relocs" >&5
+echo $ECHO_N "checking assembler supports pc related relocs... $ECHO_C" >&6
+if test "${libffi_cv_as_x86_pcrel+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+       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
+
+fi
+echo "$as_me:$LINENO: result: $libffi_cv_as_x86_pcrel" >&5
+echo "${ECHO_T}$libffi_cv_as_x86_pcrel" >&6
+    if test "x$libffi_cv_as_x86_pcrel" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AS_X86_PCREL 1
+_ACEOF
+
+    fi
+fi
+
 echo "$as_me:$LINENO: checking whether .eh_frame section should be read-only" >&5
 echo $ECHO_N "checking whether .eh_frame section should be read-only... $ECHO_C" >&6
 if test "${libffi_cv_ro_eh_frame+set}" = set; then
index b99ebd7db65a4e4c08531aabe15c148c8c6e045f..2dff35c060f137285412af796b9e0d486b8b134e 100644 (file)
@@ -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 e93cf8ae77b1b0e9763d9ad75a05582d6c7d4691..90c8990eb1968b34dc7bf60c717511c5af6d5f4b 100644 (file)
@@ -37,6 +37,9 @@
    */
 #undef HAVE_AS_SPARC_UA_PCREL
 
+/* Define if your assembler supports PC relative relocs. */
+#undef HAVE_AS_X86_PCREL
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
index 4e652207edf58539babd2a473179fc0dde7f75ac..04564db9caafdc1a73a3822ef51c7b8daece35f2 100644 (file)
@@ -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 a33888180bd336ffacc6cc435646711ade9fadd6..ec6030484ea3d7e45f316f40a6026fd1ccea61a9 100644 (file)
@@ -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 */