gzip: Improve ptr_to_globals trick, allowing gcc to optimize better. -480 bytes.
No binary (build failed)
—
(log yok)
| @@ -2045,8 +2045,8 @@ int gzip_main(int argc, char **argv) | |
| } | |
| #endif | |
| - | ptr_to_globals = xzalloc(sizeof(struct globals) + sizeof(struct globals2)); |
| - | ptr_to_globals++; |
| + | PTR_TO_GLOBALS = xzalloc(sizeof(struct globals) + sizeof(struct globals2)) |
| + | + sizeof(struct globals); |
| G2.l_desc.dyn_tree = G2.dyn_ltree; | |
| G2.l_desc.static_tree = G2.static_ltree; | |
| G2.l_desc.extra_bits = extra_lbits; | |
| @@ -804,7 +804,10 @@ extern char bb_common_bufsiz1[BUFSIZ+1]; | |
| /* This struct is deliberately not defined. */ | |
| /* See docs/keep_data_small.txt */ | |
| struct globals; | |
| - | extern struct globals *ptr_to_globals; |
| + | /* Magic prevents this from going into rodata */ |
| + | /* If you want to assign a value, use PTR_TO_GLOBALS = xxx */ |
| + | extern struct globals *const ptr_to_globals; |
| + | #define PTR_TO_GLOBALS (*(struct globals**)&ptr_to_globals) |
| /* You can change LIBBB_DEFAULT_LOGIN_SHELL, but don't use it, | |
| * use bb_default_login_shell and following defines. | |
| @@ -57,4 +57,5 @@ WTMP_FILE; | |
| char bb_common_bufsiz1[BUFSIZ+1]; | |
| struct globals; | |
| - | struct globals *ptr_to_globals; |
| + | /* Make it reside in R/W memory: */ |
| + | struct globals *const ptr_to_globals __attribute__ ((section (".data"))); |