Merge branch 'drm-vmwgfx-fixes' of ssh://people.freedesktop.org/~syeh/repos_linux...
[cascardo/linux.git] / scripts / objdiff
index 6e72f96..62e51da 100755 (executable)
@@ -25,7 +25,7 @@
 #
 # Note: 'make mrproper' will also remove .tmp_objdiff
 
-SRCTREE=$(git rev-parse --show-toplevel 2>/dev/null)
+SRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd)
 
 if [ -z "$SRCTREE" ]; then
        echo >&2 "ERROR: Not a git repository."
@@ -36,12 +36,36 @@ TMPD=$SRCTREE/.tmp_objdiff
 
 usage() {
        echo >&2 "Usage: $0 <command> <args>"
-       echo >&2 "  record    <list of object files>"
+       echo >&2 "  record    <list of object files or directories>"
        echo >&2 "  diff      <commitA> <commitB>"
        echo >&2 "  clean     all | <commit>"
        exit 1
 }
 
+get_output_dir() {
+       dir=${1%/*}
+
+       if [ "$dir" = "$1" ]; then
+               dir=.
+       fi
+
+       dir=$(cd $dir; pwd)
+
+       echo $TMPD/$CMT${dir#$SRCTREE}
+}
+
+do_objdump() {
+       dir=$(get_output_dir $1)
+       base=${1##*/}
+       dis=$dir/${base%.o}.dis
+
+       [ ! -d "$dir" ] && mkdir -p $dir
+
+       # remove addresses for a cleaner diff
+       # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
+       $OBJDUMP -D $1 | sed "s/^[[:space:]]\+[0-9a-f]\+//" > $dis
+}
+
 dorecord() {
        [ $# -eq 0 ] && usage
 
@@ -50,18 +74,16 @@ dorecord() {
        CMT="`git rev-parse --short HEAD`"
 
        OBJDUMP="${CROSS_COMPILE}objdump"
-       OBJDIFFD="$TMPD/$CMT"
-
-       for f in $FILES; do
-               dn="${f%/*}"
-               bn="${f##*/}"
 
-               [ ! -d "$OBJDIFFD/$dn" ] && mkdir -p "$OBJDIFFD/$dn"
-
-               # remove addresses for a more clear diff
-               # http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
-               $OBJDUMP -D "$f" | sed "s/^[[:space:]]\+[0-9a-f]\+//" \
-                       >"$OBJDIFFD/$dn/$bn"
+       for d in $FILES; do
+               if [ -d "$d" ]; then
+                       for f in $(find $d -name '*.o')
+                       do
+                               do_objdump $f
+                       done
+               else
+                       do_objdump $d
+               fi
        done
 }