Created attachment 32496 [details] testcase compile with -flto: > ./xgcc -B. regexi.m.i modules.i -flto modules.h:4:316: warning: type of 'module__regexp__object_tab_initdata' does not match original declaration /home/abuild/rpmbuild/BUILD/clisp-2.49/modules/regexp/regexi.c:59:3: note: previously declared here modules.h:4:254: warning: type of 'module__regexp__subr_tab_initdata' does not match original declaration /home/abuild/rpmbuild/BUILD/clisp-2.49/modules/regexp/regexi.c:173:3: note: previously declared here modules.h:4:154: warning: type of 'module__regexp__object_tab' does not match original declaration /home/abuild/rpmbuild/BUILD/clisp-2.49/modules/regexp/regexi.c:42:3: note: previously declared here modules.h:4:63: warning: type of 'module__regexp__subr_tab' does not match original declaration /home/abuild/rpmbuild/BUILD/clisp-2.49/modules/regexp/regexi.c:153:35: note: previously declared here lto1: internal compiler error: tree check: expected array_type, have record_type in array_ref_low_bound, at expr.c:6941 0xd8ac7f tree_check_failed(tree_node const*, char const*, int, char const*, ...) /space/rguenther/src/svn/trunk/gcc/tree.c:9192 0x60b229 tree_check(tree_node*, char const*, int, char const*, tree_code) /space/rguenther/src/svn/trunk/gcc/tree.h:2713 0x79d6ae array_ref_low_bound(tree_node*) /space/rguenther/src/svn/trunk/gcc/expr.c:6941 0x79cf1e get_inner_reference(tree_node*, long*, long*, tree_node**, machine_mode*, int*, int*, bool) /space/rguenther/src/svn/trunk/gcc/expr.c:6791 0x79fe95 expand_expr_addr_expr_1 /space/rguenther/src/svn/trunk/gcc/expr.c:7689 0x7a0550 expand_expr_addr_expr /space/rguenther/src/svn/trunk/gcc/expr.c:7783 0x7ab686 expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) /space/rguenther/src/svn/trunk/gcc/expr.c:10562 0x7a09ce expand_expr_real(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool) /space/rguenther/src/svn/trunk/gcc/expr.c:7950 0xdbe930 expand_expr /space/rguenther/src/svn/trunk/gcc/expr.h:457 0xdcbeb3 output_constant /space/rguenther/src/svn/trunk/gcc/varasm.c:4706 0xdccd4b output_constructor_regular_field /space/rguenther/src/svn/trunk/gcc/varasm.c:4952 0xdcd711 output_constructor /space/rguenther/src/svn/trunk/gcc/varasm.c:5231 0xdcc3fe output_constant /space/rguenther/src/svn/trunk/gcc/varasm.c:4756 0xdccd4b output_constructor_regular_field /space/rguenther/src/svn/trunk/gcc/varasm.c:4952 0xdcd711 output_constructor /space/rguenther/src/svn/trunk/gcc/varasm.c:5231 0xdcc0d5 output_constant /space/rguenther/src/svn/trunk/gcc/varasm.c:4728 0xdc3b00 assemble_variable_contents /space/rguenther/src/svn/trunk/gcc/varasm.c:1954 0xdc43e9 assemble_variable(tree_node*, int, int, int) /space/rguenther/src/svn/trunk/gcc/varasm.c:2139 0xdd5155 varpool_assemble_decl(varpool_node*) /space/rguenther/src/svn/trunk/gcc/varpool.c:455 0x6cb6fb output_in_order /space/rguenther/src/svn/trunk/gcc/cgraphunit.c:2010 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. lto-wrapper: ./xgcc returned 1 exit status /usr/lib64/gcc/x86_64-suse-linux/4.8/../../../../x86_64-suse-linux/bin/ld: lto-wrapper failed collect2: error: ld returned 1 exit status
It's module_t modules[] = { { "clisp", ... { "regexp", &module__regexp__subr_tab.subrs[0], &module__regexp__subr_tab_size, &module__regexp__object_tab[0], &module__regexp__object_tab_size, 0, &module__regexp__subr_tab_initdata[0], &module__regexp__object_tab_initdata[0], &module__regexp__init_function_1, &module__regexp__init_function_2, &module__regexp__fini_function , ((void *)0) }, ... using &module__regexp__object_tab[0] (an array-ref), and declared as extern gcv_object_t module__regexp__object_tab[]; but defined in the other module as struct module__regexp__object_tab_t { gcv_object_t _object_Kboolean; gcv_object_t _object_Kend; gcv_object_t _object_Kextended; gcv_object_t _object_Kignore_case; gcv_object_t _object_Knewline; gcv_object_t _object_Knosub; gcv_object_t _object_Knotbol; gcv_object_t _object_Knoteol; gcv_object_t _object_Kreturn_type; gcv_object_t _object_Kstart; gcv_object_t _object_regexp__make_match_boa; gcv_object_t _object__23_28_29; } module__regexp__object_tab; thus no array for the actual decl. Reduced testcase: extern int x[]; int *foo[] = { &x[0] }; ---- int x;
We miss to wrap uses of non-automatic vars inside MEM_REFs for global initializers (we do that for the IL already). Doing this raises the question whether we shouldn't simply special-case global var references and stream a type which each reference, materializing a MEM_REF only when necessary (not sure if we know that at the point we are materializing the initializer). Anyway, short-term fix: Index: gcc/lto-streamer-out.c =================================================================== --- gcc/lto-streamer-out.c (revision 208955) +++ gcc/lto-streamer-out.c (working copy) @@ -313,6 +313,27 @@ lto_is_streamable (tree expr) } +/* Wrap symbol references in *TP inside a type-preserving MEM_REF. */ + +static tree +wrap_refs (tree *tp, int *ws, void *) +{ + tree t = *tp; + if (TREE_CODE (t) == VAR_DECL) + { + tree ptrtype = build_pointer_type (TREE_TYPE (t)); + *tp = build2 (MEM_REF, TREE_TYPE (t), + build1 (ADDR_EXPR, ptrtype, t), + build_int_cst (ptrtype, 0)); + *ws = 0; + } + else if (TREE_CODE (t) == CONSTRUCTOR) + ; + else if (!EXPR_P (t)) + *ws = 0; + return NULL_TREE; +} + /* For EXPR lookup and return what we want to stream to OB as DECL_INITIAL. */ static tree @@ -340,6 +361,14 @@ get_symbol_initial_value (struct output_ initial = error_mark_node; } + /* Wrap all symbol references inside the initializer in a MEM_REF + to preserve the type at the use even in case the symbol is + prevailed by one with a different type. We can safely skip this + during WPA. */ + if (!in_lto_p + && initial && initial != error_mark_node) + walk_tree (&initial, wrap_refs, NULL, NULL); + return initial; }
Author: rguenth Date: Mon Apr 14 08:35:22 2014 New Revision: 209359 URL: http://gcc.gnu.org/viewcvs?rev=209359&root=gcc&view=rev Log: 2014-04-14 Richard Biener <rguenther@suse.de> PR lto/60720 * lto-streamer-out.c (wrap_refs): New function. (lto_output): Wrap symbol references in global initializes in type-preserving MEM_REFs. * gcc.dg/lto/pr60720_0.c: New testcase. * gcc.dg/lto/pr60720_1.c: Likewise. Added: trunk/gcc/testsuite/gcc.dg/lto/pr60720_0.c trunk/gcc/testsuite/gcc.dg/lto/pr60720_1.c Modified: trunk/gcc/ChangeLog trunk/gcc/lto-streamer-out.c trunk/gcc/testsuite/ChangeLog
Fixed on trunk sofar.
Author: rguenth Date: Wed Apr 23 08:31:48 2014 New Revision: 209677 URL: http://gcc.gnu.org/viewcvs?rev=209677&root=gcc&view=rev Log: 2014-04-23 Richard Biener <rguenther@suse.de> Backport from mainline 2014-04-14 Richard Biener <rguenther@suse.de> PR lto/60720 * lto-streamer-out.c (wrap_refs): New function. (lto_output): Wrap symbol references in global initializes in type-preserving MEM_REFs. * gcc.dg/lto/pr60720_0.c: New testcase. * gcc.dg/lto/pr60720_1.c: Likewise. Added: branches/gcc-4_9-branch/gcc/testsuite/gcc.dg/lto/pr60720_0.c branches/gcc-4_9-branch/gcc/testsuite/gcc.dg/lto/pr60720_1.c Modified: branches/gcc-4_9-branch/gcc/ChangeLog branches/gcc-4_9-branch/gcc/lto-streamer-out.c branches/gcc-4_9-branch/gcc/testsuite/ChangeLog
Fixed for 4.9.1.
Fixed.