Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/scripts/bloat-o-meter

    r1765 r2725  
    88# of the GNU General Public License, incorporated herein by reference.
    99
    10 import sys, os, re
     10import sys, os#, re
    1111
    12 if len(sys.argv) != 3:
    13     sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
     12def usage():
     13    sys.stderr.write("usage: %s [-t] file1 file2\n" % sys.argv[0])
    1414    sys.exit(-1)
    1515
    16 for f in sys.argv[1], sys.argv[2]:
    17     if not os.path.exists(f):
    18         sys.stderr.write("Error: file '%s' does not exist\n" % f)
    19         sys.exit(-1)
     16f1, f2 = (None, None)
     17flag_timing, dashes = (False, False)
    2018
     19for f in sys.argv[1:]:
     20    if f.startswith("-"):
     21        if f == "--": # sym_args
     22            dashes = True
     23            break
     24        if f == "-t": # timings
     25            flag_timing = True
     26    else:
     27        if not os.path.exists(f):
     28            sys.stderr.write("Error: file '%s' does not exist\n" % f)
     29            usage()
     30        if f1 is None:
     31            f1 = f
     32        elif f2 is None:
     33            f2 = f
     34if flag_timing:
     35    import time
     36if f1 is None or f2 is None:
     37    usage()
     38
     39sym_args = " ".join(sys.argv[3 + flag_timing + dashes:])
    2140def getsizes(file):
    22     sym = {}
    23     for l in os.popen("nm --size-sort " + file).readlines():
    24         size, type, name = l[:-1].split()
    25         if type in "tTdDbBrR":
    26             if "." in name: name = "static." + name.split(".")[0]
    27             sym[name] = sym.get(name, 0) + int(size, 16)
    28     for l in os.popen("readelf -S " + file).readlines():
     41    sym, alias, lut = {}, {}, {}
     42    #dynsym_filter = re.compile("^\d+:\s+[\dA-Fa-f]+\s+\d+\s+\w+\s+\w+\s+\w+\s+\w+\s+\w+$")
     43    for l in os.popen("readelf -W -s %s %s" % (sym_args, file)).readlines():
     44        if True:
     45            l = l.strip()
     46            if not (len(l) and l[0].isdigit() and len(l.split()) == 8):
     47                continue
     48            num, value, size, typ, bind, vis, ndx, name = l.split()
     49            if ndx == "UND": continue # skip undefined
     50            if typ in ["SECTION", "FILES"]: continue # skip sections and files
     51        #else:
     52        #    l = l.strip()
     53        #    match = dynsym_filter.match(l)
     54        #    if not match: continue
     55        #    x, value, size, typ, bind, x, ndx, name = l.split()
     56        #    if ndx == "UND": continue # skip undefined
     57        #    if typ in ["SECTION", "FILES"]: continue # skip sections and files
     58        if "." in name: name = "static." + name.split(".")[0]
     59        value = int(value, 16)
     60        size = int(size)
     61        if vis != "DEFAULT" and bind != "GLOBAL": # see if it is an alias
     62            alias[(value, size)] = {"name" : name}
     63        else:
     64            sym[name] = {"addr" : value, "size":  size}
     65            lut[(value, size)] = 0
     66    for addr, sz in iter(alias.keys()):
     67        # If the non-GLOBAL sym has an implementation elsewhere then
     68        # it's an alias, disregard it.
     69        if not (addr, sz) in lut:
     70            # If this non-GLOBAL sym does not have an implementation at
     71            # another address, then treat it as a normal symbol.
     72            sym[alias[(addr, sz)]["name"]] = {"addr" : addr, "size": sz}
     73    for l in os.popen("readelf -W -S " + file).readlines():
    2974        x = l.split()
    30         if len(x)<6 or x[1] != ".rodata": continue
    31         sym[".rodata"] = int(x[5], 16)
     75        if len(x)<6: continue
     76        # Should take these into account too!
     77        #if x[1] not in [".text", ".rodata", ".symtab", ".strtab"]: continue
     78        if x[1] not in [".rodata"]: continue
     79        sym[x[1]] = {"addr" : int(x[3], 16), "size" : int(x[5], 16)}
    3280    return sym
    3381
    34 old = getsizes(sys.argv[1])
    35 new = getsizes(sys.argv[2])
     82if flag_timing:
     83    start_t1 = int(time.time() * 1e9)
     84old = getsizes(f1)
     85if flag_timing:
     86    end_t1 = int(time.time() * 1e9)
     87    start_t2 = int(time.time() * 1e9)
     88new = getsizes(f2)
     89if flag_timing:
     90    end_t2 = int(time.time() * 1e9)
     91    start_t3 = int(time.time() * 1e9)
    3692grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
    3793delta, common = [], {}
    3894
    39 for a in old:
    40     if a in new:
    41         common[a] = 1
     95for name in iter(old.keys()):
     96    if name in new:
     97        common[name] = 1
    4298
    4399for name in old:
    44100    if name not in common:
    45101        remove += 1
    46         down += old[name]
    47         delta.append((-old[name], name))
     102        sz = old[name]["size"]
     103        down += sz
     104        delta.append((-sz, name))
    48105
    49106for name in new:
    50107    if name not in common:
    51108        add += 1
    52         up += new[name]
    53         delta.append((new[name], name))
     109        sz = new[name]["size"]
     110        up += sz
     111        delta.append((sz, name))
    54112
    55113for name in common:
    56         d = new.get(name, 0) - old.get(name, 0)
     114        d = new[name].get("size", 0) - old[name].get("size", 0)
    57115        if d>0: grow, up = grow+1, up+d
    58         if d<0: shrink, down = shrink+1, down-d
     116        elif d<0: shrink, down = shrink+1, down-d
     117        else:
     118            continue
    59119        delta.append((d, name))
    60120
    61121delta.sort()
    62122delta.reverse()
     123if flag_timing:
     124    end_t3 = int(time.time() * 1e9)
    63125
    64 print "%-48s %7s %7s %+7s" % ("function", "old", "new", "delta")
     126print("%-48s %7s %7s %+7s" % ("function", "old", "new", "delta"))
    65127for d, n in delta:
    66     if d: print "%-48s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)
    67 print "-"*78
     128    if d:
     129        old_sz = old.get(n, {}).get("size", "-")
     130        new_sz = new.get(n, {}).get("size", "-")
     131        print("%-48s %7s %7s %+7d" % (n, old_sz, new_sz, d))
     132print("-"*78)
    68133total="(add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s)%%sTotal: %s bytes"\
    69134    % (add, remove, grow, shrink, up, -down, up-down)
    70 print total % (" "*(80-len(total)))
     135print(total % (" "*(80-len(total))))
     136if flag_timing:
     137    print("\n%d/%d; %d Parse origin/new; processing nsecs" %
     138        (end_t1-start_t1, end_t2-start_t2, end_t3-start_t3))
     139    print("total nsecs: %d" % (end_t3-start_t1))
Note: See TracChangeset for help on using the changeset viewer.