Bug 60720 - clisp fails to build with -flto: internal compiler error: tree check: expected array_type, have record_type in array_ref_low_bound, at expr.c:6941
Summary: clisp fails to build with -flto: internal compiler error: tree check: expecte...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: lto (show other bugs)
Version: 4.9.0
: P3 normal
Target Milestone: 4.9.1
Assignee: Richard Biener
URL:
Keywords: lto
Depends on:
Blocks:
 
Reported: 2014-03-31 12:41 UTC by Richard Biener
Modified: 2014-04-23 08:34 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work: 4.10.0, 4.9.1
Known to fail: 4.9.0
Last reconfirmed: 2014-03-31 00:00:00


Attachments
testcase (62.13 KB, application/x-msdownload)
2014-03-31 12:41 UTC, Richard Biener
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2014-03-31 12:41:10 UTC
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
Comment 1 Richard Biener 2014-03-31 12:48:54 UTC
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;
Comment 2 Richard Biener 2014-03-31 13:13:39 UTC
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;
 }
Comment 3 Richard Biener 2014-04-14 08:35:54 UTC
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
Comment 4 Richard Biener 2014-04-14 08:40:32 UTC
Fixed on trunk sofar.
Comment 5 Richard Biener 2014-04-23 08:32:19 UTC
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
Comment 6 Richard Biener 2014-04-23 08:34:08 UTC
Fixed for 4.9.1.
Comment 7 Richard Biener 2014-04-23 08:34:22 UTC
Fixed.