d: Recognize pragma(inline) in the code generator.
authorIain Buclaw <ibuclaw@gdcproject.org>
Mon, 30 Mar 2020 22:19:18 +0000 (00:19 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sun, 26 Apr 2020 07:50:46 +0000 (09:50 +0200)
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).

gcc/d/decl.cc
gcc/d/toir.cc

index 042c10c2943128e3f9f6e854350692a7b123618f..845fc5cf877a98f604449d4d130f04e22876c005 100644 (file)
@@ -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)
        {
index 6aaf10bf4e4b599539b10befa174dcaf771d5ea4..074cde0e0da7a50b1cc01c226ef8b7b0401b1dcd 100644 (file)
@@ -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);
   }