1 #!/bin/bash
   2 #
   3 # Copyright (c) 2012, 2020, 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 # This script is processed by configure before it's usable. It is run from
  26 # the root of the build directory.
  27 
  28 
  29 ################################################################################
  30 
  31 # Check that we are run via the wrapper generated by configure
  32 if [ -z "$TOPDIR" ]; then
  33     echo "Error: You must run this script using build/[conf]/compare.sh"
  34     exit 1
  35 fi
  36 
  37 # Make sure all shell commands are executed with the C locale
  38 export LC_ALL=C
  39 
  40 if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
  41     FULLDUMP_CMD="$OTOOL -v -V -h -X -d"
  42     LDD_CMD="$OTOOL -L"
  43     DIS_CMD="$OTOOL -v -V -t"
  44     STAT_PRINT_SIZE="-f %z"
  45 elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
  46     FULLDUMP_CMD="$DUMPBIN -all"
  47     LDD_CMD="$DUMPBIN -dependents"
  48     DIS_CMD="$DUMPBIN -disasm:nobytes"
  49     STAT_PRINT_SIZE="-c %s"
  50 elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
  51     FULLDUMP_CMD="dump -h -r -t -n -X64"
  52     LDD_CMD="$LDD"
  53     DIS_CMD="$OBJDUMP -d"
  54     STAT_PRINT_SIZE="-c %s"
  55 else
  56     FULLDUMP_CMD="$READELF -a"
  57     LDD_CMD="$LDD"
  58     DIS_CMD="$OBJDUMP -d"
  59     STAT_PRINT_SIZE="-c %s"
  60 fi
  61 
  62 COMPARE_EXCEPTIONS_INCLUDE="$TOPDIR/make/scripts/compare_exceptions.sh.incl"
  63 if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
  64     echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
  65     exit 1
  66 fi
  67 # Include exception definitions
  68 . "$COMPARE_EXCEPTIONS_INCLUDE"
  69 
  70 ################################################################################
  71 #
  72 # Disassembly diff filters. These filters try to filter out ephemeral parts of the
  73 # disassembly, such as hard-coded addresses, to be able to catch "actual" differences.
  74 
  75 if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
  76   if [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then
  77     DIS_DIFF_FILTER="$SED \
  78         -e 's/^[0-9a-f]\{16\}/<ADDR>:/' \
  79         -e 's/^ *[0-9a-f]\{3,12\}:/  <ADDR>:/' \
  80         -e 's/: [0-9a-f][0-9a-f]\( [0-9a-f][0-9a-f]\)\{2,10\}/: <NUMS>/' \
  81         -e 's/\$[a-zA-Z0-9_\$]\{15\}\./<SYM>./' \
  82         -e 's/, [0-9a-fx\-]\{1,8\}/, <ADDR>/g' \
  83         -e 's/0x[0-9a-f]\{1,8\}/<HEX>/g' \
  84         -e 's/\! [0-9a-f]\{1,8\} /! <ADDR> /' \
  85         -e 's/call  [0-9a-f]\{4,7\}/call  <ADDR>/' \
  86         -e 's/%hi(0),/%hi(<HEX>),/' \
  87         "
  88   elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
  89     # Random strings looking like this differ: <.XAKoKoPIac2W0OA.
  90     DIS_DIFF_FILTER="$SED \
  91         -e 's/<\.[A-Za-z0-9]\{\15}\./<.SYM./' \
  92         "
  93   fi
  94 elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
  95   if [ "$OPENJDK_TARGET_CPU" = "x86" ]; then
  96     DIS_DIFF_FILTER="$SED -r \
  97         -e 's/^  [0-9A-F]{16}: //' \
  98         -e 's/^  [0-9A-F]{8}: /  <ADDR>: /' \
  99         -e 's/(offset \?\?)_C@_.*/\1<SYM>/' \
 100         -e 's/[@?][A-Za-z0-9_]{1,25}/<SYM>/' \
 101         -e 's/([-,+])[0-9A-F]{2,16}/\1<HEXSTR>/g' \
 102         -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
 103         -e 's/: ([a-z]{2}[a-z ]{2})        [0-9A-F]{2,16}h?$/: \1        <HEXSTR>/' \
 104         -e 's/_20[0-9]{2}_[0-1][0-9]_[0-9]{2}/_<DATE>/' \
 105         "
 106   elif [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
 107     DIS_DIFF_FILTER="$SED -r \
 108         -e 's/^  [0-9A-F]{16}: //' \
 109         -e 's/\[[0-9A-F]{4,16}h\]/[<HEXSTR>]/' \
 110         -e 's/([,+])[0-9A-F]{2,16}h/\1<HEXSTR>/' \
 111         -e 's/([a-z]{2}[a-z ]{2})        [0-9A-F]{4,16}$/\1        <HEXSTR>/' \
 112         -e 's/\[\?\?_C@_.*/[<SYM>]/' \
 113         "
 114   fi
 115 elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
 116   DIS_DIFF_FILTER="$SED \
 117       -e 's/0x[0-9a-f]\{3,16\}/<HEXSTR>/g' -e 's/^[0-9a-f]\{12,20\}/<ADDR>/' \
 118       -e 's/-20[0-9][0-9]-[0-1][0-9]-[0-3][0-9]-[0-2][0-9]\{5\}/<DATE>/g' \
 119       -e 's/), built on .*/), <DATE>/' \
 120       "
 121 fi
 122 
 123 ################################################################################
 124 # Compare text files and ignore specific differences:
 125 #
 126 #  * Timestamps in Java sources generated by idl2java
 127 #  * Sorting order and cleanup style in .properties files
 128 
 129 diff_text() {
 130     OTHER_FILE=$1
 131     THIS_FILE=$2
 132 
 133     SUFFIX="${THIS_FILE##*.}"
 134     NAME="${THIS_FILE##*/}"
 135 
 136     TMP=$($DIFF $THIS_FILE $OTHER_FILE)
 137 
 138     if test "x$SUFFIX" = "xclass"; then
 139         if [ "$NAME" = "SystemModules\$all.class" ] \
 140            || [ "$NAME" = "SystemModules\$default.class" ]; then
 141             # The SystemModules\$*.classes are not comparable as they contain the
 142             # module hashes which would require a whole other level of
 143             # reproducible builds to get reproducible. There is also random
 144             # order of map initialization.
 145             TMP=""
 146         elif [ "$NAME" = "module-info.class" ]; then
 147             # The module-info.class have several issues with random ordering of
 148             # elements in HashSets.
 149             MODULES_CLASS_FILTER="$SED \
 150                 -e 's/,$//' \
 151                 -e 's/;$//' \
 152                 -e 's/^ *[0-9]*://' \
 153                 -e 's/#[0-9]* */#/' \
 154                 -e 's/ *\/\// \/\//' \
 155                 -e 's/aload *[0-9]*/aload X/' \
 156                 -e 's/ldc_w/ldc  /' \
 157                 | $SORT \
 158                 "
 159             $JAVAP -c -constants -l -p "${OTHER_FILE}" \
 160                 | eval "$MODULES_CLASS_FILTER" >  ${OTHER_FILE}.javap &
 161             $JAVAP -c -constants -l -p "${THIS_FILE}" \
 162                 | eval "$MODULES_CLASS_FILTER" > ${THIS_FILE}.javap &
 163             wait
 164             TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap)
 165         fi
 166     fi
 167 
 168     if test -n "$TMP"; then
 169         echo Files $OTHER_FILE and $THIS_FILE differ
 170         return 1
 171     fi
 172 
 173     return 0
 174 }
 175 
 176 ################################################################################
 177 # Compare directory structure
 178 
 179 compare_dirs() {
 180     THIS_DIR=$1
 181     OTHER_DIR=$2
 182     WORK_DIR=$3
 183 
 184     mkdir -p $WORK_DIR
 185 
 186     (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_other)
 187     (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this)
 188 
 189     $DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_this > $WORK_DIR/dirs_diff
 190 
 191     echo -n Directory structure...
 192     if [ -s $WORK_DIR/dirs_diff ]; then
 193         echo Differences found.
 194         REGRESSIONS=true
 195         # Differences in directories found.
 196         ONLY_OTHER=$($GREP '<' $WORK_DIR/dirs_diff)
 197         if [ "$ONLY_OTHER" ]; then
 198             echo Only in $OTHER
 199             $GREP '<' $WORK_DIR/dirs_diff | $SED 's|< ./|    |g'
 200         fi
 201         ONLY_THIS=$($GREP '>' $WORK_DIR/dirs_diff)
 202         if [ "$ONLY_THIS" ]; then
 203             echo Only in $THIS
 204             $GREP '>' $WORK_DIR/dirs_diff | $SED 's|> ./|    |g'
 205         fi
 206     else
 207         echo Identical!
 208     fi
 209 }
 210 
 211 
 212 ################################################################################
 213 # Compare file structure
 214 
 215 compare_files() {
 216     THIS_DIR=$1
 217     OTHER_DIR=$2
 218     WORK_DIR=$3
 219 
 220     $MKDIR -p $WORK_DIR
 221 
 222     (cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other)
 223     (cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this)
 224 
 225     $DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff
 226 
 227     echo -n File names...
 228     if [ -s $WORK_DIR/files_diff ]; then
 229         echo Differences found.
 230         REGRESSIONS=true
 231         # Differences in files found.
 232         ONLY_OTHER=$($GREP '<' $WORK_DIR/files_diff)
 233         if [ "$ONLY_OTHER" ]; then
 234             echo Only in $OTHER
 235             $GREP '<' $WORK_DIR/files_diff | $SED 's|< ./|    |g'
 236         fi
 237         ONLY_THIS=$($GREP '>' $WORK_DIR/files_diff)
 238         if [ "$ONLY_THIS" ]; then
 239             echo Only in $THIS
 240             $GREP '>' $WORK_DIR/files_diff | $SED 's|> ./|    |g'
 241         fi
 242     else
 243         echo Identical!
 244     fi
 245 }
 246 
 247 
 248 ################################################################################
 249 # Compare permissions
 250 
 251 compare_permissions() {
 252     THIS_DIR=$1
 253     OTHER_DIR=$2
 254     WORK_DIR=$3
 255 
 256     mkdir -p $WORK_DIR
 257 
 258     echo -n Permissions...
 259     found=""
 260     for f in `cd $OTHER_DIR && $FIND . -type f`
 261     do
 262         if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
 263         if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
 264         OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
 265         TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
 266         if [ "$OP" != "$TP" ]
 267         then
 268             if [ -z "$found" ]; then echo ; found="yes"; fi
 269             $PRINTF "\tother: ${OP} this: ${TP}\t$f\n"
 270         fi
 271     done
 272     if [ -z "$found" ]; then
 273         echo "Identical!"
 274     else
 275         REGRESSIONS=true
 276     fi
 277 }
 278 
 279 ################################################################################
 280 # Compare file command output
 281 
 282 compare_file_types() {
 283     THIS_DIR=$1
 284     OTHER_DIR=$2
 285     WORK_DIR=$3
 286 
 287     $MKDIR -p $WORK_DIR
 288 
 289     FILE_TYPES_FILTER="$SED \
 290         -e 's/BuildID[^,]*//' \
 291         -e 's/last modified: .*//' \
 292         "
 293 
 294     echo -n File types...
 295     found=""
 296     # The file command does not know about jmod files and this sometimes results
 297     # in different types being detected more or less randomly.
 298     for f in $(cd $OTHER_DIR && $FIND . ! -type d -a ! -name "*.jmod")
 299     do
 300         if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
 301         if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
 302         OF=$(cd ${OTHER_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
 303         TF=$(cd ${THIS_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
 304         if [ "$OF" != "$TF" ]
 305         then
 306             if [ "`echo $OF | $GREP -c 'Zip archive data'`" -gt 0 ] \
 307                 && [ "`echo $TF | $GREP -c 'Zip archive data'`" -gt 0 ]
 308             then
 309                 # the way we produce zip-files make it so that directories are stored in
 310                 # old file but not in new (only files with full-path) this makes file
 311                 # report them as different
 312                 continue
 313             elif [ "`echo $OF | $GREP -c 'MSVC program database ver 7.00'`" -gt 0 ] \
 314                      && [ "`echo $TF | $GREP -c 'MSVC program database ver 7.00'`" -gt 0 ]
 315             then
 316                 # For Windows pdb files the file command reports some kind of size data
 317                 # which may sometimes come out randomly different.
 318                 continue
 319             else
 320                 if [ -z "$found" ]; then echo ; found="yes"; fi
 321                 $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n"
 322             fi
 323         fi
 324     done
 325     if [ -z "$found" ]; then
 326         echo "Identical!"
 327     else
 328         REGRESSIONS=true
 329     fi
 330 }
 331 
 332 ################################################################################
 333 # Compare the rest of the files
 334 
 335 compare_general_files() {
 336     THIS_DIR=$1
 337     OTHER_DIR=$2
 338     WORK_DIR=$3
 339 
 340     GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" \
 341         ! -name "*.zip" ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
 342         ! -name "modules" ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
 343         ! -name "*.cpl" ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
 344         ! -name "*.lib" ! -name "*.jmod" ! -name "*.exe" \
 345         ! -name "*.obj" ! -name "*.o" ! -name "jspawnhelper" ! -name "*.a" \
 346         ! -name "*.tar.gz" ! -name "*.jsa" ! -name "gtestLauncher" \
 347         ! -name "*.map" \
 348         | $GREP -v "./bin/"  | $SORT | $FILTER)
 349 
 350     echo Other files with binary differences...
 351     for f in $GENERAL_FILES
 352     do
 353         # Skip all files in test/*/native
 354         if [[ "$f" == */native/* ]]; then
 355             continue
 356         fi
 357         if [ -e $OTHER_DIR/$f ]; then
 358             SUFFIX="${f##*.}"
 359             if [ "$(basename $f)" = "release" ]; then
 360                 # In release file, ignore differences in source rev numbers
 361                 OTHER_FILE=$WORK_DIR/$f.other
 362                 THIS_FILE=$WORK_DIR/$f.this
 363                 $MKDIR -p $(dirname $OTHER_FILE)
 364                 $MKDIR -p $(dirname $THIS_FILE)
 365                 RELEASE_FILTER="$SED -e 's/SOURCE=".*"/SOURCE=<src-rev>/g'"
 366                 $CAT $OTHER_DIR/$f | eval "$RELEASE_FILTER" > $OTHER_FILE
 367                 $CAT $THIS_DIR/$f  | eval "$RELEASE_FILTER" > $THIS_FILE
 368             elif [ "$SUFFIX" = "svg" ]; then
 369                 # GraphViz has non-determinism when generating svg files
 370                 OTHER_FILE=$WORK_DIR/$f.other
 371                 THIS_FILE=$WORK_DIR/$f.this
 372                 $MKDIR -p $(dirname $OTHER_FILE) $(dirname $THIS_FILE)
 373                 SVG_FILTER="$SED \
 374                     -e 's/edge[0-9][0-9]*/edgeX/g'
 375                     "
 376                 $CAT $OTHER_DIR/$f | eval "$SVG_FILTER" > $OTHER_FILE
 377                 $CAT $THIS_DIR/$f | eval "$SVG_FILTER" > $THIS_FILE
 378             elif [[ "$f" = *"/lib/classlist" ]] || [ "$SUFFIX" = "jar_contents" ]; then
 379                 # The classlist files may have some lines in random order
 380                 OTHER_FILE=$WORK_DIR/$f.other
 381                 THIS_FILE=$WORK_DIR/$f.this
 382                 $MKDIR -p $(dirname $OTHER_FILE) $(dirname $THIS_FILE)
 383                 $RM $OTHER_FILE $THIS_FILE
 384                 $CAT $OTHER_DIR/$f | $SORT > $OTHER_FILE
 385                 $CAT $THIS_DIR/$f  | $SORT > $THIS_FILE
 386             else
 387                 OTHER_FILE=$OTHER_DIR/$f
 388                 THIS_FILE=$THIS_DIR/$f
 389             fi
 390             DIFF_OUT=$($DIFF $OTHER_FILE $THIS_FILE 2>&1)
 391             if [ -n "$DIFF_OUT" ]; then
 392                 echo $f
 393                 REGRESSIONS=true
 394                 if [ "$SHOW_DIFFS" = "true" ]; then
 395                     echo "$DIFF_OUT"
 396                 fi
 397             fi
 398         fi
 399     done
 400 
 401 
 402 }
 403 
 404 ################################################################################
 405 # Compare zip file
 406 
 407 compare_zip_file() {
 408     THIS_DIR=$1
 409     OTHER_DIR=$2
 410     WORK_DIR=$3
 411     ZIP_FILE=$4
 412     # Optionally provide different name for other zipfile
 413     OTHER_ZIP_FILE=$5
 414 
 415     THIS_ZIP=$THIS_DIR/$ZIP_FILE
 416     if [ -n "$OTHER_ZIP_FILE" ]; then
 417         OTHER_ZIP=$OTHER_DIR/$OTHER_ZIP_FILE
 418     else
 419         OTHER_ZIP=$OTHER_DIR/$ZIP_FILE
 420     fi
 421 
 422     THIS_SUFFIX="${THIS_ZIP##*.}"
 423     OTHER_SUFFIX="${OTHER_ZIP##*.}"
 424     if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then
 425         echo "The files do not have the same suffix type! ($THIS_SUFFIX != $OTHER_SUFFIX)"
 426         return 2
 427     fi
 428 
 429     TYPE="$THIS_SUFFIX"
 430 
 431     if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null
 432     then
 433         return 0
 434     fi
 435     # Not quite identical, the might still contain the same data.
 436     # Unpack the jar/zip files in temp dirs
 437 
 438     THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this
 439     OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other
 440     $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
 441     $MKDIR -p $THIS_UNZIPDIR
 442     $MKDIR -p $OTHER_UNZIPDIR
 443     if [ "$TYPE" = "jar" -o "$TYPE" = "war" -o "$TYPE" = "zip" ]
 444     then
 445         (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
 446         (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
 447     elif [ "$TYPE" = "gz" ]
 448     then
 449         (cd $THIS_UNZIPDIR && $GUNZIP -c $THIS_ZIP | $TAR xf -)
 450         (cd $OTHER_UNZIPDIR && $GUNZIP -c $OTHER_ZIP | $TAR xf -)
 451     elif [ "$TYPE" = "jmod" ]
 452     then
 453         (cd $THIS_UNZIPDIR && $JMOD extract $THIS_ZIP)
 454         (cd $OTHER_UNZIPDIR && $JMOD extract $OTHER_ZIP)
 455     else
 456         (cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
 457         (cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
 458     fi
 459 
 460     CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
 461     # On solaris, there is no -q option.
 462     if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
 463         $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
 464             | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \
 465             > $CONTENTS_DIFF_FILE
 466     else
 467         $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
 468     fi
 469 
 470     ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
 471     ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE)
 472 
 473     return_value=0
 474 
 475     if [ -n "$ONLY_OTHER" ]; then
 476         echo "        Only OTHER $ZIP_FILE contains:"
 477         echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR|            |"g | sed 's|: |/|g'
 478         return_value=1
 479     fi
 480 
 481     if [ -n "$ONLY_THIS" ]; then
 482         echo "        Only THIS $ZIP_FILE contains:"
 483         echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR|            |"g | sed 's|: |/|g'
 484         return_value=1
 485     fi
 486 
 487     if [ "$CMP_ZIPS_CONTENTS" = "true" ]; then
 488         if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
 489             DIFFING_FILES=$($GREP -e 'differ$' -e '^diff ' $CONTENTS_DIFF_FILE \
 490                 | $SED -e 's/^Files //g' -e 's/diff -r //g' | $CUT -f 1 -d ' ' \
 491                 | $SED "s|$OTHER_UNZIPDIR/||g")
 492         else
 493             DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \
 494                 | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g")
 495         fi
 496 
 497         # Separate executable/library files from other files in zip.
 498         DIFFING_TEXT_FILES=
 499         DIFFING_EXEC_FILES=
 500         for file in $DIFFING_FILES; do
 501             SUFFIX="${file##*.}"
 502             if [ "$SUFFIX" = "exe" -o "$SUFFIX" = "dll" -o "$SUFFIX" = "so" \
 503                  -o "$SUFFIX" = "dylib" ]; then
 504                 DIFFING_EXEC_FILES="$DIFFING_EXEC_FILES $file"
 505             else
 506                 DIFFING_TEXT_FILES="$DIFFING_TEXT_FILES $file"
 507             fi
 508         done
 509 
 510         $RM -f $WORK_DIR/$ZIP_FILE.diffs
 511         for file in $DIFFING_TEXT_FILES; do
 512             if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
 513                 diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
 514             fi
 515         done
 516 
 517         if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then
 518             return_value=1
 519             echo "        Differing files in $ZIP_FILE"
 520             $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP 'differ$' | cut -f 2 -d ' ' | \
 521                 $SED "s|$OTHER_UNZIPDIR|            |g" > $WORK_DIR/$ZIP_FILE.difflist
 522             $CAT $WORK_DIR/$ZIP_FILE.difflist
 523 
 524             if [ -n "$SHOW_DIFFS" ]; then
 525                 for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do
 526                     if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then
 527                         $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap
 528                     elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then
 529                         $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i
 530                     else
 531                         $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i
 532                     fi
 533                 done
 534             fi
 535         fi
 536 
 537         # Use the compare_bin_file function for comparing the executable files.
 538         for file in $DIFFING_EXEC_FILES; do
 539             compare_bin_file $THIS_UNZIPDIR $OTHER_UNZIPDIR $WORK_DIR/$ZIP_FILE.bin \
 540                              $file
 541             if [ "$?" != "0" ]; then
 542                 return_value=1
 543             fi
 544         done
 545     fi
 546 
 547     return $return_value
 548 }
 549 
 550 ################################################################################
 551 # Compare jmod file
 552 
 553 compare_jmod_file() {
 554     THIS_DIR=$1
 555     OTHER_DIR=$2
 556     WORK_DIR=$3
 557     JMOD_FILE=$4
 558 
 559     THIS_JMOD=$THIS_DIR/$JMOD_FILE
 560     OTHER_JMOD=$OTHER_DIR/$JMOD_FILE
 561 
 562     if $CMP $OTHER_JMOD $THIS_JMOD > /dev/null; then
 563         return 0
 564     fi
 565 
 566     THIS_JMOD_LIST=$WORK_DIR/$JMOD_FILE.list.this
 567     OTHER_JMOD_LIST=$WORK_DIR/$JMOD_FILE.list.other
 568     mkdir -p $(dirname $THIS_JMOD_LIST) $(dirname $OTHER_JMOD_LIST)
 569 
 570     $JMOD list $THIS_JMOD | sort > $THIS_JMOD_LIST
 571     $JMOD list $OTHER_JMOD | sort > $OTHER_JMOD_LIST
 572     JMOD_LIST_DIFF_FILE=$WORK_DIR/$JMOD_FILE.list.diff
 573     $DIFF $THIS_JMOD_LIST $OTHER_JMOD_LIST > $JMOD_LIST_DIFF_FILE
 574 
 575     ONLY_THIS=$($GREP "^<" $JMOD_LIST_DIFF_FILE)
 576     ONLY_OTHER=$($GREP "^>" $JMOD_LIST_DIFF_FILE)
 577 
 578     if [ -n "$ONLY_OTHER" ]; then
 579         echo "        Only OTHER $JMOD_FILE contains:"
 580         echo "$ONLY_OTHER" | sed "s|^>|            |"g | sed 's|: |/|g'
 581         return_value=1
 582     fi
 583 
 584     if [ -n "$ONLY_THIS" ]; then
 585         echo "        Only THIS $JMOD_FILE contains:"
 586         echo "$ONLY_THIS" | sed "s|^<|            |"g | sed 's|: |/|g'
 587         return_value=1
 588     fi
 589 
 590     return $return_value
 591 }
 592 
 593 ################################################################################
 594 # Compare all zip files
 595 
 596 compare_all_zip_files() {
 597     THIS_DIR=$1
 598     OTHER_DIR=$2
 599     WORK_DIR=$3
 600 
 601     ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" -o -name "*.tar.gz" \
 602         | $SORT | $FILTER )
 603 
 604     if [ -n "$ZIPS" ]; then
 605         echo Zip/tar.gz files...
 606 
 607         return_value=0
 608         for f in $ZIPS; do
 609             if [ -f "$OTHER_DIR/$f" ]; then
 610                 compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
 611                 if [ "$?" != "0" ]; then
 612                     return_value=1
 613                     REGRESSIONS=true
 614                 fi
 615             fi
 616         done
 617     fi
 618 
 619     return $return_value
 620 }
 621 
 622 ################################################################################
 623 # Compare all jmod files
 624 
 625 compare_all_jmod_files() {
 626     THIS_DIR=$1
 627     OTHER_DIR=$2
 628     WORK_DIR=$3
 629 
 630     JMODS=$(cd $THIS_DIR && $FIND . -type f -name "*.jmod" | $SORT | $FILTER )
 631 
 632     if [ -n "$JMODS" ]; then
 633         echo Jmod files...
 634 
 635         return_value=0
 636         for f in $JMODS; do
 637             if [ -f "$OTHER_DIR/$f" ]; then
 638                 compare_jmod_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
 639                 if [ "$?" != "0" ]; then
 640                     return_value=1
 641                     REGRESSIONS=true
 642                 fi
 643             fi
 644         done
 645     fi
 646 
 647     return $return_value
 648 }
 649 
 650 ################################################################################
 651 # Compare all jar files
 652 
 653 compare_all_jar_files() {
 654     THIS_DIR=$1
 655     OTHER_DIR=$2
 656     WORK_DIR=$3
 657 
 658     # TODO filter?
 659     ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" \
 660         -o -name "modules" | $SORT | $FILTER)
 661 
 662     if [ -n "$ZIPS" ]; then
 663         echo Jar files...
 664 
 665         return_value=0
 666         for f in $ZIPS; do
 667             if [ -f "$OTHER_DIR/$f" ]; then
 668                 compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
 669                 if [ "$?" != "0" ]; then
 670                     return_value=1
 671                     REGRESSIONS=true
 672                 fi
 673             fi
 674         done
 675     fi
 676 
 677     return $return_value
 678 }
 679 
 680 ################################################################################
 681 # Compare binary (executable/library) file
 682 
 683 compare_bin_file() {
 684     THIS_DIR=$1
 685     OTHER_DIR=$2
 686     WORK_DIR=$3
 687     BIN_FILE=$4
 688     OTHER_BIN_FILE=$5
 689 
 690     THIS_FILE=$THIS_DIR/$BIN_FILE
 691     if [ -n "$OTHER_BIN_FILE" ]; then
 692         OTHER_FILE=$OTHER_DIR/$OTHER_BIN_FILE
 693     else
 694         OTHER_FILE=$OTHER_DIR/$BIN_FILE
 695     fi
 696     NAME=$(basename $BIN_FILE)
 697     WORK_FILE_BASE=$WORK_DIR/$BIN_FILE
 698     FILE_WORK_DIR=$(dirname $WORK_FILE_BASE)
 699 
 700     $MKDIR -p $FILE_WORK_DIR
 701 
 702     # Make soft links to original files from work dir to facilitate debugging
 703     $LN -f -s $THIS_FILE $WORK_FILE_BASE.this
 704     $LN -f -s $OTHER_FILE $WORK_FILE_BASE.other
 705 
 706     ORIG_THIS_FILE="$THIS_FILE"
 707     ORIG_OTHER_FILE="$OTHER_FILE"
 708 
 709     if [ "$STRIP_ALL" = "true" ] || [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then
 710         THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME
 711         OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME
 712         $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other
 713         $CP $THIS_FILE $THIS_STRIPPED_FILE
 714         $CP $OTHER_FILE $OTHER_STRIPPED_FILE
 715         $STRIP $THIS_STRIPPED_FILE
 716         $STRIP $OTHER_STRIPPED_FILE
 717         THIS_FILE="$THIS_STRIPPED_FILE"
 718         OTHER_FILE="$OTHER_STRIPPED_FILE"
 719     fi
 720 
 721     if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
 722         unset _NT_SYMBOL_PATH
 723         if [ "$(uname -o)" = "Cygwin" ]; then
 724             THIS=$(cygpath -msa $THIS)
 725             OTHER=$(cygpath -msa $OTHER)
 726         fi
 727         # Build an _NT_SYMBOL_PATH that contains all known locations for
 728         # pdb files.
 729         PDB_DIRS="$(ls -d \
 730             {$OTHER,$THIS}/support/modules_{cmds,libs}/{*,*/*} \
 731             {$OTHER,$THIS}/support/native/jdk.incubator.jpackage/* \
 732             )"
 733         export _NT_SYMBOL_PATH="$(echo $PDB_DIRS | tr ' ' ';')"
 734     fi
 735 
 736     if cmp $OTHER_FILE $THIS_FILE > /dev/null; then
 737         # The files were bytewise identical.
 738         if [ -n "$VERBOSE" ]; then
 739             echo "        :           :         :         :          :          : $BIN_FILE"
 740         fi
 741         return 0
 742     fi
 743     if [ -z "$SKIP_BIN_DIFF" ]; then
 744         BIN_MSG=" diff "
 745         if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then
 746             DIFF_BIN=true
 747             if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then
 748                 BIN_MSG="*$BIN_MSG*"
 749                 REGRESSIONS=true
 750             else
 751                 BIN_MSG=" $BIN_MSG "
 752             fi
 753         else
 754             BIN_MSG="($BIN_MSG)"
 755             DIFF_BIN=
 756         fi
 757     else
 758         BIN_MSG=
 759         DIFF_BIN=
 760     fi
 761 
 762     if [ -n "$STAT" ]; then
 763         THIS_SIZE=$($STAT $STAT_PRINT_SIZE "$THIS_FILE")
 764         OTHER_SIZE=$($STAT $STAT_PRINT_SIZE "$OTHER_FILE")
 765     else
 766         THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }')
 767         OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }')
 768     fi
 769     if [ $THIS_SIZE -ne $OTHER_SIZE ]; then
 770         DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE)
 771         DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE)
 772         SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM)
 773         if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* || "$ACCEPTED_SMALL_SIZE_DIFF" = "true" ]] \
 774             && [ "$DIFF_SIZE_REL" -gt 98 ] \
 775             && [ "$DIFF_SIZE_REL" -lt 102 ]; then
 776             SIZE_MSG="($SIZE_MSG)"
 777             DIFF_SIZE=
 778         elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
 779             && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
 780             && [ "$DIFF_SIZE_NUM" = 512 ]; then
 781             # On windows, size of binaries increase in 512 increments.
 782             SIZE_MSG="($SIZE_MSG)"
 783             DIFF_SIZE=
 784         elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
 785             && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
 786             && [ "$DIFF_SIZE_NUM" = -512 ]; then
 787             # On windows, size of binaries increase in 512 increments.
 788             SIZE_MSG="($SIZE_MSG)"
 789             DIFF_SIZE=
 790         else
 791             if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
 792                 DIFF_SIZE=true
 793                 if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
 794                     SIZE_MSG="*$SIZE_MSG*"
 795                     REGRESSIONS=true
 796                 else
 797                     SIZE_MSG=" $SIZE_MSG "
 798                 fi
 799             else
 800                 SIZE_MSG="($SIZE_MSG)"
 801                 DIFF_SIZE=
 802             fi
 803         fi
 804     else
 805         SIZE_MSG="           "
 806         DIFF_SIZE=
 807         if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then
 808             SIZE_MSG="     !     "
 809         fi
 810     fi
 811 
 812     if [ "$SORT_ALL_SYMBOLS" = "true" ] || [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then
 813         SYM_SORT_CMD="sort"
 814     else
 815         SYM_SORT_CMD="cat"
 816     fi
 817 
 818     if [ -n "$SYMBOLS_DIFF_FILTER" ] && [ -z "$NEED_SYMBOLS_DIFF_FILTER" ] \
 819             || [[ "$NEED_SYMBOLS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
 820         this_SYMBOLS_DIFF_FILTER="$SYMBOLS_DIFF_FILTER"
 821     else
 822         this_SYMBOLS_DIFF_FILTER="$CAT"
 823     fi
 824 
 825     # Check symbols
 826     if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
 827         # The output from dumpbin on windows differs depending on if the debug symbol
 828         # files are still around at the location the binary is pointing too. Need
 829         # to filter out that extra information.
 830         $DUMPBIN -exports $OTHER_FILE | $GREP  -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
 831         $DUMPBIN -exports $THIS_FILE  | $GREP  -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
 832     elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
 833         # Some symbols get seemingly random 15 character prefixes. Filter them out.
 834         $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
 835         $NM -a $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
 836     elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
 837         $OBJDUMP -T $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
 838         $OBJDUMP -T $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
 839     elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
 840         $NM -j $ORIG_OTHER_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
 841         $NM -j $ORIG_THIS_FILE  2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
 842     else
 843         $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME \
 844             | $AWK '{print $2, $3, $4, $5}' \
 845             | eval "$this_SYMBOLS_DIFF_FILTER" \
 846             | $SYM_SORT_CMD \
 847             > $WORK_FILE_BASE.symbols.other
 848         $NM -a $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME \
 849             | $AWK '{print $2, $3, $4, $5}' \
 850             | eval "$this_SYMBOLS_DIFF_FILTER" \
 851             | $SYM_SORT_CMD \
 852             > $WORK_FILE_BASE.symbols.this
 853     fi
 854 
 855     $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
 856     if [ -s $WORK_FILE_BASE.symbols.diff ]; then
 857         SYM_MSG=" diff  "
 858         if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then
 859             DIFF_SYM=true
 860             if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then
 861                 SYM_MSG="*$SYM_MSG*"
 862                 REGRESSIONS=true
 863             else
 864                 SYM_MSG=" $SYM_MSG "
 865             fi
 866         else
 867             SYM_MSG="($SYM_MSG)"
 868             DIFF_SYM=
 869         fi
 870     else
 871         SYM_MSG="         "
 872         DIFF_SYM=
 873         if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then
 874             SYM_MSG="    !    "
 875         fi
 876     fi
 877 
 878     # Check dependencies
 879     if [ -n "$LDD_CMD" ]; then
 880         if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
 881             LDD_FILTER="$GREP \.dll"
 882         else
 883             LDD_FILTER="$CAT"
 884         fi
 885         (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null \
 886                     | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
 887                     | $TEE $WORK_FILE_BASE.deps.other \
 888                     | $UNIQ > $WORK_FILE_BASE.deps.other.uniq)
 889         (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null \
 890                     | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
 891                     | $TEE $WORK_FILE_BASE.deps.this \
 892                     | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
 893         (cd $FILE_WORK_DIR && $RM -f $NAME)
 894 
 895         $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this \
 896               > $WORK_FILE_BASE.deps.diff
 897         $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq \
 898               > $WORK_FILE_BASE.deps.diff.uniq
 899 
 900         if [ -s $WORK_FILE_BASE.deps.diff ]; then
 901             if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then
 902                 DEP_MSG=" diff  "
 903             else
 904                 DEP_MSG=" redun "
 905             fi
 906             if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then
 907                 DIFF_DEP=true
 908                 if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then
 909                     DEP_MSG="*$DEP_MSG*"
 910                     REGRESSIONS=true
 911                 else
 912                     DEP_MSG=" $DEP_MSG "
 913                 fi
 914             else
 915                 DEP_MSG="($DEP_MSG)"
 916                 DIFF_DEP=
 917             fi
 918         else
 919             DEP_MSG="         "
 920             DIFF_DEP=
 921             if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
 922                 DEP_MSG="     !      "
 923             fi
 924         fi
 925     else
 926         DEP_MSG="    -    "
 927     fi
 928 
 929     # Some linux compilers add a unique Build ID
 930     if [ "$OPENJDK_TARGET_OS" = "linux" ]; then
 931       BUILD_ID_FILTER="$SED -r 's/(Build ID:) [0-9a-f]{40}/\1/'"
 932     else
 933       BUILD_ID_FILTER="$CAT"
 934     fi
 935 
 936     # Compare fulldump output
 937     if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then
 938         if [ -z "$FULLDUMP_DIFF_FILTER" ]; then
 939             FULLDUMP_DIFF_FILTER="$CAT"
 940         fi
 941         $FULLDUMP_CMD $OTHER_FILE | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
 942             > $WORK_FILE_BASE.fulldump.other 2>&1 &
 943         $FULLDUMP_CMD $THIS_FILE  | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
 944             > $WORK_FILE_BASE.fulldump.this  2>&1 &
 945         wait
 946 
 947         $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this \
 948             > $WORK_FILE_BASE.fulldump.diff
 949 
 950         if [ -s $WORK_FILE_BASE.fulldump.diff ]; then
 951             FULLDUMP_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}')
 952             FULLDUMP_MSG=$($PRINTF "%8d" $FULLDUMP_DIFF_SIZE)
 953             if [[ "$ACCEPTED_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
 954                 DIFF_FULLDUMP=true
 955                 if [[ "$KNOWN_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
 956                     FULLDUMP_MSG="*$FULLDUMP_MSG*"
 957                     REGRESSIONS=true
 958                 else
 959                     FULLDUMP_MSG=" $FULLDUMP_MSG "
 960                 fi
 961             else
 962                 FULLDUMP_MSG="($FULLDUMP_MSG)"
 963                 DIFF_FULLDUMP=
 964             fi
 965         else
 966             FULLDUMP_MSG="          "
 967             DIFF_FULLDUMP=
 968             if [[ "$KNOWN_FULLDUMP_DIFF $ACCEPTED_FULLDUMP_DIFF" = *"$BIN_FILE"* ]]; then
 969                 FULLDUMP_MSG="    !    "
 970             fi
 971         fi
 972     fi
 973 
 974     # Compare disassemble output
 975     if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then
 976         this_DIS_DIFF_FILTER="$CAT"
 977         if [ -n "$DIS_DIFF_FILTER" ]; then
 978             if [ -z "$NEED_DIS_DIFF_FILTER" ] \
 979                 || [[ "$NEED_DIS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
 980                 this_DIS_DIFF_FILTER="$DIS_DIFF_FILTER"
 981             fi
 982         fi
 983         if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
 984             DIS_GREP_ARG=-a
 985         else
 986             DIS_GREP_ARG=
 987         fi
 988         $DIS_CMD $OTHER_FILE | $GREP $DIS_GREP_ARG -v $NAME \
 989             | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.other 2>&1 &
 990         $DIS_CMD $THIS_FILE  | $GREP $DIS_GREP_ARG -v $NAME \
 991             | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.this  2>&1 &
 992         wait
 993 
 994         $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff
 995 
 996         if [ -s $WORK_FILE_BASE.dis.diff ]; then
 997             DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}')
 998             DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE)
 999             if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then
1000                 DIFF_DIS=true
1001                 if [ "$MAX_KNOWN_DIS_DIFF_SIZE" = "" ]; then
1002                     MAX_KNOWN_DIS_DIFF_SIZE="0"
1003                 fi
1004                 if [[ "$KNOWN_DIS_DIFF" = *"$BIN_FILE"* ]] \
1005                     && [ "$DIS_DIFF_SIZE" -lt "$MAX_KNOWN_DIS_DIFF_SIZE" ]; then
1006                     DIS_MSG=" $DIS_MSG "
1007                 else
1008                     DIS_MSG="*$DIS_MSG*"
1009                     REGRESSIONS=true
1010                 fi
1011             else
1012                 DIS_MSG="($DIS_MSG)"
1013                 DIFF_DIS=
1014             fi
1015         else
1016             DIS_MSG="          "
1017             DIFF_DIS=
1018             if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
1019                 DIS_MSG="    !    "
1020             fi
1021         fi
1022     fi
1023 
1024 
1025     if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_FULLDUMP$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then
1026         if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi
1027         if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi
1028         if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi
1029         if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi
1030         if [ -n "$FULLDUMP_MSG" ]; then echo -n "$FULLDUMP_MSG:"; fi
1031         if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi
1032         echo " $BIN_FILE"
1033         if [ "$SHOW_DIFFS" = "true" ]; then
1034             if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then
1035                 echo "Symbols diff:"
1036                 $CAT $WORK_FILE_BASE.symbols.diff
1037             fi
1038             if [ -s "$WORK_FILE_BASE.deps.diff" ]; then
1039                 echo "Deps diff:"
1040                 $CAT $WORK_FILE_BASE.deps.diff
1041             fi
1042             if [ -s "$WORK_FILE_BASE.fulldump.diff" ]; then
1043                 echo "Fulldump diff:"
1044                 $CAT $WORK_FILE_BASE.fulldump.diff
1045             fi
1046             if [ -s "$WORK_FILE_BASE.dis.diff" ]; then
1047                 echo "Disassembly diff:"
1048                 $CAT $WORK_FILE_BASE.dis.diff
1049             fi
1050         fi
1051         return 1
1052     fi
1053     return 0
1054 }
1055 
1056 ################################################################################
1057 # Print binary diff header
1058 
1059 print_binary_diff_header() {
1060     if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi
1061     if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n "   Size    :"; fi
1062     if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi
1063     if [ -z "$SKIP_DEP_DIFF" ]; then echo -n "  Deps   :"; fi
1064     if [ -z "$SKIP_FULLDUMP_DIFF" ]; then echo -n " Fulldump :"; fi
1065     if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass   :"; fi
1066     echo
1067 }
1068 
1069 ################################################################################
1070 # Compare all libraries
1071 
1072 compare_all_libs() {
1073     THIS_DIR=$1
1074     OTHER_DIR=$2
1075     WORK_DIR=$3
1076 
1077     LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' \
1078         -o -name '*.dll' -o -name '*.obj' -o -name '*.o' -o -name '*.a' \
1079         -o -name '*.cpl' \) | $SORT | $FILTER)
1080 
1081     # On macos, filter out the dSYM debug symbols files as they are also
1082     # named *.dylib.
1083     if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
1084         LIBS=$(echo "$LIBS" | $GREP -v '\.dSYM/')
1085     fi
1086 
1087     if [ -n "$LIBS" ]; then
1088         echo Libraries...
1089         print_binary_diff_header
1090         for l in $LIBS; do
1091             if [ -f "$OTHER_DIR/$l" ]; then
1092                 compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l
1093                 if [ "$?" != "0" ]; then
1094                     return_value=1
1095                 fi
1096             fi
1097         done
1098     fi
1099 
1100     return $return_value
1101 }
1102 
1103 ################################################################################
1104 # Compare all executables
1105 
1106 compare_all_execs() {
1107     THIS_DIR=$1
1108     OTHER_DIR=$2
1109     WORK_DIR=$3
1110 
1111     if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1112         EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER)
1113     else
1114         EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \
1115             \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \
1116             -o -name '*.jar' -o -name '*.diz' -o -name 'jcontrol' -o -name '*.properties' \
1117             -o -name '*.data' -o -name '*.bfc' -o -name '*.src' -o -name '*.txt' \
1118             -o -name '*.cfg' -o -name 'meta-index' -o -name '*.properties.ja' \
1119             -o -name '*.xml' -o -name '*.html' -o -name '*.png' -o -name 'README' \
1120             -o -name '*.zip' -o -name '*.jimage' -o -name '*.java' -o -name '*.mf' \
1121             -o -name '*.jpg' -o -name '*.wsdl' -o -name '*.js' -o -name '*.sh' \
1122             -o -name '*.bat' -o -name '*LICENSE' -o -name '*.d' -o -name '*store' \
1123             -o -name 'blacklist' -o -name '*certs' -o -name '*.ttf' \
1124             -o -name '*.jfc' -o -name '*.dat'  -o -name 'release' -o -name '*.dir'\
1125             -o -name '*.sym' -o -name '*.idl' -o -name '*.h' -o -name '*.access' \
1126             -o -name '*.template' -o -name '*.policy' -o -name '*.security' \
1127             -o -name 'COPYRIGHT' -o -name '*.1' -o -name '*.debuginfo' \
1128             -o -name 'classlist' \) | $SORT | $FILTER)
1129     fi
1130 
1131     if [ -n "$EXECS" ]; then
1132         echo Executables...
1133         print_binary_diff_header
1134         for e in $EXECS; do
1135             if [ -f "$OTHER_DIR/$e" ]; then
1136                 compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e
1137                 if [ "$?" != "0" ]; then
1138                     return_value=1
1139                 fi
1140             fi
1141         done
1142     fi
1143 
1144     return $return_value
1145 }
1146 
1147 ################################################################################
1148 # Initiate configuration
1149 
1150 THIS="$SCRIPT_DIR"
1151 echo "$THIS"
1152 THIS_SCRIPT="$0"
1153 
1154 if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
1155     echo "bash ./compare.sh [OPTIONS] [FILTER]"
1156     echo ""
1157     echo "-all                Compare all files in all known ways"
1158     echo "-names              Compare the file names and directory structure"
1159     echo "-perms              Compare the permission bits on all files and directories"
1160     echo "-types              Compare the output of the file command on all files"
1161     echo "-general            Compare the files not convered by the specialized comparisons"
1162     echo "-zips               Compare the contents of all zip files and files in them"
1163     echo "-zips-names         Compare the file names inside all zip files"
1164     echo "-jars               Compare the contents of all jar files"
1165     echo "-jmods              Compare the listings of all jmod files"
1166     echo "-libs               Compare all native libraries"
1167     echo "-execs              Compare all executables"
1168     echo "-v                  Verbose output, does not hide known differences"
1169     echo "-vv                 More verbose output, shows diff output of all comparisons"
1170     echo "-o [OTHER]          Compare with build in other directory. Will default to the old build directory"
1171     echo ""
1172     echo "--sort-symbols      Sort all symbols before comparing"
1173     echo "--strip             Strip all binaries before comparing"
1174     echo "--clean             Clean all previous comparison results first"
1175     echo ""
1176     echo "[FILTER]            List filenames in the image to compare, works for jars, zips, libs and execs"
1177     echo "Example:"
1178     echo "bash ./make/scripts/compareimages.sh CodePointIM.jar"
1179     echo ""
1180     echo "-2zips <file1> <file2> Compare two zip files only"
1181     echo "-2bins <file1> <file2> Compare two binary files only"
1182     echo "-2dirs <dir1> <dir2> Compare two directories as if they were images"
1183     echo ""
1184     exit 10
1185 fi
1186 
1187 CMP_NAMES=false
1188 CMP_PERMS=false
1189 CMP_TYPES=false
1190 CMP_GENERAL=false
1191 CMP_ZIPS=false
1192 CMP_ZIPS_CONTENTS=true
1193 CMP_JARS=false
1194 CMP_JMODS=false
1195 CMP_LIBS=false
1196 CMP_EXECS=false
1197 
1198 while [ -n "$1" ]; do
1199     case "$1" in
1200         -v)
1201             VERBOSE=true
1202             ;;
1203         -vv)
1204             VERBOSE=true
1205             SHOW_DIFFS=true
1206             ;;
1207         -o)
1208             OTHER="$2"
1209             shift
1210             ;;
1211         -all)
1212             CMP_NAMES=true
1213             if [ "$OPENJDK_TARGET_OS" != "windows" ]; then
1214                 CMP_PERMS=true
1215             fi
1216             CMP_TYPES=true
1217             CMP_GENERAL=true
1218             CMP_ZIPS=true
1219             CMP_JARS=true
1220             CMP_JMODS=true
1221             CMP_LIBS=true
1222             CMP_EXECS=true
1223             ;;
1224         -names)
1225             CMP_NAMES=true
1226             ;;
1227         -perms)
1228             CMP_PERMS=true
1229             ;;
1230         -types)
1231             CMP_TYPES=true
1232             ;;
1233         -general)
1234             CMP_GENERAL=true
1235             ;;
1236         -zips)
1237             CMP_ZIPS=true
1238             CMP_ZIPS_CONTENTS=true
1239             ;;
1240         -zips-names)
1241             CMP_ZIPS=true
1242             CMP_ZIPS_CONTENTS=false
1243             ;;
1244         -jars)
1245             CMP_JARS=true
1246             ;;
1247         -jmods)
1248             CMP_JMODS=true
1249             ;;
1250         -libs)
1251             CMP_LIBS=true
1252             ;;
1253         -execs)
1254             CMP_EXECS=true
1255             ;;
1256         -2dirs)
1257             THIS="$(cd "$2" > /dev/null && pwd )"
1258             OTHER="$(cd "$3" > /dev/null && pwd )"
1259             THIS_BASE_DIR="$THIS"
1260             OTHER_BASE_DIR="$OTHER"
1261             SKIP_DEFAULT=true
1262             shift
1263             shift
1264             ;;
1265         -2zips)
1266             CMP_2_ZIPS=true
1267             THIS_FILE=$2
1268             OTHER_FILE=$3
1269             shift
1270             shift
1271             ;;
1272         -2bins)
1273             CMP_2_BINS=true
1274             THIS_FILE=$2
1275             OTHER_FILE=$3
1276             shift
1277             shift
1278             ;;
1279         --sort-symbols)
1280             SORT_ALL_SYMBOLS=true
1281             ;;
1282         --strip)
1283             STRIP_ALL=true
1284             ;;
1285         --clean)
1286             CLEAN_OUTPUT=true
1287             ;;
1288         *)
1289             CMP_NAMES=false
1290             CMP_PERMS=false
1291             CMP_TYPES=false
1292             CMP_ZIPS=true
1293             CMP_JARS=true
1294             CMP_JMODS=true
1295             CMP_LIBS=true
1296             CMP_EXECS=true
1297 
1298             if [ -z "$FILTER" ]; then
1299                 FILTER="$GREP"
1300             fi
1301             FILTER="$FILTER -e $1"
1302             ;;
1303     esac
1304     shift
1305 done
1306 
1307 if [ "$STRIP_ALL" = "true" ] && [ -z "$STRIP" ]; then
1308   echo Warning: Not stripping even with --strip, since strip is missing on this platform
1309   STRIP_ALL=false
1310 fi
1311 
1312 COMPARE_ROOT=$OUTPUTDIR/compare-support
1313 if [ "$CLEAN_OUTPUT" = "true" ]; then
1314     echo Cleaning old output in $COMPARE_ROOT.
1315     $RM -rf $COMPARE_ROOT
1316 fi
1317 $MKDIR -p $COMPARE_ROOT
1318 if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1319     if [ "$(uname -o)" = "Cygwin" ]; then
1320         COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT)
1321     fi
1322 fi
1323 
1324 if [ "$CMP_2_ZIPS" = "true" ]; then
1325     THIS_DIR="$(dirname $THIS_FILE)"
1326     THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
1327     OTHER_DIR="$(dirname $OTHER_FILE)"
1328     OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
1329     THIS_FILE_NAME="$(basename $THIS_FILE)"
1330     OTHER_FILE_NAME="$(basename $OTHER_FILE)"
1331     echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
1332     compare_zip_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2zips $THIS_FILE_NAME $OTHER_FILE_NAME
1333     exit
1334 fi
1335 
1336 if [ "$CMP_2_BINS" = "true" ]; then
1337     THIS_DIR="$(dirname $THIS_FILE)"
1338     THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
1339     OTHER_DIR="$(dirname $OTHER_FILE)"
1340     OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
1341     THIS_FILE_NAME="$(basename $THIS_FILE)"
1342     OTHER_FILE_NAME="$(basename $OTHER_FILE)"
1343     echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
1344     compare_bin_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2bins $THIS_FILE_NAME $OTHER_FILE_NAME
1345     exit
1346 fi
1347 
1348 if [ "$CMP_NAMES" = "false" ] \
1349        && [ "$CMP_TYPES" = "false" ] \
1350        && [ "$CMP_PERMS" = "false" ] \
1351        && [ "$CMP_GENERAL" = "false" ] \
1352        && [ "$CMP_ZIPS" = "false" ] \
1353        && [ "$CMP_JARS" = "false" ] \
1354        && [ "$CMP_JMODS" = "false" ] \
1355        && [ "$CMP_LIBS" = "false" ] \
1356        && [ "$CMP_EXECS" = "false" ]; then
1357     CMP_NAMES=true
1358     CMP_PERMS=true
1359     CMP_TYPES=true
1360     CMP_GENERAL=true
1361     CMP_ZIPS=true
1362     CMP_JARS=true
1363     CMP_JMODS=true
1364     CMP_LIBS=true
1365     CMP_EXECS=true
1366 fi
1367 
1368 if [ -z "$FILTER" ]; then
1369     FILTER="$CAT"
1370 fi
1371 
1372 if [ "$SKIP_DEFAULT" != "true" ]; then
1373     if [ -z "$OTHER" ]; then
1374         echo "Nothing to compare to, set with -o"
1375         exit 1
1376     else
1377         if [ ! -d "$OTHER" ]; then
1378             echo "Other build directory does not exist:"
1379             echo "$OTHER"
1380             exit 1
1381         fi
1382         OTHER="$( cd "$OTHER" > /dev/null && pwd )"
1383         echo "Comparing to:"
1384         echo "$OTHER"
1385         echo
1386     fi
1387 
1388     # Find the common images to compare, prioritizing later build stages
1389     if [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/images/jdk" ]; then
1390         THIS_JDK="$THIS/images/jdk"
1391         OTHER_JDK="$OTHER/images/jdk"
1392         echo "Selecting normal images for JDK compare"
1393     elif [ -d "$(ls -d $THIS/licensee-src/build/*/images/jdk 2> /dev/null)" ] \
1394         && [ -d "$(ls -d $OTHER/licensee-src/build/*/images/jdk 2> /dev/null)" ]
1395     then
1396         echo "Selecting licensee images for compare"
1397         # Simply override the THIS and OTHER dir with the build dir from
1398         # the nested licensee source build for the rest of the script
1399         # execution.
1400         OLD_THIS="$THIS"
1401         OLD_OTHER="$OTHER"
1402         THIS="$(ls -d $THIS/licensee-src/build/*)"
1403         OTHER="$(ls -d $OTHER/licensee-src/build/*)"
1404         THIS_JDK="$THIS/images/jdk"
1405         OTHER_JDK="$OTHER/images/jdk"
1406         # Rewrite the path to tools that are used from the build
1407         JIMAGE="$(echo "$JIMAGE" | $SED "s|$OLD_THIS|$THIS|g")"
1408         JMOD="$(echo "$JMOD" | $SED "s|$OLD_THIS|$THIS|g")"
1409         JAVAP="$(echo "$JAVAP" | $SED "s|$OLD_THIS|$THIS|g")"
1410     else
1411         echo "No common images found."
1412         exit 1
1413     fi
1414     echo "  $THIS_JDK"
1415     echo "  $OTHER_JDK"
1416 
1417     if [ -d "$THIS/images/jdk-bundle" -o -d "$THIS/deploy/images/jdk-bundle" ] \
1418              && [ -d "$OTHER/images/jdk-bundle" -o -d "$OTHER/deploy/images/jdk-bundle" ]; then
1419         if [ -d "$THIS/deploy/images/jdk-bundle" ]; then
1420             THIS_JDK_BUNDLE="$THIS/deploy/images/jdk-bundle"
1421         else
1422             THIS_JDK_BUNDLE="$THIS/images/jdk-bundle"
1423         fi
1424         if [ -d "$OTHER/deploy/images/jdk-bundle" ]; then
1425             OTHER_JDK_BUNDLE="$OTHER/deploy/images/jdk-bundle"
1426         else
1427             OTHER_JDK_BUNDLE="$OTHER/images/jdk-bundle"
1428         fi
1429         echo "Also comparing jdk macosx bundles"
1430         echo "  $THIS_JDK_BUNDLE"
1431         echo "  $OTHER_JDK_BUNDLE"
1432     fi
1433 
1434     THIS_SEC_DIR="$THIS/images"
1435     OTHER_SEC_DIR="$OTHER/images"
1436     if [ -f "$THIS_SEC_DIR/sec-bin.zip" ] && [ -f "$OTHER_SEC_DIR/sec-bin.zip" ]; then
1437         OTHER_SEC_BIN="$OTHER_SEC_DIR/sec-bin.zip"
1438         THIS_SEC_BIN="$THIS_SEC_DIR/sec-bin.zip"
1439         if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1440             if [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
1441                 JGSS_WINDOWS_BIN="jgss-windows-x64-bin.zip"
1442             else
1443                 JGSS_WINDOWS_BIN="jgss-windows-i586-bin.zip"
1444             fi
1445             OTHER_SEC_WINDOWS_BIN="$OTHER_SEC_DIR/sec-windows-bin.zip"
1446             OTHER_JGSS_WINDOWS_BIN="$OTHER_SEC_DIR/$JGSS_WINDOWS_BIN"
1447             THIS_SEC_WINDOWS_BIN="$THIS_SEC_DIR/sec-windows-bin.zip"
1448             THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
1449         fi
1450     fi
1451 
1452     if [ -d "$THIS/images/docs" ] && [ -d "$OTHER/images/docs" ]; then
1453         THIS_DOCS="$THIS/images/docs"
1454         OTHER_DOCS="$OTHER/images/docs"
1455         echo "Also comparing docs"
1456     else
1457         echo "WARNING! Docs haven't been built and won't be compared."
1458     fi
1459 
1460     if [ -d "$THIS/images/test" ] && [ -d "$OTHER/images/test" ]; then
1461         THIS_TEST="$THIS/images/test"
1462         OTHER_TEST="$OTHER/images/test"
1463         echo "Also comparing test image"
1464     else
1465         echo "WARNING! Test haven't been built and won't be compared."
1466     fi
1467 fi
1468 
1469 ################################################################################
1470 # Do the work
1471 
1472 if [ "$CMP_NAMES" = "true" ]; then
1473     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1474         echo -n "JDK "
1475         compare_dirs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1476         echo -n "JDK "
1477         compare_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1478     fi
1479     if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1480         echo -n "JDK Bundle "
1481         compare_dirs $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1482 
1483         echo -n "JDK Bundle "
1484         compare_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1485     fi
1486     if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
1487         echo -n "Docs "
1488         compare_dirs $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1489         echo -n "Docs "
1490         compare_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1491     fi
1492     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1493         echo -n "Test "
1494         compare_dirs $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1495         echo -n "Test "
1496         compare_files $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1497     fi
1498     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1499         compare_dirs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1500         compare_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1501     fi
1502 fi
1503 
1504 if [ "$CMP_LIBS" = "true" ]; then
1505     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1506         echo -n "JDK "
1507         compare_all_libs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1508     fi
1509     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1510         echo -n "Test "
1511         STRIP_ALL_bak="$STRIP_ALL"
1512         if [ "$STRIP_TESTS_BEFORE_COMPARE" = "true" ]; then
1513           STRIP_ALL="true"
1514         fi
1515         compare_all_libs $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1516         STRIP_ALL="$STRIP_ALL_bak"
1517     fi
1518     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1519         compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1520     fi
1521 fi
1522 
1523 if [ "$CMP_EXECS" = "true" ]; then
1524     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1525         echo -n "JDK "
1526         compare_all_execs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1527     fi
1528     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1529         echo -n "Test "
1530         STRIP_ALL_bak="$STRIP_ALL"
1531         if [ "$STRIP_TESTS_BEFORE_COMPARE" = "true" ]; then
1532           STRIP_ALL="true"
1533         fi
1534         compare_all_execs $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1535         STRIP_ALL="$STRIP_ALL_bak"
1536     fi
1537     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1538         compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1539     fi
1540 fi
1541 
1542 if [ "$CMP_GENERAL" = "true" ]; then
1543     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1544         echo -n "JDK "
1545         compare_general_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1546     fi
1547     if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1548         echo -n "JDK Bundle "
1549         compare_general_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1550     fi
1551     if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
1552         echo -n "Docs "
1553         compare_general_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1554     fi
1555     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1556         echo -n "Test "
1557         compare_general_files $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1558     fi
1559     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1560         compare_general_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1561     fi
1562 fi
1563 
1564 if [ "$CMP_ZIPS" = "true" ]; then
1565     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1566         echo -n "JDK "
1567         compare_all_zip_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1568     fi
1569     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1570         echo -n "Test "
1571         compare_all_zip_files $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1572     fi
1573     if [ -n "$THIS_SEC_BIN" ] && [ -n "$OTHER_SEC_BIN" ]; then
1574         if [ -n "$(echo $THIS_SEC_BIN | $FILTER)" ]; then
1575             echo "sec-bin.zip..."
1576             compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-bin.zip
1577         fi
1578     fi
1579     if [ -n "$THIS_SEC_WINDOWS_BIN" ] && [ -n "$OTHER_SEC_WINDOWS_BIN" ]; then
1580         if [ -n "$(echo $THIS_SEC_WINDOWS_BIN | $FILTER)" ]; then
1581             echo "sec-windows-bin.zip..."
1582             compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-windows-bin.zip
1583         fi
1584     fi
1585     if [ -n "$THIS_JGSS_WINDOWS_BIN" ] && [ -n "$OTHER_JGSS_WINDOWS_BIN" ]; then
1586         if [ -n "$(echo $THIS_JGSS_WINDOWS_BIN | $FILTER)" ]; then
1587             echo "$JGSS_WINDOWS_BIN..."
1588             compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin $JGSS_WINDOWS_BIN
1589         fi
1590     fi
1591     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1592         compare_all_zip_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1593     fi
1594 fi
1595 
1596 if [ "$CMP_JARS" = "true" ]; then
1597     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1598         echo -n "JDK "
1599         compare_all_jar_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1600     fi
1601     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1602         echo -n "Test "
1603         compare_all_jar_files $THIS_TEST $OTHER_TEST $COMPARE_ROOT/test
1604     fi
1605     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1606         compare_all_jar_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1607     fi
1608 fi
1609 
1610 if [ "$CMP_JMODS" = "true" ]; then
1611     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1612         compare_all_jmod_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1613     fi
1614     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1615         compare_all_jmod_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1616     fi
1617 fi
1618 
1619 if [ "$CMP_PERMS" = "true" ]; then
1620     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1621         echo -n "JDK "
1622         compare_permissions $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1623     fi
1624     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1625         compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1626     fi
1627 fi
1628 
1629 if [ "$CMP_TYPES" = "true" ]; then
1630     if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1631         echo -n "JDK "
1632         compare_file_types $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1633     fi
1634     if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1635         echo -n "JDK Bundle "
1636         compare_file_types $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1637     fi
1638     if [ -n "$THIS_TEST" ] && [ -n "$OTHER_TEST" ]; then
1639         echo -n "Test "
1640         compare_file_types $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1641     fi
1642     if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1643         compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1644     fi
1645 fi
1646 
1647 echo
1648 
1649 if [ -n "$REGRESSIONS" ]; then
1650     echo "REGRESSIONS FOUND!"
1651     echo
1652     exit 1
1653 else
1654     echo "No regressions found"
1655     echo
1656     exit 0
1657 fi