diff --git a/gcc/m2/gm2-libs-iso/SysClock.mod b/gcc/m2/gm2-libs-iso/SysClock.mod
index 3313309d19ad4dd270439b57bacc2edf6cc1a53b..56d5503a87c584fdf2b035bc933d86ea045fda61 100644
--- a/gcc/m2/gm2-libs-iso/SysClock.mod
+++ b/gcc/m2/gm2-libs-iso/SysClock.mod
@@ -173,6 +173,26 @@ BEGIN
 END ExtractDate ;
 
 
+(*
+   EpochTime - assigns all fields of userData to 0 or FALSE.
+*)
+
+PROCEDURE EpochTime (VAR userData: DateTime) ;
+BEGIN
+   WITH userData DO
+      second := 0 ;
+      minute :=  0 ;
+      hour := 0 ;
+      year := 0 ;
+      month := 0 ;
+      day := 0 ;
+      fractions := 0 ;
+      zone := 0 ;
+      summerTimeFlag := FALSE
+   END
+END EpochTime ;
+
+
 PROCEDURE GetClock (VAR userData: DateTime) ;
 (* Assigns local date and time of the day to userData *)
 VAR
@@ -207,10 +227,10 @@ BEGIN
                summerTimeFlag := (isdst () = 1)
             END
          ELSE
-            HALT
+            EpochTime (userData)
          END
       ELSE
-         HALT
+         EpochTime (userData)
       END ;
       ts := KillTimespec (ts)
    END
@@ -310,13 +330,11 @@ BEGIN
                            userData.month, userData.year) ;
       offset := timezone () ;
       sec := VAL (LONGINT, sec) - offset ;
-      IF SetTimespec (ts, sec, nano) = 0
-      THEN
-         HALT
-      END ;
-      IF SetTimeRealtime (ts) # 0
+      IF SetTimespec (ts, sec, nano) = 1
       THEN
-         HALT
+         IF SetTimeRealtime (ts) = 0
+         THEN
+         END
       END ;
       ts := KillTimespec (ts)
    END
diff --git a/gcc/m2/gm2-libs-iso/wrapclock.def b/gcc/m2/gm2-libs-iso/wrapclock.def
index 1dd12e1c6b894cea0a5cabe530fe4cc4c6936f2f..9f5f28624448bc25bbccee320351b212289abf19 100644
--- a/gcc/m2/gm2-libs-iso/wrapclock.def
+++ b/gcc/m2/gm2-libs-iso/wrapclock.def
@@ -36,11 +36,23 @@ TYPE
    timezone - return the glibc timezone value.
               This contains the difference between UTC and the latest
               local standard time, in seconds west of UTC.
+              If the underlying timezone is unavailable and
+              clock_gettime, localtime_r, tm_gmtoff
+              is unavailable then 0 is returned.
 *)
 
 PROCEDURE timezone () : LONGINT ;
 
 
+(*
+   istimezone returns 1 if timezone in wrapclock.cc can resolve the
+              timezone value using the timezone C library call or by using
+              clock_gettime, localtime_r and tm_gmtoff.
+*)
+
+PROCEDURE istimezone () : INTEGER ;
+
+
 (*
    daylight - return the glibc daylight value.
               This variable has a nonzero value if Daylight Saving
diff --git a/libgm2/configure b/libgm2/configure
index 74f93ac5eec38e7e80fa6ad434194e61e57fc274..072d584544ecb14673471c34b04c7bc7ed021cc0 100755
--- a/libgm2/configure
+++ b/libgm2/configure
@@ -3976,6 +3976,42 @@ test -n "$target_alias" &&
 target_alias=${target_alias-$host_alias}
 
 
+if test "$build" != "$host"; then
+  # We are being configured with some form of cross compiler.
+  GLIBCXX_IS_NATIVE=false
+  case "$host","$target" in
+    # Darwin crosses can use the host system's libraries and headers,
+    # because of the fat library support.  Of course, it must be the
+    # same version of Darwin on both sides.  Allow the user to
+    # just say --target=foo-darwin without a version number to mean
+    # "the version on this system".
+      *-*-darwin*,*-*-darwin*)
+	hostos=`echo $host | sed 's/.*-darwin/darwin/'`
+	targetos=`echo $target | sed 's/.*-darwin/darwin/'`
+	if test $hostos = $targetos || test $targetos = darwin ; then
+	  GLIBCXX_IS_NATIVE=true
+	fi
+	;;
+
+      *)
+
+	;;
+  esac
+else
+  GLIBCXX_IS_NATIVE=true
+fi
+
+# Runs configure.host, and assorted other critical bits.  Sets
+# up critical shell variables.
+GLIBCXX_CONFIGURE
+
+# For gettimeofday support.
+GLIBCXX_CHECK_GETTIMEOFDAY
+
+# For clock_gettime, nanosleep and sched_yield support.
+GLIBCXX_ENABLE_LIBSTDCXX_TIME
+
+
 am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
