diff: stop using data/bss
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 4 Jun 2007 12:21:53 +0000 (12:21 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 4 Jun 2007 12:21:53 +0000 (12:21 -0000)
function                                             old     new   delta
do_diff                                              385     436     +51
diff_main                                            850     895     +45
dump_unified_vec                                     437     457     +20
prepare                                              335     334      -1
anychange                                              1       -      -1
suff                                                   4       -      -4
status                                               135     131      -4
static.max_context                                     4       -      -4
start                                                 12       8      -4
pref                                                   4       -      -4
member                                                 4       -      -4
label2                                                 4       -      -4
label1                                                 4       -      -4
klist                                                  4       -      -4
ixold                                                  4       -      -4
ixnew                                                  4       -      -4
dl_count                                               4       -      -4
dl                                                     4       -      -4
context_vec_start                                      4       -      -4
context_vec_ptr                                        4       -      -4
context_vec_end                                        4       -      -4
context                                                4       -      -4
clistlen                                               4       -      -4
clist                                                  4       -      -4
clen                                                   4       -      -4
class                                                  4       -      -4
J                                                      4       -      -4
add_to_dirlist                                        71      64      -7
slen                                                   8       -      -8
sfile                                                  8       -      -8
len                                                    8       -      -8
file                                                   8       -      -8
get_dir                                              196     185     -11
newcand                                               97      85     -12
change                                               351     331     -20
stb2                                                  96       -     -96
stb1                                                  96       -     -96
diffreg                                             2835    2717    -118
------------------------------------------------------------------------------
(add/remove: 0/27 grow/shrink: 3/8 up/down: 116/-482)        Total: -366 bytes

# size */*/diff.o
   text    data     bss     dec     hex filename
   7055       8     305    7368    1cc8 busybox.t2/coreutils/diff.o
   7002       0       0    7002    1b5a busybox.t3/coreutils/diff.o

coreutils/diff.c
miscutils/nmeter.c

index f6b045b2d763934af4d57e7548df0f30e873f6a4..faab287f81aef2e326c5629b9e360585c610272a 100644 (file)
 #define FLAG_U (1<<12)
 #define        FLAG_w  (1<<13)
 
-/* The following variables should be static, but gcc currently
- * creates a much bigger object if we do this. [which version of gcc? --vda] */
-/* 4.x, IIRC also 3.x --bernhard */
-/* Works for gcc 3.4.3. Sizes without and with "static":
-   # size busybox.t[34]/coreutils/diff.o
-   text    data     bss     dec     hex filename
-   6969       8     305    7282    1c72 busybox.t3/coreutils/diff.o
-   6969       8     305    7282    1c72 busybox.t4/coreutils/diff.o
-   --vda
- */
-/* This is the default number of lines of context. */
-static int context = 3;
-static int status;
-static char *start;
-static const char *label1;
-static const char *label2;
-static struct stat stb1, stb2;
-USE_FEATURE_DIFF_DIR(static char **dl;)
-USE_FEATURE_DIFF_DIR(static int dl_count;)
-
 struct cand {
        int x;
        int y;
        int pred;
 };
 
-static struct line {
+struct line {
        int serial;
        int value;
-} *file[2];
+};
 
 /*
  * The following struct is used to record change information
@@ -102,29 +82,79 @@ static struct line {
  * understand the highly mnemonic field names)
  */
 struct context_vec {
-       int a;                          /* start line in old file */
-       int b;                          /* end line in old file */
-       int c;                          /* start line in new file */
-       int d;                          /* end line in new file */
+       int a;          /* start line in old file */
+       int b;          /* end line in old file */
+       int c;          /* start line in new file */
+       int d;          /* end line in new file */
+};
+
+struct globals {
+       USE_FEATURE_DIFF_DIR(char **dl;)
+       USE_FEATURE_DIFF_DIR(int dl_count;)
+       /* This is the default number of lines of context. */
+       int context;
+       size_t max_context;
+       int status;
+       char *start;
+       const char *label1;
+       const char *label2;
+       struct line *file[2];
+       int *J;          /* will be overlaid on class */
+       int *class;      /* will be overlaid on file[0] */
+       int *klist;      /* will be overlaid on file[0] after class */
+       int *member;     /* will be overlaid on file[1] */
+       int clen;
+       int len[2];
+       int pref, suff;  /* length of prefix and suffix */
+       int slen[2];
+       bool anychange;
+       long *ixnew;     /* will be overlaid on file[1] */
+       long *ixold;     /* will be overlaid on klist */
+       struct cand *clist;  /* merely a free storage pot for candidates */
+       int clistlen;    /* the length of clist */
+       struct line *sfile[2];   /* shortened by pruning common prefix/suffix */
+       struct context_vec *context_vec_start;
+       struct context_vec *context_vec_end;
+       struct context_vec *context_vec_ptr;
+       struct stat stb1, stb2;
 };
+#define G (*ptr_to_globals)
+#define dl                 (G.dl                )
+#define dl_count           (G.dl_count          )
+#define context            (G.context           )
+#define max_context        (G.max_context       )
+#define status             (G.status            )
+#define start              (G.start             )
+#define label1             (G.label1            )
+#define label2             (G.label2            )
+#define file               (G.file              )
+#define J                  (G.J                 )
+#define class              (G.class             )
+#define klist              (G.klist             )
+#define member             (G.member            )
+#define clen               (G.clen              )
+#define len                (G.len               )
+#define pref               (G.pref              )
+#define suff               (G.suff              )
+#define slen               (G.slen              )
+#define anychange          (G.anychange         )
+#define ixnew              (G.ixnew             )
+#define ixold              (G.ixold             )
+#define clist              (G.clist             )
+#define clistlen           (G.clistlen          )
+#define sfile              (G.sfile             )
+#define context_vec_start  (G.context_vec_start )
+#define context_vec_end    (G.context_vec_end   )
+#define context_vec_ptr    (G.context_vec_ptr   )
+#define stb1               (G.stb1              )
+#define stb2               (G.stb2              )
+#define INIT_G() do { \
+       PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
+       context = 3; \
+       max_context = 64; \
+} while (0)
+
 
