Bug 61997 - cc1plus ICE with aarch64 target using PCH and builtin functions
Summary: cc1plus ICE with aarch64 target using PCH and builtin functions
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 5.0
: P3 major
Target Milestone: 5.0
Assignee: Andrew Pinski
URL:
Keywords: GC, ice-on-valid-code
Depends on:
Blocks: 63820
  Show dependency treegraph
 
Reported: 2014-08-02 15:22 UTC by Robert Morell
Modified: 2021-09-03 07:29 UTC (History)
1 user (show)

See Also:
Host:
Target: aarch64*-*-*
Build:
Known to work:
Known to fail: 4.8.2, 4.8.3, 4.9.1, 5.0
Last reconfirmed: 2014-08-02 00:00:00


Attachments
Test case (462 bytes, text/x-csrc)
2014-08-02 15:22 UTC, Robert Morell
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Robert Morell 2014-08-02 15:22:27 UTC
Created attachment 33226 [details]
Test case

This reproduces with at least GCC 4.8.2, 4.8.3, and SVN r213491.  I believe it's present in every version that supports the aarch64 target.

I have been using GCC configured with:
configure --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --target=aarch64-unknown-linux-gnu --enable-languages=c,c++ --enable-threads=posix --enable-shared --disable-libsanitizer --disable-gnu-indirect-function --disable-gnu-unique-object --with-sysroot=/gcc-debug/Linux-aarch64-sysroot --disable-multilib

The simplest reproduction case that I've found is to precompile a header with exactle one line in it, call it precomp.h:
#define CEILF(f) ceilf(f)

Compile the PCH with:
aarch64-unknown-linux-gnu-gcc -nostdinc -march=armv8-a -fPIC -O2 -ftree-vectorize -x c++-header -c precomp.h -o precomp.h.ghc

Then build the attached longish creduce'd test case with:
aarch64-unknown-linux-gnu-gcc -nostdinc -march=armv8-a -fPIC -O2 -ftree-vectorize -x c++ -include precomp.h -Winvalid-pch -c test.c

It fails with SEGV:
test.c: In function ‘void x127()’:
test.c:141:1: internal compiler error: Segmentation fault
 x127 ()
 ^
0x899d958 crash_signal
	/gcc-debug/gcc-svn/gcc/toplev.c:337
0x81bbd62 contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*)
	/gcc-debug/gcc-svn/gcc/tree.h:2841
0x87208ca gimple_build_call_1
	/gcc-debug/gcc-svn/gcc/gimple.c:216
0x872093d gimple_build_call_vec(tree_node*, vec<tree_node*, va_heap, vl_ptr>)
	/gcc-debug/gcc-svn/gcc/gimple.c:230
0x8bd85e0 vectorizable_call
	/gcc-debug/gcc-svn/gcc/tree-vect-stmts.c:2470
0x8be7b1f vect_transform_stmt(gimple_statement_base*, gimple_stmt_iterator*, bool*, _slp_tree*, _slp_instance*)
	/gcc-debug/gcc-svn/gcc/tree-vect-stmts.c:7237
0x8bfb143 vect_transform_loop(_loop_vec_info*)
	/gcc-debug/gcc-svn/gcc/tree-vect-loop.c:6079
0x8c0e4f1 vectorize_loops()
	/gcc-debug/gcc-svn/gcc/tree-vectorizer.c:478
0x8b1c75c execute
	/gcc-debug/gcc-svn/gcc/tree-ssa-loop.c:232

It looks like the reason for the failure is that the global table aarch64_builtin_decls in aarch64-builtins.c isn't relocated when loading the PCH.  All of the nodes that it points to are freed, and the memory may get reused (or poisoned, if that's enabled).

The table is properly annotated with the GTY macro, but aarch64-builtins.c isn't in GTFILES so it's not processed by the type generator.

If I manually add aarch64-builtins.c to target_gtfiles (and include the resulting gt-aarch64-builtins.h at the bottom of the C file) then this problem goes away.
Comment 1 Andrew Pinski 2014-08-02 18:33:44 UTC
Confirmed.
Comment 2 Andrew Pinski 2014-08-02 18:34:07 UTC
Also happens with a aarch64-elf gcc.
Comment 3 Andrew Pinski 2014-08-02 18:38:52 UTC
(In reply to Robert Morell from comment #0) 
> If I manually add aarch64-builtins.c to target_gtfiles (and include the
> resulting gt-aarch64-builtins.h at the bottom of the C file) then this
> problem goes away.

That is the correct fix.  I am testing this fix then and will be applying to the trunk as obvious after I test it.
Comment 4 James Greenhalgh 2014-11-03 12:00:57 UTC
Did the fix for this make it to trunk?
Comment 5 Andrew Pinski 2014-11-11 23:40:27 UTC
Fixed.
Comment 6 Andrew Pinski 2014-11-11 23:40:36 UTC
Author: pinskia
Date: Tue Nov 11 23:40:03 2014
New Revision: 217394

URL: https://gcc.gnu.org/viewcvs?rev=217394&root=gcc&view=rev
Log:
2014-11-11  Andrew Pinski  <apinski@cavium.com>

        Bug target/61997
        * config.gcc (aarch64*-*-*): Set target_gtfiles to include
        aarch64-builtins.c.
        * config/aarch64/aarch64-builtins.c: Include gt-aarch64-builtins.h
        at the end of the file.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config.gcc
    trunk/gcc/config/aarch64/aarch64-builtins.c
Comment 7 Yvan Roux 2015-01-13 08:53:27 UTC
Author: yroux
Date: Tue Jan 13 08:52:55 2015
New Revision: 219522

URL: https://gcc.gnu.org/viewcvs?rev=219522&root=gcc&view=rev
Log:
2015-01-13  Michael Collison  <michael.collison@linaro.org>

	Backport from trunk r217394.
	2014-11-11  Andrew Pinski  <apinski@cavium.com>

	Bug target/61997
	* config.gcc (aarch64*-*-*): Set target_gtfiles to include
	aarch64-builtins.c.
	* config/aarch64/aarch64-builtins.c: Include gt-aarch64-builtins.h
	at the end of the file.


Modified:
    branches/linaro/gcc-4_9-branch/gcc/ChangeLog.linaro
    branches/linaro/gcc-4_9-branch/gcc/config.gcc
    branches/linaro/gcc-4_9-branch/gcc/config/aarch64/aarch64-builtins.c