This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] PR 12389
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, rth at redhat dot com
- Date: Sun, 19 Oct 2003 04:03:13 +0200
- Subject: Re: [RFC] PR 12389
- References: <20031019014616.GP6212@kam.mff.cuni.cz>
> Hi,
> PR 12389 has testcase that dies in dwarf2out because we inline function
> that is not DECL_INLINE because it is called once in unit-at-a-time.
> I am not quite sure how to deal with this. Accepting current scheme, we
> probably should mark all functions DECL_INLINE but I don't see anything
> good in it.
>
> Why do we need knowing whether function is inlined in dwarf2out at first
> place? In the case it is just optimization of dwarf output, perhaps I
> shall make dwarf2out to check out whether some of call edges has inline
> flag? Or is the patch bellow to imply DECL_INLINE for dwarf2out fine?
OK, this implements the idea of deciding whether function actually got
inlined. I guess other debug formats needs similar update. I would
like to do that by followup patch.
Honza
2003-10-19 Jan Hubicka <jh@suse.cz>
* 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.
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Makefile.in,v
retrieving revision 1.1174
diff -c -3 -p -r1.1174 Makefile.in
*** Makefile.in 18 Oct 2003 05:23:22 -0000 1.1174
--- Makefile.in 19 Oct 2003 01:59:40 -0000
*************** dwarf2out.o : dwarf2out.c $(CONFIG_H) $(
*** 1583,1589 ****
$(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)
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) \
--- 1583,1589 ----
$(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) 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) \
Index: cgraph.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraph.c,v
retrieving revision 1.32
diff -c -3 -p -r1.32 cgraph.c
*** cgraph.c 2 Oct 2003 15:11:40 -0000 1.32
--- cgraph.c 19 Oct 2003 01:59:40 -0000
*************** cgraph_varpool_assemble_pending_decls (v
*** 531,535 ****
--- 531,545 ----
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);
+ if (!cgraph_global_info_ready)
+ abort ();
+ return cgraph_node (decl)->global.inlined;
+ }
#include "gt-cgraph.h"
Index: cgraph.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraph.h,v
retrieving revision 1.22
diff -c -3 -p -r1.22 cgraph.h
*** cgraph.h 25 Sep 2003 18:11:18 -0000 1.22
--- cgraph.h 19 Oct 2003 01:59:40 -0000
*************** struct cgraph_global_info GTY(())
*** 59,64 ****
--- 59,67 ----
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.
*************** struct cgraph_varpool_node *cgraph_varpo
*** 167,172 ****
--- 170,177 ----
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);
Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
retrieving revision 1.457
diff -c -3 -p -r1.457 dwarf2out.c
*** dwarf2out.c 6 Oct 2003 22:25:15 -0000 1.457
--- dwarf2out.c 19 Oct 2003 01:59:41 -0000
*************** Software Foundation, 59 Temple Place - S
*** 64,69 ****
--- 64,70 ----
#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 *);
*************** gen_subprogram_die (tree decl, dw_die_re
*** 10685,10691 ****
}
else if (DECL_ABSTRACT (decl))
{
! if (DECL_INLINE (decl) && !flag_no_inline)
{
/* ??? Checking DECL_DEFER_OUTPUT is correct for static
inline functions, but not for extern inline functions.
--- 10686,10692 ----
}
else if (DECL_ABSTRACT (decl))
{
! if (cgraph_function_possibly_inlined_p (decl))
{
/* ??? Checking DECL_DEFER_OUTPUT is correct for static
inline functions, but not for extern inline functions.
*************** gen_decl_die (tree decl, dw_die_ref cont
*** 11800,11806 ****
/* 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)
&& ! 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
--- 11801,11807 ----
/* 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 (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
Index: cgraphunit.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cgraphunit.c,v
retrieving revision 1.35
diff -c -3 -p -r1.35 cgraphunit.c
*** cgraphunit.c 12 Oct 2003 09:06:26 -0000 1.35
--- cgraphunit.c 19 Oct 2003 02:01:20 -0000
*************** cgraph_mark_inline (struct cgraph_node *
*** 829,834 ****
--- 833,839 ----
bool called = false;
int new_insns;
+ what->global.inlined = 1;
for (e = what->callers; e; e = e->next_caller)
{
if (e->caller == to)