------- Additional Comments From aoliva at gcc dot gnu dot org 2005-03-31 20:47 ------- Subject: [PR debug/19345] remap TYPE_STUB_DECL during inlining
TYPE_STUB_DECL was NULL in the testcase given in the bug report because tree inlining failed to remap TYPE_STUB_DECL. This patch reverts the patch that hides the problem, that AFAICT was checked in by accident, and installs a proper (IMHO :-) fix. Bootstrapping on amd64-linux-gnu. Ok to install if it passes regtesting? Index: gcc/ChangeLog from Alexandre Oliva <[EMAIL PROTECTED]> PR debug/19345 * dwarf2out.c (add_abstract_origin_attribute): Revert accidental? check in from 2005-03-03 for debug/20253. * tree-inline.c (remap_type): Remap TYPE_STUB_DECL. (remap_decl): Insert type decl in map earlier. Index: gcc/dwarf2out.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v retrieving revision 1.576 diff -u -p -r1.576 dwarf2out.c --- gcc/dwarf2out.c 30 Mar 2005 23:08:17 -0000 1.576 +++ gcc/dwarf2out.c 31 Mar 2005 20:43:20 -0000 @@ -10465,11 +10465,7 @@ add_abstract_origin_attribute (dw_die_re if (TYPE_P (fn)) fn = TYPE_STUB_DECL (fn); - /* TYPE_STUB_DECL may have given us a NULL, which decl_function_context - won't like. */ - if (fn) - fn = decl_function_context (fn); - + fn = decl_function_context (fn); if (fn) dwarf2out_abstract_function (fn); } Index: gcc/tree-inline.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v retrieving revision 1.175 diff -u -p -r1.175 tree-inline.c --- gcc/tree-inline.c 30 Mar 2005 21:34:27 -0000 1.175 +++ gcc/tree-inline.c 31 Mar 2005 20:43:22 -0000 @@ -172,6 +172,11 @@ remap_decl (tree decl, inline_data *id) /* Make a copy of the variable or label. */ tree t = copy_decl_for_inlining (decl, fn, VARRAY_TREE (id->fns, 0)); + /* Remember it, so that if we encounter this local entity again + we can reuse this copy. Do this early becuase remap_type may + need this decl for TYPE_STUB_DECL. */ + insert_decl_map (id, decl, t); + /* Remap types, if necessary. */ TREE_TYPE (t) = remap_type (TREE_TYPE (t), id); if (TREE_CODE (t) == TYPE_DECL) @@ -214,9 +219,6 @@ remap_decl (tree decl, inline_data *id) } #endif - /* Remember it, so that if we encounter this local entity - again we can reuse this copy. */ - insert_decl_map (id, decl, t); return t; } @@ -285,6 +287,9 @@ remap_type (tree type, inline_data *id) TYPE_NEXT_VARIANT (new) = NULL; } + if (TYPE_STUB_DECL (type)) + TYPE_STUB_DECL (new) = remap_decl (TYPE_STUB_DECL (type), id); + /* Lazily create pointer and reference types. */ TYPE_POINTER_TO (new) = NULL; TYPE_REFERENCE_TO (new) = NULL; Index: gcc/testsuite/ChangeLog from Daniel Berlin <[EMAIL PROTECTED]> * gcc.dg/pr19345.c: New test. Index: gcc/testsuite/gcc.dg/pr19345.c =================================================================== RCS file: gcc/testsuite/gcc.dg/pr19345.c diff -N gcc/testsuite/gcc.dg/pr19345.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gcc/testsuite/gcc.dg/pr19345.c 31 Mar 2005 20:43:37 -0000 @@ -0,0 +1,12 @@ +/* We shouldn't crash trying to produce the inlined structure type die debug info. */ +/* { dg-do compile } */ +/* { dg-options "-O1 -g" } */ +inline void bar(char a[], unsigned int l) +{ + asm volatile ("" :: "m" ( *(struct {char x[l]; } *)a)); +} + +void foo(void) +{ + bar (0, 0); +} -- Alexandre Oliva http://www.ic.unicamp.br/~oliva/ Red Hat Compiler Engineer [EMAIL PROTECTED], gcc.gnu.org} Free Software Evangelist [EMAIL PROTECTED], gnu.org} -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19345