Merge "Build GCC which always enable --eh-frame-hdr"
diff --git a/build/tools/build-gcc.sh b/build/tools/build-gcc.sh
index f98601e..d6c2ad5 100755
--- a/build/tools/build-gcc.sh
+++ b/build/tools/build-gcc.sh
@@ -141,13 +141,11 @@
 set_parameters $PARAMETERS
 
 # Disable x86_64 build for toolchains older than 4.7
-# x86_64-* targets are available on 64-bit host only
 case "$TOOLCHAIN" in
   x86_64-4.4.3|x86_64-4.6)
     echo "ERROR: x86_64 toolchain is enabled in 4.7+. Please try to build newer version."
     exit 1
     ;;
-  x86_64-*) do_try64_option ;;
 esac
 
 prepare_target_build
@@ -324,8 +322,6 @@
     ;;
     *-4.4.3)
     ;;
-    x86_64-4.7) # x32 support is included into gold 2.23, but 4.7 is based on 2.22, so stick it to bsd.
-    ;;
     *)
         EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-gold=default"
     ;;
diff --git a/build/tools/build-on-device-toolchain.sh b/build/tools/build-on-device-toolchain.sh
new file mode 100755
index 0000000..8c2a106
--- /dev/null
+++ b/build/tools/build-on-device-toolchain.sh
@@ -0,0 +1,124 @@
+#!/bin/sh
+#
+# Copyright (C) 2013 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Rebuild all on-device toolchain for le32 target
+#
+
+PROGDIR=$(dirname $0)
+. $PROGDIR/prebuilt-common.sh
+
+NDK_DIR=$ANDROID_NDK_ROOT
+register_var_option "--ndk-dir=<path>" NDK_DIR "NDK installation directory"
+
+BUILD_DIR=/tmp/ndk-$USER/build
+register_var_option "--build-dir=<path>" BUILD_DIR "Specify temporary build dir."
+
+OUT_DIR=/tmp/ndk-$USER/out
+register_var_option "--out-dir=<path>" OUT_DIR "Specify output directory directly."
+
+ABI=armeabi-v7a
+register_var_option "--abi=<target>" ABI "List which emulator target you use"
+
+NO_SYNC=
+do_no_sync_option () { NO_SYNC=yes; }
+register_option "--no-sync" do_no_sync_option "Do not push sysroot to device /data/local/tmp/"
+
+TESTING=
+do_testing_option () { TESTING=yes; }
+register_option "--testing" do_testing_option "Copy each c++ libraries for (even for GPL stuff)"
+
+register_jobs_option
+
+PROGRAM_PARAMETERS="<toolchain-src-dir>"
+PROGRAM_DESCRIPTION=\
+"This script can be used to copy all components that on-device compilation needs.
+Also, it will compile on-device LLVM-related toolchain."
+
+extract_parameters "$@"
+
+# Check toolchain source path
+SRC_DIR="$PARAMETERS"
+check_toolchain_src_dir "$SRC_DIR"
+BUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
+rm -rf $BUILD_DIR; mkdir -p $BUILD_DIR
+mkdir -p $OUT_DIR
+
+
+FLAGS=
+if [ "$VERBOSE" = "yes" ]; then
+    FLAGS=$FLAGS" --verbose"
+fi
+if [ "$VERBOSE2" = "yes" ]; then
+    FLAGS=$FLAGS" --verbose"
+fi
+FLAGS="$FLAGS -j$NUM_JOBS"
+TMP_OUT_DIR=/tmp/ndk-$USER/on_device_out
+FLAGS="$FLAGS --out-dir=$TMP_OUT_DIR"
+ARCH="$(convert_abi_to_arch $ABI)"
+GCC_TOOLCHAIN_VERSION=`cat $NDK_DIR/toolchains/llvm-$DEFAULT_LLVM_VERSION/setup.mk | grep '^TOOLCHAIN_VERSION' | awk '{print $3'}`
+
+SYSROOT=$NDK_DIR/$(get_default_platform_sysroot_for_arch $ARCH)
+OUT_SYSROOT=$OUT_DIR
+
+mkdir -p $OUT_SYSROOT/usr/bin
+mkdir -p $OUT_SYSROOT/usr/lib
+
+dump "Copy platform CRT files..."
+cp -r $SYSROOT/usr/lib/crtbegin_dynamic.o $OUT_SYSROOT/usr/lib
+cp -r $SYSROOT/usr/lib/crtbegin_so.o $OUT_SYSROOT/usr/lib
+cp -r $SYSROOT/usr/lib/crtend_android.o $OUT_SYSROOT/usr/lib
+cp -r $SYSROOT/usr/lib/crtend_so.o $OUT_SYSROOT/usr/lib
+
+dump "Copy $ABI gabi++ library"
+cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
+
+dump "Copy $ABI libportable library"
+cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.a $OUT_SYSROOT/usr/lib
+cp -f $NDK_DIR/$LIBPORTABLE_SUBDIR/libs/$ABI/libportable.wrap $OUT_SYSROOT/usr/lib
+
+dump "Copy $ABI libportable library"
+cp -f $NDK_DIR/$COMPILER_RT_SUBDIR/libs/$ABI/libcompiler_rt_static.a $OUT_SYSROOT/usr/lib
+
+if [ "$TESTING" = "yes" ]; then
+  dump "Copy stuff for testing"
+  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libsupc++.a $OUT_SYSROOT/usr/lib
+  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_static.a $OUT_SYSROOT/usr/lib
+  cp -f $NDK_DIR/$GNUSTL_SUBDIR/$GCC_TOOLCHAIN_VERSION/libs/$ABI/libgnustl_shared.so $OUT_SYSROOT/usr/lib
+
+  cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_static.a $OUT_SYSROOT/usr/lib
+  cp -f $NDK_DIR/$STLPORT_SUBDIR/libs/$ABI/libstlport_shared.so $OUT_SYSROOT/usr/lib
+
+  cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_static.a $OUT_SYSROOT/usr/lib
+  cp -f $NDK_DIR/$GABIXX_SUBDIR/libs/$ABI/libgabi++_shared.so $OUT_SYSROOT/usr/lib
+fi
+
+
+dump "Build $ARCH LLVM toolchain..."
+run $BUILDTOOLS/build-device-llvm.sh $FLAGS --arch=$ARCH --gcc-version=$GCC_TOOLCHAIN_VERSION $SRC_DIR $NDK_DIR
+fail_panic "Could not build le32 LLVM toolchain!"
+mv -f $TMP_OUT_DIR/$ARCH/lib*.so $OUT_SYSROOT/usr/lib
+mv -f $TMP_OUT_DIR/$ARCH/* $OUT_SYSROOT/usr/bin
+
+
+if [ "$NO_SYNC" != "yes" ]; then
+  dump "Push on-device $ABI toolchain sysroot to /data/local/tmp/"
+  run adb shell rm -rf /data/local/tmp/*
+  run adb push $OUT_SYSROOT /data/local/tmp/
+  fail_panic "Could not push sysroot!"
+fi
+
+dump "Done."
+exit 0
diff --git a/build/tools/dev-cleanup.sh b/build/tools/dev-cleanup.sh
index b13fdb1..71df0c0 100755
--- a/build/tools/dev-cleanup.sh
+++ b/build/tools/dev-cleanup.sh
@@ -45,6 +45,7 @@
     rm -rf $DIR/$GNUSTL_SUBDIR/$VERSION
 done
 rm -rf $DIR/$LIBPORTABLE_SUBDIR
+rm -rf $DIR/$COMPILER_RT_SUBDIR
 
 rm -f $DIR/ndk-stack*
 rm -f $DIR/ndk-depends*
diff --git a/build/tools/dev-defaults.sh b/build/tools/dev-defaults.sh
index 1a25080..4861b6b 100644
--- a/build/tools/dev-defaults.sh
+++ b/build/tools/dev-defaults.sh
@@ -203,7 +203,7 @@
     case $1 in
         mipsel-*-4.4.3|*-4.6) echo "$DEFAULT_BINUTILS_VERSION";;
         *-4.4.3) echo "2.19";;
-        x86*-4.7) echo "2.23";;
+        x86*-4.7) echo "2.23";;  # Use 2.23 to get x32 support in ld.gold
         *-4.7) echo "2.22";;
         *) echo "2.23";;
     esac
diff --git a/build/tools/make-standalone-toolchain.sh b/build/tools/make-standalone-toolchain.sh
index 9f7f714..378502e 100755
--- a/build/tools/make-standalone-toolchain.sh
+++ b/build/tools/make-standalone-toolchain.sh
@@ -85,6 +85,7 @@
             ARCH=arm
             ;;
     esac
+    ARCH_INC=$ARCH
     log "Auto-config: --arch=$ARCH"
 else
     ARCH_INC=$ARCH
@@ -301,18 +302,21 @@
       arm) # NOte: -target may change by clang based on the
            #        presence of subsequent -march=armv7-a and/or -mthumb
           LLVM_TARGET=armv5te-none-linux-androideabi
+          TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_arm
           ;;
       x86)
           LLVM_TARGET=i686-none-linux-android
+          TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_x86
           ;;
       mips)
           LLVM_TARGET=mipsel-none-linux-android
+          TOOLCHAIN_PREFIX=$DEFAULT_ARCH_TOOLCHAIN_PREFIX_mips
           ;;
       *)
         dump "ERROR: Unsupported NDK architecture!"
   esac
   # Need to remove '.' from LLVM_VERSION when constructing new clang name,
-  # otherwise clang3.1++ may still compile *.c code as C, not C++, which
+  # otherwise clang3.3++ may still compile *.c code as C, not C++, which
   # is not consistent with g++
   LLVM_VERSION_WITHOUT_DOT=$(echo "$LLVM_VERSION" | sed -e "s!\.!!")
   mv "$TMPDIR/bin/clang${HOST_EXE}" "$TMPDIR/bin/clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE}"
@@ -351,6 +355,8 @@
 fi
 EOF
   chmod 0755 "$TMPDIR/bin/clang" "$TMPDIR/bin/clang++"
+  cp -a "$TMPDIR/bin/clang" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang"
+  cp -a "$TMPDIR/bin/clang++" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang++"
 
   if [ -n "$HOST_EXE" ] ; then
     cat > "$TMPDIR/bin/clang.cmd" <<EOF
@@ -379,6 +385,8 @@
 if ERRORLEVEL 1 exit /b 1
 :done
 EOF
+    cp -a "$TMPDIR/bin/clang.cmd" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang.cmd"
+    cp -a "$TMPDIR/bin/clang++.cmd" "$TMPDIR/bin/$TOOLCHAIN_PREFIX-clang++.cmd"
   fi
 fi
 
@@ -440,10 +448,11 @@
             ;;
         stlport)
             if [ "$ARCH_INC" != "$ARCH" ]; then
-              tmp_lib_dir=`mktemp -d`
+              tmp_lib_dir=$TMPDIR/stl
               $NDK_DIR/build/tools/build-cxx-stl.sh --stl=stlport --out-dir=$tmp_lib_dir --abis=unknown
               cp -p "`ls $tmp_lib_dir/sources/cxx-stl/stlport/libs/*/libstlport_static.a`" "$ABI_STL/lib/$ABI2/libstdc++.a"
               cp -p "`ls $tmp_lib_dir/sources/cxx-stl/stlport/libs/*/libstlport_shared.so`" "$ABI_STL/lib/$ABI2/libstlport_shared.so"
+              rm -rf $tmp_lib_dir
             else
               copy_file_list "$STLPORT_LIBS/$ABI" "$ABI_STL/lib/$ABI2" "libstlport_shared.so"
               cp -p "$STLPORT_LIBS/$ABI/libstlport_static.a" "$ABI_STL/lib/$ABI2/libstdc++.a"
diff --git a/build/tools/prebuilt-common.sh b/build/tools/prebuilt-common.sh
index 379268e..2138372 100644
--- a/build/tools/prebuilt-common.sh
+++ b/build/tools/prebuilt-common.sh
@@ -766,7 +766,7 @@
         DST_PREFIX="$NDK_CCACHE $DST_PREFIX"
     fi
     $NDK_BUILDTOOLS_PATH/gen-toolchain-wrapper.sh --src-prefix=$BINPREFIX --dst-prefix="$DST_PREFIX" "$CROSS_WRAP_DIR" \
-        --cflags="$HOST_CFLAGS" --cxxflags="$HOST_CFLAGS" --ldflags="HOST_LDFLAGS"
+        --cflags="$HOST_CFLAGS" --cxxflags="$HOST_CFLAGS" --ldflags="$HOST_LDFLAGS"
     # generate wrappers for BUILD toolchain
     # this is required for mingw/darwin build to avoid tools canadian cross configuration issues
     # 32-bit BUILD toolchain
diff --git a/build/tools/toolchain-patches/gcc/0006-Disable-libstdc-versioning.patch b/build/tools/toolchain-patches/gcc/0006-Disable-libstdc-versioning.patch
index d89fd14..0f6f242 100644
--- a/build/tools/toolchain-patches/gcc/0006-Disable-libstdc-versioning.patch
+++ b/build/tools/toolchain-patches/gcc/0006-Disable-libstdc-versioning.patch
@@ -62,7 +62,7 @@
 index 69001b4..e875539 100644
 --- a/gcc-4.8/libstdc++-v3/src/Makefile.in
 +++ b/gcc-4.8/libstdc++-v3/src/Makefile.in
-@@ -336,7 +336,7 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
+@@ -335,7 +335,7 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES)
  SUBDIRS = c++98 c++11
  
  # Cross compiler support.
@@ -71,7 +71,7 @@
  @GLIBCXX_LDBL_COMPAT_FALSE@ldbl_compat_sources = 
  @GLIBCXX_LDBL_COMPAT_TRUE@ldbl_compat_sources = compatibility-ldbl.cc
  parallel_compat_sources = \
-@@ -543,6 +543,9 @@ clean-toolexeclibLTLIBRARIES:
+@@ -544,6 +544,9 @@ clean-toolexeclibLTLIBRARIES:
  libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES) 
  	$(libstdc___la_LINK) -rpath $(toolexeclibdir) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS)
  
diff --git a/build/tools/toolchain-patches/mclinker/0005-Fixed-darwin-ld.mcld-GNU-m-emulation-fail.patch b/build/tools/toolchain-patches/mclinker/0005-Fixed-darwin-ld.mcld-GNU-m-emulation-fail.patch
index 1b184b6..aff63e9 100644
--- a/build/tools/toolchain-patches/mclinker/0005-Fixed-darwin-ld.mcld-GNU-m-emulation-fail.patch
+++ b/build/tools/toolchain-patches/mclinker/0005-Fixed-darwin-ld.mcld-GNU-m-emulation-fail.patch
@@ -15,7 +15,7 @@
 index b5152e6..f7ddd90 100644
 --- a/tools/llvm-mcld/llvm-mcld.cpp
 +++ b/tools/llvm-mcld/llvm-mcld.cpp
-@@ -1016,12 +1016,12 @@ static Triple ParseEmulation(const std::string& pEmulation)
+@@ -1018,12 +1018,12 @@ static Triple ParseEmulation(const std::string& pEmulation)
  {
    Triple result = StringSwitch<Triple>(pEmulation)
      .Case("armelf_linux_eabi", Triple("arm", "", "linux", "gnueabi"))
diff --git a/find-win-host.cmd b/find-win-host.cmd
index ad7212f..2149b25 100644
--- a/find-win-host.cmd
+++ b/find-win-host.cmd
@@ -1,4 +1,4 @@
-rem @echo off
+@echo off
 rem This is a Windows cmd.exe script used to find windows host name.
 rem %1 is the env. var to set to the windows host name.
 
diff --git a/sources/cxx-stl/llvm-libc++/libcxx/test/testit_android b/sources/cxx-stl/llvm-libc++/libcxx/test/testit_android
index 880ae44..7963a35 100755
--- a/sources/cxx-stl/llvm-libc++/libcxx/test/testit_android
+++ b/sources/cxx-stl/llvm-libc++/libcxx/test/testit_android
@@ -220,12 +220,16 @@
 then
        SOURCE_LIB="-L$LIBCXX_LIBS"
 fi
+if [ -z "$ADB" ]
+then
+       ADB=adb
+fi
 
 if [ "$DO_STATIC" ]; then
   # Statically link to ensure the executable can be run easily through ADB
   LIBS=-lc++_static
 else
-  run2 adb push $LIBCXX_LIBS/libc++_shared.so /data/local/tmp 2>/dev/null
+  run2 $ADB push $LIBCXX_LIBS/libc++_shared.so /data/local/tmp 2>/dev/null
   if [ $? != 0 ]; then
     echo "ERROR: Can't push shared libc++ to target device!"
     exit 1
@@ -258,9 +262,9 @@
   # Run the command, while storing the standard output to CMD_OUT
   # and appending the exit code as the last line.
   if [ "$VERBOSE" -gt 2 ]; then
-    echo "COMMAND: adb shell $@"
+    echo "COMMAND: $ADB shell $@"
   fi
-  adb shell "$@ ; echo \$?" | sed -e 's![[:cntrl:]]!!g' > $CMD_OUT 2>&1
+  $ADB shell "$@ ; echo \$?" | sed -e 's![[:cntrl:]]!!g' > $CMD_OUT 2>&1
   # Get last line in log, which contains the exit code from the command
   RET=$(sed -e '$!d' $CMD_OUT)
   # Get output, which corresponds to everything except the last line
@@ -281,7 +285,7 @@
   EXECUTABLE_BASENAME=$(basename "$EXECUTABLE")
   shift
   TARGET_PATH=/data/local/tmp
-  run2 adb push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null &&
+  run2 $ADB push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null &&
   adb_shell "LD_LIBRARY_PATH=$TARGET_PATH; cd $TARGET_PATH; ./$EXECUTABLE_BASENAME"
 }
 
diff --git a/tests/run-tests.sh b/tests/run-tests.sh
index 125cf3a..2a1a625 100755
--- a/tests/run-tests.sh
+++ b/tests/run-tests.sh
@@ -382,7 +382,7 @@
             WINE=wine12
             ;;
         *)
-            WINE=wine15
+            WINE=wine17
             NDK_BUILD_FLAGS=""  # make.exe -B hangs in wine > 1.2.x
             if [ "$NDK_TOOLCHAIN_VERSION" != "4.4.3" ] ; then
                 APP_LDFLAGS="$APP_LDFLAGS -fuse-ld=mcld" # 64-bit ld.gold can't run in any wine!