-static int *J;                 /* will be overlaid on class */
-static int *class;             /* will be overlaid on file[0] */
-static int *klist;             /* will be overlaid on file[0] after class */
-static int *member;            /* will be overlaid on file[1] */
-static int clen;
-static int len[2];
-static int pref, suff; /* length of prefix and suffix */
-static int slen[2];
-static bool anychange;
-static long *ixnew;            /* will be overlaid on file[1] */
-static long *ixold;            /* will be overlaid on klist */
-static struct cand *clist;     /* merely a free storage pot for candidates */
-static int clistlen;   /* the length of clist */
-static struct line *sfile[2];  /* shortened by pruning common prefix/suffix */
-static struct context_vec *context_vec_start;
-static struct context_vec *context_vec_end;
-static struct context_vec *context_vec_ptr;
 
 
 static void print_only(const char *path, size_t dirlen, const char *entry)
@@ -761,8 +791,6 @@ static void print_header(const char *file1, const char *file2)
 static void change(char *file1, FILE * f1, char *file2, FILE * f2, int a,
                                   int b, int c, int d)
 {
-       static size_t max_context = 64;
-
        if ((a > b && c > d) || (option_mask32 & FLAG_q)) {
                anychange = 1;
                return;
@@ -1170,6 +1198,8 @@ int diff_main(int argc, char **argv)
        char *f1, *f2;
        llist_t *L_arg = NULL;
 
+       INIT_G();
+
        /* exactly 2 params; collect multiple -L <label> */
        opt_complementary = "=2:L::";
        getopt32(argc, argv, "abdiL:NqrsS:tTU:wu"
index 3152b74e31f6a08544b63a6f1a4b233163342d3f..1d58eb2c163b52588877b819068ac09186b0b48c 100644 (file)
@@ -69,16 +69,16 @@ struct globals {
 #define proc_meminfo       (G.proc_meminfo      )
 #define proc_diskstats     (G.proc_diskstats    )
 #define proc_sys_fs_filenr (G.proc_sys_fs_filenr)
-
-// We depend on this being a char[], not char* - we take sizeof() of it
-#define outbuf bb_common_bufsiz1
-
 #define INIT_G() do { \
+               PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
                cur_outbuf = outbuf; \
                final_str = "\n"; \
                deltanz = delta = 1000000; \
        } while (0)
 
+// We depend on this being a char[], not char* - we take sizeof() of it
+#define outbuf bb_common_bufsiz1
+
 static inline void reset_outbuf(void)
 {
        cur_outbuf = outbuf;
@@ -774,7 +774,6 @@ int nmeter_main(int argc, char **argv)
        s_stat *s;
        char *cur, *prev;
 
-       PTR_TO_GLOBALS = xzalloc(sizeof(G));
        INIT_G();
 
        xchdir("/proc");