On Thu, Jul 09, 2015 at 03:57:31PM +0200, Richard Biener wrote: > On Thu, Jul 9, 2015 at 1:08 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > > On Thu, Jul 9, 2015 at 2:54 AM, Richard Biener > > <richard.guent...@gmail.com> wrote: > >> On Thu, Jul 9, 2015 at 11:52 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > >>> On Thu, Jul 09, 2015 at 10:16:38AM +0200, Richard Biener wrote: > >>>> On Wed, Jul 8, 2015 at 5:32 PM, H.J. Lu <hongjiu...@intel.com> wrote: > >>>> > There is no need to try different alignment on variable of > >>>> > error_mark_node. > >>>> > > >>>> > OK for trunk if there is no regression? > >>>> > >>>> Can't we avoid calling align_variable on error_mark_node type decls > >>>> completely? That is, punt earlier when we try to emit it. > >>>> > >>> > >>> How about this? OK for trunk? > >> > >> Heh, you now get the obvious question why we can't simply avoid > >> adding the varpool node in the first place ;) > >> > > > > When it was first added to varpool, its type was OK: > > > > (gdb) bt > > #0 varpool_node::get_create (decl=<var_decl 0x7ffff1506900 vv>) > > at /export/gnu/import/git/sources/gcc/gcc/varpool.c:150 > > #1 0x0000000000e1c3e8 in rest_of_decl_compilation ( > > decl=<var_decl 0x7ffff1506900 vv>, top_level=1, at_end=0) > > at /export/gnu/import/git/sources/gcc/gcc/passes.c:271 > > #2 0x0000000000731d39 in finish_decl (decl=<var_decl 0x7ffff1506900 vv>, > > init_loc=0, init=<tree 0x0>, origtype=<tree 0x0>, asmspec_tree=<tree > > 0x0>) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-decl.c:4863 > > #3 0x000000000078d1ed in c_parser_declaration_or_fndef ( > > parser=0x7ffff15050a8, fndef_ok=false, static_assert_ok=true, > > empty_ok=true, nested=false, start_attr_ok=true, > > objc_foreach_object_declaration=0x0, omp_declare_simd_clauses=...) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1855 > > #4 0x000000000078c234 in c_parser_external_declaration > > (parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1435 > > #5 0x000000000078be45 in c_parser_translation_unit (parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1322 > > #6 0x00000000007b3271 in c_parse_file () > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:15440 > > #7 0x000000000081cb97 in c_common_parse_file () > > at /export/gnu/import/git/sources/gcc/gcc/c-family/c-opts.c:1059 > > #8 0x0000000000f27662 in compile_file () > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:543 > > ---Type <return> to continue, or q <return> to quit--- > > #9 0x0000000000f29baa in do_compile () > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:2041 > > #10 0x0000000000f29df9 in toplev::main (this=0x7fffffffdc90, argc=17, > > argv=0x7fffffffdd98) > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:2142 > > #11 0x00000000017d8228 in main (argc=17, argv=0x7fffffffdd98) > > at /export/gnu/import/git/sources/gcc/gcc/main.c:39 > > > > Later, it was turned into error_mark_node: > > > > Old value = <array_type 0x7ffff15ee150> > > New value = <error_mark 0x7ffff14fac90> > > finish_decl (decl=<var_decl 0x7ffff1506990 a>, init_loc=0, init=<tree 0x0>, > > origtype=<tree 0x0>, asmspec_tree=<tree 0x0>) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-decl.c:4802 > > 4802 if (TREE_USED (type)) > > (gdb) bt > > #0 finish_decl (decl=<var_decl 0x7ffff1506990 a>, init_loc=0, > > init=<tree 0x0>, origtype=<tree 0x0>, asmspec_tree=<tree 0x0>) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-decl.c:4802 > > #1 0x000000000078d1ed in c_parser_declaration_or_fndef ( > > parser=0x7ffff15050a8, fndef_ok=false, static_assert_ok=true, > > empty_ok=true, nested=true, start_attr_ok=true, > > objc_foreach_object_declaration=0x0, omp_declare_simd_clauses=...) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1855 > > #2 0x0000000000792a23 in c_parser_compound_statement_nostart ( > > parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:4621 > > #3 0x0000000000792688 in c_parser_compound_statement > > (parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:4532 > > #4 0x000000000078d5a3 in c_parser_declaration_or_fndef ( > > parser=0x7ffff15050a8, fndef_ok=true, static_assert_ok=true, > > empty_ok=true, nested=false, start_attr_ok=true, > > objc_foreach_object_declaration=0x0, omp_declare_simd_clauses=...) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1965 > > #5 0x000000000078c234 in c_parser_external_declaration > > (parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1435 > > #6 0x000000000078be45 in c_parser_translation_unit (parser=0x7ffff15050a8) > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:1322 > > #7 0x00000000007b3271 in c_parse_file () > > ---Type <return> to continue, or q <return> to quit--- > > at /export/gnu/import/git/sources/gcc/gcc/c/c-parser.c:15440 > > #8 0x000000000081cb97 in c_common_parse_file () > > at /export/gnu/import/git/sources/gcc/gcc/c-family/c-opts.c:1059 > > #9 0x0000000000f27662 in compile_file () > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:543 > > #10 0x0000000000f29baa in do_compile () > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:2041 > > #11 0x0000000000f29df9 in toplev::main (this=0x7fffffffdc90, argc=17, > > argv=0x7fffffffdd98) > > at /export/gnu/import/git/sources/gcc/gcc/toplev.c:2142 > > #12 0x00000000017d8228 in main (argc=17, argv=0x7fffffffdd98) > > at /export/gnu/import/git/sources/gcc/gcc/main.c:39 > > (gdb) > > > > I guess it isn't worth to take it out of varpool. > > > > Is my patch OK for trunk? >
Let me give it another try. > I don't see why the C FE would need to invoke finish_decl twice here. finish_decl is called once on int vv; and the second time on static int a[vv]; which leads to error_mark_node decl. > So I'd rather > have the C frontend not invoke rest_of_decl_compilation on this in the > first place. > > Your patch still feels like a hack in the wrong place. > This patch avoids calling varpool_node::finalize_decl on error_mark_node type decls. Does it make sense? H.J. -- gcc/ PR target/66810 * cgraphbuild.c (pass_build_cgraph_edges::execute): Skip error_mark_node type decls. gcc/testsuite/ PR target/66810 * gcc.target/i386/pr66810.c: New test. --- gcc/cgraphbuild.c | 3 ++- gcc/testsuite/gcc.target/i386/pr66810.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr66810.c diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index 7d2d096..4d679d9 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -381,7 +381,8 @@ pass_build_cgraph_edges::execute (function *fun) FOR_EACH_LOCAL_DECL (fun, ix, decl) if (TREE_CODE (decl) == VAR_DECL && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl)) - && !DECL_HAS_VALUE_EXPR_P (decl)) + && !DECL_HAS_VALUE_EXPR_P (decl) + && TREE_TYPE (decl) != error_mark_node) varpool_node::finalize_decl (decl); record_eh_tables (node, fun); diff --git a/gcc/testsuite/gcc.target/i386/pr66810.c b/gcc/testsuite/gcc.target/i386/pr66810.c new file mode 100644 index 0000000..4778b37 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr66810.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target ia32 } } */ +/* { dg-options "-mno-sse -mno-mmx -miamcu" } */ + +int vv; + +void +i (void) +{ + static int a[vv]; /* { dg-error "storage size" } */ +} -- 2.4.3