From: Paul Eggert Date: Thu, 5 Sep 2019 06:13:54 +0000 (-0700) Subject: Use plain ‘static’ for Emacs C inline functions X-Git-Tag: emacs-27.0.90~1553^2~29 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=365dad197bac5deec9244fd9c189d23c46c99b31;p=emacs.git Use plain ‘static’ for Emacs C inline functions 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’. --- diff --git a/src/conf_post.h b/src/conf_post.h index 4af1ba9331f..43f98620a4b 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -373,8 +373,13 @@ extern int emacs_setenv_TZ (char const *); #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 @@ extern int emacs_setenv_TZ (char const *); 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. */