From 434e6e1484418c55561914600de9e180fc408378 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 23 Jan 2018 23:07:13 -0500 Subject: [PATCH] Improve implementation of pg_attribute_always_inline. Avoid compiler warnings on MSVC (which doesn't want to see both __forceinline and inline) and ancient GCC (which doesn't have __attribute__((always_inline))). Don't force inline-ing when building at -O0, as the programmer is probably hoping for exact source-to-object-line correspondence in that case. (For the moment this only works for GCC; maybe we can extend it later.) Make pg_attribute_always_inline be syntactically a drop-in replacement for inline, rather than an additional wart. And improve the comments. Thomas Munro and Michail Nikolaev, small tweaks by me Discussion: https://postgr.es/m/32278.1514863068@sss.pgh.pa.us Discussion: https://postgr.es/m/CANtu0oiYp74brgntKOxgg1FK5+t8uQ05guSiFU6FYz_5KUhr6Q@mail.gmail.com --- src/backend/executor/nodeHashjoin.c | 3 +-- src/include/c.h | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 8f2b634b124..03d78042fa0 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -161,8 +161,7 @@ static void ExecParallelHashJoinPartitionOuter(HashJoinState *node); * the other one is "outer". * ---------------------------------------------------------------- */ -pg_attribute_always_inline -static inline TupleTableSlot * +static pg_attribute_always_inline TupleTableSlot * ExecHashJoinImpl(PlanState *pstate, bool parallel) { HashJoinState *node = castNode(HashJoinState, pstate); diff --git a/src/include/c.h b/src/include/c.h index 34a7fa67b45..9b7fe87f32b 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -146,14 +146,21 @@ #define pg_attribute_noreturn() #endif -/* GCC, Sunpro and XLC support always_inline via __attribute__ */ -#if defined(__GNUC__) -#define pg_attribute_always_inline __attribute__((always_inline)) -/* msvc via a special keyword */ +/* + * Use "pg_attribute_always_inline" in place of "inline" for functions that + * we wish to force inlining of, even when the compiler's heuristics would + * choose not to. But, if possible, don't force inlining in unoptimized + * debug builds. + */ +#if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) || defined(__IBMC__) +/* GCC > 3, Sunpro and XLC support always_inline via __attribute__ */ +#define pg_attribute_always_inline __attribute__((always_inline)) inline #elif defined(_MSC_VER) +/* MSVC has a special keyword for this */ #define pg_attribute_always_inline __forceinline #else -#define pg_attribute_always_inline +/* Otherwise, the best we can do is to say "inline" */ +#define pg_attribute_always_inline inline #endif /* -- 2.30.2