Refine the constraint for isInlineBuiltinDeclaration
authorserge-sans-paille <sguelton@redhat.com>
Tue, 28 Sep 2021 13:54:43 +0000 (15:54 +0200)
committerserge-sans-paille <sguelton@redhat.com>
Tue, 28 Sep 2021 14:07:33 +0000 (16:07 +0200)
Require it to be always_inline, to more closely match how _FORITFY_SOURCE
behaves.

This avoids generation of `.inline` suffixed functions - these should always be
inlined.

clang/lib/AST/Decl.cpp
clang/test/CodeGen/memcpy-nobuiltin.inc

index 835e28c..60ca863 100644 (file)
@@ -3176,7 +3176,8 @@ bool FunctionDecl::isInlineBuiltinDeclaration() const {
     return false;
 
   const FunctionDecl *Definition;
-  return hasBody(Definition) && Definition->isInlineSpecified();
+  return hasBody(Definition) && Definition->isInlineSpecified() &&
+         Definition->hasAttr<AlwaysInlineAttr>();
 }
 
 bool FunctionDecl::isDestroyingOperatorDelete() const {
index 25eab0a..d1d034c 100644 (file)
@@ -2,7 +2,7 @@
 extern void *memcpy(void *dest, void const *from, size_t n);
 
 #ifdef WITH_DECL
-inline void *memcpy(void *dest, void const *from, size_t n) {
+inline __attribute__((always_inline)) void *memcpy(void *dest, void const *from, size_t n) {
   char const *ifrom = from;
   char *idest = dest;
   while (n--)
@@ -11,7 +11,7 @@ inline void *memcpy(void *dest, void const *from, size_t n) {
 }
 #endif
 #ifdef WITH_SELF_REFERENCE_DECL
-inline void *memcpy(void *dest, void const *from, size_t n) {
+inline __attribute__((always_inline)) void *memcpy(void *dest, void const *from, size_t n) {
   if (n != 0)
     memcpy(dest, from, n);
   return dest;