#!/bin/bash

src=$1; shift
dst=$1; shift
obj=$1; shift
sym=$1; shift

if [ -n "$sym" ] ; then

	readarray A < <(objdump -dr $src/$obj | awk "/>:\$/ { P=0; } /$sym(.cold.[[:digit:]]*)*>:\$/ { P=1; O=strtonum(\"0x\" \$1); } { if (P) { o=strtonum(\"0x\" \$1); printf(\"%04x \", o-O); print \$0; } }");
	readarray B < <(objdump -dr $dst/$obj | awk "/>:\$/ { P=0; } /$sym(.cold.[[:digit:]]*)*>:\$/ { P=1; O=strtonum(\"0x\" \$1); } { if (P) { o=strtonum(\"0x\" \$1); printf(\"%04x \", o-O); print \$0; } }");

	for ((i=0; i<${#A[*]} || i<${#B[*]}; i++));
	do
		if [ "${A[$i]}" = "${B[$i]}" ] ; then
			sep="|"
		else
			sep="\\"
		fi
		printf "%-80.80s%c%s %-80.80s\n" "${A[$i]%%[[:space:]]}" $'\x1d' $sep "${B[$i]%%[[:space:]]}" ;

	done | column -t -s$'\x1d'
	exit;
fi

if [ -n "$obj" ] ; then

	readelf -Ws $src/$obj | grep -v "\.cold\." | awk '/DEFAULT/ { if ($3 > 0) { print $8 } }' | while read sym ;
	do
		s1=$(readelf -Ws $src/$obj | awk "/\<$sym\>/ { s+=\$3 } END { print s }");
		s2=$(readelf -Ws $dst/$obj | awk "/\<$sym\>/ { s+=\$3 } END { print s }");
		if [ "$s1" -ne "$s2" ] ;
		then
			printf "%-50s %10d %10d   %+d\n" $sym $s1 $s2 $(($s2-$s1));
		fi;
	done;
	exit;
fi

find ${src}/ -name \*.o | grep -v -e piggy\.o -e \.tmp_ -e vmlinux\.o | ( while read file ;
do
	file=${file#${src}/};
	s1=$(readelf -WS $src/$file | grep "AX" | awk '{ s+=strtonum("0x"$6) } END { print s }');
	s2=$(readelf -WS $dst/$file | grep "AX" | awk '{ s+=strtonum("0x"$6) } END { print s }');
	let S1+=s1;
	let S2+=s2;
	if [ "$s1" -ne "$s2" ] ;
	then
		diff=$(($s2-$s1));
		let D+=diff;
		printf "%-50s %10d %10d   %+d\n" $file $s1 $s2 $diff;
	fi;
done ; printf "%50s %10d %10d   %+d\n" "total" $S1 $S2 $D )

