diff mbox

PR ada/54040: [x32] Incorrect timeval and timespec

Message ID CAMe9rOpAXacQAxckGV1eoSqV4Pwih6da1iGEq=b9TpWe2OB4jw@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu Nov. 15, 2013, 4:28 a.m. UTC
On Thu, Nov 14, 2013 at 1:16 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Nov 14, 2013 at 6:16 AM, Arnaud Charlet <charlet@adacore.com> wrote:
>>> I also changed s-osinte-posix.adb and s-osprim-posix.adb
>>> for x32.  They aren't Linux specific.  What should I do with
>>> them?
>>
>> I would use the time_t type defined in s-osinte* (all POSIX implementations
>> of s-osinte* have such definition, or if they don't, it's easy to add), and
>> in the s-osinte-linux version we can have a renaming:
>>
>>    subtype time_t is System.Linux.time_t
>>
>> and in System.Linux have either:
>>
>>    type time_t is new Long_Integer;
>>
>> or
>>
>>    type time_t is new Long_Long_Integer;
>>
>> depending on the variant.
>>
>> Arno
>
> Another problem.  s-osprim-posix.adb has
>
>    --  ??? These definitions are duplicated from System.OS_Interface
>    --  because we don't want to depend on any package. Consider removing
>    --  these declarations in System.OS_Interface and move these ones in
>    --  the spec.
>
> I can't use time_t from s-osinte-linux.ads since System.OS_Interface
> isn't available. What should I do?
>

This is what I got.  I added s-posix-time.ads which declares
System.OS_Time.time_t.  I use it instead long for time_t.  I
didn't add time_t to s-linux.ads since it isn't used by
s-osprim-posix.adb.

It passes all tests with -m32, -mx32 and -m64 on Linux/x86-64
I don't know if I do it right.  If it isn't right, please tell me exactly
how to fix it since I don't know Ada.

Thanks.

Comments

Arnaud Charlet Nov. 15, 2013, 10:11 a.m. UTC | #1
> This is what I got.  I added s-posix-time.ads which declares
> System.OS_Time.time_t.  I use it instead long for time_t.  I
> didn't add time_t to s-linux.ads since it isn't used by
> s-osprim-posix.adb.

Adding s-posix-time.ads isn't desirable, too intrusive.
Better to use time_t (only) from system.linux in s-osinte, and provide
an alternate s-osprim-x32.adb

> It passes all tests with -m32, -mx32 and -m64 on Linux/x86-64
> I don't know if I do it right.  If it isn't right, please tell me exactly
> how to fix it since I don't know Ada.

Unfortunately I can't give you a training about Ada by email, so there's
a limit on advices I can give.

Arno
diff mbox

Patch

diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
index 91778c5..18d3974 100644
--- a/gcc/ada/gcc-interface/Makefile.in
+++ b/gcc/ada/gcc-interface/Makefile.in
@@ -1007,6 +1007,7 @@  ifeq ($(strip $(filter-out arm% linux-androideabi,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-android.adb \
   s-osinte.ads<s-osinte-android.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1021,7 +1022,7 @@  ifeq ($(strip $(filter-out arm% linux-androideabi,$(target_cpu) $(target_os))),)
     indepsw.adb<indepsw-gnu.adb
 
   GNATRTL_SOCKETS_OBJS =
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=
   THREADSLIB =
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1086,6 +1087,7 @@  ifeq ($(strip $(filter-out sparc% sun solaris%,$(target_cpu) $(target_vendor) $(
     a-intnam.ads<a-intnam-solaris.ads \
     s-inmaop.adb<s-inmaop-posix.adb \
     s-intman.adb<s-intman-posix.adb \
+    s-ostime.ads<s-posix-time.ads \
     s-osinte.adb<s-osinte-posix.adb \
     s-osinte.ads<s-osinte-solaris-posix.ads \
     s-osprim.adb<s-osprim-solaris.adb \
@@ -1095,6 +1097,7 @@  ifeq ($(strip $(filter-out sparc% sun solaris%,$(target_cpu) $(target_vendor) $(
     g-soliop.ads<g-soliop-solaris.ads \
     system.ads<system-solaris-sparc.ads
 
+    EXTRA_GNATRTL_TASKING_OBJS=s-ostime.o
     THREADSLIB = -lposix4 -lpthread
   endif
 
@@ -1173,6 +1176,7 @@  ifeq ($(strip $(filter-out %86 linux%,$(target_cpu) $(target_os))),)
   a-exetim.adb<a-exetim-posix.adb \
   a-exetim.ads<a-exetim-default.ads \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   $(ATOMICS_TARGET_PAIRS)
 
@@ -1210,7 +1214,7 @@  ifeq ($(strip $(filter-out %86 linux%,$(target_cpu) $(target_os))),)
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread -lrt
   EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o s-ostime.o
 
   TOOLS_TARGET_PAIRS =  \
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
@@ -1228,6 +1232,7 @@  ifeq ($(strip $(filter-out %86 kfreebsd%,$(target_cpu) $(target_os))),)
   a-intnam.ads<a-intnam-freebsd.ads \
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-kfreebsd-gnu.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1245,6 +1250,7 @@  ifeq ($(strip $(filter-out %86 kfreebsd%,$(target_cpu) $(target_os))),)
     indepsw.adb<indepsw-gnu.adb
 
   EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-ostime.o
 
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
@@ -1261,6 +1267,7 @@  ifeq ($(strip $(filter-out x86_64 kfreebsd%,$(target_cpu) $(target_os))),)
   a-numaux.ads<a-numaux-x86.ads \
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-kfreebsd-gnu.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1275,6 +1282,7 @@  ifeq ($(strip $(filter-out x86_64 kfreebsd%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
+  EXTRA_GNATRTL_TASKING_OBJS=s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1347,6 +1355,7 @@  ifeq ($(strip $(filter-out s390% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1379,7 +1388,7 @@  ifeq ($(strip $(filter-out s390% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1412,6 +1421,7 @@  ifeq ($(strip $(filter-out hppa% hp hpux11%,$(target_cpu) $(target_vendor) $(tar
   a-intnam.ads<a-intnam-hpux.ads \
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-hpux.ads \
   s-parame.ads<s-parame-hpux.ads \
@@ -1423,6 +1433,7 @@  ifeq ($(strip $(filter-out hppa% hp hpux11%,$(target_cpu) $(target_vendor) $(tar
   system.ads<system-hpux.ads
 
   TOOLS_TARGET_PAIRS = mlib-tgt-specific.adb<mlib-tgt-specific-hpux.adb
+  EXTRA_GNATRTL_TASKING_OBJS=s-ostime.o
   EH_MECHANISM=-gcc
   TGT_LIB = /usr/lib/libcl.a
   THREADSLIB = -lpthread
@@ -1735,6 +1746,7 @@  ifeq ($(strip $(filter-out mips linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1745,6 +1757,7 @@  ifeq ($(strip $(filter-out mips linux%,$(target_cpu) $(target_os))),)
   s-tpopsp.adb<s-tpopsp-posix-foreign.adb \
   system.ads<system-linux-mips.ads
 
+  EXTRA_GNATRTL_TASKING_OBJS=s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1759,6 +1772,7 @@  ifeq ($(strip $(filter-out mipsel linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux-mipsel.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1787,7 +1801,7 @@  ifeq ($(strip $(filter-out mipsel linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1802,6 +1816,7 @@  ifeq ($(strip $(filter-out mips64el linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux-mipsel.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1830,7 +1845,7 @@  ifeq ($(strip $(filter-out mips64el linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1849,6 +1864,7 @@  ifeq ($(strip $(filter-out powerpc% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-tpopsp.adb<s-tpopsp-tls.adb \
   g-sercom.adb<g-sercom-linux.adb \
@@ -1894,7 +1910,7 @@  ifeq ($(strip $(filter-out powerpc% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread -lrt
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1909,6 +1925,7 @@  ifeq ($(strip $(filter-out arm% linux-gnueabi,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1930,7 +1947,7 @@  ifeq ($(strip $(filter-out arm% linux-gnueabi,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1945,6 +1962,7 @@  ifeq ($(strip $(filter-out sparc% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux-sparc.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -1972,7 +1990,7 @@  ifeq ($(strip $(filter-out sparc% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -1987,6 +2005,7 @@  ifeq ($(strip $(filter-out hppa% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux-hppa.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -2001,7 +2020,7 @@  ifeq ($(strip $(filter-out hppa% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB = -lpthread
   GNATLIB_SHARED = gnatlib-shared-dual
@@ -2016,6 +2035,7 @@  ifeq ($(strip $(filter-out sh4% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osprim.adb<s-osprim-posix.adb \
@@ -2030,7 +2050,7 @@  ifeq ($(strip $(filter-out sh4% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-linux.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   MISCLIB=
   THREADSLIB = -lpthread
@@ -2051,6 +2071,7 @@  ifeq ($(strip $(filter-out %ia64 linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-mudido.adb<s-mudido-affinity.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osinte.adb<s-osinte-posix.adb \
@@ -2069,7 +2090,7 @@  ifeq ($(strip $(filter-out %ia64 linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o s-ostime.o
   EH_MECHANISM=-gcc
   MISCLIB=
   THREADSLIB=-lpthread -lrt
@@ -2114,6 +2135,7 @@  ifeq ($(strip $(filter-out alpha% linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux-alpha.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-osinte.ads<s-osinte-linux.ads \
   s-osinte.adb<s-osinte-posix.adb \
   s-osprim.adb<s-osprim-posix.adb \
@@ -2130,7 +2152,7 @@  ifeq ($(strip $(filter-out alpha% linux%,$(target_cpu) $(target_os))),)
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
     indepsw.adb<indepsw-gnu.adb
 
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o s-ostime.o
   EH_MECHANISM=-gcc
   MISCLIB=
   THREADSLIB=-lpthread
@@ -2149,6 +2171,7 @@  ifeq ($(strip $(filter-out %x86_64 linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time.ads \
   s-mudido.adb<s-mudido-affinity.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osinte.adb<s-osinte-posix.adb \
@@ -2168,7 +2191,7 @@  ifeq ($(strip $(filter-out %x86_64 linux%,$(target_cpu) $(target_os))),)
     indepsw.adb<indepsw-gnu.adb
 
   EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB=-lpthread -lrt
   MISCLIB = -ldl
@@ -2187,6 +2210,7 @@  ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
   s-inmaop.adb<s-inmaop-posix.adb \
   s-intman.adb<s-intman-posix.adb \
   s-linux.ads<s-linux.ads \
+  s-ostime.ads<s-posix-time-x32.ads \
   s-mudido.adb<s-mudido-affinity.adb \
   s-osinte.ads<s-osinte-linux.ads \
   s-osinte.adb<s-osinte-posix.adb \
@@ -2206,7 +2230,7 @@  ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
     indepsw.adb<indepsw-gnu.adb
 
   EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
-  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o a-exetim.o s-ostime.o
   EH_MECHANISM=-gcc
   THREADSLIB=-lpthread -lrt
   GNATLIB_SHARED=gnatlib-shared-dual
diff --git a/gcc/ada/s-osinte-linux.ads b/gcc/ada/s-osinte-linux.ads
index a99c4e5..49c6832 100644
--- a/gcc/ada/s-osinte-linux.ads
+++ b/gcc/ada/s-osinte-linux.ads
@@ -42,6 +42,7 @@  with Ada.Unchecked_Conversion;
 with Interfaces.C;
 with System.Linux;
 with System.OS_Constants;
+with System.OS_Time;
 
 package System.OS_Interface is
    pragma Preelaborate;
@@ -596,11 +597,11 @@  private
 
    type pid_t is new int;
 
-   type time_t is new long;
+   type time_t is new System.OS_Time.time_t;
 
    type timespec is record
       tv_sec  : time_t;
-      tv_nsec : long;
+      tv_nsec : time_t;
    end record;
    pragma Convention (C, timespec);
 
diff --git a/gcc/ada/s-osinte-posix.adb b/gcc/ada/s-osinte-posix.adb
index 29579b2..402ddcb 100644
--- a/gcc/ada/s-osinte-posix.adb
+++ b/gcc/ada/s-osinte-posix.adb
@@ -104,7 +104,7 @@  package body System.OS_Interface is
       end if;
 
       return timespec'(tv_sec => S,
-                       tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
+                       tv_nsec => time_t (Long_Long_Integer (F * 10#1#E9)));
    end To_Timespec;
 
 end System.OS_Interface;
diff --git a/gcc/ada/s-osprim-posix.adb b/gcc/ada/s-osprim-posix.adb
index e03a132..a3717a7 100644
--- a/gcc/ada/s-osprim-posix.adb
+++ b/gcc/ada/s-osprim-posix.adb
@@ -31,6 +31,8 @@ 
 
 --  This version is for POSIX-like operating systems
 
+with System.OS_Time;
+
 package body System.OS_Primitives is
 
    --  ??? These definitions are duplicated from System.OS_Interface
@@ -38,11 +40,11 @@  package body System.OS_Primitives is
    --  these declarations in System.OS_Interface and move these ones in
    --  the spec.
 
-   type time_t is new Long_Integer;
+   type time_t is new System.OS_Time.time_t;
 
    type timespec is record
       tv_sec  : time_t;
-      tv_nsec : Long_Integer;
+      tv_nsec : time_t;
    end record;
    pragma Convention (C, timespec);
 
@@ -54,7 +56,7 @@  package body System.OS_Primitives is
    -----------
 
    function Clock return Duration is
-      type timeval is array (1 .. 2) of Long_Integer;
+      type timeval is array (1 .. 2) of time_t;
 
       procedure timeval_to_duration
         (T    : not null access timeval;
@@ -118,7 +120,7 @@  package body System.OS_Primitives is
 
       return
         timespec'(tv_sec  => S,
-                  tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
+                  tv_nsec => time_t (Long_Long_Integer (F * 10#1#E9)));
    end To_Timespec;
 
    -----------------
diff --git a/gcc/ada/s-posix-time-x32.ads b/gcc/ada/s-posix-time-x32.ads
new file mode 100644
index 0000000..2f71869
--- /dev/null
+++ b/gcc/ada/s-posix-time-x32.ads
@@ -0,0 +1,44 @@ 
+------------------------------------------------------------------------------
+--                                                                          --
+--                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
+--                                                                          --
+--                          S Y S T E M .  O S _ T i m e                    --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--          Copyright (C) 2013, Free Software Foundation, Inc.              --
+--                                                                          --
+-- GNARL is free software; you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is the default version of this package
+
+--  PLEASE DO NOT add any with-clauses to this package or remove the pragma
+--  Preelaborate. This package is designed to be a bottom-level (leaf) package
+
+package System.OS_Time is
+   pragma Preelaborate;
+
+   ------------
+   -- time_t --
+   ------------
+
+   type time_t is new Long_Long_Integer;
+
+end System.OS_Time;
diff --git a/gcc/ada/s-posix-time.ads b/gcc/ada/s-posix-time.ads
new file mode 100644
index 0000000..3cb8976
--- /dev/null
+++ b/gcc/ada/s-posix-time.ads
@@ -0,0 +1,44 @@ 
+------------------------------------------------------------------------------
+--                                                                          --
+--                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
+--                                                                          --
+--                          S Y S T E M .  O S _ T i m e                    --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--          Copyright (C) 2013, Free Software Foundation, Inc.              --
+--                                                                          --
+-- GNARL is free software; you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is the default version of this package
+
+--  PLEASE DO NOT add any with-clauses to this package or remove the pragma
+--  Preelaborate. This package is designed to be a bottom-level (leaf) package
+
+package System.OS_Time is
+   pragma Preelaborate;
+
+   ------------
+   -- time_t --
+   ------------
+
+   type time_t is new Long_Integer;
+
+end System.OS_Time;
diff --git a/gcc/ada/s-taprop-linux.adb b/gcc/ada/s-taprop-linux.adb
index 6047d31..1c78b37 100644
--- a/gcc/ada/s-taprop-linux.adb
+++ b/gcc/ada/s-taprop-linux.adb
@@ -46,6 +46,7 @@  with System.Interrupt_Management;
 with System.OS_Primitives;
 with System.Stack_Checking.Operations;
 with System.Multiprocessors;
+with System.OS_Time;
 
 with System.Soft_Links;
 --  We use System.Soft_Links instead of System.Tasking.Initialization
@@ -627,7 +628,7 @@  package body System.Task_Primitives.Operations is
    function Monotonic_Clock return Duration is
       use Interfaces;
 
-      type timeval is array (1 .. 2) of C.long;
+      type timeval is array (1 .. 2) of System.OS_Time.time_t;
 
       procedure timeval_to_duration
         (T    : not null access timeval;