summaryrefslogtreecommitdiff
path: root/utils/analysis
diff options
context:
space:
mode:
authorAndrew Mahone <andrew.mahone@gmail.com>2009-04-10 02:42:50 +0000
committerAndrew Mahone <andrew.mahone@gmail.com>2009-04-10 02:42:50 +0000
commit88e2c8849d286554d1a0bf93623ffbf879f26bdf (patch)
tree78e2baea27d372a01e1a7f41fee05ffe13ceb0b9 /utils/analysis
parentcd6cbf50013aae91e937a7506d82d0ed38cecdde (diff)
downloadrockbox-88e2c8849d286554d1a0bf93623ffbf879f26bdf.tar.gz
rockbox-88e2c8849d286554d1a0bf93623ffbf879f26bdf.zip
Add new directory under utils for code-analysis tools, and objdiff.py script to display per-symbol size deltas between object files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20672 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/analysis')
-rwxr-xr-xutils/analysis/objdiff.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/utils/analysis/objdiff.py b/utils/analysis/objdiff.py
new file mode 100755
index 0000000000..dc51441bfa
--- /dev/null
+++ b/utils/analysis/objdiff.py
@@ -0,0 +1,54 @@
1#!/usr/bin/python
2import sys
3from subprocess import Popen, PIPE
4
5if len(sys.argv) != 3:
6 print """%s usage:
7 %s obj1 obj2
8 Calculate per-symbol and total size differences between obj1 and obj2,
9 which may be any files that nm can read""" % ((sys.argv[0],)*2)
10 sys.exit(2)
11
12obj1 = sys.argv[1]
13obj2 = sys.argv[2]
14
15def getsyms(obj):
16 proc = Popen(args=['nm', '-S', '-t', 'd', obj], stdout=PIPE, stderr=PIPE)
17 out, err = proc.communicate()
18 if err:
19 print "nm reported an error:\n"
20 print err
21 sys.exit(1)
22 d = {}
23 for l in out.splitlines():
24 l = l.strip().split()
25 if len(l) == 4:
26 d[l[3]] = int(l[1])
27 return d
28
29diff = 0
30
31d1 = getsyms(obj1)
32d2 = getsyms(obj2)
33l = [(k,v) for k,v in sorted(d1.items()) if k not in d2]
34if l:
35 print "only in %s" % obj1
36 print ''.join(" %6d %s\n" % (v,k) for k,v in l)
37 diff -= sum(v for k,v in l)
38
39l = [(k,v) for k,v in sorted(d2.items()) if k not in d1]
40if l:
41 print "only in %s" % obj2
42 print ''.join("%6d %s\n" % (v,k) for k,v in l)
43 diff += sum(v for k,v in l)
44
45l = [(k,v,d2[k]) for k,v in sorted(d1.items()) if k in d2 and d2[k] != v]
46if l:
47 print "different sizes in %s and %s:" %(obj1, obj2)
48 print ''.join(" %6d %6d %s\n" % (v1,v2,k) for k,v1,v2 in l)
49 diff += sum(v2-v1 for k,v1,v2 in l)
50
51if diff:
52 print "total size difference: %+d" % diff
53else:
54 print "total size difference: 0"