@@ -12702,7 +12738,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12705 "configure"
+#line 12741 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12808,7 +12844,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12811 "configure"
+#line 12847 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
diff --git a/libgm2/configure.ac b/libgm2/configure.ac
index 75ca603283f693c439b6ec543e81d7b1416174eb..92e76c9346c94c12c48d46a0f91c0251f053c449 100644
--- a/libgm2/configure.ac
+++ b/libgm2/configure.ac
@@ -42,6 +42,42 @@ AC_CANONICAL_SYSTEM
 target_alias=${target_alias-$host_alias}
 AC_SUBST(target_alias)
 
+if test "$build" != "$host"; then
+  # We are being configured with some form of cross compiler.
+  GLIBCXX_IS_NATIVE=false
+  case "$host","$target" in
+    # Darwin crosses can use the host system's libraries and headers,
+    # because of the fat library support.  Of course, it must be the
+    # same version of Darwin on both sides.  Allow the user to
+    # just say --target=foo-darwin without a version number to mean
+    # "the version on this system".
+      *-*-darwin*,*-*-darwin*)
+	hostos=`echo $host | sed 's/.*-darwin/darwin/'`
+	targetos=`echo $target | sed 's/.*-darwin/darwin/'`
+	if test $hostos = $targetos || test $targetos = darwin ; then
+	  GLIBCXX_IS_NATIVE=true
+	fi
+	;;
+
+      *)
+	GCC_NO_EXECUTABLES
+	;;
+  esac
+else
+  GLIBCXX_IS_NATIVE=true
+fi
+
+# Runs configure.host, and assorted other critical bits.  Sets
+# up critical shell variables.
+GLIBCXX_CONFIGURE
+
+# For gettimeofday support.
+GLIBCXX_CHECK_GETTIMEOFDAY
+
+# For clock_gettime, nanosleep and sched_yield support.
+GLIBCXX_ENABLE_LIBSTDCXX_TIME
+
+
 AM_INIT_AUTOMAKE([1.15.1 no-define foreign no-dist -Wall -Wno-portability])
 
 AH_TEMPLATE(PACKAGE, [Name of package])
diff --git a/libgm2/libm2iso/wrapclock.cc b/libgm2/libm2iso/wrapclock.cc
index 91ac96f26f92a78d28a1cdce0ad6e31c9e39d775..1f4ca8c325d084f7414e4eb14b6cd0c3dfa88100 100644
--- a/libgm2/libm2iso/wrapclock.cc
+++ b/libgm2/libm2iso/wrapclock.cc
@@ -51,6 +51,18 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "time.h"
 #endif
 
+// Conditional inclusion of sys/time.h for gettimeofday
+#if !defined(_GLIBCXX_USE_CLOCK_MONOTONIC) && \
+    !defined(_GLIBCXX_USE_CLOCK_REALTIME) && \
+     defined(_GLIBCXX_USE_GETTIMEOFDAY)
+#include <sys/time.h>
+#endif
+
+#if defined(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL)
+#include <unistd.h>
+#include <sys/syscall.h>
+#endif
+
 #if defined(HAVE_MALLOC_H)
 #include "malloc.h"
 #endif
