This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: Fix PR other/37463 (All Solaris/x86 eh tests fail)
- From: Rainer Orth <ro at techfak dot uni-bielefeld dot de>
- To: Alexandre Oliva <aoliva at redhat dot com>
- Cc: Eric Botcazou <ebotcazou at adacore dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 3 Nov 2008 20:08:39 +0100 (MET)
- Subject: Re: PATCH: Fix PR other/37463 (All Solaris/x86 eh tests fail)
- References: <18667.34451.309776.825356@manam.TechFak.Uni-Bielefeld.DE> <200810091938.23496.ebotcazou@adacore.com> <18671.27097.810911.856479@manam.TechFak.Uni-Bielefeld.DE> <oriqr8y6i9.fsf@oliva.athome.lsd.ic.unicamp.br> <18699.20726.399365.365064@manam.TechFak.Uni-Bielefeld.DE> <orabcky1rb.fsf@oliva.athome.lsd.ic.unicamp.br>
Alexandre Oliva writes:
> > I'll revise the patch accordingly and resubmit once testing completes.
>
> These changes are pre-approved.
Thanks. I've committed the following after two tests: a full bootstrap on
i386-pc-solaris2.10 with gas 2.15 and objdump present (no cfi support since
the old gas doesn't create rw .eh_frame sections) and the configure step on
the same platform with gas 2.19.50, but without any objdump in path (this
gas does create rw .eh_frame sections, but without objdump it cannot be
detected, so no cfi support either).
Rainer
-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University
Thu Oct 2 17:48:04 2008 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
PR other/37463
* configure.ac (gcc_cv_ld_ro_rw_mix): Move before
gcc_cv_as_cfi_directive.
(gcc_cv_as_cfi_directive) [*-*-solaris*]: Check if linker supports
merging read-only and read-write sections or assembler emits
read-write .eh_frame sections.
* configure: Regenerate.
Index: configure.ac
===================================================================
--- configure.ac (revision 141554)
+++ configure.ac (working copy)
@@ -2150,6 +2150,45 @@ if test $gcc_cv_as_hidden = yes && test
[Define if your assembler and linker support .hidden.])
fi
+AC_MSG_CHECKING(linker read-only and read-write section mixing)
+gcc_cv_ld_ro_rw_mix=unknown
+if test $in_tree_ld = yes ; then
+ if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 10 -o "$gcc_cv_gld_major_version" -gt 2 \
+ && test $in_tree_ld_is_elf = yes; then
+ gcc_cv_ld_ro_rw_mix=read-write
+ fi
+elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x -a x$gcc_cv_objdump != x ; then
+ echo '.section myfoosect, "a"' > conftest1.s
+ echo '.section myfoosect, "aw"' > conftest2.s
+ echo '.byte 1' >> conftest2.s
+ echo '.section myfoosect, "a"' > conftest3.s
+ echo '.byte 0' >> conftest3.s
+ if $gcc_cv_as -o conftest1.o conftest1.s > /dev/null 2>&1 \
+ && $gcc_cv_as -o conftest2.o conftest2.s > /dev/null 2>&1 \
+ && $gcc_cv_as -o conftest3.o conftest3.s > /dev/null 2>&1 \
+ && $gcc_cv_ld -shared -o conftest1.so conftest1.o \
+ conftest2.o conftest3.o > /dev/null 2>&1; then
+ gcc_cv_ld_ro_rw_mix=`$gcc_cv_objdump -h conftest1.so \
+ | sed -e '/myfoosect/!d' -e N`
+ if echo "$gcc_cv_ld_ro_rw_mix" | grep CONTENTS > /dev/null; then
+ if echo "$gcc_cv_ld_ro_rw_mix" | grep READONLY > /dev/null; then
+ gcc_cv_ld_ro_rw_mix=read-only
+ else
+ gcc_cv_ld_ro_rw_mix=read-write
+ fi
+ fi
+ fi
+changequote(,)dnl
+ rm -f conftest.* conftest[123].*
+changequote([,])dnl
+fi
+if test x$gcc_cv_ld_ro_rw_mix = xread-write; then
+ AC_DEFINE(HAVE_LD_RO_RW_SECTION_MIXING, 1,
+ [Define if your linker links a mix of read-only
+ and read-write sections into a read-write section.])
+fi
+AC_MSG_RESULT($gcc_cv_ld_ro_rw_mix)
+
# Check if we have .[us]leb128, and support symbol arithmetic with it.
gcc_GAS_CHECK_FEATURE([.sleb128 and .uleb128], gcc_cv_as_leb128,
[elf,2,11,0],,
@@ -2189,7 +2228,32 @@ gcc_GAS_CHECK_FEATURE([cfi directives],
.cfi_same_value 1
.cfi_def_cfa 1, 2
.cfi_escape 1, 2, 3, 4, 5
- .cfi_endproc])
+ .cfi_endproc],
+[case "$target" in
+ *-*-solaris*)
+ # If the linker used on Solaris (like Sun ld) isn't capable of merging
+ # read-only and read-write sections, we need to make sure that the
+ # assembler used emits read-write .eh_frame sections.
+ if test "x$gcc_cv_ld_ro_rw_mix" != xread-write; then
+ if test "x$gcc_cv_objdump" != x; then
+ if $gcc_cv_objdump -h conftest.o 2>/dev/null | \
+ sed -e /.eh_frame/!d -e N | grep READONLY > /dev/null; then
+ gcc_cv_as_cfi_directive=no
+ else
+ gcc_cv_as_cfi_directive=yes
+ fi
+ else
+ # no objdump, err on the side of caution
+ gcc_cv_as_cfi_directive=no
+ fi
+ else
+ gcc_cv_as_cfi_directive=yes
+ fi
+ ;;
+ *-*-*)
+ gcc_cv_as_cfi_directive=yes
+ ;;
+esac])
AC_DEFINE_UNQUOTED(HAVE_GAS_CFI_DIRECTIVE,
[`if test $gcc_cv_as_cfi_directive = yes; then echo 1; else echo 0; fi`],
[Define 0/1 if your assembler supports CFI directives.])
@@ -3218,45 +3282,6 @@ if test "x$gcc_cv_as_line_zero" = xyes;
[Define if the assembler won't complain about a line such as # 0 "" 2.])
fi
-AC_MSG_CHECKING(linker read-only and read-write section mixing)
-gcc_cv_ld_ro_rw_mix=unknown
-if test $in_tree_ld = yes ; then
- if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 10 -o "$gcc_cv_gld_major_version" -gt 2 \
- && test $in_tree_ld_is_elf = yes; then
- gcc_cv_ld_ro_rw_mix=read-write
- fi
-elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x -a x$gcc_cv_objdump != x ; then
- echo '.section myfoosect, "a"' > conftest1.s
- echo '.section myfoosect, "aw"' > conftest2.s
- echo '.byte 1' >> conftest2.s
- echo '.section myfoosect, "a"' > conftest3.s
- echo '.byte 0' >> conftest3.s
- if $gcc_cv_as -o conftest1.o conftest1.s > /dev/null 2>&1 \
- && $gcc_cv_as -o conftest2.o conftest2.s > /dev/null 2>&1 \
- && $gcc_cv_as -o conftest3.o conftest3.s > /dev/null 2>&1 \
- && $gcc_cv_ld -shared -o conftest1.so conftest1.o \
- conftest2.o conftest3.o > /dev/null 2>&1; then
- gcc_cv_ld_ro_rw_mix=`$gcc_cv_objdump -h conftest1.so \
- | sed -e '/myfoosect/!d' -e N`
- if echo "$gcc_cv_ld_ro_rw_mix" | grep CONTENTS > /dev/null; then
- if echo "$gcc_cv_ld_ro_rw_mix" | grep READONLY > /dev/null; then
- gcc_cv_ld_ro_rw_mix=read-only
- else
- gcc_cv_ld_ro_rw_mix=read-write
- fi
- fi
- fi
-changequote(,)dnl
- rm -f conftest.* conftest[123].*
-changequote([,])dnl
-fi
-if test x$gcc_cv_ld_ro_rw_mix = xread-write; then
- AC_DEFINE(HAVE_LD_RO_RW_SECTION_MIXING, 1,
- [Define if your linker links a mix of read-only
- and read-write sections into a read-write section.])
-fi
-AC_MSG_RESULT($gcc_cv_ld_ro_rw_mix)
-
AC_MSG_CHECKING(linker PT_GNU_EH_FRAME support)
gcc_cv_ld_eh_frame_hdr=no
if test $in_tree_ld = yes ; then