Commit | Line | Data |
---|---|---|
79192ca8 JC |
1 | #!/bin/bash |
2 | ||
3 | # objdiff - a small script for validating that a commit or series of commits | |
4 | # didn't change object code. | |
5 | # | |
6 | # Copyright 2014, Jason Cooper <jason@lakedaemon.net> | |
7 | # | |
8 | # Licensed under the terms of the GNU GPL version 2 | |
9 | ||
10 | # usage example: | |
11 | # | |
12 | # $ git checkout COMMIT_A | |
13 | # $ <your fancy build command here> | |
14 | # $ ./scripts/objdiff record path/to/*.o | |
15 | # | |
16 | # $ git checkout COMMIT_B | |
17 | # $ <your fancy build command here> | |
18 | # $ ./scripts/objdiff record path/to/*.o | |
19 | # | |
20 | # $ ./scripts/objdiff diff COMMIT_A COMMIT_B | |
21 | # $ | |
22 | ||
23 | # And to clean up (everything is in .tmp_objdiff/*) | |
24 | # $ ./scripts/objdiff clean all | |
25 | # | |
26 | # Note: 'make mrproper' will also remove .tmp_objdiff | |
27 | ||
18165efa | 28 | SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) |
79192ca8 | 29 | |
fd6e1242 | 30 | if [ -z "$SRCTREE" ]; then |
5ab370e9 | 31 | echo >&2 "ERROR: Not a git repository." |
79192ca8 JC |
32 | exit 1 |
33 | fi | |
34 | ||
fd6e1242 MY |
35 | TMPD=$SRCTREE/.tmp_objdiff |
36 | ||
79192ca8 | 37 | usage() { |
5ab370e9 | 38 | echo >&2 "Usage: $0 <command> <args>" |
7fa0e6db | 39 | echo >&2 " record <list of object files or directories>" |
5ab370e9 MY |
40 | echo >&2 " diff <commitA> <commitB>" |
41 | echo >&2 " clean all | <commit>" | |
79192ca8 JC |
42 | exit 1 |
43 | } | |
44 | ||
18165efa MY |
45 | get_output_dir() { |
46 | dir=${1%/*} | |
47 | ||
48 | if [ "$dir" = "$1" ]; then | |
49 | dir=. | |
50 | fi | |
51 | ||
52 | dir=$(cd $dir; pwd) | |
53 | ||
54 | echo $TMPD/$CMT${dir#$SRCTREE} | |
55 | } | |
56 | ||
7fa0e6db MY |
57 | do_objdump() { |
58 | dir=$(get_output_dir $1) | |
59 | base=${1##*/} | |
60 | dis=$dir/${base%.o}.dis | |
61 | ||
62 | [ ! -d "$dir" ] && mkdir -p $dir | |
63 | ||
64 | # remove addresses for a cleaner diff | |
65 | # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and | |
66 | $OBJDUMP -D $1 | sed "s/^[[:space:]]\+[0-9a-f]\+//" > $dis | |
67 | } | |
68 | ||
79192ca8 JC |
69 | dorecord() { |
70 | [ $# -eq 0 ] && usage | |
71 | ||
72 | FILES="$*" | |
73 | ||
74 | CMT="`git rev-parse --short HEAD`" | |
75 | ||
76 | OBJDUMP="${CROSS_COMPILE}objdump" | |
79192ca8 | 77 | |
7fa0e6db MY |
78 | for d in $FILES; do |
79 | if [ -d "$d" ]; then | |
80 | for f in $(find $d -name '*.o') | |
81 | do | |
82 | do_objdump $f | |
83 | done | |
84 | else | |
85 | do_objdump $d | |
86 | fi | |
79192ca8 JC |
87 | done |
88 | } | |
89 | ||
90 | dodiff() { | |
91 | [ $# -ne 2 ] && [ $# -ne 0 ] && usage | |
92 | ||
93 | if [ $# -eq 0 ]; then | |
94 | SRC="`git rev-parse --short HEAD^`" | |
95 | DST="`git rev-parse --short HEAD`" | |
96 | else | |
97 | SRC="`git rev-parse --short $1`" | |
98 | DST="`git rev-parse --short $2`" | |
99 | fi | |
100 | ||
101 | DIFF="`which colordiff`" | |
102 | ||
103 | if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then | |
104 | DIFF="`which diff`" | |
105 | fi | |
106 | ||
107 | SRCD="$TMPD/$SRC" | |
108 | DSTD="$TMPD/$DST" | |
109 | ||
110 | if [ ! -d "$SRCD" ]; then | |
5ab370e9 | 111 | echo >&2 "ERROR: $SRCD doesn't exist" |
79192ca8 JC |
112 | exit 1 |
113 | fi | |
114 | ||
115 | if [ ! -d "$DSTD" ]; then | |
5ab370e9 | 116 | echo >&2 "ERROR: $DSTD doesn't exist" |
79192ca8 JC |
117 | exit 1 |
118 | fi | |
119 | ||
120 | $DIFF -Nurd $SRCD $DSTD | |
121 | } | |
122 | ||
123 | doclean() { | |
124 | [ $# -eq 0 ] && usage | |
125 | [ $# -gt 1 ] && usage | |
126 | ||
127 | if [ "x$1" = "xall" ]; then | |
128 | rm -rf $TMPD/* | |
129 | else | |
130 | CMT="`git rev-parse --short $1`" | |
131 | ||
132 | if [ -d "$TMPD/$CMT" ]; then | |
133 | rm -rf $TMPD/$CMT | |
134 | else | |
5ab370e9 | 135 | echo >&2 "$CMT not found" |
79192ca8 JC |
136 | fi |
137 | fi | |
138 | } | |
139 | ||
140 | [ $# -eq 0 ] && usage | |
141 | ||
142 | case "$1" in | |
143 | record) | |
144 | shift | |
145 | dorecord $* | |
146 | ;; | |
147 | diff) | |
148 | shift | |
149 | dodiff $* | |
150 | ;; | |
151 | clean) | |
152 | shift | |
153 | doclean $* | |
154 | ;; | |
155 | *) | |
5ab370e9 | 156 | echo >&2 "Unrecognized command '$1'" |
79192ca8 JC |
157 | exit 1 |
158 | ;; | |
159 | esac |