gzip: Improve ptr_to_globals trick, allowing gcc
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 15 Mar 2007 19:48:35 +0000 (19:48 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 15 Mar 2007 19:48:35 +0000 (19:48 -0000)
to optimize better. -480 bytes.

archival/gzip.c
include/libbb.h
libbb/messages.c

index 6af6c18..c2333e3 100644 (file)
@@ -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;
index 90fb0ad..d68519d 100644 (file)
@@ -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.
index 1a10a8c..12a165a 100644 (file)
@@ -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")));