xref: /utopia/UTPA2-700.0.x/projects/build/scripts/bloat-o-meter (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi#!/usr/bin/python
2*53ee8cc1Swenshuai.xi#
3*53ee8cc1Swenshuai.xi# Copyright 2004 Matt Mackall <mpm@selenic.com>
4*53ee8cc1Swenshuai.xi#
5*53ee8cc1Swenshuai.xi# inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen
6*53ee8cc1Swenshuai.xi#
7*53ee8cc1Swenshuai.xi# This software may be used and distributed according to the terms
8*53ee8cc1Swenshuai.xi# of the GNU General Public License, incorporated herein by reference.
9*53ee8cc1Swenshuai.xi
10*53ee8cc1Swenshuai.xiimport sys, os, re
11*53ee8cc1Swenshuai.xi
12*53ee8cc1Swenshuai.xiif len(sys.argv) != 3:
13*53ee8cc1Swenshuai.xi    sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
14*53ee8cc1Swenshuai.xi    sys.exit(-1)
15*53ee8cc1Swenshuai.xi
16*53ee8cc1Swenshuai.xidef getsizes(file):
17*53ee8cc1Swenshuai.xi    sym = {}
18*53ee8cc1Swenshuai.xi    for l in os.popen("nm --size-sort " + file).readlines():
19*53ee8cc1Swenshuai.xi        size, type, name = l[:-1].split()
20*53ee8cc1Swenshuai.xi        if type in "tTdDbBrR":
21*53ee8cc1Swenshuai.xi            # strip generated symbols
22*53ee8cc1Swenshuai.xi            if name[:6] == "__mod_": continue
23*53ee8cc1Swenshuai.xi            # function names begin with '.' on 64-bit powerpc
24*53ee8cc1Swenshuai.xi            if "." in name[1:]: name = "static." + name.split(".")[0]
25*53ee8cc1Swenshuai.xi            sym[name] = sym.get(name, 0) + int(size, 16)
26*53ee8cc1Swenshuai.xi    return sym
27*53ee8cc1Swenshuai.xi
28*53ee8cc1Swenshuai.xiold = getsizes(sys.argv[1])
29*53ee8cc1Swenshuai.xinew = getsizes(sys.argv[2])
30*53ee8cc1Swenshuai.xigrow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
31*53ee8cc1Swenshuai.xidelta, common = [], {}
32*53ee8cc1Swenshuai.xi
33*53ee8cc1Swenshuai.xifor a in old:
34*53ee8cc1Swenshuai.xi    if a in new:
35*53ee8cc1Swenshuai.xi        common[a] = 1
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xifor name in old:
38*53ee8cc1Swenshuai.xi    if name not in common:
39*53ee8cc1Swenshuai.xi        remove += 1
40*53ee8cc1Swenshuai.xi        down += old[name]
41*53ee8cc1Swenshuai.xi        delta.append((-old[name], name))
42*53ee8cc1Swenshuai.xi
43*53ee8cc1Swenshuai.xifor name in new:
44*53ee8cc1Swenshuai.xi    if name not in common:
45*53ee8cc1Swenshuai.xi        add += 1
46*53ee8cc1Swenshuai.xi        up += new[name]
47*53ee8cc1Swenshuai.xi        delta.append((new[name], name))
48*53ee8cc1Swenshuai.xi
49*53ee8cc1Swenshuai.xifor name in common:
50*53ee8cc1Swenshuai.xi        d = new.get(name, 0) - old.get(name, 0)
51*53ee8cc1Swenshuai.xi        if d>0: grow, up = grow+1, up+d
52*53ee8cc1Swenshuai.xi        if d<0: shrink, down = shrink+1, down-d
53*53ee8cc1Swenshuai.xi        delta.append((d, name))
54*53ee8cc1Swenshuai.xi
55*53ee8cc1Swenshuai.xidelta.sort()
56*53ee8cc1Swenshuai.xidelta.reverse()
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xiprint "add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
59*53ee8cc1Swenshuai.xi      (add, remove, grow, shrink, up, -down, up-down)
60*53ee8cc1Swenshuai.xiprint "%-40s %7s %7s %+7s" % ("function", "old", "new", "delta")
61*53ee8cc1Swenshuai.xifor d, n in delta:
62*53ee8cc1Swenshuai.xi    if d: print "%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)
63