re PR debug/12389 ([testcase needed] ICE in gen_subprogram_die for nested function)

PR debug/12389
	* Makefile.in (dwarf2out.o): Depend on cgraph.h.
	* cgraph.c (cgraph_function_possibly_inlined_p): New function.
	* cgraph.h (cgraph_function_possibly_inlined_p): Declare.
	(cgraph_global_info): Add flag inlined
	* dwarf2out.c (gen_subprogram_die, gen_decl_die): Use
	cgraph_function_possibly_inded_p
	* cgraphunit.c (mark_inline): Set inlined flag.
	* toplev.c (rest_of_decl_compilation): Call outlining_inline_function
	only for possibly inlined functions.
	* c-decl.c (duplicate_decls): Never output abstract DIE representing old
	body of function.

From-SVN: r72795
This commit is contained in:
Jan Hubicka 2003-10-22 13:58:10 +02:00 committed by Jan Hubicka
parent e97c30aaa7
commit 1bb17c2144
8 changed files with 49 additions and 13 deletions

View File

@ -1,3 +1,18 @@
2003-10-22 Jan Hubicka <jh@suse.cz>
PR debug/12389
* Makefile.in (dwarf2out.o): Depend on cgraph.h.
* cgraph.c (cgraph_function_possibly_inlined_p): New function.
* cgraph.h (cgraph_function_possibly_inlined_p): Declare.
(cgraph_global_info): Add flag inlined
* dwarf2out.c (gen_subprogram_die, gen_decl_die): Use
cgraph_function_possibly_inded_p
* cgraphunit.c (mark_inline): Set inlined flag.
* toplev.c (rest_of_decl_compilation): Call outlining_inline_function
only for possibly inlined functions.
* c-decl.c (duplicate_decls): Never output abstract DIE representing old
body of function.
2003-10-22 Andrew Haley <aph@redhat.com>
* varasm.c (output_constructor): Make constructor annotation

View File

@ -1586,7 +1586,7 @@ dwarf2out.o : dwarf2out.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H)
$(RTL_H) dwarf2.h debug.h flags.h insn-config.h reload.h output.h $(DIAGNOSTIC_H) real.h \
hard-reg-set.h $(REGS_H) $(EXPR_H) libfuncs.h toplev.h dwarf2out.h varray.h \
$(GGC_H) except.h dwarf2asm.h $(TM_P_H) langhooks.h $(HASHTAB_H) \
gt-dwarf2out.h $(TARGET_H)
gt-dwarf2out.h $(TARGET_H) cgraph.h
dwarf2asm.o : dwarf2asm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) flags.h $(RTL_H) \
$(TREE_H) output.h dwarf2asm.h $(TM_P_H) $(GGC_H) gt-dwarf2asm.h
vmsdbgout.o : vmsdbgout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \

View File

@ -1406,7 +1406,10 @@ duplicate_decls (tree newdecl, tree olddecl, int different_binding_level,
been written out yet. */
if (new_is_definition && DECL_INITIAL (olddecl))
{
if (TREE_USED (olddecl))
if (TREE_USED (olddecl)
/* In unit-at-a-time mode we never inline re-defined extern
inline functions. */
&& !flag_unit_at_a_time)
(*debug_hooks->outlining_inline_function) (olddecl);
/* The new defn must not be inline. */

View File

@ -531,5 +531,15 @@ cgraph_varpool_assemble_pending_decls (void)
return changed;
}
/* Return true when the DECL can possibly be inlined. */
bool
cgraph_function_possibly_inlined_p (tree decl)
{
if (!flag_unit_at_a_time)
return (DECL_INLINE (decl) && !flag_no_inline);
if (!cgraph_global_info_ready)
abort ();
return cgraph_node (decl)->global.inlined;
}
#include "gt-cgraph.h"

View File

@ -59,6 +59,9 @@ struct cgraph_global_info GTY(())
Once we inline all calls to the function and the function is local,
it is set to false. */
bool will_be_output;
/* Set iff at least one of the caller edges has inline_call flag set. */
bool inlined;
};
/* Information about the function that is propagated by the RTL backend.
@ -168,6 +171,8 @@ void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *);
void cgraph_varpool_finalize_decl (tree);
bool cgraph_varpool_assemble_pending_decls (void);
bool cgraph_function_possibly_inlined_p (tree);
/* In cgraphunit.c */
bool cgraph_assemble_pending_functions (void);
void cgraph_finalize_function (tree, bool);

View File

@ -833,6 +833,7 @@ cgraph_mark_inline (struct cgraph_node *to, struct cgraph_node *what,
bool called = false;
int new_insns;
what->global.inlined = 1;
for (e = what->callers; e; e = e->next_caller)
{
if (e->caller == to)

View File

@ -64,6 +64,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "target.h"
#include "langhooks.h"
#include "hashtab.h"
#include "cgraph.h"
#ifdef DWARF2_DEBUGGING_INFO
static void dwarf2out_source_line (unsigned int, const char *);
@ -10685,20 +10686,20 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
}
else if (DECL_ABSTRACT (decl))
{
if (DECL_INLINE (decl) && !flag_no_inline)
if (DECL_DECLARED_INLINE_P (decl))
{
/* ??? Checking DECL_DEFER_OUTPUT is correct for static
inline functions, but not for extern inline functions.
We can't get this completely correct because information
about whether the function was declared inline is not
saved anywhere. */
if (DECL_DEFER_OUTPUT (decl))
if (cgraph_function_possibly_inlined_p (decl))
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
else
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
}
else
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
{
if (cgraph_function_possibly_inlined_p (decl))
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
else
abort ();
}
equate_decl_number_to_die (decl, subr_die);
}
@ -11800,7 +11801,8 @@ gen_decl_die (tree decl, dw_die_ref context_die)
/* If we're emitting an out-of-line copy of an inline function,
emit info for the abstract instance and set up to refer to it. */
else if (DECL_INLINE (decl) && ! DECL_ABSTRACT (decl)
else if (cgraph_function_possibly_inlined_p (decl)
&& ! DECL_ABSTRACT (decl)
&& ! class_scope_p (context_die)
/* dwarf2out_abstract_function won't emit a die if this is just
a declaration. We must avoid setting DECL_ABSTRACT_ORIGIN in

View File

@ -3177,7 +3177,7 @@ rest_of_compilation (tree decl)
/* We are now committed to emitting code for this function. Do any
preparation, such as emitting abstract debug info for the inline
before it gets mangled by optimization. */
if (DECL_INLINE (decl))
if (cgraph_function_possibly_inlined_p (decl))
(*debug_hooks->outlining_inline_function) (decl);
/* Remove any notes we don't need. That will make iterating