diff mbox

Fix up --enable-initfini-array autodetection in configure (PR bootstrap/50237)

Message ID yddsji9o9e5.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth Feb. 17, 2012, 1:51 p.m. UTC
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:

> Richard Guenther <richard.guenther@gmail.com> writes:
>
>> I'm not sure about the varasm.c change - it's definitely not a no-op
>> (callback will be not set, and the flags will be different).  Certainly
>
> As I've demonstrated in my response to H.J., the effect with gas is none.
>
>> the current code is inconsistent wrt the priority != DEFAULT_INIT_PRIORITY
>> case, not sure why, but you don't make it consistent either because
>> you don't change that case to SECTION_NOTYPE either.  I'd be fine
>
> I didn't find a need for that, but agree that the inconsistency is
> disturbing.  default_section_type_flags suggests that SECTION_NOTYPE
> should be set for .init_array and friends, but it's only used by
> get_named_section.
>
>> with it with both calls using SECTION_NOTYPE, but would like to
>> know what the callback difference is about.
>
> I don't think the callback is needed, which is effectively a
>
> 	printf ("\t.section\t.init_array");
>
> Looking at it, this is e.g. wrong for Sun as on SPARC, which requires
> the section name to be in double quotes.

Here's the revised patch which consistently sets SECTION_NOTYPE.

Bootstrapped without regressions on i386-pc-solaris2.11 with gas/gld and
x86_64-unknown-linux-gnu, ok for mainline?

	Rainer


2012-01-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.

Comments

Richard Biener Feb. 20, 2012, 10:02 a.m. UTC | #1
On Fri, Feb 17, 2012 at 2:51 PM, Rainer Orth
<ro@cebitec.uni-bielefeld.de> wrote:
> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:
>
>> Richard Guenther <richard.guenther@gmail.com> writes:
>>
>>> I'm not sure about the varasm.c change - it's definitely not a no-op
>>> (callback will be not set, and the flags will be different).  Certainly
>>
>> As I've demonstrated in my response to H.J., the effect with gas is none.
>>
>>> the current code is inconsistent wrt the priority != DEFAULT_INIT_PRIORITY
>>> case, not sure why, but you don't make it consistent either because
>>> you don't change that case to SECTION_NOTYPE either.  I'd be fine
>>
>> I didn't find a need for that, but agree that the inconsistency is
>> disturbing.  default_section_type_flags suggests that SECTION_NOTYPE
>> should be set for .init_array and friends, but it's only used by
>> get_named_section.
>>
>>> with it with both calls using SECTION_NOTYPE, but would like to
>>> know what the callback difference is about.
>>
>> I don't think the callback is needed, which is effectively a
>>
>>       printf ("\t.section\t.init_array");
>>
>> Looking at it, this is e.g. wrong for Sun as on SPARC, which requires
>> the section name to be in double quotes.
>
> Here's the revised patch which consistently sets SECTION_NOTYPE.
>
> Bootstrapped without regressions on i386-pc-solaris2.11 with gas/gld and
> x86_64-unknown-linux-gnu, ok for mainline?

Ok.

Thanks,
Richard.

>        Rainer
>
>
> 2012-01-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.
>
>
>
>
> --
> -----------------------------------------------------------------------------
> Rainer Orth, Center for Biotechnology, Bielefeld University
>
diff mbox

Patch

# HG changeset patch
# Parent 4dc36b1ff03f2d688613f3edbf1d0724079888d3
Enable initfini array support on Solaris

diff --git a/gcc/acinclude.m4 b/gcc/acinclude.m4
--- 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
 .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.ac b/gcc/configure.ac
--- 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
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7661,7 +7661,7 @@  get_elf_initfini_array_priority_section 
       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
     {
@@ -7669,16 +7669,16 @@  get_elf_initfini_array_priority_section 
 	{
 	  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;
 	}
     }