diff options
author | Kang-Che Sung <explorer09@gmail.com> | 2017-01-05 04:25:03 +0300 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-01-09 20:52:32 +0300 |
commit | f10f7a21d40d5ce0846414973e88602a59d4580e (patch) | |
tree | 5175d6320513012ed73c1836a78440f086205b03 | |
parent | 61a91af63dbc91f85058efda5c542dfc859ab1be (diff) |
Allow FAST_FUNC to be overridden at build time
Busybox uses FAST_FUNC macro to tweak with IA-32 calling conventions in
order to make the function call slightly smaller or slightly faster.
However, when I experiment with GCC's LTO (Link Time Optimization), I
discovered that FAST_FUNC could hinder LTO's optimization so that the
resulting executable become a few bytes larger (than what is compiled
without FAST_FUNC).
This change allows to specify e.g.
CONFIG_EXTRA_CFLAGS="-DFAST_FUNC= -flto"
and compile with LTO without a source code hack.
Signed-off-by: Kang-Che Sung <explorer09@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | include/platform.h | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/include/platform.h b/include/platform.h index c987d418c..6c7d03dc7 100644 --- a/include/platform.h +++ b/include/platform.h @@ -108,13 +108,18 @@ * and/or smaller by using modified ABI. It is usually only needed * on non-static, busybox internal functions. Recent versions of gcc * optimize statics automatically. FAST_FUNC on static is required - * only if you need to match a function pointer's type */ -#if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */ + * only if you need to match a function pointer's type. + * FAST_FUNC may not work well with -flto so allow user to disable this. + * (-DFAST_FUNC= ) + */ +#ifndef FAST_FUNC +# if __GNUC_PREREQ(3,0) && defined(i386) /* stdcall makes callee to pop arguments from stack, not caller */ -# define FAST_FUNC __attribute__((regparm(3),stdcall)) +# define FAST_FUNC __attribute__((regparm(3),stdcall)) /* #elif ... - add your favorite arch today! */ -#else -# define FAST_FUNC +# else +# define FAST_FUNC +# endif #endif /* Make all declarations hidden (-fvisibility flag only affects definitions) */ |