@@ -64,91 +76,19 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #endif
 
 
-extern "C" long int
-EXPORT(timezone) (void)
-{
-#if defined(HAVE_STRUCT_TM) && defined(HAVE_STRUCT_TIMESPEC)
-  struct tm result;
-  struct timespec ts;
-
-#if defined(HAVE_CLOCK_GETTIME) && defined(HAVE_TM_TM_GMTOFF)
-  if (clock_gettime (CLOCK_REALTIME, &ts) == 0)
-    {
-      time_t time = ts.tv_sec;
-      localtime_r (&time, &result);
-      return result.tm_gmtoff;
-    }
-  else
-#endif
-#endif
-    return timezone;
-}
-
-
-extern "C" int
-EXPORT(daylight) (void)
-{
-#if defined(HAVE_DAYLIGHT)
-  return daylight;
-#else
-  return 0;
-#endif
-}
-
-
-/* isdst returns 1 if daylight saving time is currently in effect and
-   returns 0 if it is not.  */
-
-extern "C" int
-EXPORT(isdst) (void)
-{
-#if defined(HAVE_STRUCT_TM) && defined(HAVE_STRUCT_TIMESPEC)
-  struct tm result;
-  struct timespec ts;
-
-#if defined(HAVE_CLOCK_SETTIME)
-  if (clock_gettime (CLOCK_REALTIME, &ts) == 0)
-    {
-      time_t time = ts.tv_sec;
-      localtime_r (&time, &result);
-      return result.tm_isdst;
-    }
-  else
-#endif
-#endif
-    return 0;
-}
-
-
-/* tzname returns the string associated with the local timezone.
-   The daylight value is 0 or 1.  The value 0 returns the non
-   daylight saving timezone string and the value of 1 returns the
-   daylight saving timezone string.  It returns NULL if tzname is
-   unavailable.  */
-
-extern "C" char *
-EXPORT(tzname) (int daylight)
-{
-#if defined(HAVE_TZNAME)
-  return tzname[daylight];
-#else
-  return NULL;
-#endif
-}
-
-
 /* GetTimeRealtime performs return gettime (CLOCK_REALTIME, ts).
    gettime returns 0 on success and -1 on failure.  If the underlying
    system does not have gettime then GetTimeRealtime returns 1.  */
 
-#if defined(HAVE_STRUCT_TIMESPEC)
+#if defined(HAVE_STRUCT_TIMESPEC) && defined(_GLIBCXX_USE_CLOCK_REALTIME)
 extern "C" int
 EXPORT(GetTimeRealtime) (struct timespec *ts)
 {
-#if defined(HAVE_CLOCK_GETTIME)
-  return clock_gettime (CLOCK_REALTIME, ts);
+  timespec tp;
+#if defined(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL)
+  return syscall (SYS_clock_gettime, CLOCK_REALTIME, ts);
 #else
-  return 1;
+  return clock_gettime (CLOCK_REALTIME, ts);
 #endif
 }
 
@@ -161,16 +101,17 @@ EXPORT(GetTimeRealtime) (void *ts)
 }
 #endif
 
-
 /* SetTimeRealtime performs return settime (CLOCK_REALTIME, ts).
    gettime returns 0 on success and -1 on failure.  If the underlying
    system does not have gettime then GetTimeRealtime returns 1.  */
 
-#if defined(HAVE_STRUCT_TIMESPEC)
+#if defined(HAVE_STRUCT_TIMESPEC) && defined(_GLIBCXX_USE_CLOCK_REALTIME)
 extern "C" int
 EXPORT(SetTimeRealtime) (struct timespec *ts)
 {
-#if defined(HAVE_CLOCK_GETTIME)
+#if defined(_GLIBCXX_USE_CLOCK_SETTIME_SYSCALL)
+  return syscall (SYS_clock_settime, CLOCK_REALTIME, ts);
+#elif defined(HAVE_CLOCK_SETTIME)
   return clock_settime (CLOCK_REALTIME, ts);
 #else
   return 1;
@@ -186,7 +127,6 @@ EXPORT(SetTimeRealtime) (void *ts)
 }
 #endif
 
