xref: /linux/scripts/objdiff (revision 18165efa8203a34d82f60a1831ea290e7304c654)
179192ca8SJason Cooper#!/bin/bash
279192ca8SJason Cooper
379192ca8SJason Cooper# objdiff - a small script for validating that a commit or series of commits
479192ca8SJason Cooper# didn't change object code.
579192ca8SJason Cooper#
679192ca8SJason Cooper# Copyright 2014, Jason Cooper <jason@lakedaemon.net>
779192ca8SJason Cooper#
879192ca8SJason Cooper# Licensed under the terms of the GNU GPL version 2
979192ca8SJason Cooper
1079192ca8SJason Cooper# usage example:
1179192ca8SJason Cooper#
1279192ca8SJason Cooper# $ git checkout COMMIT_A
1379192ca8SJason Cooper# $ <your fancy build command here>
1479192ca8SJason Cooper# $ ./scripts/objdiff record path/to/*.o
1579192ca8SJason Cooper#
1679192ca8SJason Cooper# $ git checkout COMMIT_B
1779192ca8SJason Cooper# $ <your fancy build command here>
1879192ca8SJason Cooper# $ ./scripts/objdiff record path/to/*.o
1979192ca8SJason Cooper#
2079192ca8SJason Cooper# $ ./scripts/objdiff diff COMMIT_A COMMIT_B
2179192ca8SJason Cooper# $
2279192ca8SJason Cooper
2379192ca8SJason Cooper# And to clean up (everything is in .tmp_objdiff/*)
2479192ca8SJason Cooper# $ ./scripts/objdiff clean all
2579192ca8SJason Cooper#
2679192ca8SJason Cooper# Note: 'make mrproper' will also remove .tmp_objdiff
2779192ca8SJason Cooper
28*18165efaSMasahiro YamadaSRCTREE=$(cd $(git rev-parse --show-toplevel 2>/dev/null); pwd)
2979192ca8SJason Cooper
30fd6e1242SMasahiro Yamadaif [ -z "$SRCTREE" ]; then
315ab370e9SMasahiro Yamada	echo >&2 "ERROR: Not a git repository."
3279192ca8SJason Cooper	exit 1
3379192ca8SJason Cooperfi
3479192ca8SJason Cooper
35fd6e1242SMasahiro YamadaTMPD=$SRCTREE/.tmp_objdiff
36fd6e1242SMasahiro Yamada
3779192ca8SJason Cooperusage() {
385ab370e9SMasahiro Yamada	echo >&2 "Usage: $0 <command> <args>"
395ab370e9SMasahiro Yamada	echo >&2 "  record    <list of object files>"
405ab370e9SMasahiro Yamada	echo >&2 "  diff      <commitA> <commitB>"
415ab370e9SMasahiro Yamada	echo >&2 "  clean     all | <commit>"
4279192ca8SJason Cooper	exit 1
4379192ca8SJason Cooper}
4479192ca8SJason Cooper
45*18165efaSMasahiro Yamadaget_output_dir() {
46*18165efaSMasahiro Yamada	dir=${1%/*}
47*18165efaSMasahiro Yamada
48*18165efaSMasahiro Yamada	if [ "$dir" = "$1" ]; then
49*18165efaSMasahiro Yamada		dir=.
50*18165efaSMasahiro Yamada	fi
51*18165efaSMasahiro Yamada
52*18165efaSMasahiro Yamada	dir=$(cd $dir; pwd)
53*18165efaSMasahiro Yamada
54*18165efaSMasahiro Yamada	echo $TMPD/$CMT${dir#$SRCTREE}
55*18165efaSMasahiro Yamada}
56*18165efaSMasahiro Yamada
5779192ca8SJason Cooperdorecord() {
5879192ca8SJason Cooper	[ $# -eq 0 ] && usage
5979192ca8SJason Cooper
6079192ca8SJason Cooper	FILES="$*"
6179192ca8SJason Cooper
6279192ca8SJason Cooper	CMT="`git rev-parse --short HEAD`"
6379192ca8SJason Cooper
6479192ca8SJason Cooper	OBJDUMP="${CROSS_COMPILE}objdump"
6579192ca8SJason Cooper
6679192ca8SJason Cooper	for f in $FILES; do
67*18165efaSMasahiro Yamada		dir=$(get_output_dir $f)
6879192ca8SJason Cooper		bn="${f##*/}"
6979192ca8SJason Cooper
70*18165efaSMasahiro Yamada		[ ! -d "$dir" ] && mkdir -p $dir
7179192ca8SJason Cooper
7279192ca8SJason Cooper		# remove addresses for a more clear diff
7379192ca8SJason Cooper		# http://dummdida.tumblr.com/post/60924060451/binary-diff-between-libc-from-scientificlinux-and
74*18165efaSMasahiro Yamada		$OBJDUMP -D $f | sed "s/^[[:space:]]\+[0-9a-f]\+//" > $dir/$bn
7579192ca8SJason Cooper	done
7679192ca8SJason Cooper}
7779192ca8SJason Cooper
7879192ca8SJason Cooperdodiff() {
7979192ca8SJason Cooper	[ $# -ne 2 ] && [ $# -ne 0 ] && usage
8079192ca8SJason Cooper
8179192ca8SJason Cooper	if [ $# -eq 0 ]; then
8279192ca8SJason Cooper		SRC="`git rev-parse --short HEAD^`"
8379192ca8SJason Cooper		DST="`git rev-parse --short HEAD`"
8479192ca8SJason Cooper	else
8579192ca8SJason Cooper		SRC="`git rev-parse --short $1`"
8679192ca8SJason Cooper		DST="`git rev-parse --short $2`"
8779192ca8SJason Cooper	fi
8879192ca8SJason Cooper
8979192ca8SJason Cooper	DIFF="`which colordiff`"
9079192ca8SJason Cooper
9179192ca8SJason Cooper	if [ ${#DIFF} -eq 0 ] || [ ! -x "$DIFF" ]; then
9279192ca8SJason Cooper		DIFF="`which diff`"
9379192ca8SJason Cooper	fi
9479192ca8SJason Cooper
9579192ca8SJason Cooper	SRCD="$TMPD/$SRC"
9679192ca8SJason Cooper	DSTD="$TMPD/$DST"
9779192ca8SJason Cooper
9879192ca8SJason Cooper	if [ ! -d "$SRCD" ]; then
995ab370e9SMasahiro Yamada		echo >&2 "ERROR: $SRCD doesn't exist"
10079192ca8SJason Cooper		exit 1
10179192ca8SJason Cooper	fi
10279192ca8SJason Cooper
10379192ca8SJason Cooper	if [ ! -d "$DSTD" ]; then
1045ab370e9SMasahiro Yamada		echo >&2 "ERROR: $DSTD doesn't exist"
10579192ca8SJason Cooper		exit 1
10679192ca8SJason Cooper	fi
10779192ca8SJason Cooper
10879192ca8SJason Cooper	$DIFF -Nurd $SRCD $DSTD
10979192ca8SJason Cooper}
11079192ca8SJason Cooper
11179192ca8SJason Cooperdoclean() {
11279192ca8SJason Cooper	[ $# -eq 0 ] && usage
11379192ca8SJason Cooper	[ $# -gt 1 ] && usage
11479192ca8SJason Cooper
11579192ca8SJason Cooper	if [ "x$1" = "xall" ]; then
11679192ca8SJason Cooper		rm -rf $TMPD/*
11779192ca8SJason Cooper	else
11879192ca8SJason Cooper		CMT="`git rev-parse --short $1`"
11979192ca8SJason Cooper
12079192ca8SJason Cooper		if [ -d "$TMPD/$CMT" ]; then
12179192ca8SJason Cooper			rm -rf $TMPD/$CMT
12279192ca8SJason Cooper		else
1235ab370e9SMasahiro Yamada			echo >&2 "$CMT not found"
12479192ca8SJason Cooper		fi
12579192ca8SJason Cooper	fi
12679192ca8SJason Cooper}
12779192ca8SJason Cooper
12879192ca8SJason Cooper[ $# -eq 0 ] &&	usage
12979192ca8SJason Cooper
13079192ca8SJason Coopercase "$1" in
13179192ca8SJason Cooper	record)
13279192ca8SJason Cooper		shift
13379192ca8SJason Cooper		dorecord $*
13479192ca8SJason Cooper		;;
13579192ca8SJason Cooper	diff)
13679192ca8SJason Cooper		shift
13779192ca8SJason Cooper		dodiff $*
13879192ca8SJason Cooper		;;
13979192ca8SJason Cooper	clean)
14079192ca8SJason Cooper		shift
14179192ca8SJason Cooper		doclean $*
14279192ca8SJason Cooper		;;
14379192ca8SJason Cooper	*)
1445ab370e9SMasahiro Yamada		echo >&2 "Unrecognized command '$1'"
14579192ca8SJason Cooper		exit 1
14679192ca8SJason Cooper		;;
14779192ca8SJason Cooperesac
148