Skip to content
Snippets Groups Projects
  • Nathan Lynch's avatar
    8998979c
    fix bloat-o-meter for ppc64 · 8998979c
    Nathan Lynch authored
    
    bloat-o-meter assumes that a '.' anywhere in a symbol's name means that it
    is static and prepends 'static.' to the first part of the symbol name,
    discarding the portion of the name that follows the '.'.  However, the
    names of function entry points begin with '.' in the ppc64 ABI.  This
    causes all function text size changes to be accounted to a single 'static.'
    entry in the output when comparing ppc64 kernels.
    
    Change getsizes() to ignore the first character of the symbol name when
    searching for '.'.
    
    Signed-off-by: default avatarNathan Lynch <ntl@pobox.com>
    Cc: Matt Mackall <mpm@selenic.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8998979c
    History
    fix bloat-o-meter for ppc64
    Nathan Lynch authored
    
    bloat-o-meter assumes that a '.' anywhere in a symbol's name means that it
    is static and prepends 'static.' to the first part of the symbol name,
    discarding the portion of the name that follows the '.'.  However, the
    names of function entry points begin with '.' in the ppc64 ABI.  This
    causes all function text size changes to be accounted to a single 'static.'
    entry in the output when comparing ppc64 kernels.
    
    Change getsizes() to ignore the first character of the symbol name when
    searching for '.'.
    
    Signed-off-by: default avatarNathan Lynch <ntl@pobox.com>
    Cc: Matt Mackall <mpm@selenic.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
bloat-o-meter 1.67 KiB
#!/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

if len(sys.argv) != 3:
    sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
    sys.exit(-1)

def getsizes(file):
    sym = {}
    for l in os.popen("nm --size-sort " + file).readlines():
        size, type, name = l[:-1].split()
        if type in "tTdDbB":
            # function names begin with '.' on 64-bit powerpc
            if "." in name[1:]: name = "static." + name.split(".")[0]
            sym[name] = sym.get(name, 0) + int(size, 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 "add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
      (add, remove, grow, shrink, up, -down, up-down)
print "%-40s %7s %7s %+7s" % ("function", "old", "new", "delta")
for d, n in delta:
    if d: print "%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d)