xref: /openbmc/linux/scripts/bloat-o-meter (revision d960600df3ce3588571e2c1adf1f5f6d8ca9eb5a)
1*d960600dSMatt Mackall#!/usr/bin/python
2*d960600dSMatt Mackall#
3*d960600dSMatt Mackall# Copyright 2004 Matt Mackall <mpm@selenic.com>
4*d960600dSMatt Mackall#
5*d960600dSMatt Mackall# inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen
6*d960600dSMatt Mackall#
7*d960600dSMatt Mackall# This software may be used and distributed according to the terms
8*d960600dSMatt Mackall# of the GNU General Public License, incorporated herein by reference.
9*d960600dSMatt Mackall
10*d960600dSMatt Mackallimport sys, os, re
11*d960600dSMatt Mackall
12*d960600dSMatt Mackallif len(sys.argv) != 3:
13*d960600dSMatt Mackall    sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
14*d960600dSMatt Mackall    sys.exit(-1)
15*d960600dSMatt Mackall
16*d960600dSMatt Mackalldef getsizes(file):
17*d960600dSMatt Mackall    sym = {}
18*d960600dSMatt Mackall    for l in os.popen("nm --size-sort " + file).readlines():
19*d960600dSMatt Mackall        size, type, name = l[:-1].split()
20*d960600dSMatt Mackall        if type in "tTdDbB":
21*d960600dSMatt Mackall            sym[name] = int(size, 16)
22*d960600dSMatt Mackall    return sym
23*d960600dSMatt Mackall
24*d960600dSMatt Mackallold = getsizes(sys.argv[1])
25*d960600dSMatt Mackallnew = getsizes(sys.argv[2])
26*d960600dSMatt Mackallgrow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
27*d960600dSMatt Mackalldelta, common = [], {}
28*d960600dSMatt Mackall
29*d960600dSMatt Mackallfor a in old:
30*d960600dSMatt Mackall    if a in new:
31*d960600dSMatt Mackall        common[a] = 1
32*d960600dSMatt Mackall
33*d960600dSMatt Mackallfor name in old:
34*d960600dSMatt Mackall    if name not in common:
35*d960600dSMatt Mackall        remove += 1
36*d960600dSMatt Mackall        down += old[name]
37*d960600dSMatt Mackall        delta.append((-old[name], name))
38*d960600dSMatt Mackall
39*d960600dSMatt Mackallfor name in new:
40*d960600dSMatt Mackall    if name not in common:
41*d960600dSMatt Mackall        add += 1
42*d960600dSMatt Mackall        up += new[name]
43*d960600dSMatt Mackall        delta.append((new[name], name))
44*d960600dSMatt Mackall
45*d960600dSMatt Mackallfor name in common:
46*d960600dSMatt Mackall        d = new.get(name, 0) - old.get(name, 0)
47*d960600dSMatt Mackall        if d>0: grow, up = grow+1, up+d
48*d960600dSMatt Mackall        if d<0: shrink, down = shrink+1, down-d
49*d960600dSMatt Mackall        delta.append((d, name))
50*d960600dSMatt Mackall
51*d960600dSMatt Mackalldelta.sort()
52*d960600dSMatt Mackalldelta.reverse()
53*d960600dSMatt Mackall
54*d960600dSMatt Mackallprint "add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
55*d960600dSMatt Mackall      (add, remove, grow, shrink, up, -down, up-down)
56*d960600dSMatt Mackallprint "%-40s %7s %7s %+7s" % ("function", "old", "new", "delta")
57*d960600dSMatt Mackallfor d, n in delta:
58*d960600dSMatt Mackall    if d: print "%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)
59