From 365dad197bac5deec9244fd9c189d23c46c99b31 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 4 Sep 2019 23:13:54 -0700 Subject: [PATCH] =?UTF-8?q?Use=20plain=20=E2=80=98static=E2=80=99=20for=20?= =?UTF-8?q?Emacs=20C=20inline=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This improved performance of ‘make compile-always’ by 8.2% on my platform (AMD Phenom II X4 910e, Fedora 30 x86-64). * src/conf_post.h (INLINE, EXTERN_INLINE, INLINE_HEADER_BEGIN) (INLINE_HEADER_END) [!EMACS_EXTERN_INLINE]: Use plain ‘static’. --- src/conf_post.h | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/conf_post.h b/src/conf_post.h index 4af1ba9331..43f98620a4 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -373,8 +373,13 @@ #define ATTRIBUTE_MALLOC_SIZE(args) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE (args) #undef noinline #endif -/* Use Gnulib's extern-inline module for extern inline functions. - An include file foo.h should prepend FOO_INLINE to function +/* INLINE marks functions defined in Emacs-internal C headers. + INLINE is implemented via C99-style 'extern inline' if Emacs is built + with -DEMACS_EXTERN_INLINE; otherwise it is implemented via 'static'. + EMACS_EXTERN_INLINE is no longer the default, as 'static' seems to + have better performance with GCC. + + An include file foo.h should prepend INLINE to function definitions, with the following overall pattern: [#include any other .h files first.] @@ -399,20 +404,40 @@ #define ATTRIBUTE_MALLOC_SIZE(args) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE (args) For Emacs, this is done by having emacs.c first '#define INLINE EXTERN_INLINE' and then include every .h file that uses INLINE. - The INLINE_HEADER_BEGIN and INLINE_HEADER_END suppress bogus - warnings in some GCC versions; see ../m4/extern-inline.m4. + The INLINE_HEADER_BEGIN and INLINE_HEADER_END macros suppress bogus + warnings in some GCC versions; see ../m4/extern-inline.m4. */ + +#ifdef EMACS_EXTERN_INLINE + +/* Use Gnulib's extern-inline module for extern inline functions. C99 compilers compile functions like 'incr' as C99-style extern inline functions. Buggy GCC implementations do something similar with GNU-specific keywords. Buggy non-GCC compilers use static functions, which bloats the code but is good enough. */ -#ifndef INLINE -# define INLINE _GL_INLINE +# ifndef INLINE +# define INLINE _GL_INLINE +# endif +# define EXTERN_INLINE _GL_EXTERN_INLINE +# define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN +# define INLINE_HEADER_END _GL_INLINE_HEADER_END + +#else + +/* Use 'static' instead of 'extern inline' because 'static' typically + has better performance for Emacs. Do not use the 'inline' keyword, + as modern compilers inline automatically. ATTRIBUTE_UNUSED + pacifies gcc -Wunused-function. */ + +# ifndef INLINE +# define INLINE EXTERN_INLINE +# endif +# define EXTERN_INLINE static ATTRIBUTE_UNUSED +# define INLINE_HEADER_BEGIN +# define INLINE_HEADER_END + #endif -#define EXTERN_INLINE _GL_EXTERN_INLINE -#define INLINE_HEADER_BEGIN _GL_INLINE_HEADER_BEGIN -#define INLINE_HEADER_END _GL_INLINE_HEADER_END /* 'int x UNINIT;' is equivalent to 'int x;', except it cajoles GCC into not warning incorrectly about use of an uninitialized variable. */ -- 2.17.1