brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.2 KiB · 4124062 Raw
791 lines · bash
1#!/usr/bin/env bash2#===-- test-release.sh - Test the LLVM release candidates ------------------===#3#4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5# See https://llvm.org/LICENSE.txt for license information.6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7#8#===------------------------------------------------------------------------===#9#10# Download, build, and test the release candidate for an LLVM release.11#12#===------------------------------------------------------------------------===#13 14System=`uname -s`15Machine=`uname -m`16if [ "$System" = "FreeBSD" ]; then17    MAKE=gmake18else19    MAKE=make20fi21generator="Unix Makefiles"22 23Release=""24Release_no_dot=""25RC=""26Triple=""27use_gzip="no"28do_checkout="yes"29do_debug="no"30do_asserts="no"31do_compare="yes"32do_rt="yes"33do_clang_tools="yes"34do_libs="yes"35do_libcxxabi="yes"36do_libunwind="yes"37do_test_suite="yes"38do_openmp="yes"39do_lld="yes"40do_lldb="yes"41do_polly="yes"42do_mlir="yes"43do_flang="yes"44do_silent_log="no"45BuildDir="`pwd`"46ExtraConfigureFlags=""47ExportBranch=""48git_ref=""49do_cmake_cache="no"50do_bolt="no"51if [ "$System" = "Linux" ]; then52    case $Machine in53        x86_64 | arm64 | aarch64 )54            do_bolt="yes"55            ;;56    esac57fi58 59function usage() {60    echo "usage: `basename $0` -release X.Y.Z -rc NUM [OPTIONS]"61    echo ""62    echo " -release X.Y.Z       The release version to test."63    echo " -rc NUM              The pre-release candidate number."64    echo " -final               The final release candidate."65    echo " -triple TRIPLE       The target triple for this machine."66    echo " -j NUM               Number of compile jobs to run. [default: 3]"67    echo " -build-dir DIR       Directory to perform testing in. [default: pwd]"68    echo " -no-checkout         Don't checkout the sources from SVN."69    echo " -test-debug          Test the debug build. [default: no]"70    echo " -test-asserts        Test with asserts on. [default: no]"71    echo " -no-compare-files    Don't test that phase 2 and 3 files are identical."72    echo " -use-gzip            Use gzip instead of xz."73    echo " -use-ninja           Use ninja instead of make/gmake."74    echo " -configure-flags FLAGS  Extra flags to pass to the configure step."75    echo " -git-ref sha         Use the specified git ref for testing instead of a release."76    echo " -no-rt               Disable check-out & build Compiler-RT"77    echo " -no-clang-tools      Disable check-out & build clang-tools-extra"78    echo " -no-libs             Disable check-out & build libcxx/libcxxabi/libunwind"79    echo " -no-libcxxabi        Disable check-out & build libcxxabi"80    echo " -no-libunwind        Disable check-out & build libunwind"81    echo " -no-test-suite       Disable check-out & build test-suite"82    echo " -no-openmp           Disable check-out & build libomp"83    echo " -no-lld              Disable check-out & build lld"84    echo " -lldb                Enable check-out & build lldb"85    echo " -no-lldb             Disable check-out & build lldb (default)"86    echo " -no-polly            Disable check-out & build Polly"87    echo " -no-mlir             Disable check-out & build MLIR"88    echo " -no-flang            Disable check-out & build Flang"89    echo " -silent-log          Don't output build logs to stdout"90    echo " -use-cmake-cache     Build using a CMake cache file"91}92 93while [ $# -gt 0 ]; do94    case $1 in95        -release | --release )96            shift97            Release="$1"98            Release_no_dot="`echo $1 | sed -e 's,\.,,g'`"99            ;;100        -rc | --rc | -RC | --RC )101            shift102            RC="rc$1"103            ;;104        -final | --final )105            RC=final106            ;;107        -git-ref | --git-ref )108            shift109            Release="test"110            Release_no_dot="test"111            ExportBranch="$1"112            RC="`echo $ExportBranch | sed -e 's,/,_,g'`"113            git_ref="$1"114            echo "WARNING: Using the ref $git_ref instead of a release tag"115            echo "         This is intended to aid new packagers in trialing "116            echo "         builds without requiring a tag to be created first"117            ;;118        -triple | --triple )119            shift120            Triple="$1"121            ;;122        -configure-flags | --configure-flags )123            shift124            ExtraConfigureFlags="$1"125            ;;126        -j* )127            NumJobs="`echo $1 | sed -e 's,-j\([0-9]*\),\1,g'`"128            if [ -z "$NumJobs" ]; then129                shift130                NumJobs="$1"131            fi132            ;;133        -use-ninja )134            MAKE=ninja135            generator=Ninja136            ;;137        -build-dir | --build-dir | -builddir | --builddir )138            shift139            BuildDir="$1"140            ;;141        -no-checkout | --no-checkout )142            do_checkout="no"143            ;;144        -test-debug | --test-debug )145            do_debug="yes"146            ;;147        -test-asserts | --test-asserts )148            do_asserts="yes"149            ;;150        -no-compare-files | --no-compare-files )151            do_compare="no"152            ;;153        -use-gzip | --use-gzip )154            use_gzip="yes"155            ;;156        -no-rt )157            do_rt="no"158            ;;159        -no-libs )160            do_libs="no"161            ;;162        -no-clang-tools )163            do_clang_tools="no"164            ;;165        -no-libcxxabi )166            do_libcxxabi="no"167            ;;168        -no-libunwind )169            do_libunwind="no"170            ;;171        -no-test-suite )172            do_test_suite="no"173            ;;174        -no-openmp )175            do_openmp="no"176            ;;177        -bolt )178            do_bolt="yes"179            ;;180        -no-bolt )181            do_bolt="no"182            ;;183        -no-lld )184            do_lld="no"185            ;;186        -lldb )187            do_lldb="yes"188            ;;189        -no-lldb )190            do_lldb="no"191            ;;192        -no-polly )193            do_polly="no"194            ;;195        -no-mlir )196            do_mlir="no"197            ;;198        -no-flang )199            do_flang="no"200            ;;201        -silent-log )202            do_silent_log="yes"203            ;;204        -use-cmake-cache | --use-cmake-cache )205            do_cmake_cache="yes"206            ;;207        -help | --help | -h | --h | -\? )208            usage209            exit 0210            ;;211        * )212            echo "unknown option: $1"213            usage214            exit 1215            ;;216    esac217    shift218done219 220if [ $do_mlir = "no" ] && [ $do_flang = "yes" ]; then221  echo "error: cannot build Flang without MLIR"222  exit 1223fi224 225# Check required arguments.226if [ -z "$Release" ]; then227    echo "error: no release number specified"228    exit 1229fi230if [ -z "$RC" ]; then231    echo "error: no release candidate number specified"232    exit 1233fi234if [ -z "$ExportBranch" ]; then235    ExportBranch="tags/RELEASE_$Release_no_dot/$RC"236fi237if [ -z "$Triple" ]; then238    echo "error: no target triple specified"239    exit 1240fi241 242if [ "$Release" != "test" ]; then243  if [ -n "$git_ref" ]; then244    echo "error: can't specify both -release and -git-ref"245    exit 1246  fi247  git_ref=llvmorg-$Release248  if [ "$RC" != "final" ]; then249    git_ref="$git_ref-$RC"250  fi251fi252 253UserNumJobs="$NumJobs"254 255# Figure out how many make processes to run.256if [ -z "$NumJobs" ]; then257    NumJobs=`sysctl -n hw.activecpu 2> /dev/null || true`258fi259if [ -z "$NumJobs" ]; then260    NumJobs=`sysctl -n hw.ncpu 2> /dev/null || true`261fi262if [ -z "$NumJobs" ]; then263    NumJobs=`grep -c processor /proc/cpuinfo 2> /dev/null || true`264fi265if [ -z "$NumJobs" ]; then266    NumJobs=3267fi268 269if [ "$MAKE" = "ninja" ] && [ -z "$UserNumJobs" ]; then270  # Rely on default ninja job numbers271  J_ARG=""272else273  J_ARG="-j $NumJobs"274fi275 276# Projects list277projects="llvm;clang"278if [ $do_clang_tools = "yes" ]; then279  projects="${projects:+$projects;}clang-tools-extra"280fi281runtimes=""282if [ $do_rt = "yes" ]; then283  runtimes="${runtimes:+$runtimes;}compiler-rt"284fi285if [ $do_libs = "yes" ]; then286  runtimes="${runtimes:+$runtimes;}libcxx"287  if [ $do_libcxxabi = "yes" ]; then288    runtimes="${runtimes:+$runtimes;}libcxxabi"289  fi290  if [ $do_libunwind = "yes" ]; then291    runtimes="${runtimes:+$runtimes;}libunwind"292  fi293fi294if [ $do_openmp = "yes" ]; then295  projects="${projects:+$projects;}openmp"296fi297if [ $do_bolt = "yes" ]; then298  projects="${projects:+$projects;}bolt"299fi300if [ $do_lld = "yes" ]; then301  projects="${projects:+$projects;}lld"302fi303if [ $do_lldb = "yes" ]; then304  projects="${projects:+$projects;}lldb"305fi306if [ $do_polly = "yes" ]; then307  projects="${projects:+$projects;}polly"308fi309if [ $do_mlir = "yes" ]; then310  projects="${projects:+$projects;}mlir"311fi312if [ $do_flang = "yes" ]; then313  projects="${projects:+$projects;}flang"314fi315 316# Go to the build directory (may be different from CWD)317BuildDir=$BuildDir/$RC318mkdir -p $BuildDir319cd $BuildDir320 321# Location of log files.322LogDir=$BuildDir/logs323mkdir -p $LogDir324 325# Final package name.326Package=clang+llvm-$Release327if [ $RC != "final" ]; then328  Package=$Package-$RC329fi330Package=$Package-$Triple331 332# Errors to be highlighted at the end are written to this file.333echo -n > $LogDir/deferred_errors.log334 335redir="/dev/stdout"336if [ $do_silent_log == "yes" ]; then337  echo "# Silencing build logs because of -silent-log flag..."338  redir="/dev/null"339fi340 341 342function build_with_cmake_cache() {343(344  CMakeBuildDir=$BuildDir/build345  SrcDir=$BuildDir/llvm-project/346  InstallDir=$BuildDir/install347 348  rm -rf $CMakeBuildDir349 350  # FIXME: Would be nice if the commands were echoed to the log file too.351  set -x352 353  env CC="$c_compiler" CXX="$cxx_compiler" \354  cmake -G "$generator" -B $CMakeBuildDir -S $SrcDir/llvm \355        -C $SrcDir/clang/cmake/caches/Release.cmake \356	-DCLANG_BOOTSTRAP_PASSTHROUGH="LLVM_LIT_ARGS" \357        -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \358        $ExtraConfigureFlags359        2>&1 | tee $LogDir/llvm.configure-$Flavor.log360 361  ${MAKE} $J_ARG $Verbose -C $CMakeBuildDir stage2-check-all \362          2>&1 | tee $LogDir/llvm.make-$Flavor.log > $redir363 364  DESTDIR="${InstallDir}" \365  ${MAKE} -C $CMakeBuildDir stage2-install \366          2>&1 | tee $LogDir/llvm.install-$Flavor.log > $redir367 368 mkdir -p $BuildDir/Release369 pushd $BuildDir/Release370 mv $InstallDir/usr/local $Package371 if [ "$use_gzip" = "yes" ]; then372    tar cf - $Package | gzip -9c > $BuildDir/$Package.tar.gz373  else374    tar cf - $Package | xz -9ce -T $NumJobs > $BuildDir/$Package.tar.xz375  fi376  mv $Package $InstallDir/usr/local377  popd378) 2>&1 | tee $LogDir/testing.$Release-$RC.log379 380  exit 0381}382 383function deferred_error() {384  Phase="$1"385  Flavor="$2"386  Msg="$3"387  echo "[${Flavor} Phase${Phase}] ${Msg}" | tee -a $LogDir/deferred_errors.log388}389 390# Make sure that a required program is available391function check_program_exists() {392  local program="$1"393  if ! type -P $program > /dev/null 2>&1 ; then394    echo "program '$1' not found !"395    exit 1396  fi397}398 399if [ "$System" != "Darwin" ] && [ "$System" != "SunOS" ] && [ "$System" != "AIX" ]; then400  check_program_exists 'chrpath'401fi402 403if [ "$System" != "Darwin" ]; then404  check_program_exists 'file'405  check_program_exists 'objdump'406fi407 408check_program_exists ${MAKE}409 410# Export sources to the build directory.411function export_sources() {412  SrcDir=$BuildDir/llvm-project413  mkdir -p $SrcDir414  echo "# Using git ref: $git_ref"415 416  # GitHub allows you to download a tarball of any commit using the URL:417  # https://github.com/$organization/$repo/archive/$ref.tar.gz418  curl -L https://github.com/llvm/llvm-project/archive/$git_ref.tar.gz | \419    tar -C $SrcDir --strip-components=1 -xzf -420 421  if [ "$do_test_suite" = "yes" ]; then422    TestSuiteSrcDir=$BuildDir/llvm-test-suite423    mkdir -p $TestSuiteSrcDir424 425    # We can only use named refs, like branches and tags, that exist in426    # both the llvm-project and test-suite repos if we want to run the427    # test suite.428    # If the test-suite fails to download assume we are using a ref that429    # doesn't exist in the test suite and disable it.430    set +e431    curl -L https://github.com/llvm/test-suite/archive/$git_ref.tar.gz | \432      tar -C $TestSuiteSrcDir --strip-components=1 -xzf -433    if [ $? -ne -0 ]; then434      echo "$git_ref not found in test-suite repo, test-suite disabled."435      do_test_suite="no"436    fi437    set -e438  fi439 440  cd $BuildDir441}442 443function configure_llvmCore() {444    Phase="$1"445    Flavor="$2"446    ObjDir="$3"447 448    case $Flavor in449        Release )450            BuildType="Release"451            Assertions="OFF"452            ;;453        Release+Asserts )454            BuildType="Release"455            Assertions="ON"456            ;;457        Debug )458            BuildType="Debug"459            Assertions="ON"460            ;;461        * )462            echo "# Invalid flavor '$Flavor'"463            echo ""464            return465            ;;466    esac467 468    # During the first two phases, there is no need to build any of the projects469    # except clang, since these phases are only meant to produce a bootstrapped470    # clang compiler, capable of building the third phase.471    if [ "$Phase" -lt "3" ]; then472      project_list="clang"473    else474      project_list="$projects"475    fi476    # During the first phase, there is no need to build any of the runtimes,477    # since this phase is only meant to get a clang compiler, capable of478    # building itself and any selected runtimes in the second phase.479    if [ "$Phase" -lt "2" ]; then480      runtime_list=""481      # compiler-rt builtins is needed on AIX to have a functional Phase 1 clang.482      if [ "$System" = "AIX" ]; then483        runtime_list="compiler-rt"484      fi  485    else486      runtime_list="$runtimes"487    fi488 489    echo "# Using C compiler: $c_compiler"490    echo "# Using C++ compiler: $cxx_compiler"491 492    cd $ObjDir493    echo "# Configuring llvm $Release-$RC $Flavor"494 495    echo "#" env CC="$c_compiler" CXX="$cxx_compiler" \496        cmake -G "$generator" \497        -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \498        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \499        -DLLVM_ENABLE_PROJECTS="$project_list" \500        -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \501        -DLLVM_ENABLE_RUNTIMES="$runtime_list" \502        $ExtraConfigureFlags $BuildDir/llvm-project/llvm \503        2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log504    env CC="$c_compiler" CXX="$cxx_compiler" \505        cmake -G "$generator" \506        -DCMAKE_BUILD_TYPE=$BuildType -DLLVM_ENABLE_ASSERTIONS=$Assertions \507        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \508        -DLLVM_ENABLE_PROJECTS="$project_list" \509        -DLLVM_LIT_ARGS="-j $NumJobs $LitVerbose" \510        -DLLVM_ENABLE_RUNTIMES="$runtime_list" \511        $ExtraConfigureFlags $BuildDir/llvm-project/llvm \512        2>&1 | tee $LogDir/llvm.configure-Phase$Phase-$Flavor.log513 514    cd $BuildDir515}516 517function build_llvmCore() {518    Phase="$1"519    Flavor="$2"520    ObjDir="$3"521    DestDir="$4"522 523    Verbose="VERBOSE=1"524    if [ ${MAKE} = 'ninja' ]; then525      Verbose="-v"526    fi527    LitVerbose="-v"528 529    InstallTarget="install"530    if [ "$Phase" -lt "3" ]; then531      BuildTarget="clang"532      InstallTarget="install-clang install-clang-resource-headers"533      # compiler-rt builtins is needed on AIX to have a functional Phase 1 clang.534      if [ "$System" = "AIX" ]; then535        BuildTarget="$BuildTarget runtimes"536        InstallTarget="$InstallTarget install-builtins"537      fi538    fi539    if [ "$Phase" -eq "3" ]; then540      # Build everything at once, with the proper parallelism and verbosity,541      # in Phase 3.542      BuildTarget=543    fi544 545    cd $ObjDir546    echo "# Compiling llvm $Release-$RC $Flavor"547    echo "# ${MAKE} $J_ARG $Verbose"548    ${MAKE} $J_ARG $Verbose $BuildTarget \549        2>&1 | tee $LogDir/llvm.make-Phase$Phase-$Flavor.log > $redir550 551    echo "# Installing llvm $Release-$RC $Flavor"552    echo "# ${MAKE} install"553    DESTDIR="${DestDir}" ${MAKE} $InstallTarget \554        2>&1 | tee $LogDir/llvm.install-Phase$Phase-$Flavor.log > $redir555    cd $BuildDir556}557 558function test_llvmCore() {559    Phase="$1"560    Flavor="$2"561    ObjDir="$3"562 563    KeepGoing="-k"564    if [ ${MAKE} = 'ninja' ]; then565      # Ninja doesn't have a documented "keep-going-forever" mode, we need to566      # set a limit on how many jobs can fail before we give up.567      KeepGoing="-k 100"568    fi569 570    cd $ObjDir571    if ! ( ${MAKE} $J_ARG $KeepGoing $Verbose check-all \572        2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log ) ; then573      deferred_error $Phase $Flavor "check-all failed"574    fi575 576    if [ $do_test_suite = 'yes' ]; then577      cd $TestSuiteBuildDir578      env CC="$c_compiler" CXX="$cxx_compiler" \579          cmake $TestSuiteSrcDir -G "$generator" -DTEST_SUITE_LIT=$Lit \580                -DTEST_SUITE_HOST_CC=$build_compiler581 582      if ! ( ${MAKE} $J_ARG $KeepGoing $Verbose check \583          2>&1 | tee $LogDir/llvm.check-Phase$Phase-$Flavor.log ) ; then584        deferred_error $Phase $Flavor "test suite failed"585      fi586    fi587    cd $BuildDir588}589 590# Clean RPATH. Libtool adds the build directory to the search path, which is591# not necessary --- and even harmful --- for the binary packages we release.592function clean_RPATH() {593  if [ "$System" = "Darwin" ] || [ "$System" = "SunOS" ] || [ "$System" = "AIX" ]; then594    return595  fi596  local InstallPath="$1"597  for Candidate in `find $InstallPath/{bin,lib} -type f`; do598    if file $Candidate | grep ELF | egrep 'executable|shared object' > /dev/null 2>&1 ; then599      if rpath=`objdump -x $Candidate | grep 'RPATH'` ; then600        rpath=`echo $rpath | sed -e's/^ *RPATH *//'`601        if [ -n "$rpath" ]; then602          newrpath=`echo $rpath | sed -e's/.*\(\$ORIGIN[^:]*\).*/\1/'`603          chrpath -r $newrpath $Candidate 2>&1 > /dev/null 2>&1604        fi605      fi606    fi607  done608}609 610# Create a package of the release binaries.611function package_release() {612    cwd=`pwd`613    cd $BuildDir/Phase3/Release614    mv llvmCore-$Release-$RC.install/usr/local $Package615    if [ "$use_gzip" = "yes" ]; then616      tar cf - $Package | gzip -9c > $BuildDir/$Package.tar.gz617    else618      tar cf - $Package | xz -9ce -T $NumJobs > $BuildDir/$Package.tar.xz619    fi620    mv $Package llvmCore-$Release-$RC.install/usr/local621    cd $cwd622}623 624# Exit if any command fails625# Note: pipefail is necessary for running build commands through626# a pipe (i.e. it changes the output of ``false | tee /dev/null ; echo $?``)627set -e628set -o pipefail629 630# Turn off core dumps, as some test cases can easily fill up even the largest631# file systems.632ulimit -c 0633 634if [ "$do_checkout" = "yes" ]; then635    export_sources636fi637 638# Setup the test-suite.  Do this early so we can catch failures before639# we do the full 3 stage build.640if [ $do_test_suite = "yes" ]; then641  check_program_exists 'python3'642  venv="python3 -m venv"643 644  SandboxDir="$BuildDir/sandbox"645  Lit=$SandboxDir/bin/lit646  TestSuiteBuildDir="$BuildDir/test-suite-build"647  TestSuiteSrcDir="$BuildDir/llvm-test-suite"648 649  ${venv} $SandboxDir650  $SandboxDir/bin/python -m pip install $BuildDir/llvm-project/llvm/utils/lit651  mkdir -p $TestSuiteBuildDir652fi653 654if [ "$do_cmake_cache" = "yes" ]; then655  build_with_cmake_cache656  exit 0657fi658 659(660 661Flavors="Release"662if [ "$do_debug" = "yes" ]; then663    Flavors="Debug $Flavors"664fi665if [ "$do_asserts" = "yes" ]; then666    Flavors="$Flavors Release+Asserts"667fi668 669for Flavor in $Flavors ; do670    echo ""671    echo ""672    echo "********************************************************************************"673    echo "  Release:     $Release-$RC"674    echo "  Build:       $Flavor"675    echo "  System Info: "676    echo "    `uname -a`"677    echo "********************************************************************************"678    echo ""679 680    c_compiler="$CC"681    cxx_compiler="$CXX"682    build_compiler="$CC"683    [[ -z "$build_compiler" ]] && build_compiler="cc"684    llvmCore_phase1_objdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.obj685    llvmCore_phase1_destdir=$BuildDir/Phase1/$Flavor/llvmCore-$Release-$RC.install686 687    llvmCore_phase2_objdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.obj688    llvmCore_phase2_destdir=$BuildDir/Phase2/$Flavor/llvmCore-$Release-$RC.install689 690    llvmCore_phase3_objdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.obj691    llvmCore_phase3_destdir=$BuildDir/Phase3/$Flavor/llvmCore-$Release-$RC.install692 693    rm -rf $llvmCore_phase1_objdir694    rm -rf $llvmCore_phase1_destdir695 696    rm -rf $llvmCore_phase2_objdir697    rm -rf $llvmCore_phase2_destdir698 699    rm -rf $llvmCore_phase3_objdir700    rm -rf $llvmCore_phase3_destdir701 702    mkdir -p $llvmCore_phase1_objdir703    mkdir -p $llvmCore_phase1_destdir704 705    mkdir -p $llvmCore_phase2_objdir706    mkdir -p $llvmCore_phase2_destdir707 708    mkdir -p $llvmCore_phase3_objdir709    mkdir -p $llvmCore_phase3_destdir710 711    ############################################################################712    # Phase 1: Build llvmCore and clang713    echo "# Phase 1: Building llvmCore"714    configure_llvmCore 1 $Flavor $llvmCore_phase1_objdir715    build_llvmCore 1 $Flavor \716        $llvmCore_phase1_objdir $llvmCore_phase1_destdir717    clean_RPATH $llvmCore_phase1_destdir/usr/local718 719    ########################################################################720    # Phase 2: Build llvmCore with newly built clang from phase 1.721    c_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang722    cxx_compiler=$llvmCore_phase1_destdir/usr/local/bin/clang++723    echo "# Phase 2: Building llvmCore"724    configure_llvmCore 2 $Flavor $llvmCore_phase2_objdir725    build_llvmCore 2 $Flavor \726        $llvmCore_phase2_objdir $llvmCore_phase2_destdir727    clean_RPATH $llvmCore_phase2_destdir/usr/local728 729    ########################################################################730    # Phase 3: Build llvmCore with newly built clang from phase 2.731    c_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang732    cxx_compiler=$llvmCore_phase2_destdir/usr/local/bin/clang++733    echo "# Phase 3: Building llvmCore"734    configure_llvmCore 3 $Flavor $llvmCore_phase3_objdir735    build_llvmCore 3 $Flavor \736        $llvmCore_phase3_objdir $llvmCore_phase3_destdir737    clean_RPATH $llvmCore_phase3_destdir/usr/local738 739    ########################################################################740    # Testing: Test phase 3741    c_compiler=$llvmCore_phase3_destdir/usr/local/bin/clang742    cxx_compiler=$llvmCore_phase3_destdir/usr/local/bin/clang++743    echo "# Testing - built with clang"744    test_llvmCore 3 $Flavor $llvmCore_phase3_objdir745 746    ########################################################################747    # Compare .o files between Phase2 and Phase3 and report which ones748    # differ.749    if [ "$do_compare" = "yes" ]; then750        echo751        echo "# Comparing Phase 2 and Phase 3 files"752        for p2 in `find $llvmCore_phase2_objdir -name '*.o'` ; do753            p3=`echo $p2 | sed -e 's,Phase2,Phase3,'`754            # Substitute 'Phase2' for 'Phase3' in the Phase 2 object file in755            # case there are build paths in the debug info. Do the same sub-756            # stitution on both files in case the string occurrs naturally.757            if ! cmp -s \758                <(env LC_ALL=C sed -e 's,Phase1,Phase2,g' -e 's,Phase2,Phase3,g' $p2) \759                <(env LC_ALL=C sed -e 's,Phase1,Phase2,g' -e 's,Phase2,Phase3,g' $p3) \760                16 16; then761                echo "file `basename $p2` differs between phase 2 and phase 3"762            fi763        done764    fi765done766 767) 2>&1 | tee $LogDir/testing.$Release-$RC.log768 769if [ "$use_gzip" = "yes" ]; then770  echo "# Packaging the release as $Package.tar.gz"771else772  echo "# Packaging the release as $Package.tar.xz"773fi774package_release775 776set +e777 778# Woo hoo!779echo "### Testing Finished ###"780echo "### Logs: $LogDir"781 782echo "### Errors:"783if [ -s "$LogDir/deferred_errors.log" ]; then784  cat "$LogDir/deferred_errors.log"785  exit 1786else787  echo "None."788fi789 790exit 0791