0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd)
0029
0030 if [ -z "$SRCTREE" ]; then
0031 echo >&2 "ERROR: Not a git repository."
0032 exit 1
0033 fi
0034
0035 TMPD=$SRCTREE/.objdiff
0036
0037 usage() {
0038 echo >&2 "Usage: $0 <command> <args>"
0039 echo >&2 " record <list of object files or directories>"
0040 echo >&2 " diff <commitA> <commitB>"
0041 echo >&2 " clean all | <commit>"
0042 exit 1
0043 }
0044
0045 get_output_dir() {
0046 dir=${1%/*}
0047
0048 if [ "$dir" = "$1" ]; then
0049 dir=.
0050 fi
0051
0052 dir=$(cd $dir; pwd)
0053
0054 echo $TMPD/$CMT${dir
0055 }
0056
0057 do_objdump() {
0058 dir=$(get_output_dir $1)
0059 base=${1
0060 stripped=$dir/${base%.o}.stripped
0061 dis=$dir/${base%.o}.dis
0062
0063 [ ! -d "$dir" ] && mkdir -p $dir
0064
0065
0066
0067 $STRIP -g $1 -R __bug_table -R .note -R .comment -o $stripped
0068 $OBJDUMP -D $stripped | sed -e "s/^[[:space:]]\+[0-9a-f]\+//" -e "s:^$stripped:$1:" > $dis
0069 }
0070
0071 dorecord() {
0072 [ $
0073
0074 FILES="$*"
0075
0076 CMT="`git rev-parse --short HEAD`"
0077
0078 STRIP="${CROSS_COMPILE}strip"
0079 OBJDUMP="${CROSS_COMPILE}objdump"
0080
0081 for d in $FILES; do
0082 if [ -d "$d" ]; then
0083 for f in $(find $d -name '*.o')
0084 do
0085 do_objdump $f
0086 done
0087 else
0088 do_objdump $d
0089 fi
0090 done
0091 }
0092
0093 dodiff() {
0094 [ $
0095
0096 if [ $
0097 SRC="`git rev-parse --short HEAD^`"
0098 DST="`git rev-parse --short HEAD`"
0099 else
0100 SRC="`git rev-parse --short $1`"
0101 DST="`git rev-parse --short $2`"
0102 fi
0103
0104 DIFF="`which colordiff`"
0105
0106 if [ ${
0107 DIFF="`which diff`"
0108 fi
0109
0110 SRCD="$TMPD/$SRC"
0111 DSTD="$TMPD/$DST"
0112
0113 if [ ! -d "$SRCD" ]; then
0114 echo >&2 "ERROR: $SRCD doesn't exist"
0115 exit 1
0116 fi
0117
0118 if [ ! -d "$DSTD" ]; then
0119 echo >&2 "ERROR: $DSTD doesn't exist"
0120 exit 1
0121 fi
0122
0123 $DIFF -Nurd $SRCD $DSTD
0124 }
0125
0126 doclean() {
0127 [ $
0128 [ $
0129
0130 if [ "x$1" = "xall" ]; then
0131 rm -rf $TMPD/*
0132 else
0133 CMT="`git rev-parse --short $1`"
0134
0135 if [ -d "$TMPD/$CMT" ]; then
0136 rm -rf $TMPD/$CMT
0137 else
0138 echo >&2 "$CMT not found"
0139 fi
0140 fi
0141 }
0142
0143 [ $
0144
0145 case "$1" in
0146 record)
0147 shift
0148 dorecord $*
0149 ;;
0150 diff)
0151 shift
0152 dodiff $*
0153 ;;
0154 clean)
0155 shift
0156 doclean $*
0157 ;;
0158 *)
0159 echo >&2 "Unrecognized command '$1'"
0160 exit 1
0161 ;;
0162 esac