diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-20 16:24:18 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-12-20 16:24:18 +0100 |
| commit | 503faf9d5331b70d93836d221ff12f97d769499b (patch) | |
| tree | eafea86b6bfc5b2b61a434ff0cf8e88bc31abe2e /miscutils | |
| parent | eaa3b00002e23e2ecccade3e06790dd524e7b662 (diff) | |
| download | busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.gz busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.tar.bz2 busybox-w32-503faf9d5331b70d93836d221ff12f97d769499b.zip | |
bc: shrink "dc only" code by dropping unused structure members
function old new delta
zbc_program_num 979 981 +2
zbc_program_pushArray 147 145 -2
bc_program_pushVar 198 196 -2
bc_program_func 17 15 -2
dc_num_printChar 24 21 -3
bc_program_retire 35 32 -3
bc_program_binOpRetire 46 43 -3
zdc_program_printStream 153 148 -5
zbc_program_prep 91 86 -5
zbc_program_copyToVar 300 295 -5
zdc_program_modexp 721 715 -6
zbc_program_binOpPrep 311 305 -6
bc_program_addFunc 138 132 -6
bc_num_printNewline 51 45 -6
bc_num_printHex 67 61 -6
bc_num_printDigits 137 131 -6
zdc_program_assignStr 146 137 -9
bc_program_reset 64 55 -9
bc_func_free 27 5 -22
bc_parse_free 38 8 -30
bc_parse_create 92 47 -45
bc_func_init 50 5 -45
dc_main 691 645 -46
zdc_program_execStr 496 442 -54
zbc_program_print 677 623 -54
zbc_vm_process 204 137 -67
zbc_program_exec 4132 4057 -75
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/26 up/down: 2/-522) Total: -520 bytes
text data bss dec hex filename
969767 485 7296 977548 eea8c busybox_old
969210 485 7296 976991 ee85f busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils')
| -rw-r--r-- | miscutils/bc.c | 87 |
1 files changed, 46 insertions, 41 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index c59d5a2b5..c5288102d 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c | |||
| @@ -348,9 +348,9 @@ typedef struct BcId { | |||
| 348 | 348 | ||
| 349 | typedef struct BcFunc { | 349 | typedef struct BcFunc { |
| 350 | BcVec code; | 350 | BcVec code; |
| 351 | BcVec labels; | 351 | IF_BC(BcVec labels;) |
| 352 | size_t nparams; | 352 | IF_BC(BcVec autos;) |
| 353 | BcVec autos; | 353 | IF_BC(size_t nparams;) |
| 354 | } BcFunc; | 354 | } BcFunc; |
| 355 | 355 | ||
| 356 | typedef enum BcResultType { | 356 | typedef enum BcResultType { |
| @@ -385,7 +385,7 @@ typedef struct BcResult { | |||
| 385 | typedef struct BcInstPtr { | 385 | typedef struct BcInstPtr { |
| 386 | size_t func; | 386 | size_t func; |
| 387 | size_t idx; | 387 | size_t idx; |
| 388 | size_t len; | 388 | IF_BC(size_t len;) |
| 389 | } BcInstPtr; | 389 | } BcInstPtr; |
| 390 | 390 | ||
| 391 | // BC_LEX_NEG is not used in lexing; it is only for parsing. | 391 | // BC_LEX_NEG is not used in lexing; it is only for parsing. |
| @@ -664,30 +664,29 @@ typedef struct BcLex { | |||
| 664 | typedef struct BcParse { | 664 | typedef struct BcParse { |
| 665 | BcLex l; | 665 | BcLex l; |
| 666 | 666 | ||
| 667 | BcVec exits; | 667 | IF_BC(BcVec exits;) |
| 668 | BcVec conds; | 668 | IF_BC(BcVec conds;) |
| 669 | 669 | IF_BC(BcVec ops;) | |
| 670 | BcVec ops; | ||
| 671 | 670 | ||
| 672 | BcFunc *func; | 671 | BcFunc *func; |
| 673 | size_t fidx; | 672 | size_t fidx; |
| 674 | 673 | ||
| 675 | size_t in_funcdef; | 674 | IF_BC(size_t in_funcdef;) |
| 676 | } BcParse; | 675 | } BcParse; |
| 677 | 676 | ||
| 678 | typedef struct BcProgram { | 677 | typedef struct BcProgram { |
| 679 | size_t len; | 678 | size_t len; |
| 680 | size_t scale; | 679 | size_t nchars; |
| 681 | 680 | ||
| 681 | size_t scale; | ||
| 682 | size_t ib_t; | 682 | size_t ib_t; |
| 683 | size_t ob_t; | 683 | size_t ob_t; |
| 684 | BcNum ob; | ||
| 685 | 684 | ||
| 686 | BcVec results; | 685 | BcVec results; |
| 687 | BcVec exestack; | 686 | BcVec exestack; |
| 688 | 687 | ||
| 689 | BcVec fns; | 688 | BcVec fns; |
| 690 | BcVec fn_map; | 689 | BcVec fn_map; //TODO: dc does not need this, its 'functions' are anonynomous (have no names) |
| 691 | 690 | ||
| 692 | BcVec vars; | 691 | BcVec vars; |
| 693 | BcVec var_map; | 692 | BcVec var_map; |
| @@ -700,11 +699,9 @@ typedef struct BcProgram { | |||
| 700 | 699 | ||
| 701 | const char *file; | 700 | const char *file; |
| 702 | 701 | ||
| 703 | BcNum last; | ||
| 704 | BcNum zero; | 702 | BcNum zero; |
| 705 | BcNum one; | 703 | IF_BC(BcNum one;) |
| 706 | 704 | IF_BC(BcNum last;) | |
| 707 | size_t nchars; | ||
| 708 | } BcProgram; | 705 | } BcProgram; |
| 709 | 706 | ||
| 710 | #define BC_PROG_MAIN (0) | 707 | #define BC_PROG_MAIN (0) |
| @@ -1616,6 +1613,7 @@ static BC_STATUS zbc_num_shift(BcNum *n, size_t places) | |||
| 1616 | 1613 | ||
| 1617 | static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale) | 1614 | static BC_STATUS zbc_num_inv(BcNum *a, BcNum *b, size_t scale) |
| 1618 | { | 1615 | { |
| 1616 | //TODO: nice example of non-allocated BcNum, use in other places as well! | ||
| 1619 | BcNum one; | 1617 | BcNum one; |
| 1620 | BcDig num[2]; | 1618 | BcDig num[2]; |
| 1621 | 1619 | ||
| @@ -2527,17 +2525,17 @@ static BC_STATUS zbc_func_insert(BcFunc *f, char *name, bool var) | |||
| 2527 | static void bc_func_init(BcFunc *f) | 2525 | static void bc_func_init(BcFunc *f) |
| 2528 | { | 2526 | { |
| 2529 | bc_char_vec_init(&f->code); | 2527 | bc_char_vec_init(&f->code); |
| 2530 | bc_vec_init(&f->autos, sizeof(BcId), bc_id_free); | 2528 | IF_BC(bc_vec_init(&f->labels, sizeof(size_t), NULL);) |
| 2531 | bc_vec_init(&f->labels, sizeof(size_t), NULL); | 2529 | IF_BC(bc_vec_init(&f->autos, sizeof(BcId), bc_id_free);) |
| 2532 | f->nparams = 0; | 2530 | IF_BC(f->nparams = 0;) |
| 2533 | } | 2531 | } |
| 2534 | 2532 | ||
| 2535 | static FAST_FUNC void bc_func_free(void *func) | 2533 | static FAST_FUNC void bc_func_free(void *func) |
| 2536 | { | 2534 | { |
| 2537 | BcFunc *f = (BcFunc *) func; | 2535 | BcFunc *f = (BcFunc *) func; |
| 2538 | bc_vec_free(&f->code); | 2536 | bc_vec_free(&f->code); |
| 2539 | bc_vec_free(&f->autos); | 2537 | IF_BC(bc_vec_free(&f->labels);) |
| 2540 | bc_vec_free(&f->labels); | 2538 | IF_BC(bc_vec_free(&f->autos);) |
| 2541 | } | 2539 | } |
| 2542 | 2540 | ||
| 2543 | static void bc_array_expand(BcVec *a, size_t len); | 2541 | static void bc_array_expand(BcVec *a, size_t len); |
| @@ -3566,10 +3564,10 @@ static void bc_program_reset(void) | |||
| 3566 | static void bc_parse_reset(BcParse *p) | 3564 | static void bc_parse_reset(BcParse *p) |
| 3567 | { | 3565 | { |
| 3568 | if (p->fidx != BC_PROG_MAIN) { | 3566 | if (p->fidx != BC_PROG_MAIN) { |
| 3569 | p->func->nparams = 0; | ||
| 3570 | bc_vec_pop_all(&p->func->code); | 3567 | bc_vec_pop_all(&p->func->code); |
| 3571 | bc_vec_pop_all(&p->func->autos); | 3568 | IF_BC(bc_vec_pop_all(&p->func->labels);) |
| 3572 | bc_vec_pop_all(&p->func->labels); | 3569 | IF_BC(bc_vec_pop_all(&p->func->autos);) |
| 3570 | IF_BC(p->func->nparams = 0;) | ||
| 3573 | 3571 | ||
| 3574 | p->fidx = BC_PROG_MAIN; | 3572 | p->fidx = BC_PROG_MAIN; |
| 3575 | p->func = bc_program_func_BC_PROG_MAIN(); | 3573 | p->func = bc_program_func_BC_PROG_MAIN(); |
| @@ -3578,18 +3576,18 @@ static void bc_parse_reset(BcParse *p) | |||
| 3578 | p->l.i = p->l.len; | 3576 | p->l.i = p->l.len; |
| 3579 | p->l.t.t = BC_LEX_EOF; | 3577 | p->l.t.t = BC_LEX_EOF; |
| 3580 | 3578 | ||
| 3581 | bc_vec_pop_all(&p->exits); | 3579 | IF_BC(bc_vec_pop_all(&p->exits);) |
| 3582 | bc_vec_pop_all(&p->conds); | 3580 | IF_BC(bc_vec_pop_all(&p->conds);) |
| 3583 | bc_vec_pop_all(&p->ops); | 3581 | IF_BC(bc_vec_pop_all(&p->ops);) |
| 3584 | 3582 | ||
| 3585 | bc_program_reset(); | 3583 | bc_program_reset(); |
| 3586 | } | 3584 | } |
| 3587 | 3585 | ||
| 3588 | static void bc_parse_free(BcParse *p) | 3586 | static void bc_parse_free(BcParse *p) |
| 3589 | { | 3587 | { |
| 3590 | bc_vec_free(&p->exits); | 3588 | IF_BC(bc_vec_free(&p->exits);) |
| 3591 | bc_vec_free(&p->conds); | 3589 | IF_BC(bc_vec_free(&p->conds);) |
| 3592 | bc_vec_free(&p->ops); | 3590 | IF_BC(bc_vec_free(&p->ops);) |
| 3593 | bc_lex_free(&p->l); | 3591 | bc_lex_free(&p->l); |
| 3594 | } | 3592 | } |
| 3595 | 3593 | ||
| @@ -3598,9 +3596,9 @@ static void bc_parse_create(BcParse *p, size_t fidx) | |||
| 3598 | memset(p, 0, sizeof(BcParse)); | 3596 | memset(p, 0, sizeof(BcParse)); |
| 3599 | 3597 | ||
| 3600 | bc_lex_init(&p->l); | 3598 | bc_lex_init(&p->l); |
| 3601 | bc_vec_init(&p->exits, sizeof(size_t), NULL); | 3599 | IF_BC(bc_vec_init(&p->exits, sizeof(size_t), NULL);) |
| 3602 | bc_vec_init(&p->conds, sizeof(size_t), NULL); | 3600 | IF_BC(bc_vec_init(&p->conds, sizeof(size_t), NULL);) |
| 3603 | bc_vec_init(&p->ops, sizeof(BcLexType), NULL); | 3601 | IF_BC(bc_vec_init(&p->ops, sizeof(BcLexType), NULL);) |
| 3604 | 3602 | ||
| 3605 | p->fidx = fidx; | 3603 | p->fidx = fidx; |
| 3606 | p->func = bc_program_func(fidx); | 3604 | p->func = bc_program_func(fidx); |
| @@ -5036,12 +5034,17 @@ static BC_STATUS zbc_program_num(BcResult *r, BcNum **num, bool hex) | |||
| 5036 | *num = bc_vec_top(v); | 5034 | *num = bc_vec_top(v); |
| 5037 | break; | 5035 | break; |
| 5038 | } | 5036 | } |
| 5037 | #if ENABLE_BC | ||
| 5039 | case BC_RESULT_LAST: | 5038 | case BC_RESULT_LAST: |
| 5040 | *num = &G.prog.last; | 5039 | *num = &G.prog.last; |
| 5041 | break; | 5040 | break; |
| 5042 | case BC_RESULT_ONE: | 5041 | case BC_RESULT_ONE: |
| 5043 | *num = &G.prog.one; | 5042 | *num = &G.prog.one; |
| 5044 | break; | 5043 | break; |
| 5044 | #endif | ||
| 5045 | default: | ||
| 5046 | // Testing the theory that dc does not reach LAST/ONE | ||
| 5047 | bb_error_msg_and_die("BUG:%d", r->t); | ||
| 5045 | } | 5048 | } |
| 5046 | 5049 | ||
| 5047 | RETURN_STATUS(BC_STATUS_SUCCESS); | 5050 | RETURN_STATUS(BC_STATUS_SUCCESS); |
| @@ -5178,7 +5181,7 @@ static BC_STATUS zbc_program_read(void) | |||
| 5178 | 5181 | ||
| 5179 | ip.func = BC_PROG_READ; | 5182 | ip.func = BC_PROG_READ; |
| 5180 | ip.idx = 0; | 5183 | ip.idx = 0; |
| 5181 | ip.len = G.prog.results.len; | 5184 | IF_BC(ip.len = G.prog.results.len;) |
| 5182 | 5185 | ||
| 5183 | // Update this pointer, just in case. | 5186 | // Update this pointer, just in case. |
| 5184 | f = bc_program_func(BC_PROG_READ); | 5187 | f = bc_program_func(BC_PROG_READ); |
| @@ -5496,7 +5499,9 @@ static BC_STATUS zbc_program_print(char inst, size_t idx) | |||
| 5496 | 5499 | ||
| 5497 | if (BC_PROG_NUM(r, num)) { | 5500 | if (BC_PROG_NUM(r, num)) { |
| 5498 | s = zbc_num_print(num, !pop); | 5501 | s = zbc_num_print(num, !pop); |
| 5499 | if (!s) bc_num_copy(&G.prog.last, num); | 5502 | #if ENABLE_BC |
| 5503 | if (!s && IS_BC) bc_num_copy(&G.prog.last, num); | ||
| 5504 | #endif | ||
| 5500 | } else { | 5505 | } else { |
| 5501 | char *str; | 5506 | char *str; |
| 5502 | 5507 | ||
| @@ -6322,7 +6327,7 @@ static BC_STATUS zdc_program_execStr(char *code, size_t *bgn, bool cond) | |||
| 6322 | } | 6327 | } |
| 6323 | 6328 | ||
| 6324 | ip.idx = 0; | 6329 | ip.idx = 0; |
| 6325 | ip.len = G.prog.results.len; | 6330 | IF_BC(ip.len = G.prog.results.len;) |
| 6326 | ip.func = fidx; | 6331 | ip.func = fidx; |
| 6327 | 6332 | ||
| 6328 | bc_vec_pop(&G.prog.results); | 6333 | bc_vec_pop(&G.prog.results); |
| @@ -6977,7 +6982,7 @@ static void bc_program_free(void) | |||
| 6977 | bc_vec_free(&G.prog.exestack); | 6982 | bc_vec_free(&G.prog.exestack); |
| 6978 | bc_num_free(&G.prog.last); | 6983 | bc_num_free(&G.prog.last); |
| 6979 | bc_num_free(&G.prog.zero); | 6984 | bc_num_free(&G.prog.zero); |
| 6980 | bc_num_free(&G.prog.one); | 6985 | IF_BC(bc_num_free(&G.prog.one);) |
| 6981 | bc_vec_free(&G.input_buffer); | 6986 | bc_vec_free(&G.input_buffer); |
| 6982 | } | 6987 | } |
| 6983 | 6988 | ||
| @@ -7001,14 +7006,14 @@ static void bc_program_init(void) | |||
| 7001 | G.prog.ib_t = 10; | 7006 | G.prog.ib_t = 10; |
| 7002 | G.prog.ob_t = 10; | 7007 | G.prog.ob_t = 10; |
| 7003 | 7008 | ||
| 7004 | bc_num_init_DEF_SIZE(&G.prog.last); | 7009 | IF_BC(bc_num_init_DEF_SIZE(&G.prog.last);) |
| 7005 | //bc_num_zero(&G.prog.last); - already is | 7010 | //IF_BC(bc_num_zero(&G.prog.last);) - already is |
| 7006 | 7011 | ||
| 7007 | bc_num_init_DEF_SIZE(&G.prog.zero); | 7012 | bc_num_init_DEF_SIZE(&G.prog.zero); |
| 7008 | //bc_num_zero(&G.prog.zero); - already is | 7013 | //bc_num_zero(&G.prog.zero); - already is |
| 7009 | 7014 | ||
| 7010 | bc_num_init_DEF_SIZE(&G.prog.one); | 7015 | IF_BC(bc_num_init_DEF_SIZE(&G.prog.one);) |
| 7011 | bc_num_one(&G.prog.one); | 7016 | IF_BC(bc_num_one(&G.prog.one);) |
| 7012 | 7017 | ||
| 7013 | bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free); | 7018 | bc_vec_init(&G.prog.fns, sizeof(BcFunc), bc_func_free); |
| 7014 | bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free); | 7019 | bc_vec_init(&G.prog.fn_map, sizeof(BcId), bc_id_free); |
