common/bin/compare-objects.sh
changeset 13133 701e61c32ece
child 13697 5262b00bc10c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/bin/compare-objects.sh	Thu Jul 05 18:27:07 2012 -0700
@@ -0,0 +1,235 @@
+#!/bin/bash
+#
+# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# MANUAL
+#
+# ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir
+#
+# Compares object files
+#
+
+if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then
+    echo "bash ./common/bin/compare-build.sh old_jdk_build_dir new_jdk_build_dir"
+    echo ""
+    echo "Compare object files"
+    echo ""
+    exit 10
+fi
+
+#######
+#
+# List of files (grep patterns) that are ignored
+# 
+# 1) hotspot object files
+IGNORE="-e hotspot"
+
+# 2) various build artifacts: sizer.32.o sizer.64.o dummyodbc.o
+#    these are produced during build and then e.g run to produce other data
+#    i.e not directly put into build => safe to ignore
+IGNORE="${IGNORE} -e sizer.32.o -e sizer.64.o"
+IGNORE="${IGNORE} -e dummyodbc.o"
+IGNORE="${IGNORE} -e genSolarisConstants.o"
+IGNORE="${IGNORE} -e genUnixConstants.o"
+
+OLD="$1"
+NEW="$2"
+shift; shift
+PATTERN="$*"
+
+if [ -f $NEW/spec.sh ]; then
+    . $NEW/spec.sh
+elif [ -f $NEW/../../spec.sh ]; then
+    . $NEW/../../spec.sh
+elif [ -f $OLD/spec.sh ]; then
+    . $OLD/spec.sh
+elif [ -f $OLD/../../spec.sh ]; then
+    . $OLD/../../spec.sh
+else
+    echo "Unable to find spec.sh"
+    echo "Giving up"
+    exit 1
+fi
+
+export COMPARE_ROOT=/tmp/cimages.$USER/objects
+mkdir -p $COMPARE_ROOT
+
+(${CD} $OLD && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.old
+(${CD} $NEW && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.new
+
+# On macosx JobjC is build in both i386 and x86_64 variant (universial binary)
+#   but new build only builds the x86_64
+# Remove the 386 variants from comparison...to avoid "false" positives
+${GREP} -v 'JObjC.dst/Objects-normal/i386' $COMPARE_ROOT/list.old > $COMPARE_ROOT/list.old.new
+${CP} $COMPARE_ROOT/list.old $COMPARE_ROOT/list.old.full
+${CP} $COMPARE_ROOT/list.old.new $COMPARE_ROOT/list.old
+
+findnew() {
+    arg_1=$1
+    arg_2=$2
+
+    # special case 1 unpack-cmd => unpackexe
+    arg_1=`${ECHO} $arg_1 | ${SED} 's!unpack-cmd!unpackexe!g'`
+    arg_2=`${ECHO} $arg_2 | ${SED} 's!unpack-cmd!unpackexe!g'`
+
+    # special case 2 /JObjC.dst/ => /libjobjc/
+    arg_1=`${ECHO} $arg_1 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'`
+    arg_2=`${ECHO} $arg_2 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'`
+
+    full=`${ECHO} $arg_1 | ${SED} 's!\.!\\\.!g'`
+    medium=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*/[^/]*\)!\1!'`
+    short=`${ECHO} $arg_2 | ${SED} 's!\.!\\\.!g'`
+    if [ "`${GREP} -c "/$full" $COMPARE_ROOT/list.new`" -eq 1 ]
+    then
+	${ECHO} $NEW/$arg_1
+	return
+    fi
+
+    if [ "`${GREP} -c "$medium" $COMPARE_ROOT/list.new`" -eq 1 ]
+    then
+	${GREP} "$medium" $COMPARE_ROOT/list.new
+	return
+    fi
+
+    if [ "`${GREP} -c "/$short" $COMPARE_ROOT/list.new`" -eq 1 ]
+    then
+	${GREP} "/$short" $COMPARE_ROOT/list.new
+	return
+    fi
+
+    # old style has "dir" before obj{64}
+    dir=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*\)/obj[64]*.*!\1!g'`
+    if [ -n "$dir" -a "$dir" != "$arg_1" ]
+    then
+	if [ "`${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
+	then
+	    ${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} "/$short"
+	    return
+	fi
+
+	# Try with lib$dir/
+	if [ "`${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
+	then
+	    ${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} "/$short"
+	    return
+	fi
+
+	# Try with $dir_objs
+	if [ "`${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
+	then
+	    ${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} "/$short"
+	    return
+	fi
+    fi
+
+    # check for some specifics...
+    for i in demo hotspot jobjc
+    do
+	if [ "`${ECHO} $full | ${GREP} -c $i`" -gt 0 ]
+	then
+	    if [ "`${GREP} $i $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
+	    then
+		${GREP} $i $COMPARE_ROOT/list.new | ${GREP} "/$short"
+		return
+	    fi
+	fi
+    done
+
+    # check for specific demo
+    demo=`${ECHO} $arg_1 | ${SED} 's!.*/demo/jvmti/\([^/]*\)/.*!\1!g'`
+    if [ -n "$demo" -a "$dir" != "$demo" ]
+    then
+	if [ "`${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
+	then
+	    ${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} "/$short"
+	    return
+	fi
+    fi
+
+    return
+}
+
+compare() {
+    old=$1
+    new=$2
+    ${DIFF} $old $new > /dev/null
+    res=$?
+    if [ $res -eq 0 ]
+    then
+	${ECHO} 0
+	return
+    fi
+
+    # check if stripped objects gives equality
+    ${CP} $old $COMPARE_ROOT/`basename $old`.old
+    ${CP} $new $COMPARE_ROOT/`basename $old`.new
+    ${POST_STRIP_CMD} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null 2>&1
+    ${DIFF} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null
+    res=$?
+    ${RM} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new
+    if [ $res -eq 0 ]
+    then
+	${ECHO} S
+	return
+    fi
+
+    name=`basename $1 | ${SED} 's!\.o!!'`
+    cntold=`strings $old | ${GREP} -c $name`
+    cntnew=`strings $new | ${GREP} -c $name`
+    
+    if [ $cntold -gt 0 -a $cntnew -gt 0 ]
+    then
+	${ECHO} F
+	return
+    fi
+
+    ${ECHO} 1
+}
+
+for F in `${CAT} $COMPARE_ROOT/list.old`
+do
+    if [ "${IGNORE}" ] && [ "`${ECHO} $F | ${GREP} ${IGNORE}`" ]
+    then
+	#
+	# skip ignored files
+        #
+	continue;
+    fi
+
+    if [ "$PATTERN" ] && [ `${ECHO} $F | ${GREP} -c $PATTERN` -eq 0 ]
+    then
+	continue;
+    fi
+
+    f=`basename $F`
+    o=$OLD/$F
+    n=`findnew $F $f`
+
+    if [ "$n" ]
+    then	
+	n="$NEW/$n"
+	${ECHO} `compare $o $n` : $f : $o : $n
+    else
+	${ECHO} "- : $f : $o "
+    fi
+done