aboutsummaryrefslogtreecommitdiff
path: root/coreutils/expr.c
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 /coreutils/expr.c
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 'coreutils/expr.c')
-rw-r--r--coreutils/expr.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/coreutils/expr.c b/coreutils/expr.c
index 1bdfba004..b247f08db 100644
--- a/coreutils/expr.c
+++ b/coreutils/expr.c
@@ -249,7 +249,7 @@ static arith_t arithmetic_common(VALUE *l, VALUE *r, int op)
249 arith_t li, ri; 249 arith_t li, ri;
250 250
251 if (!toarith(l) || !toarith(r)) 251 if (!toarith(l) || !toarith(r))
252 bb_error_msg_and_die("non-numeric argument"); 252 bb_simple_error_msg_and_die("non-numeric argument");
253 li = l->u.i; 253 li = l->u.i;
254 ri = r->u.i; 254 ri = r->u.i;
255 if (op == '+') 255 if (op == '+')
@@ -259,7 +259,7 @@ static arith_t arithmetic_common(VALUE *l, VALUE *r, int op)
259 if (op == '*') 259 if (op == '*')
260 return li * ri; 260 return li * ri;
261 if (ri == 0) 261 if (ri == 0)
262 bb_error_msg_and_die("division by zero"); 262 bb_simple_error_msg_and_die("division by zero");
263 if (op == '/') 263 if (op == '/')
264 return li / ri; 264 return li / ri;
265 return li % ri; 265 return li % ri;
@@ -319,19 +319,19 @@ static VALUE *eval7(void)
319 VALUE *v; 319 VALUE *v;
320 320
321 if (!*G.args) 321 if (!*G.args)
322 bb_error_msg_and_die("syntax error"); 322 bb_simple_error_msg_and_die("syntax error");
323 323
324 if (nextarg("(")) { 324 if (nextarg("(")) {
325 G.args++; 325 G.args++;
326 v = eval(); 326 v = eval();
327 if (!nextarg(")")) 327 if (!nextarg(")"))
328 bb_error_msg_and_die("syntax error"); 328 bb_simple_error_msg_and_die("syntax error");
329 G.args++; 329 G.args++;
330 return v; 330 return v;
331 } 331 }
332 332
333 if (nextarg(")")) 333 if (nextarg(")"))
334 bb_error_msg_and_die("syntax error"); 334 bb_simple_error_msg_and_die("syntax error");
335 335
336 return str_value(*G.args++); 336 return str_value(*G.args++);
337} 337}
@@ -353,7 +353,7 @@ static VALUE *eval6(void)
353 G.args++; /* We have a valid token, so get the next argument. */ 353 G.args++; /* We have a valid token, so get the next argument. */
354 if (key == 1) { /* quote */ 354 if (key == 1) { /* quote */
355 if (!*G.args) 355 if (!*G.args)
356 bb_error_msg_and_die("syntax error"); 356 bb_simple_error_msg_and_die("syntax error");
357 return str_value(*G.args++); 357 return str_value(*G.args++);
358 } 358 }
359 if (key == 2) { /* length */ 359 if (key == 2) { /* length */
@@ -546,11 +546,11 @@ int expr_main(int argc UNUSED_PARAM, char **argv)
546 xfunc_error_retval = 2; /* coreutils compat */ 546 xfunc_error_retval = 2; /* coreutils compat */
547 G.args = argv + 1; 547 G.args = argv + 1;
548 if (*G.args == NULL) { 548 if (*G.args == NULL) {
549 bb_error_msg_and_die("too few arguments"); 549 bb_simple_error_msg_and_die("too few arguments");
550 } 550 }
551 v = eval(); 551 v = eval();
552 if (*G.args) 552 if (*G.args)
553 bb_error_msg_and_die("syntax error"); 553 bb_simple_error_msg_and_die("syntax error");
554 if (v->type == INTEGER) 554 if (v->type == INTEGER)
555 printf("%" PF_REZ "d\n", PF_REZ_TYPE v->u.i); 555 printf("%" PF_REZ "d\n", PF_REZ_TYPE v->u.i);
556 else 556 else