common/bin/compare-objects.sh

Mon, 14 Sep 2020 16:42:03 +0100

author
andrew
date
Mon, 14 Sep 2020 16:42:03 +0100
changeset 2554
7f60c2d9823e
parent 478
2ba6f4da4bf3
child 1133
50aaf272884f
permissions
-rw-r--r--

Added tag jdk8u272-b08 for changeset 34c6baf21464

     1 #!/bin/bash
     2 #
     3 # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
     4 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5 #
     6 # This code is free software; you can redistribute it and/or modify it
     7 # under the terms of the GNU General Public License version 2 only, as
     8 # published by the Free Software Foundation.
     9 #
    10 # This code is distributed in the hope that it will be useful, but WITHOUT
    11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    12 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    13 # version 2 for more details (a copy is included in the LICENSE file that
    14 # accompanied this code).
    15 #
    16 # You should have received a copy of the GNU General Public License version
    17 # 2 along with this work; if not, write to the Free Software Foundation,
    18 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    19 #
    20 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    21 # or visit www.oracle.com if you need additional information or have any
    22 # questions.
    23 #
    25 # MANUAL
    26 #
    27 # ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir
    28 #
    29 # Compares object files
    30 #
    32 if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then
    33     echo "bash ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir <pattern>"
    34     echo ""
    35     echo "Compare object files"
    36     echo ""
    37     exit 10
    38 fi
    40 #######
    41 #
    42 # List of files (grep patterns) that are ignored
    43 # 
    44 # 1) hotspot object files
    45 IGNORE="-e hotspot"
    47 # 2) various build artifacts: sizer.32.o sizer.64.o dummyodbc.o
    48 #    these are produced during build and then e.g run to produce other data
    49 #    i.e not directly put into build => safe to ignore
    50 IGNORE="${IGNORE} -e sizer.32.o -e sizer.64.o"
    51 IGNORE="${IGNORE} -e dummyodbc.o"
    52 IGNORE="${IGNORE} -e genSolarisConstants.o"
    53 IGNORE="${IGNORE} -e genUnixConstants.o"
    55 OLD="$1"
    56 NEW="$2"
    57 shift; shift
    58 PATTERN="$*"
    60 if [ -f $NEW/spec.sh ]; then
    61     . $NEW/spec.sh
    62 elif [ -f $NEW/../../spec.sh ]; then
    63     . $NEW/../../spec.sh
    64 elif [ -f $OLD/spec.sh ]; then
    65     . $OLD/spec.sh
    66 elif [ -f $OLD/../../spec.sh ]; then
    67     . $OLD/../../spec.sh
    68 else
    69     echo "Unable to find spec.sh"
    70     echo "Giving up"
    71     exit 1
    72 fi
    74 export COMPARE_ROOT=/tmp/cimages.$USER/objects
    75 mkdir -p $COMPARE_ROOT
    77 (${CD} $OLD && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.old
    78 (${CD} $NEW && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.new
    80 # On macosx JobjC is build in both i386 and x86_64 variant (universial binary)
    81 #   but new build only builds the x86_64
    82 # Remove the 386 variants from comparison...to avoid "false" positives
    83 ${GREP} -v 'JObjC.dst/Objects-normal/i386' $COMPARE_ROOT/list.old > $COMPARE_ROOT/list.old.new
    84 ${CP} $COMPARE_ROOT/list.old $COMPARE_ROOT/list.old.full
    85 ${CP} $COMPARE_ROOT/list.old.new $COMPARE_ROOT/list.old
    87 findnew() {
    88     arg_1=$1
    89     arg_2=$2
    91     # special case 1 unpack-cmd => unpackexe
    92     arg_1=`${ECHO} $arg_1 | ${SED} 's!unpack-cmd!unpackexe!g'`
    93     arg_2=`${ECHO} $arg_2 | ${SED} 's!unpack-cmd!unpackexe!g'`
    95     # special case 2 /JObjC.dst/ => /libjobjc/
    96     arg_1=`${ECHO} $arg_1 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'`
    97     arg_2=`${ECHO} $arg_2 | ${SED} 's!/JObjC.dst/!/libjobjc/!g'`
    99     full=`${ECHO} $arg_1 | ${SED} 's!\.!\\\.!g'`
   100     medium=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*/[^/]*\)!\1!'`
   101     short=`${ECHO} $arg_2 | ${SED} 's!\.!\\\.!g'`
   102     if [ "`${GREP} -c "/$full" $COMPARE_ROOT/list.new`" -eq 1 ]
   103     then
   104 	${ECHO} $NEW/$arg_1
   105 	return
   106     fi
   108     if [ "`${GREP} -c "$medium" $COMPARE_ROOT/list.new`" -eq 1 ]
   109     then
   110 	${GREP} "$medium" $COMPARE_ROOT/list.new
   111 	return
   112     fi
   114     if [ "`${GREP} -c "/$short" $COMPARE_ROOT/list.new`" -eq 1 ]
   115     then
   116 	${GREP} "/$short" $COMPARE_ROOT/list.new
   117 	return
   118     fi
   120     # old style has "dir" before obj{64}
   121     dir=`${ECHO} $arg_1 | ${SED} 's!.*/\([^/]*\)/obj[64]*.*!\1!g'`
   122     if [ -n "$dir" -a "$dir" != "$arg_1" ]
   123     then
   124 	if [ "`${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
   125 	then
   126 	    ${GREP} $dir $COMPARE_ROOT/list.new | ${GREP} "/$short"
   127 	    return
   128 	fi
   130 	# Try with lib$dir/
   131 	if [ "`${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
   132 	then
   133 	    ${GREP} "lib$dir/" $COMPARE_ROOT/list.new | ${GREP} "/$short"
   134 	    return
   135 	fi
   137 	# Try with $dir_objs
   138 	if [ "`${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
   139 	then
   140 	    ${GREP} "${dir}_objs" $COMPARE_ROOT/list.new | ${GREP} "/$short"
   141 	    return
   142 	fi
   143     fi
   145     # check for some specifics...
   146     for i in demo hotspot jobjc
   147     do
   148 	if [ "`${ECHO} $full | ${GREP} -c $i`" -gt 0 ]
   149 	then
   150 	    if [ "`${GREP} $i $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
   151 	    then
   152 		${GREP} $i $COMPARE_ROOT/list.new | ${GREP} "/$short"
   153 		return
   154 	    fi
   155 	fi
   156     done
   158     # check for specific demo
   159     demo=`${ECHO} $arg_1 | ${SED} 's!.*/demo/jvmti/\([^/]*\)/.*!\1!g'`
   160     if [ -n "$demo" -a "$dir" != "$demo" ]
   161     then
   162 	if [ "`${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} -c "/$short"`" -eq 1 ]
   163 	then
   164 	    ${GREP} $demo $COMPARE_ROOT/list.new | ${GREP} "/$short"
   165 	    return
   166 	fi
   167     fi
   169     return
   170 }
   172 compare() {
   173     old=$1
   174     new=$2
   175     ${DIFF} $old $new > /dev/null
   176     res=$?
   177     if [ $res -eq 0 ]
   178     then
   179 	${ECHO} 0
   180 	return
   181     fi
   183     # check if stripped objects gives equality
   184     ${CP} $old $COMPARE_ROOT/`basename $old`.old
   185     ${CP} $new $COMPARE_ROOT/`basename $old`.new
   186     ${POST_STRIP_CMD} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null 2>&1
   187     ${DIFF} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new > /dev/null
   188     res=$?
   189     ${RM} $COMPARE_ROOT/`basename $old`.old $COMPARE_ROOT/`basename $old`.new
   190     if [ $res -eq 0 ]
   191     then
   192 	${ECHO} S
   193 	return
   194     fi
   196     name=`basename $1 | ${SED} 's!\.o!!'`
   197     cntold=`strings $old | ${GREP} -c $name`
   198     cntnew=`strings $new | ${GREP} -c $name`
   200     if [ $cntold -gt 0 -a $cntnew -gt 0 ]
   201     then
   202 	${ECHO} F
   203 	return
   204     fi
   206     ${ECHO} 1
   207 }
   209 for F in `${CAT} $COMPARE_ROOT/list.old`
   210 do
   211     if [ "${IGNORE}" ] && [ "`${ECHO} $F | ${GREP} ${IGNORE}`" ]
   212     then
   213 	#
   214 	# skip ignored files
   215         #
   216 	continue;
   217     fi
   219     if [ "$PATTERN" ] && [ `${ECHO} $F | ${GREP} -c $PATTERN` -eq 0 ]
   220     then
   221 	continue;
   222     fi
   224     f=`basename $F`
   225     o=$OLD/$F
   226     n=`findnew $F $f`
   228     if [ "$n" ]
   229     then	
   230 	n="$NEW/$n"
   231 	${ECHO} `compare $o $n` : $f : $o : $n
   232     else
   233 	${ECHO} "- : $f : $o "
   234     fi
   235 done

mercurial