~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/scripts/bloat-o-meter

Version: ~ [ linux-5.15-rc7 ] ~ [ linux-5.14.14 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.75 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.155 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.213 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.252 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.287 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.289 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/usr/bin/env python3
  2 #
  3 # Copyright 2004 Matt Mackall <mpm@selenic.com>
  4 #
  5 # inspired by perl Bloat-O-Meter (c) 1997 by Andi Kleen
  6 #
  7 # This software may be used and distributed according to the terms
  8 # of the GNU General Public License, incorporated herein by reference.
  9 
 10 import sys, os, re
 11 from signal import signal, SIGPIPE, SIG_DFL
 12 
 13 signal(SIGPIPE, SIG_DFL)
 14 
 15 if len(sys.argv) < 3:
 16     sys.stderr.write("usage: %s [option] file1 file2\n" % sys.argv[0])
 17     sys.stderr.write("The options are:\n")
 18     sys.stderr.write("-c        categorize output based on symbol type\n")
 19     sys.stderr.write("-d        Show delta of Data Section\n")
 20     sys.stderr.write("-t        Show delta of text Section\n")
 21     sys.exit(-1)
 22 
 23 re_NUMBER = re.compile(r'\.[0-9]+')
 24 
 25 def getsizes(file, format):
 26     sym = {}
 27     with os.popen("nm --size-sort " + file) as f:
 28         for line in f:
 29             if line.startswith("\n") or ":" in line:
 30                 continue
 31             size, type, name = line.split()
 32             if type in format:
 33                 # strip generated symbols
 34                 if name.startswith("__mod_"): continue
 35                 if name.startswith("__se_sys"): continue
 36                 if name.startswith("__se_compat_sys"): continue
 37                 if name.startswith("__addressable_"): continue
 38                 if name == "linux_banner": continue
 39                 # statics and some other optimizations adds random .NUMBER
 40                 name = re_NUMBER.sub('', name)
 41                 sym[name] = sym.get(name, 0) + int(size, 16)
 42     return sym
 43 
 44 def calc(oldfile, newfile, format):
 45     old = getsizes(oldfile, format)
 46     new = getsizes(newfile, format)
 47     grow, shrink, add, remove, up, down = 0, 0, 0, 0, 0, 0
 48     delta, common = [], {}
 49     otot, ntot = 0, 0
 50 
 51     for a in old:
 52         if a in new:
 53             common[a] = 1
 54 
 55     for name in old:
 56         otot += old[name]
 57         if name not in common:
 58             remove += 1
 59             down += old[name]
 60             delta.append((-old[name], name))
 61 
 62     for name in new:
 63         ntot += new[name]
 64         if name not in common:
 65             add += 1
 66             up += new[name]
 67             delta.append((new[name], name))
 68 
 69     for name in common:
 70         d = new.get(name, 0) - old.get(name, 0)
 71         if d>0: grow, up = grow+1, up+d
 72         if d<0: shrink, down = shrink+1, down-d
 73         delta.append((d, name))
 74 
 75     delta.sort()
 76     delta.reverse()
 77     return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot
 78 
 79 def print_result(symboltype, symbolformat, argc):
 80     grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \
 81     calc(sys.argv[argc - 1], sys.argv[argc], symbolformat)
 82 
 83     print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
 84           (add, remove, grow, shrink, up, -down, up-down))
 85     print("%-40s %7s %7s %+7s" % (symboltype, "old", "new", "delta"))
 86     for d, n in delta:
 87         if d: print("%-40s %7s %7s %+7d" % (n, old.get(n,"-"), new.get(n,"-"), d))
 88 
 89     if otot:
 90         percent = (ntot - otot) * 100.0 / otot
 91     else:
 92         percent = 0
 93     print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent))
 94 
 95 if sys.argv[1] == "-c":
 96     print_result("Function", "tT", 3)
 97     print_result("Data", "dDbB", 3)
 98     print_result("RO Data", "rR", 3)
 99 elif sys.argv[1] == "-d":
100     print_result("Data", "dDbBrR", 3)
101 elif sys.argv[1] == "-t":
102     print_result("Function", "tT", 3)
103 else:
104     print_result("Function", "tTdDbBrR", 2)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp