https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91767
Bug ID: 91767
Summary: After r274953, clang-compiled xgcc segfaults during
RTL pass: stv
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: bootstrap
Assignee: unassigned at gcc dot gnu.org
Reporter: dimitry at andric dot com
Target Milestone: ---
As reported in https://bugs.freebsd.org/240387, after the gcc10-devel port was
updated from the 20190825 snapshot to the 20190901 snapshot, bootstrapping
started to fail due to a segfault, when the host compiler is clang 8.0.
Bisecting showed that the segfaults start appearing after r274953.
The error appears for different source files, when building libgcc with xgcc,
but it always looks like:
during RTL pass: stv
/home/dim/src/gcc/libgcc/config/libbid/bid128_fma.c: In function
'bid128_ext_fma':
/home/dim/src/gcc/libgcc/config/libbid/bid128_fma.c:3569:1: internal compiler
error: Segmentation fault
3569 | }
| ^
Running under valgrind shows:
==19771== Invalid read of size 1
==19771== at 0x82D7DC: gen_rtx_SUBREG(machine_mode, rtx_def*, poly_int<1u,
unsigned long>) (src/gcc/gcc/emit-rtl.c:1013)
==19771== by 0xFFE42E: make_vector_copies
(src/gcc/gcc/config/i386/i386-features.c:716)
==19771== by 0xFFE42E: (anonymous
namespace)::general_scalar_chain::convert_registers()
(src/gcc/gcc/config/i386/i386-features.c:1173)
==19771== by 0xFFC3B8: convert
(src/gcc/gcc/config/i386/i386-features.c:1192)
==19771== by 0xFFC3B8: convert_scalars_to_vector
(src/gcc/gcc/config/i386/i386-features.c:1629)
==19771== by 0xFFC3B8: (anonymous namespace)::pass_stv::execute(function*)
(src/gcc/gcc/config/i386/i386-features.c:1767)
==19771== by 0xB3463D: execute_one_pass(opt_pass*)
(src/gcc/gcc/passes.c:2494)
==19771== by 0xB35047: execute_pass_list_1(opt_pass*)
(src/gcc/gcc/passes.c:2580)
==19771== by 0xB35059: execute_pass_list_1(opt_pass*)
(src/gcc/gcc/passes.c:2581)
==19771== by 0xB27164: execute_pass_list(function*, opt_pass*)
(src/gcc/gcc/passes.c:2591)
==19771== by 0x768E5A: cgraph_node::expand() (src/gcc/gcc/cgraphunit.c:2194)
==19771== by 0x76C4DD: expand_all_functions (src/gcc/gcc/cgraphunit.c:2332)
==19771== by 0x76C4DD: symbol_table::compile()
(src/gcc/gcc/cgraphunit.c:2688)
==19771== by 0x76CA4F: symbol_table::finalize_compilation_unit()
(src/gcc/gcc/cgraphunit.c:2868)
==19771== by 0xC150F3: compile_file() (src/gcc/gcc/toplev.c:481)
==19771== by 0xC14BCE: do_compile (src/gcc/gcc/toplev.c:2166)
==19771== by 0xC14BCE: toplev::main(int, char**) (src/gcc/gcc/toplev.c:2301)
==19771== Address 0x2 is not stack'd, malloc'd or (recently) free'd
==19771==
Unfortunately this does not give much more information than simply running
under gdb. It looks like an entry in a hash map is searched for, but
unexpectedly returns NULL. This NULL value is then passed as a rtx_def pointer
to gen_rtx_SUBREG(), which attempts to access one of the struct elements, and
this causes the segfault.