https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84017

            Bug ID: 84017
           Summary: [6/7/8 regression] Bootstrap failure on Solaris 10/x86
                    with gas/ld
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: bootstrap
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ro at gcc dot gnu.org
                CC: segher at gcc dot gnu.org
  Target Milestone: ---
              Host: i386-pc-solaris2.10
            Target: i386-pc-solaris2.10
             Build: i386-pc-solaris2.10

Starting back in the GCC 6 days, Solaris 10/x86 bootstrap started to FAIL in a
very weird way compiling libgo:

/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
 func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
                                                                ^
/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
/vol/gcc/src/hg/trunk/local/libgo/go/sync/atomic/doc.go:74:64: error: use of
undefined type 'bool'
go1: internal compiler error: in register_builtin_type, at
go/gofrontend/export.cc:483
0x8242a31 Export::register_builtin_type(Gogo*, char const*, Builtin_code)
        /vol/gcc/src/hg/trunk/local/gcc/go/gofrontend/export.cc:483
0x8242b7f Export::register_builtin_types(Gogo*)
        /vol/gcc/src/hg/trunk/local/gcc/go/gofrontend/export.cc:470
0x827c0f6 Gogo::do_exports()
        /vol/gcc/src/hg/trunk/local/gcc/go/gofrontend/gogo.cc:4485
0x8279a41 go_parse_input_files(char const**, unsigned int, bool, bool)
        /vol/gcc/src/hg/trunk/local/gcc/go/gofrontend/go.cc:118
0x8274f92 go_langhook_parse_file
        /vol/gcc/src/hg/trunk/local/gcc/go/go-lang.c:312

The error is obviously completely bogus.  A reghunt identified this patch as
the culprit:

The first bad revision is:
changeset:   22378:b810ecbf30be
user:        segher@138bc75d-0d04-0410-961f-82ee72b054a4
date:        Thu May 07 15:51:01 2015 +0000
summary:     PR middle-end/192

PR middle-end/192
        PR middle-end/54303
        * varasm.c (function_mergeable_rodata_prefix): New function.
        (mergeable_string_section): Use it.
        (mergeable_constant_section): Use it.

gcc/testsuite/
        * gcc.dg/fdata-sections-2.c: New file.

The error vanishes if go1 is rebuilt with -g3 -O0.  It also only happens when
using the gas/ld combo, no problem with as/ld (or gas/gld).

At the same time, many warnings appear during the build like this one:

ld: warning: relocation warning: R_386_GOTOFF: file
/var/gcc/regression/trunk/10-gcc-gas/build/prev-i386-pc-solaris2.10/libstdc++-v3/src/.libs/libstdc++.a(wlocale-inst.o):
section [213].rel.gnu.linkonce.t._ZNSt17moneypunct_bynameIwLb0EEC2EPKcj: symbol
.LC72: relocation against discarded COMDAT section
[136].gnu.linkonce.r._ZSt16__convert_from_vRKPiPciPKcz.str1.1: symbol not
found, relocation ignored

Indeed full support for .gnu.linkonce sections (a non-standard gld extension)
only appeared in Solaris 11.

I've successfully been using this patch
diff --git a/gcc/varasm.c b/gcc/varasm.c
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -789,7 +789,7 @@ static const char *
 function_mergeable_rodata_prefix (void)
 {
   section *s = targetm.asm_out.function_rodata_section
(current_function_decl);
-  if (SECTION_STYLE (s) == SECTION_NAMED)
+  if (SECTION_STYLE (s) == SECTION_NAMED && HAVE_COMDAT_GROUP)
     return s->named.name;
   else
     return targetm.asm_out.mergeable_rodata_prefix;

to avoid the issue, which effectively restores to the situation before the
patch: HAVE_COMDAT_GROUP is 0 on Solaris 10, and 1 on Solaris 11+.  However,
it cannot be right since it is only needed with gas/ld, not with as/ld.

I long meant to investigate further, but neglected to do so,keeping the patch
above local.

When I recently reverted it to check, however, I ran into another (and much
earlier) failure:

/vol/gcc/src/hg/trunk/local/gcc/pretty-print.c:2128: test_pp_format: FAIL:
ASSERT_STREQ (expected, pp_formatted_text (&pp)) expected="-27 12345678"
actual=" 12345678"
cc1: internal compiler error: in fail_formatted, at selftest.c:62
0x900c345 selftest::fail_formatted(selftest::location const&, char const*, ...)
        /vol/gcc/src/hg/trunk/local/gcc/selftest.c:62
0x900c3ab selftest::assert_streq(selftest::location const&, char const*, char
const*, char const*, char const*)
        /vol/gcc/src/hg/trunk/local/gcc/selftest.c:85
0x901ccc6 assert_pp_format_va
        /vol/gcc/src/hg/trunk/local/gcc/pretty-print.c:2039
0x901cd7f assert_pp_format
        /vol/gcc/src/hg/trunk/local/gcc/pretty-print.c:2052
0x901cfec test_pp_format
        /vol/gcc/src/hg/trunk/local/gcc/pretty-print.c:2128
0x901d8d8 selftest::pretty_print_c_tests()
        /vol/gcc/src/hg/trunk/local/gcc/pretty-print.c:2202
0x8fb9df6 selftest::run_tests()
        /vol/gcc/src/hg/trunk/local/gcc/selftest-run-tests.c:66
0x8776ef7 toplev::run_self_tests()
        /vol/gcc/src/hg/trunk/local/gcc/toplev.c:2145

I don't yet understand what's going on here, but finally wanted to get this
into the system.

  Rainer

Reply via email to