From: Geunsik Lim <lee...@gmail.com>

The patch supports OpenMP library to parallelize the existing
C/C++ code (e.g: for task parallelism) 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.7.2 for ktoolchain
version 2.5. The patch is good to me when I evaluate a lot of
C/C++ source code with OpenMP's #parama. we move the version
of OpenMP from version 2.5 to version 3.1.

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.7.2 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

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

diff --git a/gcc-4.7/gcc/config/arm/linux-eabi.h 
b/gcc-4.7/gcc/config/arm/linux-eabi.h
index 88811b7..ddeb627 100644
--- a/gcc-4.7/gcc/config/arm/linux-eabi.h
+++ b/gcc-4.7/gcc/config/arm/linux-eabi.h
@@ -87,7 +87,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-4.7/gcc/config/linux-android.h 
b/gcc-4.7/gcc/config/linux-android.h
index 033cfef..c6d9cdd 100644
--- a/gcc-4.7/gcc/config/linux-android.h
+++ b/gcc-4.7/gcc/config/linux-android.h
@@ -53,7 +53,8 @@
   "--noexecstack"
 
 #define ANDROID_LIB_SPEC \
-  "%{!static: -ldl}"
+  "%{!static: -ldl}" \
+  "%{pthread:-lc}"
 
 #define ANDROID_STARTFILE_SPEC                                         \
   "%{shared: crtbegin_so%O%s;:"                                                
\
diff --git a/gcc-4.7/libgomp/configure b/gcc-4.7/libgomp/configure
index 8ed841a..3c99b25 100755
--- a/gcc-4.7/libgomp/configure
+++ b/gcc-4.7/libgomp/configure
@@ -15013,7 +15013,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>
@@ -15036,6 +15083,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/gcc-4.7/libgomp/configure.ac b/gcc-4.7/libgomp/configure.ac
index d87ed29..292db2a 100644
--- a/gcc-4.7/libgomp/configure.ac
+++ b/gcc-4.7/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/gcc-4.7/libgomp/env.c b/gcc-4.7/libgomp/env.c
index aff7490..98abd71 100644
--- a/gcc-4.7/libgomp/env.c
+++ b/gcc-4.7/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)
-- 
1.7.8.1

Reply via email to