Commit bef8491a by Sriraman Tallam Committed by Sriraman Tallam

Emit errors when always_inline functions cannot be inlined in -O0 mode.

	* tree-inline.c (expand_call_inline): Allow the error to be flagged
	in early inline pass.
	* ipa-inline.c (inline_always_inline_functions): Pretend always_inline
	functions are inlined during failures to flag an error.
	* gcc.target/i386/inline_error.c: New test.
	* gcc.c-torture/compile/pr44043.c: Fix test to expect an error.
	* gcc.c-torture/compile/pr43791.c: Fix test to expect an error.

From-SVN: r200179
parent 3dd55b2f
2013-06-18 Sriraman Tallam <tmsriram@google.com>
* ipa-inline.c (inline_always_inline_functions): Pretend always_inline
functions are inlined during failures to flag an error.
* tree-inline.c (expand_call_inline): Allow the error to be flagged
in early inline pass.
2013-06-18 H.J. Lu <hongjiu.lu@intel.com> 2013-06-18 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (initial_ix86_tune_features): Fix a typo * config/i386/i386.c (initial_ix86_tune_features): Fix a typo
......
...@@ -1911,7 +1911,15 @@ inline_always_inline_functions (struct cgraph_node *node) ...@@ -1911,7 +1911,15 @@ inline_always_inline_functions (struct cgraph_node *node)
} }
if (!can_early_inline_edge_p (e)) if (!can_early_inline_edge_p (e))
{
/* Set inlined to true if the callee is marked "always_inline" but
is not inlinable. This will allow flagging an error later in
expand_call_inline in tree-inline.c. */
if (lookup_attribute ("always_inline",
DECL_ATTRIBUTES (callee->symbol.decl)) != NULL)
inlined = true;
continue; continue;
}
if (dump_file) if (dump_file)
fprintf (dump_file, " Inlining %s into %s (always_inline).\n", fprintf (dump_file, " Inlining %s into %s (always_inline).\n",
......
2013-06-18 Sriraman Tallam <tmsriram@google.com>
* gcc.target/i386/inline_error.c: New test.
* gcc.c-torture/compile/pr44043.c: Fix test to expect an error.
* gcc.c-torture/compile/pr43791.c: Fix test to expect an error.
2013-06-18 Paolo Carlini <paolo.carlini@oracle.com> 2013-06-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53211 PR c++/53211
......
...@@ -19,3 +19,4 @@ void trylock(void) { ...@@ -19,3 +19,4 @@ void trylock(void) {
fasttrylock(slowtrylock); fasttrylock(slowtrylock);
} }
/* { dg-prune-output "(inlining failed in call to always_inline.*indirect function call with a yet undetermined callee|called from here)" } */
...@@ -85,3 +85,5 @@ int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ...@@ -85,3 +85,5 @@ int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{ {
raw_send_hdrinc(sk, msg->msg_iov, len, (void *)0, msg->msg_flags); raw_send_hdrinc(sk, msg->msg_iov, len, (void *)0, msg->msg_flags);
} }
/* { dg-prune-output "(inlining failed in call to always_inline.*indirect function call with a yet undetermined callee|called from here)" } */
/* { dg-do compile } */
/* { dg-options "-O0 -mno-popcnt" } */
inline int __attribute__ ((__gnu_inline__, __always_inline__, target("popcnt")))
foo () /* { dg-error "inlining failed in call to always_inline .* target specific option mismatch" } */
{
return 0;
}
int bar()
{
return foo (); /* { dg-error "called from here" } */
}
...@@ -3905,8 +3905,6 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) ...@@ -3905,8 +3905,6 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
for inlining, but we can't do that because frontends overwrite for inlining, but we can't do that because frontends overwrite
the body. */ the body. */
&& !cg_edge->callee->local.redefined_extern_inline && !cg_edge->callee->local.redefined_extern_inline
/* Avoid warnings during early inline pass. */
&& cgraph_global_info_ready
/* PR 20090218-1_0.c. Body can be provided by another module. */ /* PR 20090218-1_0.c. Body can be provided by another module. */
&& (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto)) && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment