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