you just port libgomp to mingw32 + pthreads-win32
and assuming pthreads-win32 is sufficiently rich and not too buggy, it will
just work.

With the attached patch, I can compile libgomp with

../gcc/configure --prefix=/mingw --disable-nls --with-ld=/mingw/bin/ld
--with-as=/mingw/bin/as --disable-werror --enable-bootstrap
--enable-threads=posix --with-win32-nlsapi=unicode
--host=i386-pc-mingw32 --enable-languages=c,fortran --enable-libgomp

and the resulting compiler and generated executables seem to work (I
tried a few C and Fortran toy codes). The main changes are to
libgomp/config/posix/time.c, which used functions not available on
mingw32. Would they be acceptable in this form (protected with #ifdef
_WIN32)? If so, I'll do some more testing, and officially submit the
patch.

FX
Index: libgomp/configure
===================================================================
--- libgomp/configure	(revision 114196)
+++ libgomp/configure	(working copy)
@@ -8397,7 +8397,9 @@
 # Check for functions needed.
 
 
-for ac_func in getloadavg clock_gettime
+
+
+for ac_func in getloadavg clock_gettime gettimeofday sysconf
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_func" >&5
Index: libgomp/configure.ac
===================================================================
--- libgomp/configure.ac	(revision 114196)
+++ libgomp/configure.ac	(working copy)
@@ -162,7 +162,7 @@
    [AC_MSG_ERROR([Pthreads are required to build libgomp])])])
 
 # Check for functions needed.
-AC_CHECK_FUNCS(getloadavg clock_gettime)
+AC_CHECK_FUNCS(getloadavg clock_gettime gettimeofday sysconf)
 
 # Check for broken semaphore implementation on darwin.
 # sem_init returns: sem_init error: Function not implemented.
Index: libgomp/config.h.in
===================================================================
--- libgomp/config.h.in	(revision 114196)
+++ libgomp/config.h.in	(working copy)
@@ -18,6 +18,9 @@
 /* Define to 1 if you have the `getloadavg' function. */
 #undef HAVE_GETLOADAVG
 
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
@@ -42,6 +45,9 @@
 /* Define to 1 if the target supports __sync_*_compare_and_swap */
 #undef HAVE_SYNC_BUILTINS
 
+/* Define to 1 if you have the `sysconf' function. */
+#undef HAVE_SYSCONF
+
 /* Define to 1 if you have the <sys/loadavg.h> header file. */
 #undef HAVE_SYS_LOADAVG_H
 
Index: libgomp/config/posix/time.c
===================================================================
--- libgomp/config/posix/time.c	(revision 114196)
+++ libgomp/config/posix/time.c	(working copy)
@@ -48,32 +48,52 @@
 double
 omp_get_wtime (void)
 {
-#ifdef HAVE_CLOCK_GETTIME
+#ifdef HAVE_GETTIMEOFDAY
+# ifdef HAVE_CLOCK_GETTIME
   struct timespec ts;
-# ifdef CLOCK_MONOTONIC
+#  ifdef CLOCK_MONOTONIC
   if (clock_gettime (CLOCK_MONOTONIC, &ts) < 0)
-# endif
+#  endif
     clock_gettime (CLOCK_REALTIME, &ts);
   return ts.tv_sec + ts.tv_nsec / 1e9;
-#else
+# else
   struct timeval tv;
   gettimeofday (&tv, NULL);
   return tv.tv_sec + tv.tv_usec / 1e6;
+# endif
+#else
+# ifdef _WIN32
+
+#include <sys/timeb.h>
+  struct _timeb timebuf;
+  _ftime (&timebuf);
+  return (timebuf.time + (long)(timebuf.millitm) / 1e3);
+# else
+#  error "Either clock_gettime or gettimeofday are required"
+# endif
 #endif
 }
 
 double
 omp_get_wtick (void)
 {
-#ifdef HAVE_CLOCK_GETTIME
+#ifdef HAVE_SYSCONF
+# ifdef HAVE_CLOCK_GETTIME
   struct timespec ts;
-# ifdef CLOCK_MONOTONIC
+#  ifdef CLOCK_MONOTONIC
   if (clock_getres (CLOCK_MONOTONIC, &ts) < 0)
-# endif
+#  endif
     clock_getres (CLOCK_REALTIME, &ts);
   return ts.tv_sec + ts.tv_nsec / 1e9;
+# else
+  return 1.0 / sysconf(_SC_CLK_TCK);
+# endif
 #else
-  return 1.0 / sysconf(_SC_CLK_TCK);
+# ifdef _WIN32
+  return 1e-3;
+# else
+#  error "Either clock_getres or sysconf are required"
+# endif
 #endif
 }
 
Index: gcc/config/i386/mingw32.h
===================================================================
--- gcc/config/i386/mingw32.h	(revision 114196)
+++ gcc/config/i386/mingw32.h	(working copy)
@@ -108,3 +108,8 @@
 /* Define as short unsigned for compatibility with MS runtime.  */
 #undef WINT_TYPE
 #define WINT_TYPE "short unsigned int"
+
+/* The mingw32 compiler doesn't know the -pthread option, but requires
+   explicitly linking the libpthread.  */
+#undef GOMP_SELF_SPECS
+#define GOMP_SELF_SPECS "-lpthread"

Reply via email to