1f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner#!/bin/sh
2f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //===--------------------------- testit ---------------------------------===//
3f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //
4f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //                     The LLVM Compiler Infrastructure
5f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //
6f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# // This file is distributed under the University of Illinois Open Source
7f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# // License. See LICENSE.TXT for details.
8f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //
9f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# //===--------------------------------------------------------------------===//
10f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
11f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnercurrentpath=`pwd`
12f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerorigpath=$currentpath
13f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnercurrentdir=`basename $currentpath`
14f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerwhile [ $currentdir != "test" ]; do
15ad46d2248426e810edc5878c7cb086b7093f3cf5David 'Digit' Turner	if [ $currentdir = "/" ]
16f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
17f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		echo "current directory must be in or under \"test\"."
18f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		exit 1
19f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
20f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	cd ..
21f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	currentpath=`pwd`
22f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	currentdir=`basename $currentpath`
23f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerdone
24f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
25f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnercd ..
26f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerLIBCXX_ROOT=`pwd`
27f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnercd $origpath
28f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
29f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerVERBOSE=1
30f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
31f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerrun () {
32f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ "$VERBOSE" -gt 1 ]; then
33f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    echo "COMMAND: $@"
34f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
35f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  case $VERBOSE in
36f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    0|1)
37f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Hide command output and errors.
38f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@" >/dev/null 2>&1
39f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
40f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    2)
41f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Only hide command output
42f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@" >/dev/null
43f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
44f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    *)
45f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Show command output and errors.
46f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@"
47f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
48f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  esac
49f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner}
50f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
51f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerrun2 () {
52f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ "$VERBOSE" -gt 2 ]; then
53f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    echo "COMMAND: $@"
54f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
55f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  case $VERBOSE in
56f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    0|1)
57f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Hide command output and errors.
58f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@" >/dev/null 2>&1
59f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
60f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    2)
61f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Only hide command output
62f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@" >/dev/null
63f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
64f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    *)
65f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      # Show command output and errors.
66f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      "$@"
67f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
68f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  esac
69f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner}
70f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
71f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# The list of valid target abis supported by this script.
72f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerVALID_ABIS="armeabi armeabi-v7a x86 mips"
73f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
74dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew HsiehHOST_OS=`uname -s`
75dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsiehif [ "$HOST_OS" = "Darwin" ]; then
76dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsieh    # darwin doesn't have readelf.  hard-code a known one
77dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsieh    READELF=../../../../../toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-readelf
78dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsiehelse
79dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsieh    READELF=readelf
80dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsiehfi
81dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsieh
82f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerDO_HELP=
83f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerDO_STATIC=
84f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerTARGET_ABI=
85f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerTARGET_ARCH=
867670977319d537cb30ed322897022f649b1bd1f9Andrew Hsiehif [ -z "$TARGET_TEST_SUBDIR" ]; then
877670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh    TARGET_TEST_SUBDIR="libcxx"
887670977319d537cb30ed322897022f649b1bd1f9Andrew Hsiehfi
897670977319d537cb30ed322897022f649b1bd1f9Andrew HsiehTARGET_PATH=/data/local/tmp/$TARGET_TEST_SUBDIR
90f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerCXX=
910b823f8d0398235dc1780f6a989e91adeac769ebAndrew HsiehWITH_COMPILER_RT=
927670977319d537cb30ed322897022f649b1bd1f9Andrew HsiehLIBCXX_NEEDS_COMPILER_RT=
93f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfor OPT; do
94f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  case $OPT in
95f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    --help|-?)
96f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      DO_HELP=true
97f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
98f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    --abi=*)
99f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      TARGET_ABI=${OPT##--abi=}
100f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
101f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    --static)
102f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      DO_STATIC=true
103f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
1046eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh    --shared)
1056eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh      DO_STATIC=
1066eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh      ;;
107f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    --cxx=*)
108f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      CXX=${OPT##--cxx=}
109f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
110f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    --verbose)
111f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      VERBOSE=$(( $VERBOSE + 1 ))
112f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
1130b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    --with-compiler-rt)
1140b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      WITH_COMPILER_RT=yes
1150b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      ;;
116f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    -*)
117f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      echo "Unknown option: $OPT. See --help."
118f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      exit 1
119f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
120f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    *)
121f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      echo "This script doesn't take parameters. See --help."
122f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      exit 1
123f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
124f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  esac
125f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerdone
126f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
127f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ "$DO_HELP" ]; then
128f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  echo \
129f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner"Usage: $(basename $0) [options]
130f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
131f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerThis script is used to run the libc++ test suite for Android.
132f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerYou will need the following things:
133f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
134f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  - The prebuild libc++ libraries in your NDK install.
135f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  - A prebuilt Android toolchain in your path.
136f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  - The 'adb' tool in your path.
137f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  - An Android device connected to ADB.
138f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
139f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerThe toolchain and device must match your target ABI. For example, if
140f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turneryou use --abi=armeabi-v7a, your device must run ARMv7-A Android binaries,
141f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerand arm-linux-androideabi-g++ will be used to compile all tests, unless
142f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turneryou use --cxx=<command> to override it.
143f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
144f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerValid options:
145f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  --help|-?        Display this message.
146f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  --abi=<name>     Specify target ABI. Use --abi=list for list.
147f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  --static         Link against static libc++ library.
148f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  --cxx=<program>  Override C++ compiler/linker.
149f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  --verbose        Increase verbosity.
150f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner"
151f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  exit 0
152f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
153f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
154f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# Check target ABI.
155f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ "$TARGET_ABI" = "list" ]; then
156f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  echo "List of valid target ABIs:"
157f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  for ABI in $VALID_ABIS; do
158f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    printf " %s" $ABI
159f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  done
160f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  printf "\n"
161f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  exit 0
162f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
163f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
164f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ -z "$TARGET_ABI" ]; then
165f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  echo "ERROR: Please specify a target ABI (--abi=<name>)."
166f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  exit 1
167f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
168f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
169f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerFOUND_ABI=
170f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfor ABI in $VALID_ABIS; do
171f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ "$ABI" = "$TARGET_ABI" ]; then
172f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    FOUND_ABI=true
173f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    break
174f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
175f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerdone
176f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
177f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ -z "$FOUND_ABI" ]; then
178f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  echo "ERROR: Invalid abi '$TARGET_ABI'. Must be one of: $VALID_ABIS"
179f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  exit 1
180f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
181f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
182f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerLIBCXX_LIBS=$(cd $LIBCXX_ROOT/.. && pwd)/libs/$TARGET_ABI
183f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfor LIB in libc++_static.a libc++_shared.so; do
184f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ ! -f "$LIBCXX_LIBS/$LIB" ]; then
185f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    echo "ERROR: Missing prebuilt library: $LIBCXX_LIBS/$LIB"
186f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    echo "Please run: build/tools/build-cxx-stl.sh --stl=libc++"
187f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    exit 1
188f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
189f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerdone
190f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
191917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehLIBCOMPILER_RT_LIBS=$(cd "$LIBCXX_ROOT"/../../../android/compiler-rt && pwd)/libs/$TARGET_ABI
192dfc911962c33f546a74e3ec45b48ce4c7b9d56ecAndrew Hsieh$READELF -d "$LIBCXX_LIBS/libc++_shared.so" | grep NEEDED | grep -q compiler_rt
1937670977319d537cb30ed322897022f649b1bd1f9Andrew Hsiehif [ $? = 0 ]; then
1947670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh  LIBCXX_NEEDS_COMPILER_RT=yes
1957670977319d537cb30ed322897022f649b1bd1f9Andrew Hsiehfi
1967670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh
1977670977319d537cb30ed322897022f649b1bd1f9Andrew Hsiehif [ "$WITH_COMPILER_RT" = "yes" -o "$LIBCXX_NEEDS_COMPILER_RT" = "yes" ]; then
1980b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  for LIB in libcompiler_rt_static.a libcompiler_rt_shared.so; do
1990b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    if [ ! -f "$LIBCOMPILER_RT_LIBS/$LIB" ]; then
2000b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      echo "ERROR: Missing prebuilt library: $LIBCOMPILER_RT_LIBS/$LIB"
2010b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      echo "Please run: build/tools/build-compiler-rt.sh --ndk-dir=$NDK \
202917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh--src-dir=/tmp/ndk-$USER/src/llvm-3.3/compiler-rt --llvm-version=3.3"
2030b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      exit 1
2040b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    fi
2050b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  done
2060b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsiehfi
207917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
208f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# Check or detect C++ toolchain.
209f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerTOOLCHAIN_CFLAGS=
210f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerTOOLCHAIN_LDFLAGS=
211f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ -z "$TOOLCHAIN_PREFIX" ]; then
2124a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  # Compute
213f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  case $TARGET_ABI in
214f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    armeabi)
215f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      TOOLCHAIN_PREFIX=arm-linux-androideabi
216917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh      TOOLCHAIN_CFLAGS="-mthumb"
217917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh      TOOLCHAIN_LDFLAGS="-mthumb"
218f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
219f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    armeabi-v7a)
220f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      TOOLCHAIN_PREFIX=arm-linux-androideabi
221917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh      TOOLCHAIN_CFLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16"
222917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh      TOOLCHAIN_LDFLAGS="-march=armv7-a -mthumb -Wl,--fix-cortex-a8"
223f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
2248654c21c31811a2c1caeac75b74325b02dc00c8cAndrew Hsieh    armeabi-v7a-hard)
2258654c21c31811a2c1caeac75b74325b02dc00c8cAndrew Hsieh      TOOLCHAIN_PREFIX=arm-linux-androideabi
2268654c21c31811a2c1caeac75b74325b02dc00c8cAndrew Hsieh      TOOLCHAIN_CFLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1"
2278654c21c31811a2c1caeac75b74325b02dc00c8cAndrew Hsieh      TOOLCHAIN_LDFLAGS="-march=armv7-a -mthumb -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard"
2288654c21c31811a2c1caeac75b74325b02dc00c8cAndrew Hsieh      ;;
229f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    x86)
230f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      TOOLCHAIN_PREFIX=i686-linux-android
231f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
232f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    mips)
233f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      TOOLCHAIN_PREFIX=mipsel-linux-android
234f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
235f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    *)
236f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      echo "ERROR: Unknown ABI '$ABI'"
237f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      exit 1
238f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner      ;;
239f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  esac
240da5b11a42de8efb020db413a6d0e79a895dc886fDavid 'Digit' Turner  if [ -z "$CXX" ]; then
241da5b11a42de8efb020db413a6d0e79a895dc886fDavid 'Digit' Turner      CXX=$TOOLCHAIN_PREFIX-g++
242da5b11a42de8efb020db413a6d0e79a895dc886fDavid 'Digit' Turner  fi
243f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
244f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
245f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerREAL_CXX=$(which "$CXX" 2>/dev/null)
246f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ -z "$REAL_CXX" ]; then
247f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  echo "ERROR: Missing C++ compiler: $CXX"
248f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  exit 1
249f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
250f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerCC=$CXX
251f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
252f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerif [ -z "$OPTIONS" ]
253f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerthen
2544a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  # Note that some tests use assert() to check condition but -O2 defines assert() to nothing,
2554a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  # unless we specify -UNDEBUG to bring assert() back.
256d5161ea3a36c528d595b3dc87ec9ae866b0eb733Andrew Hsieh  OPTIONS="--std=c++11 -O2 -g -funwind-tables -UNDEBUG"
257667dbb41059198b4039b1e6b40028a11d880ea16Andrew Hsieh  if [ "$CXX" != "${CXX%clang++*}" ] ; then
2586db73059bfc7830f10a291d4b666f8ed21b775a8Andrew Hsieh    OPTIONS="$OPTIONS" # clang3.5 doesn't accept the following: -mllvm -arm-enable-ehabi-descriptors -mllvm -arm-enable-ehabi"
259d5161ea3a36c528d595b3dc87ec9ae866b0eb733Andrew Hsieh  else
260d5161ea3a36c528d595b3dc87ec9ae866b0eb733Andrew Hsieh    # Some libc++ implementation (eg. list) break TBAA!
261d5161ea3a36c528d595b3dc87ec9ae866b0eb733Andrew Hsieh    OPTIONS="$OPTIONS -fno-strict-aliasing"
2624a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  fi
263f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerfi
264667dbb41059198b4039b1e6b40028a11d880ea16Andrew Hsieh
265917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehOPTIONS="$OPTIONS $TOOLCHAIN_CFLAGS $TOOLCHAIN_LDFLAGS"
266f27a2b381b327ca3995b580531c164248f99a072David 'Digit' TurnerOPTIONS="$OPTIONS -I$LIBCXX_ROOT/test/support"
2676eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh# llvm-libc++/libcxx/test/lit.cfg line #278 defineds the following for testing only on Linux
268917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehOPTIONS="$OPTIONS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS"
269f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
270d0722199c3b7497f9211924cb5807a564cf5e39cAndrew Hsiehif [ -z "$ADB" ]
271d0722199c3b7497f9211924cb5807a564cf5e39cAndrew Hsiehthen
272917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  ADB=adb
273d0722199c3b7497f9211924cb5807a564cf5e39cAndrew Hsiehfi
274f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
275f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# Run a shell command through ADB, return its status.
2764a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# Variable ERR contains output if $RET is non-zero
277f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turneradb_shell () {
278f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  # We need a temporary file to store the output of our command
2794a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  local CMD_OUT RET
2804a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  ERR=
281f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  CMD_OUT=$(mktemp /tmp/testit_android-cmdout-XXXXXX)
282f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  # Run the command, while storing the standard output to CMD_OUT
283f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  # and appending the exit code as the last line.
284f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ "$VERBOSE" -gt 2 ]; then
285d0722199c3b7497f9211924cb5807a564cf5e39cAndrew Hsieh    echo "COMMAND: $ADB shell $@"
286f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
287d0722199c3b7497f9211924cb5807a564cf5e39cAndrew Hsieh  $ADB shell "$@ ; echo \$?" | sed -e 's![[:cntrl:]]!!g' > $CMD_OUT 2>&1
288f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  # Get last line in log, which contains the exit code from the command
289f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  RET=$(sed -e '$!d' $CMD_OUT)
290f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  # Get output, which corresponds to everything except the last line
291f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  OUT=$(sed -e '$d' $CMD_OUT)
2924a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  if [ "$RET" != "0" ]; then
2934a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    ERR=$OUT
2944a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  fi
295f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  if [ "$VERBOSE" -gt 2 ]; then
296f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner    printf "%s" "$OUT"
297f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  fi
2984a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  rm -f $CMD_OUT
299f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner  return $RET
300f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner}
301f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
302917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh# Push a given file through ADB.
303917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh# $1: File path
304917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehadb_push () {
305917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  local FILE=$1
306917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  local FILE_BASENAME=$(basename "$FILE")
307917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  run2 $ADB push $FILE $TARGET_PATH/$FILE_BASENAME 2>/dev/null
308917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh}
309917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
310f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# Run a given executable through ADB.
311f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner# $1: Executable path
312f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turneradb_run () {
313917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  local EXECUTABLE=$1
314917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  local EXECUTABLE_BASENAME=$(basename "$EXECUTABLE")
3154a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  run2 $ADB push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null
3164a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  if [ "$?" != 0 ]; then
3174a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    return 1;
3184a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  fi
3194a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  # Retry up to 10 times if fail is due to "Text file busy"
3204a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  for i in 1 2 3 4 5 6 7 8 9 10; do
3214a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    adb_shell "LD_LIBRARY_PATH=$TARGET_PATH; cd $TARGET_PATH; ./$EXECUTABLE_BASENAME"
3224a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    if [ "$?" = "0" ]; then
3234a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh      return 0
3244a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    fi
3254a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    if ! $(echo $ERR | grep -iq "Text file busy"); then
3264a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh      if [ "$i" != "1" ]; then
3275092c9020f6482298676951ac70a43530104d44eAndrew Hsieh        # Dump error message to help diagnostics
3284a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh        echo "ERR=$ERR"
3294a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh      fi
3304a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh      break;
3314a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    fi
3324a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    echo "Text file busy.  Re-try $i"
3334a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    sleep 1
3344a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    run2 $ADB push $EXECUTABLE $TARGET_PATH/$EXECUTABLE_BASENAME 2>/dev/null
3354a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh    sleep 2  # try again
3364a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  done
3374a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh  return 1
338f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner}
339f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
340917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehadb_shell "rm -rf $TARGET_PATH"
341917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehadb_shell "mkdir -p $TARGET_PATH"
342917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
343917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehif [ "$DO_STATIC" ]; then
344917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  # Statically link to ensure the executable can be run easily through ADB
3456eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh  # Note that in standalone toolchain libc++_static is renamed to libstdc++, and
3466eac0e4b1c6d8a50320cb6fce05559619c9e198fAndrew Hsieh  # compiler adds -lstdc++ implicitly
3470b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  if [ "$WITH_COMPILER_RT" = "yes" ]; then
3487670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh    LIBS="-nodefaultlibs -lstdc++ -latomic -ldl -lm -lc -lcompiler_rt_static"
3490b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  else
3500b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    LIBS="-latomic"
3510b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  fi
352917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehelse
353917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  run2 $ADB push $LIBCXX_LIBS/libc++_shared.so $TARGET_PATH 2>/dev/null
354917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  if [ $? != 0 ]; then
355917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    echo "ERROR: Can't push shared libc++ to target device!"
356917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    exit 1
357917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  fi
3587670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh
3597670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh  if [ "$WITH_COMPILER_RT" = "yes" -o "$LIBCXX_NEEDS_COMPILER_RT" = "yes" ]; then
3600b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    run2 $ADB push $LIBCOMPILER_RT_LIBS/libcompiler_rt_shared.so $TARGET_PATH 2>/dev/null
3610b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    if [ $? != 0 ]; then
3620b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      echo "ERROR: Can't push shared libcompiler_rt to target device!"
3630b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh      exit 1
3640b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    fi
3657670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh  fi
3667670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh
3677670977319d537cb30ed322897022f649b1bd1f9Andrew Hsieh  if [ "$WITH_COMPILER_RT" = "yes" ]; then
36894203c4b6f7ec3a9a3e25a22bc1171900eba2b15Albert J. Wong    LIBS="-nodefaultlibs -lc++_shared -latomic -ldl -lm -lc -lcompiler_rt_shared"
3690b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh  else
3700b823f8d0398235dc1780f6a989e91adeac769ebAndrew Hsieh    LIBS="-lc++_shared -latomic"
371917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  fi
372917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehfi
373917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
374917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehcase $TRIPLE in
375917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  *-*-mingw* | *-*-cygwin* | *-*-win*)
376917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    TEST_EXE=test.exe
377917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    ;;
378917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh  *)
379917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    TEST_EXE=a.out
380917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh    ;;
381917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsiehesac
382917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
383917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehTEST_EXE=/tmp/testit_android-$USER-$$-$TEST_EXE
384917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
385917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehFAIL=0
386917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehPASS=0
387917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehUNIMPLEMENTED=0
388917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehIMPLEMENTED_FAIL=0
389917347ec4e6c220e8750ae51462efdd461f45c6eAndrew HsiehIMPLEMENTED_PASS=0
390917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh
3914a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# Run tests in current directory, recursively
3924a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh#
3934a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# Note that file path containing EQ are symlink to the existing tests whose path contain '=',
3944a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# to workaround an issue in ndk-build which doesn't handle LOCAL_SRC_FILES with '='.
3954a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# See tests/device/test-libc++-static-full/jni/Android.mk  We need to filter out path containing
3964a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# EQ such that we don't run same tests twice
3974a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh#
3984a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# An alternative is to do "find . -type f", but this doesn't work in NDK windows package
3994a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# where zip turns symlink into physical file it points to.
4004a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh#
4014a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh# We also sort the test to make the test report comparable to previous test
4024a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh#
4034a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh
404f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerafunc() {
405f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fail=0
406f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	pass=0
407f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	if (ls *.fail.cpp > /dev/null 2>&1)
408f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
4094a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh		for FILE in $(ls *.fail.cpp | tr ' ' '\n' | grep -v EQ | sort); do
410f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			if run $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o $TEST_EXE > /dev/null 2>&1
411f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			then
412f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				rm $TEST_EXE
413f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				echo "$FILE should not compile"
414f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				fail=$(($fail+1))
415f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			else
416f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				pass=$(($pass+1))
417f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			fi
418f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		done
419f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
420f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
421f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	if (ls *.pass.cpp > /dev/null 2>&1)
422f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
423917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh		if (ls *.dat > /dev/null 2>&1)
424917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh		then
4254a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh			adb_shell "rm -f $TARGET_PATH/*.dat"
4264a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh			for FILE in $(ls *.dat | tr ' ' '\n' | grep -v EQ | sort); do
427917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh	                      if [ "$VERBOSE" -gt 1 ]; then
428917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh	                          echo "Pushing data: " $FILE
429917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh			      fi
430917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh			      adb_push $FILE
431917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh			      if [ $? != 0 ]; then
432917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh				  echo "Failed to push file $FILE"
433917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh	                      fi
434917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh			done
435917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh		fi
4364a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh		for FILE in $(ls *.pass.cpp | tr ' ' '\n' | grep -v EQ | sort); do
437f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner                      if [ "$VERBOSE" -gt 1 ]; then
438f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner                          echo "Running test: " $FILE
439f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner                      fi
440da5b11a42de8efb020db413a6d0e79a895dc886fDavid 'Digit' Turner                        COMMAND="( cd $(pwd) && $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS )"
441f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			if run $CC $OPTIONS $HEADER_INCLUDE $SOURCE_LIB $FILE $LIBS -o $TEST_EXE
442f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			then
443f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				if adb_run $TEST_EXE
444f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				then
445f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner					rm $TEST_EXE
446f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner					pass=$(($pass+1))
447f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				else
448f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner					echo "`pwd`/$FILE failed at run time"
449917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh					echo "Compile line was: $COMMAND # run-time"
450f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner					fail=$(($fail+1))
451f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner					rm $TEST_EXE
452f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				fi
453f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			else
454f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				echo "`pwd`/$FILE failed to compile"
455917347ec4e6c220e8750ae51462efdd461f45c6eAndrew Hsieh				echo "Compile line was: $COMMAND # compile-time"
456f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner				fail=$(($fail+1))
457f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			fi
458f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		done
459f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
460f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
461f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	if [ $fail -gt 0 ]
462f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
463f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		echo "failed $fail tests in `pwd`"
464f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		IMPLEMENTED_FAIL=$(($IMPLEMENTED_FAIL+1))
465f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
466f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	if [ $pass -gt 0 ]
467f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
468f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		echo "passed $pass tests in `pwd`"
469f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		if [ $fail -eq 0 ]
470f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		then
471f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			IMPLEMENTED_PASS=$((IMPLEMENTED_PASS+1))
472f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		fi
473f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
474f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	if [ $fail -eq 0 -a $pass -eq 0 ]
475f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	then
476f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		echo "not implemented:  `pwd`"
477f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		UNIMPLEMENTED=$(($UNIMPLEMENTED+1))
478f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	fi
479f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
480f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	FAIL=$(($FAIL+$fail))
481f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	PASS=$(($PASS+$pass))
482f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
4834a6fe28b54934bead656146e2571f64f4530be5bAndrew Hsieh	for FILE in $(ls | tr ' ' '\n' | grep -v EQ | sort)
484f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	do
485f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		if [ -d "$FILE" ];
486f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		then
487f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			cd $FILE
488f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			afunc
489f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner			cd ..
490f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner		fi
491f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner	done
492f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner}
493f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
494f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerafunc
495f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
496f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "****************************************************"
497f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "Results for `pwd`:"
498f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "using `$CC --version`"
499f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "with $OPTIONS $HEADER_INCLUDE $SOURCE_LIB"
500f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "----------------------------------------------------"
501f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "sections without tests   : $UNIMPLEMENTED"
502f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "sections with failures   : $IMPLEMENTED_FAIL"
503f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "sections without failures: $IMPLEMENTED_PASS"
504f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "                       +   ----"
505f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "total number of sections : $(($UNIMPLEMENTED+$IMPLEMENTED_FAIL+$IMPLEMENTED_PASS))"
506f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "----------------------------------------------------"
507f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "number of tests failed   : $FAIL"
508f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "number of tests passed   : $PASS"
509f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "                       +   ----"
510f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "total number of tests    : $(($FAIL+$PASS))"
511f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerecho "****************************************************"
512f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turner
513f27a2b381b327ca3995b580531c164248f99a072David 'Digit' Turnerexit $FAIL
514