aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJames Byrne <james.byrne@origamienergy.com>2019-07-02 11:35:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-07-02 11:35:03 +0200
commit6937487be73cd4563b876413277a295a5fe2f32c (patch)
treef16cc9999a7c827891e6ec8d99c699fc791008ee /include
parentcaecfdc20d450686cd1f7e9b5f650322f894b3c2 (diff)
downloadbusybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.gz
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.bz2
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.zip
libbb: reduce the overhead of single parameter bb_error_msg() calls
Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower overhead call to bb_perror_msg() when only a string was being printed with no parameters. This saves space for some CPU architectures because it avoids the overhead of a call to a variadic function. However there has never been a simple version of bb_error_msg(), and since 2007 many new calls to bb_perror_msg() have been added that only take a single parameter and so could have been using bb_simple_perror_message(). This changeset introduces 'simple' versions of bb_info_msg(), bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and bb_herror_msg_and_die(), and replaces all calls that only take a single parameter, or use something like ("%s", arg), with calls to the corresponding 'simple' version. Since it is likely that single parameter calls to the variadic functions may be accidentally reintroduced in the future a new debugging config option WARN_SIMPLE_MSG has been introduced. This uses some macro magic which will cause any such calls to generate a warning, but this is turned off by default to avoid use of the unpleasant macros in normal circumstances. This is a large changeset due to the number of calls that have been replaced. The only files that contain changes other than simple substitution of function calls are libbb.h, libbb/herror_msg.c, libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c, networking/udhcp/common.h and util-linux/mdev.c additonal macros have been added for logging so that single parameter and multiple parameter logging variants exist. The amount of space saved varies considerably by architecture, and was found to be as follows (for 'defconfig' using GCC 7.4): Arm: -92 bytes MIPS: -52 bytes PPC: -1836 bytes x86_64: -938 bytes Note that for the MIPS architecture only an exception had to be made disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h) because it made these files larger on MIPS. Signed-off-by: James Byrne <james.byrne@origamienergy.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'include')
-rw-r--r--include/libbb.h45
1 files changed, 44 insertions, 1 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 021100db1..111d1b790 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1137,7 +1137,7 @@ void exec_prog_or_SHELL(char **argv) NORETURN FAST_FUNC;
1137({ \ 1137({ \
1138 pid_t bb__xvfork_pid = vfork(); \ 1138 pid_t bb__xvfork_pid = vfork(); \
1139 if (bb__xvfork_pid < 0) \ 1139 if (bb__xvfork_pid < 0) \
1140 bb_perror_msg_and_die("vfork"); \ 1140 bb_simple_perror_msg_and_die("vfork"); \
1141 bb__xvfork_pid; \ 1141 bb__xvfork_pid; \
1142}) 1142})
1143#if BB_MMU 1143#if BB_MMU
@@ -1324,13 +1324,17 @@ extern void (*die_func)(void);
1324void xfunc_die(void) NORETURN FAST_FUNC; 1324void xfunc_die(void) NORETURN FAST_FUNC;
1325void bb_show_usage(void) NORETURN FAST_FUNC; 1325void bb_show_usage(void) NORETURN FAST_FUNC;
1326void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC; 1326void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
1327void bb_simple_error_msg(const char *s) FAST_FUNC;
1327void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC; 1328void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
1329void bb_simple_error_msg_and_die(const char *s) NORETURN FAST_FUNC;
1328void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC; 1330void bb_perror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
1329void bb_simple_perror_msg(const char *s) FAST_FUNC; 1331void bb_simple_perror_msg(const char *s) FAST_FUNC;
1330void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC; 1332void bb_perror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
1331void bb_simple_perror_msg_and_die(const char *s) NORETURN FAST_FUNC; 1333void bb_simple_perror_msg_and_die(const char *s) NORETURN FAST_FUNC;
1332void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC; 1334void bb_herror_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
1335void bb_simple_herror_msg(const char *s) FAST_FUNC;
1333void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC; 1336void bb_herror_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))) FAST_FUNC;
1337void bb_simple_herror_msg_and_die(const char *s) NORETURN FAST_FUNC;
1334void bb_perror_nomsg_and_die(void) NORETURN FAST_FUNC; 1338void bb_perror_nomsg_and_die(void) NORETURN FAST_FUNC;
1335void bb_perror_nomsg(void) FAST_FUNC; 1339void bb_perror_nomsg(void) FAST_FUNC;
1336void bb_verror_msg(const char *s, va_list p, const char *strerr) FAST_FUNC; 1340void bb_verror_msg(const char *s, va_list p, const char *strerr) FAST_FUNC;
@@ -1339,12 +1343,51 @@ void bb_logenv_override(void) FAST_FUNC;
1339 1343
1340#if ENABLE_FEATURE_SYSLOG_INFO 1344#if ENABLE_FEATURE_SYSLOG_INFO
1341void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC; 1345void bb_info_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))) FAST_FUNC;
1346void bb_simple_info_msg(const char *s) FAST_FUNC;
1342void bb_vinfo_msg(const char *s, va_list p) FAST_FUNC; 1347void bb_vinfo_msg(const char *s, va_list p) FAST_FUNC;
1343#else 1348#else
1344#define bb_info_msg bb_error_msg 1349#define bb_info_msg bb_error_msg
1350#define bb_simple_info_msg bb_simple_error_msg
1345#define bb_vinfo_msg(s,p) bb_verror_msg(s,p,NULL) 1351#define bb_vinfo_msg(s,p) bb_verror_msg(s,p,NULL)
1346#endif 1352#endif
1347 1353
1354#if ENABLE_WARN_SIMPLE_MSG
1355/* If enabled, cause calls to bb_error_msg() et al that only take a single
1356 * parameter to generate a warning.
1357 */
1358static inline void __attribute__ ((deprecated("use bb_simple_error_msg instead")))
1359 bb_not_simple_error_msg(const char *s) { bb_simple_error_msg(s); }
1360static inline void __attribute__ ((deprecated("use bb_simple_error_msg_and_die instead"))) NORETURN
1361 bb_not_simple_error_msg_and_die(const char *s) { bb_simple_error_msg_and_die(s); }
1362static inline void __attribute__ ((deprecated("use bb_simple_perror_msg instead")))
1363 bb_not_simple_perror_msg(const char *s) { bb_simple_perror_msg(s); }
1364static inline void __attribute__ ((deprecated("use bb_simple_perror_msg_and_die instead"))) NORETURN
1365 bb_not_simple_perror_msg_and_die(const char *s) { bb_simple_perror_msg_and_die(s); }
1366static inline void __attribute__ ((deprecated("use bb_simple_herror_msg instead")))
1367 bb_not_simple_herror_msg(const char *s) { bb_simple_herror_msg(s); }
1368static inline void __attribute__ ((deprecated("use bb_simple_herror_msg_and_die instead"))) NORETURN
1369 bb_not_simple_herror_msg_and_die(const char *s) { bb_simple_herror_msg_and_die(s); }
1370static inline void __attribute__ ((deprecated("use bb_simple_info_msg instead")))
1371 bb_not_simple_info_msg(const char *s) { bb_simple_info_msg(s); }
1372/* Override bb_error_msg() and related functions with macros that will
1373 * substitute them for the equivalent bb_not_simple_error_msg() function when
1374 * they are used with only a single parameter. Macro approach inspired by
1375 * https://gustedt.wordpress.com/2010/06/08/detect-empty-macro-arguments and
1376 * https://gustedt.wordpress.com/2010/06/03/default-arguments-for-c99
1377 */
1378#define _ARG18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) _17
1379#define BB_MSG_KIND(...) _ARG18(__VA_ARGS__, , , , , , , , , , , , , , , , , _not_simple)
1380#define _BB_MSG(name, kind, ...) bb##kind##name(__VA_ARGS__)
1381#define BB_MSG(name, kind, ...) _BB_MSG(name, kind, __VA_ARGS__)
1382#define bb_error_msg(...) BB_MSG(_error_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1383#define bb_error_msg_and_die(...) BB_MSG(_error_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1384#define bb_perror_msg(...) BB_MSG(_perror_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1385#define bb_perror_msg_and_die(...) BB_MSG(_perror_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1386#define bb_herror_msg(...) BB_MSG(_herror_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1387#define bb_herror_msg_and_die(...) BB_MSG(_herror_msg_and_die, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1388#define bb_info_msg(...) BB_MSG(_info_msg, BB_MSG_KIND(__VA_ARGS__), __VA_ARGS__)
1389#endif
1390
1348/* We need to export XXX_main from libbusybox 1391/* We need to export XXX_main from libbusybox
1349 * only if we build "individual" binaries 1392 * only if we build "individual" binaries
1350 */ 1393 */