summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>2012-02-20 11:47:25 +0000
committerro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>2012-02-20 11:47:25 +0000
commit1c6e4ce9d88b644e398b2f4337195cd497841a04 (patch)
treea77f9137c76c7d39fcac1110b79efb90d3a95ab7 /gcc
parenteeff6a54fe4eef656054dfb2053e1d4b006720ac (diff)
downloadppe42-gcc-1c6e4ce9d88b644e398b2f4337195cd497841a04.tar.gz
ppe42-gcc-1c6e4ce9d88b644e398b2f4337195cd497841a04.zip
Enable initfini array support on Solaris (PR target/50166)
* acinclude.m4 (gcc_AC_INITFINI_ARRAY): Require gcc_SUN_LD_VERSION. Define _start. Remove -e 0 from $gcc_cv_ld invocation. Only use __GLIBC_PREREQ if defined. Enable on Solaris since Solaris 8 patch. (gcc_SUN_LD_VERSION): New macro. * configure.ac (ld_ver) <*-*-solaris2*>: Refer to gcc_SUN_LD_VERSION for version number format. * configure: Regenerate. * varasm.c (get_elf_initfini_array_priority_section): Set SECTION_NOTYPE for non-default priority. Use get_section instead of get_unnamed_section to emit .init_array/.fini_array with default priority. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184390 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/acinclude.m479
-rwxr-xr-xgcc/configure69
-rw-r--r--gcc/configure.ac12
-rw-r--r--gcc/varasm.c10
5 files changed, 155 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 07635dfbe79..ee4560ae3d0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2012-02-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ PR target/50166
+ * acinclude.m4 (gcc_AC_INITFINI_ARRAY): Require gcc_SUN_LD_VERSION.
+ Define _start.
+ Remove -e 0 from $gcc_cv_ld invocation.
+ Only use __GLIBC_PREREQ if defined.
+ Enable on Solaris since Solaris 8 patch.
+ (gcc_SUN_LD_VERSION): New macro.
+ * configure.ac (ld_ver) <*-*-solaris2*>: Refer to
+ gcc_SUN_LD_VERSION for version number format.
+ * configure: Regenerate.
+ * varasm.c (get_elf_initfini_array_priority_section): Set
+ SECTION_NOTYPE for non-default priority.
+ Use get_section instead of get_unnamed_section to emit
+ .init_array/.fini_array with default priority.
+
2012-02-19 Richard Sandiford <rdsandiford@googlemail.com>
* config/mips/mips.c (mips_need_mips16_rdhwr_p): New variable.
diff --git a/gcc/acinclude.m4 b/gcc/acinclude.m4
index 933f81167c6..0c6170ca143 100644
--- a/gcc/acinclude.m4
+++ b/gcc/acinclude.m4
@@ -1,4 +1,5 @@
-dnl Copyright (C) 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc.
+dnl Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012
+dnl Free Software Foundation, Inc.
dnl
dnl This file is part of GCC.
dnl
@@ -370,7 +371,8 @@ fi
fi])
AC_DEFUN([gcc_AC_INITFINI_ARRAY],
-[AC_ARG_ENABLE(initfini-array,
+[AC_REQUIRE([gcc_SUN_LD_VERSION])dnl
+AC_ARG_ENABLE(initfini-array,
[ --enable-initfini-array use .init_array/.fini_array sections],
[], [
AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support,
@@ -427,9 +429,11 @@ int (*fp) (void) __attribute__ ((section (".init_array"))) = foo;
.balign 4
.byte 'H', 'H', 'H', 'H'
.text
+.globl _start
+_start:
EOF
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \
- && $gcc_cv_ld -e 0 -o conftest conftest.o > /dev/null 2>&1 \
+ && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \
&& $gcc_cv_objdump -s -j .init_array conftest \
| grep HHHHFFFFDDDDBBBB > /dev/null 2>&1 \
&& $gcc_cv_objdump -s -j .fini_array conftest \
@@ -442,14 +446,38 @@ changequote([,])dnl
fi
AC_PREPROC_IFELSE([AC_LANG_SOURCE([
#ifndef __ELF__
-#error Not an ELF OS
+# error Not an ELF OS
#endif
#include <stdlib.h>
-#if defined __GLIBC_PREREQ && __GLIBC_PREREQ (2, 4)
+#if defined __GLIBC_PREREQ
+# if __GLIBC_PREREQ (2, 4)
+# else
+# error GLIBC 2.4 required
+# endif
#else
-#error The C library not known to support .init_array/.fini_array
+# if defined __sun__ && defined __svr4__
+ /* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */
+# else
+# error The C library not known to support .init_array/.fini_array
+# endif
#endif
-])],, [gcc_cv_initfini_array=no]);;
+])],[
+ case "${target}" in
+ *-*-solaris2.8*)
+ # .init_array/.fini_array support was introduced in Solaris 8
+ # patches 109147-08 (sparc) and 109148-08 (x86). Since ld.so.1 and
+ # ld are guaranteed to be updated in lockstep, we can check ld -V
+ # instead. Unfortunately, proper ld version numbers were only
+ # introduced in rev. -14, so we check for that.
+ if test "$gcc_cv_sun_ld_vers_minor" -lt 272; then
+ gcc_cv_initfini_array=no
+ fi
+ ;;
+ *-*-solaris2.9* | *-*-solaris2.1[[0-9]]*)
+ # .init_array/.fini_array support is present since Solaris 9 FCS.
+ ;;
+ esac
+], [gcc_cv_initfini_array=no]);;
esac
else
AC_MSG_CHECKING(cross compile... guessing)
@@ -569,6 +597,43 @@ if test $[$2] = yes; then
$7
fi])])
+dnl gcc_SUN_LD_VERSION
+dnl
+dnl Determines Sun linker version numbers, setting gcc_cv_sun_ld_vers to
+dnl the complete version number and gcc_cv_sun_ld_vers_{major, minor} to
+dnl the corresponding fields.
+dnl
+dnl ld and ld.so.1 are guaranteed to be updated in lockstep, so ld version
+dnl numbers can be used in ld.so.1 feature checks even if a different
+dnl linker is configured.
+dnl
+AC_DEFUN([gcc_SUN_LD_VERSION],
+[changequote(,)dnl
+if test "x${build}" = "x${target}" && test "x${build}" = "x${host}"; then
+ case "${target}" in
+ *-*-solaris2*)
+ #
+ # Solaris 2 ld -V output looks like this for a regular version:
+ #
+ # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
+ #
+ # but test versions add stuff at the end:
+ #
+ # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
+ #
+ gcc_cv_sun_ld_ver=`/usr/ccs/bin/ld -V 2>&1`
+ if echo "$gcc_cv_sun_ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
+ gcc_cv_sun_ld_vers=`echo $gcc_cv_sun_ld_ver | sed -n \
+ -e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'`
+ gcc_cv_sun_ld_vers_major=`expr "$gcc_cv_sun_ld_vers" : '\([0-9]*\)'`
+ gcc_cv_sun_ld_vers_minor=`expr "$gcc_cv_sun_ld_vers" : '[0-9]*\.\([0-9]*\)'`
+ fi
+ ;;
+ esac
+fi
+changequote([,])dnl
+])
+
dnl GCC_TARGET_TEMPLATE(KEY)
dnl ------------------------
dnl Define KEY as a valid configure key on the target machine.
diff --git a/gcc/configure b/gcc/configure
index 15a9ece5e6f..2a84fc37073 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -22214,15 +22214,11 @@ if test $in_tree_ld != yes ; then
else
case "${target}" in
*-*-solaris2*)
+ # See acinclude.m4 (gcc_SUN_LD_VERSION) for the version number
+ # format.
#
- # Solaris 2 ld -V output looks like this for a regular version:
- #
- # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
- #
- # but test versions add stuff at the end:
- #
- # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
- #
+ # Don't reuse gcc_gv_sun_ld_vers_* in case a linker other than
+ # /usr/ccs/bin/ld has been configured.
ld_ver=`$gcc_cv_ld -V 2>&1`
if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
ld_vers=`echo $ld_ver | sed -n \
@@ -22350,6 +22346,29 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_ro_rw_mix" >&5
$as_echo "$gcc_cv_ld_ro_rw_mix" >&6; }
+if test "x${build}" = "x${target}" && test "x${build}" = "x${host}"; then
+ case "${target}" in
+ *-*-solaris2*)
+ #
+ # Solaris 2 ld -V output looks like this for a regular version:
+ #
+ # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
+ #
+ # but test versions add stuff at the end:
+ #
+ # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
+ #
+ gcc_cv_sun_ld_ver=`/usr/ccs/bin/ld -V 2>&1`
+ if echo "$gcc_cv_sun_ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
+ gcc_cv_sun_ld_vers=`echo $gcc_cv_sun_ld_ver | sed -n \
+ -e 's,^.*: 5\.[0-9][0-9]*-\([0-9]\.[0-9][0-9]*\).*$,\1,p'`
+ gcc_cv_sun_ld_vers_major=`expr "$gcc_cv_sun_ld_vers" : '\([0-9]*\)'`
+ gcc_cv_sun_ld_vers_minor=`expr "$gcc_cv_sun_ld_vers" : '[0-9]*\.\([0-9]*\)'`
+ fi
+ ;;
+ esac
+fi
+
# Check whether --enable-initfini-array was given.
if test "${enable_initfini_array+set}" = set; then :
enableval=$enable_initfini_array;
@@ -22425,9 +22444,11 @@ fi
.balign 4
.byte 'H', 'H', 'H', 'H'
.text
+.globl _start
+_start:
EOF
if $gcc_cv_as -o conftest.o conftest.s > /dev/null 2>&1 \
- && $gcc_cv_ld -e 0 -o conftest conftest.o > /dev/null 2>&1 \
+ && $gcc_cv_ld -o conftest conftest.o > /dev/null 2>&1 \
&& $gcc_cv_objdump -s -j .init_array conftest \
| grep HHHHFFFFDDDDBBBB > /dev/null 2>&1 \
&& $gcc_cv_objdump -s -j .fini_array conftest \
@@ -22440,17 +22461,41 @@ EOF
/* end confdefs.h. */
#ifndef __ELF__
-#error Not an ELF OS
+# error Not an ELF OS
#endif
#include <stdlib.h>
-#if defined __GLIBC_PREREQ && __GLIBC_PREREQ (2, 4)
+#if defined __GLIBC_PREREQ
+# if __GLIBC_PREREQ (2, 4)
+# else
+# error GLIBC 2.4 required
+# endif
#else
-#error The C library not known to support .init_array/.fini_array
+# if defined __sun__ && defined __svr4__
+ /* Solaris ld.so.1 supports .init_array/.fini_array since Solaris 8. */
+# else
+# error The C library not known to support .init_array/.fini_array
+# endif
#endif
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
+ case "${target}" in
+ *-*-solaris2.8*)
+ # .init_array/.fini_array support was introduced in Solaris 8
+ # patches 109147-08 (sparc) and 109148-08 (x86). Since ld.so.1 and
+ # ld are guaranteed to be updated in lockstep, we can check ld -V
+ # instead. Unfortunately, proper ld version numbers were only
+ # introduced in rev. -14, so we check for that.
+ if test "$gcc_cv_sun_ld_vers_minor" -lt 272; then
+ gcc_cv_initfini_array=no
+ fi
+ ;;
+ *-*-solaris2.9* | *-*-solaris2.1[0-9]*)
+ # .init_array/.fini_array support is present since Solaris 9 FCS.
+ ;;
+ esac
+
else
gcc_cv_initfini_array=no
fi
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 5d6aa5d3c28..97be57b83e3 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2296,15 +2296,11 @@ if test $in_tree_ld != yes ; then
else
case "${target}" in
*-*-solaris2*)
+ # See acinclude.m4 (gcc_SUN_LD_VERSION) for the version number
+ # format.
#
- # Solaris 2 ld -V output looks like this for a regular version:
- #
- # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1699
- #
- # but test versions add stuff at the end:
- #
- # ld: Software Generation Utilities - Solaris Link Editors: 5.11-1.1701:onnv-ab196087-6931056-03/25/10
- #
+ # Don't reuse gcc_gv_sun_ld_vers_* in case a linker other than
+ # /usr/ccs/bin/ld has been configured.
ld_ver=`$gcc_cv_ld -V 2>&1`
if echo "$ld_ver" | grep 'Solaris Link Editors' > /dev/null; then
ld_vers=`echo $ld_ver | sed -n \
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 86134672cbe..79c81fa7991 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7658,7 +7658,7 @@ get_elf_initfini_array_priority_section (int priority,
sprintf (buf, "%s.%.5u",
constructor_p ? ".init_array" : ".fini_array",
priority);
- sec = get_section (buf, SECTION_WRITE, NULL_TREE);
+ sec = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
}
else
{
@@ -7666,16 +7666,16 @@ get_elf_initfini_array_priority_section (int priority,
{
if (elf_init_array_section == NULL)
elf_init_array_section
- = get_unnamed_section (0, output_section_asm_op,
- "\t.section\t.init_array");
+ = get_section (".init_array",
+ SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
sec = elf_init_array_section;
}
else
{
if (elf_fini_array_section == NULL)
elf_fini_array_section
- = get_unnamed_section (0, output_section_asm_op,
- "\t.section\t.fini_array");
+ = get_section (".fini_array",
+ SECTION_WRITE | SECTION_NOTYPE, NULL_TREE);
sec = elf_fini_array_section;
}
}
OpenPOWER on IntegriCloud