+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
$(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) \
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. */
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"
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.
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);
bool called = false;
int new_insns;
+ what->global.inlined = 1;
for (e = what->callers; e; e = e->next_caller)
{
if (e->caller == to)
#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 *);
}
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);
}
/* 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
/* 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