Support Android NDK armeabi-v7a-hard ABI. (-mfloat-abi=hard)
authorZhang Xianyi <traits.zhang@gmail.com>
Thu, 21 May 2015 02:57:27 +0000 (21:57 -0500)
committerZhang Xianyi <traits.zhang@gmail.com>
Thu, 21 May 2015 02:57:27 +0000 (21:57 -0500)
e.g.
make HOSTCC=gcc CC=arm-linux-androideabi-gcc NO_LAPACK=1 TARGET=ARMV7

In Android NDK, it uses armeabi-v7a-hard ABI.
TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1
TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard
For more information, please check hard-float example at
android_ndk/tests/device/hard-float/jni/.

Makefile.arm
c_check
common.h
ctest.c
driver/others/memory.c

index 9978a67..2f7b337 100644 (file)
@@ -1,13 +1,23 @@
 # ifeq logical or
 ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15))
+ifeq ($(OSNAME), Android)
+CCOMMON_OPT += -marm -mfpu=neon  -mfloat-abi=hard -march=armv7-a
+FCOMMON_OPT += -marm -mfpu=neon  -mfloat-abi=hard -march=armv7-a
+else
 CCOMMON_OPT += -marm -mfpu=vfpv3  -mfloat-abi=hard -march=armv7-a
 FCOMMON_OPT += -marm -mfpu=vfpv3  -mfloat-abi=hard -march=armv7-a
 endif
+endif
 
 ifeq ($(CORE), ARMV7)
+ifeq ($(OSNAME), Android)
+CCOMMON_OPT += -marm -mfpu=neon  -mfloat-abi=hard -march=armv7-a
+FCOMMON_OPT += -marm -mfpu=neon  -mfloat-abi=hard -march=armv7-a
+else
 CCOMMON_OPT += -marm -mfpu=vfpv3  -mfloat-abi=hard -march=armv7-a
 FCOMMON_OPT += -marm -mfpu=vfpv3  -mfloat-abi=hard -march=armv7-a
 endif
+endif
 
 ifeq ($(CORE), ARMV6)
 CCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard  -march=armv6
diff --git a/c_check b/c_check
index 99de070..0fdadb6 100644 (file)
--- a/c_check
+++ b/c_check
@@ -57,6 +57,7 @@ $os = osf             if ($data =~ /OS_OSF/);
 $os = WINNT           if ($data =~ /OS_WINNT/);
 $os = CYGWIN_NT       if ($data =~ /OS_CYGWIN_NT/);
 $os = Interix         if ($data =~ /OS_INTERIX/);
+$os = Android         if ($data =~ /OS_ANDROID/);
 
 $architecture = x86    if ($data =~ /ARCH_X86/);
 $architecture = x86_64 if ($data =~ /ARCH_X86_64/);
index cf25fd5..320adad 100644 (file)
--- a/common.h
+++ b/common.h
@@ -93,6 +93,10 @@ extern "C" {
 #include <sched.h>
 #endif
 
+#ifdef OS_ANDROID
+#define NO_SYSV_IPC
+#endif
+
 #ifdef OS_WINDOWS
 #ifdef  ATOM
 #define GOTO_ATOM ATOM
@@ -106,7 +110,9 @@ extern "C" {
 #endif
 #else
 #include <sys/mman.h>
+#ifndef NO_SYSV_IPC
 #include <sys/shm.h>
+#endif
 #include <sys/time.h>
 #include <unistd.h>
 #include <math.h>
diff --git a/ctest.c b/ctest.c
index d5c2247..b5c74f1 100644 (file)
--- a/ctest.c
+++ b/ctest.c
@@ -44,6 +44,10 @@ COMPILER_DEC
 COMPILER_GNU
 #endif
 
+#if defined(__ANDROID__)
+OS_ANDROID
+#endif
+
 #if defined(__linux__)
 OS_LINUX
 #endif
index a9a80b8..a562da3 100644 (file)
@@ -90,7 +90,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #ifndef OS_WINDOWS
 #include <sys/mman.h>
+#ifndef NO_SYSV_IPC
 #include <sys/shm.h>
+#endif
 #include <sys/ipc.h>
 #endif
 
@@ -169,6 +171,14 @@ int get_num_procs(void) {
 #endif
 #endif
 
+#ifdef OS_ANDROID
+int get_num_procs(void) {
+  static int nums = 0;
+  if (!nums) nums = sysconf(_SC_NPROCESSORS_ONLN);
+  return nums;
+}
+#endif
+
 #ifdef OS_WINDOWS
 
 int get_num_procs(void) {
@@ -266,7 +276,7 @@ void openblas_fork_handler()
   //   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60035
   // In the mean time build with USE_OPENMP=0 or link against another
   // implementation of OpenMP.
-#if !defined(OS_WINDOWS) && defined(SMP_SERVER)
+#if !(defined(OS_WINDOWS) || defined(OS_ANDROID)) && defined(SMP_SERVER)
   int err;
   err = pthread_atfork ((void (*)(void)) BLASFUNC(blas_thread_shutdown), NULL, NULL);
   if(err != 0)
@@ -276,7 +286,7 @@ void openblas_fork_handler()
 
 int blas_get_cpu_number(void){
   env_var_t p;
-#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
+#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID)
   int max_num;
 #endif
   int blas_goto_num   = 0;
@@ -284,7 +294,7 @@ int blas_get_cpu_number(void){
 
   if (blas_num_threads) return blas_num_threads;
 
-#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
+#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID)
   max_num = get_num_procs();
 #endif
 
@@ -308,7 +318,7 @@ int blas_get_cpu_number(void){
   else if (blas_omp_num > 0) blas_num_threads = blas_omp_num;
   else blas_num_threads = MAX_CPU_NUMBER;
 
-#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
+#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID)
   if (blas_num_threads > max_num) blas_num_threads = max_num;
 #endif