diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index 042c10c2943..845fc5cf877 100644 --- a/gcc/d/decl.cc +++ b/gcc/d/decl.cc @@ -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) { diff --git a/gcc/d/toir.cc b/gcc/d/toir.cc index 6aaf10bf4e4..074cde0e0da 100644 --- a/gcc/d/toir.cc +++ b/gcc/d/toir.cc @@ -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); }