common/bin/compare-objects.sh
changeset 27393 19e59f3f3823
parent 27392 b2343bf3a5d8
parent 27377 90799a826ab5
child 27394 4e7c4d692e93
equal deleted inserted replaced
27392:b2343bf3a5d8 27393:19e59f3f3823
     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 #
       
    24 
       
    25 # MANUAL
       
    26 #
       
    27 # ./common/bin/compare-objects.sh old_jdk_build_dir new_jdk_build_dir
       
    28 #
       
    29 # Compares object files
       
    30 #
       
    31 
       
    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
       
    39 
       
    40 #######
       
    41 #
       
    42 # List of files (grep patterns) that are ignored
       
    43 # 
       
    44 # 1) hotspot object files
       
    45 IGNORE="-e hotspot"
       
    46 
       
    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"
       
    54 
       
    55 OLD="$1"
       
    56 NEW="$2"
       
    57 shift; shift
       
    58 PATTERN="$*"
       
    59 
       
    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
       
    73 
       
    74 export COMPARE_ROOT=/tmp/cimages.$USER/objects
       
    75 mkdir -p $COMPARE_ROOT
       
    76 
       
    77 (${CD} $OLD && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.old
       
    78 (${CD} $NEW && ${FIND} . -name '*.o') > $COMPARE_ROOT/list.new
       
    79 
       
    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
       
    86 
       
    87 findnew() {
       
    88     arg_1=$1
       
    89     arg_2=$2
       
    90 
       
    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'`
       
    94 
       
    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'`
       
    98 
       
    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
       
   107 
       
   108     if [ "`${GREP} -c "$medium" $COMPARE_ROOT/list.new`" -eq 1 ]
       
   109     then
       
   110 	${GREP} "$medium" $COMPARE_ROOT/list.new
       
   111 	return
       
   112     fi
       
   113 
       
   114     if [ "`${GREP} -c "/$short" $COMPARE_ROOT/list.new`" -eq 1 ]
       
   115     then
       
   116 	${GREP} "/$short" $COMPARE_ROOT/list.new
       
   117 	return
       
   118     fi
       
   119 
       
   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
       
   129 
       
   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
       
   136 
       
   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
       
   144 
       
   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
       
   157 
       
   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
       
   168 
       
   169     return
       
   170 }
       
   171 
       
   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
       
   182 
       
   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
       
   195 
       
   196     name=`basename $1 | ${SED} 's!\.o!!'`
       
   197     cntold=`strings $old | ${GREP} -c $name`
       
   198     cntnew=`strings $new | ${GREP} -c $name`
       
   199     
       
   200     if [ $cntold -gt 0 -a $cntnew -gt 0 ]
       
   201     then
       
   202 	${ECHO} F
       
   203 	return
       
   204     fi
       
   205 
       
   206     ${ECHO} 1
       
   207 }
       
   208 
       
   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
       
   218 
       
   219     if [ "$PATTERN" ] && [ `${ECHO} $F | ${GREP} -c $PATTERN` -eq 0 ]
       
   220     then
       
   221 	continue;
       
   222     fi
       
   223 
       
   224     f=`basename $F`
       
   225     o=$OLD/$F
       
   226     n=`findnew $F $f`
       
   227 
       
   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