-
 /* InitTimespec returns a newly created opaque type.  */
 
 #if defined(HAVE_STRUCT_TIMESPEC)
@@ -209,7 +149,6 @@ EXPORT(InitTimespec) (void)
 }
 #endif
 
-
 /* KillTimeval deallocates the memory associated with an opaque type.  */
 
 #if defined(HAVE_STRUCT_TIMESPEC)
@@ -231,9 +170,8 @@ EXPORT(KillTimespec) (void *ts)
 }
 #endif
 
-
 /* GetTimespec retrieves the number of seconds and nanoseconds from the
-   timespec.  */
+   timespec.  1 is returned if successful and 0 otherwise.  */
 
 #if defined(HAVE_STRUCT_TIMESPEC)
 extern "C" int
@@ -256,8 +194,8 @@ EXPORT(GetTimespec) (void *ts, unsigned long *sec, unsigned long *nano)
 }
 #endif
 
-
-/* SetTimespec sets the number of seconds and nanoseconds into timespec.  */
+/* SetTimespec sets the number of seconds and nanoseconds into timespec.
+   1 is returned if successful and 0 otherwise.  */
 
 #if defined(HAVE_STRUCT_TIMESPEC)
 extern "C" int
@@ -281,6 +219,97 @@ EXPORT(SetTimespec) (void *ts, unsigned long sec, unsigned long nano)
 }
 #endif
 
+extern "C" long int
+EXPORT(timezone) (void)
+{
+#if defined(HAVE_STRUCT_TIMESPEC)
+  struct tm result;
+  struct timespec ts;
+
+#if defined(HAVE_TM_TM_GMTOFF)
+  if (EXPORT(GetTimeRealtime) (&ts) == 0)
+    {
+      time_t time = ts.tv_sec;
+      localtime_r (&time, &result);
+      return result.tm_gmtoff;
+    }
+  else
+#endif
+#endif
+    {
+#if defined(HAVE_TIMEZONE)
+      return timezone;
+#else
+      return 0;
+#endif
+    }
+}
+
+/* istimezone returns 1 if timezone in wrapclock.cc can resolve the
+   timezone value using the timezone C library call or by using
+   clock_gettime, localtime_r and tm_gmtoff.  */
+
+extern "C" int
+EXPORT(istimezone) (void)
+{
+#if defined(HAVE_STRUCT_TIMESPEC)
+#if defined(HAVE_TM_TM_GMTOFF)
+#if defined(_GLIBCXX_USE_CLOCK_REALTIME)
+  return 1;
+#endif
+#endif
+#endif
+  return 0;
+}
+
+extern "C" int
+EXPORT(daylight) (void)
+{
+#if defined(HAVE_DAYLIGHT)
+  return daylight;
+#else
+  return 0;
+#endif
+}
+
+/* isdst returns 1 if daylight saving time is currently in effect and
+   returns 0 if it is not.  */
+
+extern "C" int
+EXPORT(isdst) (void)
+{
+#if defined(HAVE_STRUCT_TIMESPEC)
+  struct tm result;
+  struct timespec ts;
+
+  if (EXPORT(GetTimeRealtime) (&ts) == 0)
+    {
+      time_t time = ts.tv_sec;
+      localtime_r (&time, &result);
+      return result.tm_isdst;
+    }
+  else
+    return 0;
+#else
+  return 0;
+#endif
+}
+
+/* tzname returns the string associated with the local timezone.
+   The daylight value is 0 or 1.  The value 0 returns the non
+   daylight saving timezone string and the value of 1 returns the
+   daylight saving timezone string.  It returns NULL if tzname is
+   unavailable.  */
+
+extern "C" char *
+EXPORT(tzname) (int daylight)
+{
+#if defined(HAVE_TZNAME)
+  return tzname[daylight];
+#else
+  return NULL;
+#endif
+}
 
 /* init - init/finish functions for the module */