Merge "Add a new test to check exceptions with GAbi++"
diff --git a/build/core/ndk-common.sh b/build/core/ndk-common.sh
index 1048053..974f934 100644
--- a/build/core/ndk-common.sh
+++ b/build/core/ndk-common.sh
@@ -270,8 +270,10 @@
     # "uname -m" reports i386 on Snow Leopard even though its architecture is
     # 64-bit. In order to use it to build 64-bit toolchains we need to fix the
     # reporting anomoly here.
-    if [ "$HOST_OS" = darwin -a "`uname -r`" = 10.8.0 ] ; then
-      HOST_ARCH=x86_64
+    if [ "$HOST_OS" = darwin ] ; then
+        if ! echo __LP64__ | (CCOPTS= gcc -E - 2>/dev/null) | grep -q __LP64__ ; then
+            HOST_ARCH=x86_64
+        fi
     fi
     ;;
     amd64) HOST_ARCH=x86_64
diff --git a/build/tools/make-standalone-toolchain.sh b/build/tools/make-standalone-toolchain.sh
index 25413a0..d96cf36 100755
--- a/build/tools/make-standalone-toolchain.sh
+++ b/build/tools/make-standalone-toolchain.sh
@@ -194,9 +194,9 @@
   # Copy the clang/llvm toolchain prebuilt binaries
   run copy_directory "$LLVM_TOOLCHAIN_PATH" "$TMPDIR"
 
-  # Move clang and clang++ to clang-LLVM_VERSION/++, then create scripts
-  # linking them with predefined -target flag.  This is to make clang/++
-  # easier drop-in replacement for gcc/++ in NDK standalone mode.
+  # Move clang and clang++ to clang${LLVM_VERSION} and clang${LLVM_VERSION}++,
+  # then create scripts linking them with predefined -target flag.  This is to
+  # make clang/++ easier drop-in replacement for gcc/++ in NDK standalone mode.
   # Note that the file name of "clang" isn't important, and the trailing
   # "++" tells clang to compile in C++ mode
   LLVM_TARGET=
@@ -218,9 +218,15 @@
   # otherwise clang3.1++ 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" "$TMPDIR/bin/clang$LLVM_VERSION_WITHOUT_DOT"
-  rm "$TMPDIR/bin/clang++"
-  ln -s "clang$LLVM_VERSION_WITHOUT_DOT" "$TMPDIR/bin/clang$LLVM_VERSION_WITHOUT_DOT++"
+  mv "$TMPDIR/bin/clang${HOST_EXE}" "$TMPDIR/bin/clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE}"
+  if [ -h "$TMPDIR/bin/clang++${HOST_EXE}" ] ; then
+    ## clang++ is a link to clang.  Remove it and reconstruct
+    rm "$TMPDIR/bin/clang++${HOST_EXE}"
+    ln -s "clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE}" "$TMPDIR/bin/clang${LLVM_VERSION_WITHOUT_DOT}++${HOST_EXE}"
+  else
+    mv "$TMPDIR/bin/clang++${HOST_EXE}" "$TMPDIR/bin/clang$LLVM_VERSION_WITHOUT_DOT++${HOST_EXE}"
+  fi
+
   cat > "$TMPDIR/bin/clang" <<EOF
 \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT -target $LLVM_TARGET "\$@"
 EOF
