*: code shrink via NOINLINE
function old new delta expand_vars_to_list - 2118 +2118 lzo1x_optimize - 1429 +1429 run_pipe 358 1775 +1417 arith_apply - 1335 +1335 mainQSort3 - 1198 +1198 logdir_open - 1163 +1163 rewrite - 1039 +1039 dump_identity - 987 +987 do_shm - 884 +884 cpio_o - 863 +863 cpio_main 1450 560 -890 ipcs_main 3442 2523 -919 bb_dump_dump 2611 1488 -1123 process_dev 4572 3405 -1167 logdirs_reopen 1308 86 -1222 arith 2084 707 -1377 mainSort 2622 1202 -1420 do_lzo_compress 2276 799 -1477 run_list 2491 943 -1548 expand_variables 2280 135 -2145 ------------------------------------------------------------------------------ (add/remove: 9/0 grow/shrink: 1/10 up/down: 12433/-13288) Total: -855 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
57ce977a97
commit
a7bb3c1396
@ -585,7 +585,7 @@ uint8_t mmed3(uint8_t a, uint8_t b, uint8_t c)
|
|||||||
#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
|
#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT)
|
||||||
#define MAIN_QSORT_STACK_SIZE 100
|
#define MAIN_QSORT_STACK_SIZE 100
|
||||||
|
|
||||||
static
|
static NOINLINE
|
||||||
void mainQSort3(uint32_t* ptr,
|
void mainQSort3(uint32_t* ptr,
|
||||||
uint8_t* block,
|
uint8_t* block,
|
||||||
uint16_t* quadrant,
|
uint16_t* quadrant,
|
||||||
|
@ -117,7 +117,7 @@ static off_t cpio_pad4(off_t size)
|
|||||||
|
|
||||||
/* Return value will become exit code.
|
/* Return value will become exit code.
|
||||||
* It's ok to exit instead of return. */
|
* It's ok to exit instead of return. */
|
||||||
static int cpio_o(void)
|
static NOINLINE int cpio_o(void)
|
||||||
{
|
{
|
||||||
static const char trailer[] ALIGN1 = "TRAILER!!!";
|
static const char trailer[] ALIGN1 = "TRAILER!!!";
|
||||||
struct name_s {
|
struct name_s {
|
||||||
|
@ -75,7 +75,7 @@ static void copy3(uint8_t* ip, const uint8_t* m_pos, unsigned off)
|
|||||||
#define TEST_IP (ip < ip_end)
|
#define TEST_IP (ip < ip_end)
|
||||||
#define TEST_OP (op <= op_end)
|
#define TEST_OP (op <= op_end)
|
||||||
|
|
||||||
static int lzo1x_optimize(uint8_t *in, unsigned in_len,
|
static NOINLINE int lzo1x_optimize(uint8_t *in, unsigned in_len,
|
||||||
uint8_t *out, unsigned *out_len,
|
uint8_t *out, unsigned *out_len,
|
||||||
void* wrkmem UNUSED_PARAM)
|
void* wrkmem UNUSED_PARAM)
|
||||||
{
|
{
|
||||||
|
@ -214,3 +214,34 @@ Result (non-static busybox built against glibc):
|
|||||||
text data bss dec hex filename
|
text data bss dec hex filename
|
||||||
634416 2736 23856 661008 a1610 busybox
|
634416 2736 23856 661008 a1610 busybox
|
||||||
632580 2672 22944 658196 a0b14 busybox_noalign
|
632580 2672 22944 658196 a0b14 busybox_noalign
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Keeping code small
|
||||||
|
|
||||||
|
Set CONFIG_EXTRA_CFLAGS="-fno-inline-functions-called-once",
|
||||||
|
produce "make bloatcheck", see the biggest auto-inlined functions.
|
||||||
|
Now, set CONFIG_EXTRA_CFLAGS back to "", but add NOINLINE
|
||||||
|
to some of these functions. In 1.16.x timeframe, the results were
|
||||||
|
(annotated "make bloatcheck" output):
|
||||||
|
|
||||||
|
function old new delta
|
||||||
|
expand_vars_to_list - 1712 +1712 win
|
||||||
|
lzo1x_optimize - 1429 +1429 win
|
||||||
|
arith_apply - 1326 +1326 win
|
||||||
|
read_interfaces - 1163 +1163 loss, leave w/o NOINLINE
|
||||||
|
logdir_open - 1148 +1148 win
|
||||||
|
check_deps - 1148 +1148 loss
|
||||||
|
rewrite - 1039 +1039 win
|
||||||
|
run_pipe 358 1396 +1038 win
|
||||||
|
write_status_file - 1029 +1029 almost the same, leave w/o NOINLINE
|
||||||
|
dump_identity - 987 +987 win
|
||||||
|
mainQSort3 - 921 +921 win
|
||||||
|
parse_one_line - 916 +916 loss
|
||||||
|
summarize - 897 +897 almost the same
|
||||||
|
do_shm - 884 +884 win
|
||||||
|
cpio_o - 863 +863 win
|
||||||
|
subCommand - 841 +841 loss
|
||||||
|
receive - 834 +834 loss
|
||||||
|
|
||||||
|
855 bytes saved in total.
|
||||||
|
@ -96,7 +96,7 @@ static NOINLINE int bb_dump_size(FS *fs)
|
|||||||
return cur_size;
|
return cur_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rewrite(priv_dumper_t *dumper, FS *fs)
|
static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
|
||||||
{
|
{
|
||||||
enum { NOTOKAY, USEBCNT, USEPREC } sokay;
|
enum { NOTOKAY, USEBCNT, USEPREC } sokay;
|
||||||
PR *pr, **nextpr = NULL;
|
PR *pr, **nextpr = NULL;
|
||||||
|
@ -1185,7 +1185,7 @@ static const char BuffType[] ALIGN1 =
|
|||||||
"unknown""\0" "1Sect""\0" "DualPort""\0" "DualPortCache"
|
"unknown""\0" "1Sect""\0" "DualPort""\0" "DualPortCache"
|
||||||
;
|
;
|
||||||
|
|
||||||
static void dump_identity(const struct hd_driveid *id)
|
static NOINLINE void dump_identity(const struct hd_driveid *id)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const unsigned short *id_regs = (const void*) id;
|
const unsigned short *id_regs = (const void*) id;
|
||||||
|
@ -603,7 +603,7 @@ static void logdir_close(struct logdir *ld)
|
|||||||
ld->processor = NULL;
|
ld->processor = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned logdir_open(struct logdir *ld, const char *fn)
|
static NOINLINE unsigned logdir_open(struct logdir *ld, const char *fn)
|
||||||
{
|
{
|
||||||
char buf[128];
|
char buf[128];
|
||||||
unsigned now;
|
unsigned now;
|
||||||
|
@ -2151,7 +2151,7 @@ static char *expand_pseudo_dquoted(const char *str)
|
|||||||
* to be filled). This routine is extremely tricky: has to deal with
|
* to be filled). This routine is extremely tricky: has to deal with
|
||||||
* variables/parameters with whitespace, $* and $@, and constructs like
|
* variables/parameters with whitespace, $* and $@, and constructs like
|
||||||
* 'echo -$*-'. If you play here, you must run testsuite afterwards! */
|
* 'echo -$*-'. If you play here, you must run testsuite afterwards! */
|
||||||
static int expand_vars_to_list(o_string *output, int n, char *arg, char or_mask)
|
static NOINLINE int expand_vars_to_list(o_string *output, int n, char *arg, char or_mask)
|
||||||
{
|
{
|
||||||
/* or_mask is either 0 (normal case) or 0x80 -
|
/* or_mask is either 0 (normal case) or 0x80 -
|
||||||
* expansion of right-hand side of assignment == 1-element expand.
|
* expansion of right-hand side of assignment == 1-element expand.
|
||||||
@ -3750,7 +3750,7 @@ static int checkjobs_and_fg_shell(struct pipe* fg_pipe)
|
|||||||
* backgrounded: cmd & { list } &
|
* backgrounded: cmd & { list } &
|
||||||
* subshell: ( list ) [&]
|
* subshell: ( list ) [&]
|
||||||
*/
|
*/
|
||||||
static int run_pipe(struct pipe *pi)
|
static NOINLINE int run_pipe(struct pipe *pi)
|
||||||
{
|
{
|
||||||
static const char *const null_ptr = NULL;
|
static const char *const null_ptr = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
@ -293,7 +293,7 @@ arith_lookup_val(v_n_t *t, a_e_h_t *math_hooks)
|
|||||||
/* "applying" a token means performing it on the top elements on the integer
|
/* "applying" a token means performing it on the top elements on the integer
|
||||||
* stack. For a unary operator it will only change the top element, but a
|
* stack. For a unary operator it will only change the top element, but a
|
||||||
* binary operator will pop two arguments and push a result */
|
* binary operator will pop two arguments and push a result */
|
||||||
static int
|
static NOINLINE int
|
||||||
arith_apply(operator op, v_n_t *numstack, v_n_t **numstackptr, a_e_h_t *math_hooks)
|
arith_apply(operator op, v_n_t *numstack, v_n_t **numstackptr, a_e_h_t *math_hooks)
|
||||||
{
|
{
|
||||||
v_n_t *numptr_m1;
|
v_n_t *numptr_m1;
|
||||||
|
@ -115,7 +115,7 @@ static void print_perms(int id, struct ipc_perm *ipcp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void do_shm(void)
|
static NOINLINE void do_shm(void)
|
||||||
{
|
{
|
||||||
int maxid, shmid, id;
|
int maxid, shmid, id;
|
||||||
struct shmid_ds shmseg;
|
struct shmid_ds shmseg;
|
||||||
|
Loading…
Reference in New Issue
Block a user