aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-11-26 18:47:14 -0500
committerRob Landley <rob@landley.net>2006-11-26 18:47:14 -0500
commitcd2edfd6a13848e387f836252464de4662a22205 (patch)
treef79cef475f032832d51033291e2c95a0197e5402 /scripts
parent28a0dec5dd19458200a18609ba0cc8c2f3b4d22f (diff)
downloadtoybox-cd2edfd6a13848e387f836252464de4662a22205.tar.gz
Add bloat-o-meter, make bloatcheck, and scripts/showasm.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/bloat-o-meter65
-rwxr-xr-xscripts/showasm20
2 files changed, 85 insertions, 0 deletions
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
new file mode 100755
index 00000000..31364fe1
--- /dev/null
+++ b/scripts/bloat-o-meter
@@ -0,0 +1,65 @@
+#!/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":
+ 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)))
diff --git a/scripts/showasm b/scripts/showasm
new file mode 100755
index 00000000..75a6efd7
--- /dev/null
+++ b/scripts/showasm
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Copyright 2006 Rob Landley <rob@landley.net>
+
+# Dumb little utility function to print out the assembly dump of a single
+# function, or list the functions so dumpable in an executable. You'd think
+# there would be a way to get objdump to do this, but I can't find it.
+
+[ $# -lt 1 ] || [ $# -gt 2 ] && { echo "usage: showasm file function"; exit 1; }
+
+[ ! -f $1 ] && { echo "File $1 not found"; exit 1; }
+
+if [ $# -eq 1 ]
+then
+ objdump -d $1 | sed -n -e 's/^[0-9a-fA-F]* <\(.*\)>:$/\1/p'
+ exit 0
+fi
+
+objdump -d $1 | sed -n -e '/./{H;$!d}' -e "x;/^.[0-9a-fA-F]* <$2>:/p"
+