* 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
+2004-01-14 Jan Hubicka <jh@suse.cz>
+
+ * 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 <jh@suse.cz>
PR c++/10776
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
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;
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
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. */
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;
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(())
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);
= (*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. */