From 95c755e90f94c5fbeed8cf58896d114989f9c771 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Wed, 14 Jan 2004 23:54:50 +0100 Subject: [PATCH] cgraph.c (create_edge): Use local.redefined_extern_inline. * cgraph.c (create_edge): Use local.redefined_extern_inline. * cgraph.h (cgraph_local_info): Sort fields by size; add redefined_extern_inline (cgraph_global_info): Sort fields by size. (cgraph_node): Likewise. * cgraphunit.c (cgraph_finalize_function): Se local.redefined_extern_inline on redefinition. (cgraph_analyze_function): Use it; fix formating. From-SVN: r75890 --- gcc/ChangeLog | 11 +++++++++++ gcc/cgraph.c | 3 +++ gcc/cgraph.h | 24 ++++++++++++++---------- gcc/cgraphunit.c | 12 ++++++++++-- 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00062dee787..29bcb0631d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-01-14 Jan Hubicka + + * cgraph.c (create_edge): Use local.redefined_extern_inline. + * cgraph.h (cgraph_local_info): Sort fields by size; add + redefined_extern_inline + (cgraph_global_info): Sort fields by size. + (cgraph_node): Likewise. + * cgraphunit.c (cgraph_finalize_function): Se + local.redefined_extern_inline on redefinition. + (cgraph_analyze_function): Use it; fix formating. + 2004-01-14 Jan Hubicka PR c++/10776 diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 73a420e6e7c..ec3bcca34e7 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -159,6 +159,9 @@ create_edge (struct cgraph_node *caller, struct cgraph_node *callee) if (!DECL_SAVED_TREE (callee->decl)) edge->inline_failed = N_("function body not available"); + else if (callee->local.redefined_extern_inline) + edge->inline_failed = N_("redefined extern inline functions are not " + "considered for inlining"); else if (callee->local.inlinable) edge->inline_failed = N_("function not considered for inlining"); else diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 5cf31d7afae..ee4372ee91b 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -27,6 +27,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA struct cgraph_local_info GTY(()) { + /* Size of the function before inlining. */ + int self_insns; + /* Set when function function is visible in current compilation unit only and it's address is never taken. */ bool local; @@ -37,8 +40,9 @@ struct cgraph_local_info GTY(()) bool inlinable; /* True when function should be inlined independently on it's size. */ bool disregard_inline_limits; - /* Size of the function before inlining. */ - int self_insns; + /* True when the function has been originally extern inline, but it is + redefined now. */ + bool redefined_extern_inline; }; /* Information about the function that needs to be computed globally @@ -46,15 +50,15 @@ struct cgraph_local_info GTY(()) struct cgraph_global_info GTY(()) { - /* Set when the function will be inlined exactly once. */ - bool inline_once; - /* Estimated size of the function after inlining. */ int insns; /* Number of times given function will be cloned during output. */ int cloned_times; + /* Set when the function will be inlined exactly once. */ + bool inline_once; + /* Set to true for all reachable functions before inlining is decided. Once we inline all calls to the function and the function is local, it is set to false. */ @@ -93,10 +97,13 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) struct cgraph_node *next_nested; /* Pointer to the next function in cgraph_nodes_queue. */ struct cgraph_node *next_needed; - /* Unique id of the node. */ - int uid; PTR GTY ((skip (""))) aux; + struct cgraph_local_info local; + struct cgraph_global_info global; + struct cgraph_rtl_info rtl; + /* Unique id of the node. */ + int uid; /* Set when function must be output - it is externally visible or it's address is taken. */ bool needed; @@ -108,9 +115,6 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) bool analyzed; /* Set when function is scheduled to be assembled. */ bool output; - struct cgraph_local_info local; - struct cgraph_global_info global; - struct cgraph_rtl_info rtl; }; struct cgraph_edge GTY(()) diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index e26a2c1730e..27e4d8d8d7c 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -184,6 +184,7 @@ cgraph_finalize_function (tree decl, bool nested) memset (&node->global, 0, sizeof (node->global)); memset (&node->rtl, 0, sizeof (node->rtl)); node->analyzed = false; + node->local.redefined_extern_inline = true; while (node->callees) cgraph_remove_edge (node, node->callees->callee); @@ -330,8 +331,15 @@ cgraph_analyze_function (struct cgraph_node *node) = (*lang_hooks.tree_inlining.disregard_inline_limits) (decl); for (e = node->callers; e; e = e->next_caller) if (e->inline_failed) - e->inline_failed = (!node->local.inlinable ? N_("function not inlinable") - : N_("function not considered for inlining")); + { + if (node->local.redefined_extern_inline) + e->inline_failed = N_("redefined extern inline functions are not " + "considered for inlining"); + else if (!node->local.inlinable) + e->inline_failed = N_("function not inlinable"); + else + e->inline_failed = N_("function not considered for inlining"); + } if (flag_really_no_inline && !node->local.disregard_inline_limits) node->local.inlinable = 0; /* Inlining characteristics are maintained by the cgraph_mark_inline. */ -- 2.30.2