#!/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

	declare -A Sa;
	declare -A Sb;
	let n=0;

	while read sym size; do
	    S[$n]=$sym;
	    Sa[$sym]=$size;
	    let n=n+1;
	done < <( readelf -Ws $src/$obj | grep -v -e "\.cold\." -e "OBJECT" | awk '/DEFAULT/ { if ($3 > 0) { print $8 " " $3} }' );

	while read sym size; do
	    Sb[$sym]=$size;
	    if [ -z "${Sa[$sym]}" ] ; then
	        S[$n]=$sym;
	        let n=n+1;
	    fi;
	done < <( readelf -Ws $dst/$obj | grep -v -e "\.cold\." -e "OBJECT" | awk '/DEFAULT/ { if ($3 > 0) { print $8 " " $3} }' );

	for ((i=0; i<$n; i++)) ; do
		sym=${S[$i]};
		sa=${Sa[$sym]}
		if [ -z "$sa" ] ; then sa=0; fi
		sb=${Sb[$sym]}
		if [ -z "$sb" ] ; then sb=0; fi

		if [ "$sa" -ne "$sb" ] ; then
			printf "%-50s %10d %10d   %+d\n" $sym $sa $sb $(($sb-$sa));
		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 }');
	if [ -z "$s1" ]; then s1=0; fi
	s2=$(readelf -WS $dst/$file | grep "AX" | awk '{ s+=strtonum("0x"$6) } END { print s }');
	if [ -z "$s2" ]; then s2=0; fi
	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 )

