#!/usr/bin/python
#
# Copyright 2004 Matt Mackall <mpm@selenic.com>
#
# inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.

import sys, os, re

def usage():
    sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
    sys.exit(-1)

if len(sys.argv) < 3:
    usage()

for f in sys.argv[1:3]:
    if not os.path.exists(f):
        sys.stderr.write("Error: file '%s' does not exist\n" % f)
        usage()

nm_args = " ".join(sys.argv[3:])
def getsizes(file):
    sym = {}
    for l in os.popen("nm --size-sort %s %s" % (nm_args, file)).readlines():
        l = l.strip()
        # Skip empty lines
        if not len(l): continue
        # Skip archive members
        if len(l.split()) == 1 and l.endswith(':'):
          continue
        size, type, name = l.split()
        if type in "tTdDbBrR":
            if "." in name: name = "static." + name.split(".")[0]
            sym[name] = sym.get(name, 0) + int(size, 16)
    for l in os.popen("readelf -S " + file).readlines():
        x = l.split()
        if len(x)<6 or x[1] != ".rodata": continue
        sym[".rodata"] = int(x[5], 16)
    return sym

old = getsizes(sys.argv[1])
new = getsizes(sys.argv[2])
grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
delta, common = [], {}

for a in old:
    if a in new:
        common[a] = 1

for name in old:
    if name not in common:
        remove += 1
        down += old[name]
        delta.append((-old[name], name))

for name in new:
    if name not in common:
        add += 1
        up += new[name]
        delta.append((new[name], name))

for name in common:
        d = new.get(name, 0) - old.get(name, 0)
        if d>0: grow, up = grow+1, up+d
        if d<0: shrink, down = shrink+1, down-d
        delta.append((d, name))

delta.sort()
delta.reverse()

print "%-48s %7s %7s %+7s" % ("function", "old", "new", "delta")
for d, n in delta:
    if d: print "%-48s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)
print "-"*78
total="(add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s)%%sTotal: %s bytes"\
    % (add, remove, grow, shrink, up, -down, up-down)
print total % (" "*(80-len(total)))
