diff options
Diffstat (limited to 'scripts/objdiff')
-rwxr-xr-x | scripts/objdiff | 74 |
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 | ||
28 | GIT_DIR="`git rev-parse --git-dir`" | 28 | SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd) |
29 | 29 | ||
30 | if [ -d "$GIT_DIR" ]; then | 30 | if [ -z "$SRCTREE" ]; then |
31 | TMPD="${GIT_DIR%git}tmp_objdiff" | 31 | echo >&2 "ERROR: Not a git repository." |
32 | |||
33 | [ -d "$TMPD" ] || mkdir "$TMPD" | ||
34 | else | ||
35 | echo "ERROR: git directory not found." | ||
36 | exit 1 | 32 | exit 1 |
37 | fi | 33 | fi |
38 | 34 | ||
35 | TMPD=$SRCTREE/.tmp_objdiff | ||
36 | |||
39 | usage() { | 37 | usage() { |
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 | ||
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 | |||
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 | |||
47 | dorecord() { | 69 | dorecord() { |
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 | ;; |
141 | esac | 159 | esac |