@@ -228,6 +234,15 @@
 \`dirname \$0\`/clang$LLVM_VERSION_WITHOUT_DOT++ -target $LLVM_TARGET "\$@"
 EOF
   chmod 0755 "$TMPDIR/bin/clang" "$TMPDIR/bin/clang++"
+
+  if [ -n "$HOST_EXE" ] ; then
+    cat > "$TMPDIR/bin/clang.cmd" <<EOF
+%~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}${HOST_EXE} -target $LLVM_TARGET %*
+EOF
+    cat > "$TMPDIR/bin/clang++.cmd" <<EOF
+%~dp0\\clang${LLVM_VERSION_WITHOUT_DOT}++${HOST_EXE} -target $LLVM_TARGET %*
+EOF
+  fi
 fi
 
 dump "Copying sysroot headers and libraries..."
diff --git a/build/tools/prebuilt-common.sh b/build/tools/prebuilt-common.sh
index 8577279..b5ff14e 100644
--- a/build/tools/prebuilt-common.sh
+++ b/build/tools/prebuilt-common.sh
@@ -728,17 +728,19 @@
     # We only do this if the CC variable is not defined to a given value
     # and the --mingw or --try-64 options are not used.
     #
-    if [ "$HOST_OS" = "linux" -a -z "$CC" -a "$MINGW" != "yes" ]; then
-        if [ "$TRY64" != "yes" ]; then
-            LEGACY_PREFIX=i686
-        else
-            LEGACY_PREFIX=x86_64
+    if [ -z "$CC" -a "$MINGW" != "yes" ]; then
+        LEGACY_TOOLCHAIN_DIR=
+        if [ "$HOST_OS" = "linux" ]; then
+            LEGACY_TOOLCHAIN_DIR="$ANDROID_NDK_ROOT/../prebuilts/tools/gcc-sdk"
+            LEGACY_TOOLCHAIN_PREFIX="$LEGACY_TOOLCHAIN_DIR/"
+        elif [ "$HOST_OS" = "darwin" ]; then
+            LEGACY_TOOLCHAIN_DIR="$ANDROID_NDK_ROOT/../prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1/bin"
+            LEGACY_TOOLCHAIN_PREFIX="$LEGACY_TOOLCHAIN_DIR/i686-apple-darwin10-"
         fi
-        LEGACY_TOOLCHAIN_DIR="$ANDROID_NDK_ROOT/../prebuilts/tools/gcc-sdk"
         if [ -d "$LEGACY_TOOLCHAIN_DIR" ] ; then
-            log "Forcing generation of Linux binaries with legacy $LEGACY_PREFIX toolchain"
-            CC="$LEGACY_TOOLCHAIN_DIR/gcc"
-            CXX="$LEGACY_TOOLCHAIN_DIR/g++"
+            log "Forcing generation of $HOST_OS binaries with legacy toolchain"
+            CC="${LEGACY_TOOLCHAIN_PREFIX}gcc"
+            CXX="${LEGACY_TOOLCHAIN_PREFIX}g++"
         fi
     fi
 
@@ -748,11 +750,7 @@
     STRIP=${STRIP:-strip}
     case $HOST_TAG in
         darwin-*)
-            # Try to build with Tiger SDK if available
-            if check_darwin_sdk /Developer/SDKs/MacOSX10.4.sdku 10.4; then
-                log "Generating Tiger-compatible binaries!"
-            # Otherwise with Leopard SDK
-            elif check_darwin_sdk /Developer/SDKs/MacOSX10.5.sdk 10.5; then
+            if check_darwin_sdk /Developer/SDKs/MacOSX10.5.sdk 10.5; then
                 log "Generating Leopard-compatible binaries!"
             else
                 local version=`sw_vers -productVersion`
@@ -777,7 +775,6 @@
     int test_array[1-2*(sizeof(void*) != 4)];
 EOF
     log_n "Checking whether the compiler generates 32-bit binaries..."
-    HOST_BITS=32
     log2 $CC $HOST_CFLAGS -c -o $TMPO $TMPC
     $NDK_CCACHE $CC $HOST_CFLAGS -c -o $TMPO $TMPC >$TMPL 2>&1
     if [ $? != 0 ] ; then
@@ -788,15 +785,18 @@
             #        will not work well with the GCC toolchain scripts.
             CC="$CC -m32"
             CXX="$CXX -m32"
-        else
-            HOST_BITS=64
         fi
     else
         log "yes"
+        if [ "$TRY64" = "yes" ]; then
+            CC="$CC -m64"
+            CXX="$CXX -m64"
+        fi
     fi
 
-    # For now, we only support building 32-bit binaries anyway
-    if [ "$TRY64" != "yes" ]; then
+    if [ "$TRY64" = "yes" ]; then
+        HOST_BITS=64
+    else
         force_32bit_binaries  # to modify HOST_TAG and others
         HOST_BITS=32
     fi
diff --git a/sources/android/cpufeatures/cpu-features.c b/sources/android/cpufeatures/cpu-features.c
index 2eb417f..02ea74f 100644
--- a/sources/android/cpufeatures/cpu-features.c
+++ b/sources/android/cpufeatures/cpu-features.c
@@ -28,7 +28,7 @@
 
 /* ChangeLog for this library:
  *
- * NDK r??: Add new ARM CPU features: VFPv2, VFP_D32, VFP_FP16,
+ * NDK r8c: Add new ARM CPU features: VFPv2, VFP_D32, VFP_FP16,
  *          VFP_FMA, NEON_FMA, IDIV_ARM, IDIV_THUMB2 and iWMMXt.
  *
  *          Rewrite the code to parse /proc/self/auxv instead of
@@ -96,7 +96,7 @@
     __asm__ __volatile__ ( \
       "push %%ebx\n"
       "cpuid\n" \
-      "mov %1, %%ebx\n"
+      "mov %%ebx, %1\n"
       "pop %%ebx\n"
       : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
       : "a" (func) \
diff --git a/tests/build/issue39824-__BYTE_ORDER/BROKEN_BUILD b/tests/build/issue39824-__BYTE_ORDER/BROKEN_BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/build/issue39824-__BYTE_ORDER/BROKEN_BUILD
diff --git a/tests/build/issue39824-__BYTE_ORDER/jni/Android.mk b/tests/build/issue39824-__BYTE_ORDER/jni/Android.mk
new file mode 100644
index 0000000..9bd21ad
--- /dev/null
+++ b/tests/build/issue39824-__BYTE_ORDER/jni/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := issue39824-__BYTE_ORDER
+LOCAL_SRC_FILES := issue39824-__BYTE_ORDER.c
+include $(BUILD_EXECUTABLE)
+
diff --git a/tests/build/issue39824-__BYTE_ORDER/jni/Application.mk b/tests/build/issue39824-__BYTE_ORDER/jni/Application.mk
new file mode 100644
index 0000000..a252a72
--- /dev/null
+++ b/tests/build/issue39824-__BYTE_ORDER/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := all
diff --git a/tests/build/issue39824-__BYTE_ORDER/jni/issue39824-__BYTE_ORDER.c b/tests/build/issue39824-__BYTE_ORDER/jni/issue39824-__BYTE_ORDER.c
new file mode 100644
index 0000000..06e9cdb
--- /dev/null
+++ b/tests/build/issue39824-__BYTE_ORDER/jni/issue39824-__BYTE_ORDER.c
@@ -0,0 +1,6 @@
+#include <sys/endian.h>
+
+int main()
+{
+  return 0 * __BYTE_ORDER;
+}
diff --git a/tests/build/issue39983-PAGE_SIZE/jni/Android.mk b/tests/build/issue39983-PAGE_SIZE/jni/Android.mk
new file mode 100644
index 0000000..712f588
--- /dev/null
+++ b/tests/build/issue39983-PAGE_SIZE/jni/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := issue39983-PAGE_SIZE
+LOCAL_SRC_FILES := issue39983-PAGE_SIZE.c
+include $(BUILD_EXECUTABLE)
+
diff --git a/tests/build/issue39983-PAGE_SIZE/jni/Application.mk b/tests/build/issue39983-PAGE_SIZE/jni/Application.mk
new file mode 100644
index 0000000..a252a72
--- /dev/null
+++ b/tests/build/issue39983-PAGE_SIZE/jni/Application.mk
@@ -0,0 +1 @@
+APP_ABI := all
diff --git a/tests/build/issue39983-PAGE_SIZE/jni/issue39983-PAGE_SIZE.c b/tests/build/issue39983-PAGE_SIZE/jni/issue39983-PAGE_SIZE.c
new file mode 100644
index 0000000..65de46e
--- /dev/null
+++ b/tests/build/issue39983-PAGE_SIZE/jni/issue39983-PAGE_SIZE.c
@@ -0,0 +1,6 @@
+#include <pthread.h>
+
+int main()
+{
+    return 0 * PTHREAD_STACK_MIN;
+}