Commit 67e3020b by Iain Buclaw

d: Recognize pragma(inline) in the code generator.

Pragma inline affects whether functions are inlined or not.  If at the
declaration level, it affects the functions declared in the block it
controls.  If inside a function, it affects the function it is enclosed
by.  Support has been in the front-end for some time, but the
information was not leveraged by the code generation pass.

gcc/d/ChangeLog:

	* decl.cc (get_symbol_decl): Set DECL_DECLARED_INLINE_P or
	DECL_UNINLINABLE for declarations with pragma(inline).
	* toir.cc (IRVisitor::visit (GccAsmStatement *)): Set ASM_INLINE_P if
	in function decorated with pragma(inline).
parent 50929dd3
......@@ -1277,6 +1277,13 @@ get_symbol_decl (Declaration *decl)
DECL_NO_INLINE_WARNING_P (decl->csym) = 1;
}
/* In [pragma/inline], functions decorated with 'pragma(inline)' affects
whether they are inlined or not. */
if (fd->inlining == PINLINEalways)
DECL_DECLARED_INLINE_P (decl->csym) = 1;
else if (fd->inlining == PINLINEnever)
DECL_UNINLINABLE (decl->csym) = 1;
/* Function was declared 'naked'. */
if (fd->naked)
{
......
......@@ -1423,7 +1423,8 @@ public:
outputs, inputs, clobbers, labels);
SET_EXPR_LOCATION (exp, make_location_t (s->loc));
/* If the extended syntax was not used, mark the ASM_EXPR. */
/* If the extended syntax was not used, mark the ASM_EXPR as being an
ASM_INPUT expression instead of an ASM_OPERAND with no operands. */
if (s->args == NULL && s->clobbers == NULL)
ASM_INPUT_P (exp) = 1;
......@@ -1431,6 +1432,11 @@ public:
optimization, this could be unset when building in release mode. */
ASM_VOLATILE_P (exp) = 1;
/* If the function has been annotated with 'pragma(inline)', then mark
the asm expression as being inline as well. */
if (this->func_->inlining == PINLINEalways)
ASM_INLINE_P (exp) = 1;
add_stmt (exp);
}
......
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