aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/objdiff
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/objdiff')
-rwxr-xr-xscripts/objdiff74
1 files changed, 46 insertions, 28 deletions
diff --git a/scripts/objdiff b/scripts/objdiff
index b3e4f10bfc3e..62e51dae2138 100755
--- a/scripts/objdiff
+++ b/scripts/objdiff
@@ -25,25 +25,47 @@
25# 25#
26# Note: 'make mrproper' will also remove .tmp_objdiff 26# Note: 'make mrproper' will also remove .tmp_objdiff
27 27
28GIT_DIR="`git rev-parse --git-dir`" 28SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd)
29 29
30if [ -d "$GIT_DIR" ]; then 30if [ -z "$SRCTREE" ]; then
31 TMPD="${GIT_DIR%git}tmp_objdiff" 31 echo >&2 "ERROR: Not a git repository."
32
33 [ -d "$TMPD" ] || mkdir "$TMPD"
34else
35 echo "ERROR: git directory not found."
36 exit 1 32 exit 1
37fi 33fi
38 34
35TMPD=$SRCTREE/.tmp_objdiff
36
39usage() { 37usage() {
40 echo "Usage: $0 <command> <args>" 38 echo >&2 "Usage: $0 <command> <args>"
41 echo " record <list of object files>" 39 echo >&2 " record <list of object files or directories>"
42 echo " diff <commitA> <commitB>" 40 echo >&2 " diff <commitA> <commitB>"
43 echo " clean all | <commit>" 41 echo >&2 " clean all | <commit>"
44 exit 1 42 exit 1
45} 43}
46 44
45get_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
57do_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
47dorecord() { 69dorecord() {
48 [ $# -eq 0 ] && usage 70 [ $# -eq 0 ] && usage
49 71
@@ -52,20 +74,16 @@ dorecord() {
52 CMT="`git rev-parse --short HEAD`" 74 CMT="`git rev-parse --short HEAD`"
53 75
54 OBJDUMP="${CROSS_COMPILE}objdump" 76 OBJDUMP="${CROSS_COMPILE}objdump"
55 OBJDIFFD="$TMPD/$CMT"
56
57 [ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD"
58 77
59 for f in $FILES; do 78 for d in $FILES; do
60 dn="${f%/*}" 79 if [ -d "$d" ]; then
61 bn="${f##*/}" 80 for f in $(find $d -name '*.o')
62 81 do
63 [ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn" 82 do_objdump $f
64 83 done
65 # remove addresses for a more clear diff 84 else
66 # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and 85 do_objdump $d
67 $OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \ 86 fi
68 >"$OBJDIFFD/$dn/$bn"
69 done 87 done
70} 88}
71 89
@@ -90,12 +108,12 @@ dodiff() {
90 DSTD="$TMPD/$DST" 108 DSTD="$TMPD/$DST"
91 109
92 if [ ! -d "$SRCD" ]; then 110 if [ ! -d "$SRCD" ]; then
93 echo "ERROR: $SRCD doesn't exist" 111 echo >&2 "ERROR: $SRCD doesn't exist"
94 exit 1 112 exit 1
95 fi 113 fi
96 114
97 if [ ! -d "$DSTD" ]; then 115 if [ ! -d "$DSTD" ]; then
98 echo "ERROR: $DSTD doesn't exist" 116 echo >&2 "ERROR: $DSTD doesn't exist"
99 exit 1 117 exit 1
100 fi 118 fi
101 119
@@ -114,7 +132,7 @@ doclean() {
114 if [ -d "$TMPD/$CMT" ]; then 132 if [ -d "$TMPD/$CMT" ]; then
115 rm -rf $TMPD/$CMT 133 rm -rf $TMPD/$CMT
116 else 134 else
117 echo "$CMT not found" 135 echo >&2 "$CMT not found"
118 fi 136 fi
119 fi 137 fi
120} 138}
@@ -135,7 +153,7 @@ case "$1" in
135 doclean $* 153 doclean $*
136 ;; 154 ;;
137 *) 155 *)
138 echo "Unrecognized command '$1'" 156 echo >&2 "Unrecognized command '$1'"
139 exit 1 157 exit 1
140 ;; 158 ;;
141esac 159esac