diff mbox

Support OpenMP for task parallelism on Android-ICS/GCC-4.6.3

Message ID 1356568669-3612-1-git-send-email-geunsik.lim@gmail.com
State New
Headers show

Commit Message

Geunsik Lim Dec. 27, 2012, 12:37 a.m. UTC
From: Geunsik Lim <leemgs@gmail.com>

The patch supports OpenMP library to parallelize the existing
C/C++ code rapidly/easily without any modification of android platform
on multicore embedded devices.

The original patch is made by Keith Obenschain (using GCC 4.4.3).
. Archive - https://android-review.googlesource.com/#/c/34491/

I just moved GCC version from 4.4.3 to 4.6.3 for ktoolchain ver 2.5. 
The patch is good to me when I evaluate a lot of C/C++ source code with OpenMP's #parama.

Please, refer to the "kandroid toolchain" menu in www.kandroid.org to compile  
source code including bionic and openmp library on real Android devices. 
http://kandroid.org/board/board.php?board=toolchain&command=body&no=16

I tested Openmp library with the latest GCC 4.6.3 on Android/ARM devices as following. 
Please refer to the below example. 

geunsik@rhel6$> ./arm-linux-androideabi-gcc   openmptest.c  -L
/usr/local/ktoolchain-cortexa9-ver2.5-20120515-bionic/arm-linux-androideabi/lib
 -lgomp  -o openmptest   [ENTER]
geunsik@rhel6$>
geunsik@rhel6$>
geunsik@rhel6$> file ./openmptest
./openmptest: ELF 32-bit LSB executable, ARM, version 1 (SYSV), 
dynamically linked (uses shared libs), not stripped



Signed-off-by: Geunsik Lim <leemgs@gmail.com>
Acked-by: Geunsik Lim <geunsik.lim@gmail.com>
---
 gcc/config/arm/linux-eabi.h |    2 +-
 gcc/config/linux-android.h  |    3 ++-
 libgomp/configure           |   52 ++++++++++++++++++++++++++++++++++++++++++-
 libgomp/configure.ac        |    9 +++++++-
 libgomp/env.c               |    1 +
 5 files changed, 63 insertions(+), 4 deletions(-)
diff mbox

Patch

diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h
index 8330052..c3e632c 100644
--- a/gcc/config/arm/linux-eabi.h
+++ b/gcc/config/arm/linux-eabi.h
@@ -82,7 +82,7 @@ 
 #undef  LIB_SPEC
 #define LIB_SPEC							\
   LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC,			\
-		       GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
+	               ANDROID_LIB_SPEC " " GNU_USER_TARGET_LIB_SPEC )
 
 #undef	STARTFILE_SPEC
 #define STARTFILE_SPEC \
diff --git a/gcc/config/linux-android.h b/gcc/config/linux-android.h
index 94c5274..b1a9021 100644
--- a/gcc/config/linux-android.h
+++ b/gcc/config/linux-android.h
@@ -50,7 +50,8 @@ 
   "%{!frtti:%{!fno-rtti: -fno-rtti}}"
 
 #define ANDROID_LIB_SPEC \
-  "%{!static: -ldl}"
+  "%{!static: -ldl}" \
+  "%{pthread:-lc}"
 
 #define ANDROID_STARTFILE_SPEC						\
   "%{!shared:"								\
diff --git a/libgomp/configure b/libgomp/configure
index 6f25c6f..3d8ce6b 100755
--- a/libgomp/configure
+++ b/libgomp/configure
@@ -15015,7 +15015,54 @@  _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   XPCFLAGS=" -Wc,-pthread"
 else
-  CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+CFLAGS="$save_CFLAGS" LIBS="$LIBS"
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <pthread.h>
+     void *g(void *d) { return NULL; }
+int
+main ()
+{
+pthread_t t; pthread_create(&t,NULL,g,NULL);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <pthread.h>
@@ -15038,6 +15085,9 @@  rm -f core conftest.err conftest.$ac_objext \
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
 # Check for functions needed.
 for ac_func in getloadavg clock_gettime strtoull
diff --git a/libgomp/configure.ac b/libgomp/configure.ac
index d87ed29..292db2a 100644
--- a/libgomp/configure.ac
+++ b/libgomp/configure.ac
@@ -184,6 +184,13 @@  AC_LINK_IFELSE(
    void *g(void *d) { return NULL; }],
   [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
  [XPCFLAGS=" -Wc,-pthread"],
+ [CFLAGS="$save_CFLAGS" LIBS="$LIBS"
+  AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM(
+    [#include <pthread.h>
+     void *g(void *d) { return NULL; }],
+    [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
+   [],
  [CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
   AC_LINK_IFELSE(
    [AC_LANG_PROGRAM(
@@ -191,7 +198,7 @@  AC_LINK_IFELSE(
      void *g(void *d) { return NULL; }],
     [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
    [],
-   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])
+   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])])
 
 # Check for functions needed.
 AC_CHECK_FUNCS(getloadavg clock_gettime strtoull)
diff --git a/libgomp/env.c b/libgomp/env.c
index 92fa8c3..8b1e29e 100644
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -44,6 +44,7 @@ 
 #endif
 #include <limits.h>
 #include <errno.h>
+#include <asm/page.h>
 
 #ifndef HAVE_STRTOULL
 # define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)