aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rwxr-xr-xscripts/bloat-o-meter65
-rwxr-xr-xscripts/bloatcheck60
3 files changed, 61 insertions, 66 deletions
diff --git a/Makefile b/Makefile
index d9925d79..95b2dda4 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@ baseline: toybox_unstripped
@cp toybox_unstripped toybox_old
bloatcheck: toybox_old toybox_unstripped
- @scripts/bloat-o-meter toybox_old toybox_unstripped
+ @scripts/bloatcheck toybox_old toybox_unstripped
instlist: toybox
$(HOSTCC) $(CCFLAGS) -I . scripts/install.c -o instlist
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
deleted file mode 100755
index 31364fe1..00000000
--- a/scripts/bloat-o-meter
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/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/bloatcheck b/scripts/bloatcheck
new file mode 100755
index 00000000..a5a28f1c
--- /dev/null
+++ b/scripts/bloatcheck
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+if [ $# -ne 2 ]
+then
+ echo "usage: bloatcheck old new"
+ exit 1
+fi
+
+addline()
+{
+ NEXT="$(printf "%s% $((50-${#LASTNAME}))d% 10d %10d" "$LASTNAME" "$OLD" "$NEW" "$DELTA")"
+ [ -z "$STUFF" ] &&
+ STUFF="$NEXT" ||
+ STUFF="$(printf "%s\n%s" "$STUFF" "$NEXT")"
+}
+
+diff <(nm --size-sort "$1" | sort -k3,3) \
+ <(nm --size-sort "$2" | sort -k3,3) | grep '^[<>]' | sort -k4,4 | \
+(
+LASTNAME=
+DELTA=0
+TOTAL=0
+OLD=0
+NEW=0
+STUFF=
+
+printf "name% 46s% 10s% 11s\n" old new delta
+echo "-----------------------------------------------------------------------"
+while read a b c d
+do
+ THISNAME=$(echo " $d" | sed 's/[.][0-9]*$//')
+
+ if [ "$LASTNAME" != "$THISNAME" ]
+ then
+ TOTAL=$(($TOTAL+$DELTA))
+ [ $DELTA -ne 0 ] && addline
+ LASTNAME="$THISNAME"
+ DELTA=0
+ OLD=0
+ NEW=0
+ fi
+
+ SIZE=$(printf "%d" "0x$b")
+ if [ "$a" == "<" ]
+ then
+ OLD=$(($OLD+$SIZE))
+ SIZE=$((-1*$SIZE))
+ else
+ NEW=$(($NEW+$SIZE))
+ fi
+ DELTA=$(($DELTA+$SIZE))
+done
+
+TOTAL=$(($TOTAL+$DELTA))
+[ $DELTA -ne 0 ] && addline
+
+echo "$STUFF" | sort -k4,4nr
+echo "-----------------------------------------------------------------------"
+printf "% 71d total\n" "$TOTAL"
+)