diff options
Diffstat (limited to 'scripts/objdiff')
| -rwxr-xr-x | scripts/objdiff | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/scripts/objdiff b/scripts/objdiff new file mode 100755 index 000000000000..b3e4f10bfc3e --- /dev/null +++ b/scripts/objdiff | |||
| @@ -0,0 +1,141 @@ | |||
| 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 | |||
| 28 | GIT_DIR="`git rev-parse --git-dir`" | ||
| 29 | |||
| 30 | if [ -d "$GIT_DIR" ]; then | ||
| 31 | TMPD="${GIT_DIR%git}tmp_objdiff" | ||
| 32 | |||
| 33 | [ -d "$TMPD" ] || mkdir "$TMPD" | ||
| 34 | else | ||
| 35 | echo "ERROR: git directory not found." | ||
| 36 | exit 1 | ||
| 37 | fi | ||
| 38 | |||
| 39 | usage() { | ||
| 40 | echo "Usage: $0 <command> <args>" | ||
| 41 | echo " record <list of object files>" | ||
| 42 | echo " diff <commitA> <commitB>" | ||
| 43 | echo " clean all | <commit>" | ||
| 44 | exit 1 | ||
| 45 | } | ||
| 46 | |||
| 47 | dorecord() { | ||
| 48 | [ $# -eq 0 ] && usage | ||
| 49 | |||
| 50 | FILES="$*" | ||
| 51 | |||
| 52 | CMT="`git rev-parse --short HEAD`" | ||
| 53 | |||
| 54 | OBJDUMP="${CROSS_COMPILE}objdump" | ||
| 55 | OBJDIFFD="$TMPD/$CMT" | ||
| 56 | |||
| 57 | [ ! -d "$OBJDIFFD" ] && mkdir -p "$OBJDIFFD" | ||
| 58 | |||
| 59 | for f in $FILES; do | ||
| 60 | dn="${f%/*}" | ||
| 61 | bn="${f##*/}" | ||
| 62 | |||
| 63 | [ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn" | ||
| 64 | |||
| 65 | # remove addresses for a more clear diff | ||
| 66 | # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and | ||
| 67 | $OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \ | ||
| 68 | >"$OBJDIFFD/$dn/$bn" | ||
| 69 | done | ||
| 70 | } | ||
| 71 | |||
| 72 | dodiff() { | ||
| 73 | [ $# -ne 2 ] && [ $# -ne 0 ] && usage | ||
| 74 | |||
| 75 | if [ $# -eq 0 ]; then | ||
| 76 | SRC="`git rev-parse --short HEAD^`" | ||
| 77 | DST="`git rev-parse --short HEAD`" | ||
| 78 | else | ||
| 79 | SRC="`git rev-parse --short $1`" | ||
| 80 | DST="`git rev-parse --short $2`" | ||
| 81 | fi | ||
| 82 | |||
| 83 | DIFF="`which colordiff`" | ||
| 84 | |||
| 85 | if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then | ||
| 86 | DIFF="`which diff`" | ||
| 87 | fi | ||
| 88 | |||
| 89 | SRCD="$TMPD/$SRC" | ||
| 90 | DSTD="$TMPD/$DST" | ||
| 91 | |||
| 92 | if [ ! -d "$SRCD" ]; then | ||
| 93 | echo "ERROR: $SRCD doesn't exist" | ||
| 94 | exit 1 | ||
| 95 | fi | ||
| 96 | |||
| 97 | if [ ! -d "$DSTD" ]; then | ||
| 98 | echo "ERROR: $DSTD doesn't exist" | ||
| 99 | exit 1 | ||
| 100 | fi | ||
| 101 | |||
| 102 | $DIFF -Nurd $SRCD $DSTD | ||
| 103 | } | ||
| 104 | |||
| 105 | doclean() { | ||
| 106 | [ $# -eq 0 ] && usage | ||
| 107 | [ $# -gt 1 ] && usage | ||
| 108 | |||
| 109 | if [ "x$1" = "xall" ]; then | ||
| 110 | rm -rf $TMPD/* | ||
| 111 | else | ||
| 112 | CMT="`git rev-parse --short $1`" | ||
| 113 | |||
| 114 | if [ -d "$TMPD/$CMT" ]; then | ||
| 115 | rm -rf $TMPD/$CMT | ||
| 116 | else | ||
| 117 | echo "$CMT not found" | ||
| 118 | fi | ||
| 119 | fi | ||
| 120 | } | ||
| 121 | |||
| 122 | [ $# -eq 0 ] && usage | ||
| 123 | |||
| 124 | case "$1" in | ||
| 125 | record) | ||
| 126 | shift | ||
| 127 | dorecord $* | ||
| 128 | ;; | ||
| 129 | diff) | ||
| 130 | shift | ||
| 131 | dodiff $* | ||
| 132 | ;; | ||
| 133 | clean) | ||
| 134 | shift | ||
| 135 | doclean $* | ||
| 136 | ;; | ||
| 137 | *) | ||
| 138 | echo "Unrecognized command '$1'" | ||
| 139 | exit 1 | ||
| 140 | ;; | ||
| 141 | esac | ||
