Source: gcc-16
Followup-For: Bug #1121759

Upstream seems OK with v21.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114065

John, could you please check if it fixes the issue on hppa?

If you are working
with the gcc sources, the changes are 3/4 and 4/4 in
 https://gcc.gnu.org/bugzilla/attachment.cgi?id=65750.
with the Debian gcc git, the attachment applies on top of 8d4a6d2d.
with Debian source packages, `apt source gcc-16/16.0.2-3` should also
 work, the differences with 8d4a6d2d are unrelated.
>From 46c30aaa6e9fa75b5f77224019e0ce9fd3162ce6 Mon Sep 17 00:00:00 2001
From: Nicolas Boulenguez <[email protected]>
Date: Fri, 2 Oct 2026 22:20:28 +0200
Subject: ada: refresh the PR ada/114065 time_t64 patches. Closes: #1108322


diff --git 
a/debian/patches/0001-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff 
b/debian/patches/0001-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff
deleted file mode 100644
index 4cd30f15..00000000
--- 
a/debian/patches/0001-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff
+++ /dev/null
@@ -1,1681 +0,0 @@
-PR ada/114065, patches v15
-
-In the hope to reduce the rebasing work,
-when a whole file can be kept unchanged in Debian,
- * files specific to other systems can remain broken
- * cal.c can remain, it is disabled in Makefile.rtl
- * declarations of obsolete but unused time types or constants
-the changes affecting it are removed from this patch.
-
---- a/src/gcc/ada/Makefile.rtl
-+++ b/src/gcc/ada/Makefile.rtl
-@@ -754,6 +754,7 @@ GNATRTL_NONTASKING_OBJS= \
-   s-string$(objext) \
-   s-ststop$(objext) \
-   s-tasloc$(objext) \
-+  s-c_time$(objext) \
-   s-traceb$(objext) \
-   s-traent$(objext) \
-   s-trasym$(objext) \
-@@ -1416,7 +1417,6 @@ ifeq ($(strip $(filter-out arm% aarch64
-   a-intnam.ads<libgnarl/a-intnam__linux.ads \
-   s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
-   s-intman.adb<libgnarl/s-intman__android.adb \
--  s-osinte.adb<libgnarl/s-osinte__android.adb \
-   s-osinte.ads<libgnarl/s-osinte__android.ads \
-   s-oslock.ads<libgnat/s-oslock__posix.ads \
-   s-osprim.adb<libgnat/s-osprim__posix.adb \
-@@ -3190,7 +3190,7 @@ LIBGNAT_TARGET_PAIRS += \
- # library.  LIBGNAT_OBJS is the list of object files for libgnat.
- # thread.c is special as put into GNATRTL_TASKING_OBJS
- LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o                   \
--  cal.o cio.o cstreams.o ctrl_c.o                                     \
-+  cio.o cstreams.o ctrl_c.o                                           \
-   env.o errno.o exit.o expect.o final.o rtfinal.o rtinit.o            \
-   init.o initialize.o locales.o mkdir.o                                       
\
-   raise.o seh_init.o socket.o sysdep.o                                        
\
---- a/src/gcc/ada/libgnarl/a-exetim__posix.adb
-+++ b/src/gcc/ada/libgnarl/a-exetim__posix.adb
-@@ -34,6 +34,7 @@
- with Ada.Task_Identification;  use Ada.Task_Identification;
- with Ada.Unchecked_Conversion;
- 
-+with System.C_Time;
- with System.Tasking;
- with System.OS_Interface; use System.OS_Interface;
- with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
-@@ -98,7 +99,7 @@ package body Ada.Execution_Time is
-      (T : Ada.Task_Identification.Task_Id :=
-         Ada.Task_Identification.Current_Task) return CPU_Time
-    is
--      TS       : aliased timespec;
-+      TS       : aliased System.C_Time.timespec;
-       Clock_Id : aliased Interfaces.C.int;
-       Result   : Interfaces.C.int;
- 
-@@ -112,7 +113,7 @@ package body Ada.Execution_Time is
- 
-       function clock_gettime
-         (clock_id : Interfaces.C.int;
--         tp       : access timespec)
-+         tp       : access System.C_Time.timespec)
-          return Interfaces.C.int;
-       pragma Import (C, clock_gettime, "clock_gettime");
-       --  Function from the POSIX.1b Realtime Extensions library
-@@ -139,7 +140,7 @@ package body Ada.Execution_Time is
-         (clock_id => Clock_Id, tp => TS'Unchecked_Access);
-       pragma Assert (Result = 0);
- 
--      return To_CPU_Time (To_Duration (TS));
-+      return To_CPU_Time (System.C_Time.To_Duration (TS));
-    end Clock;
- 
-    --------------------------
---- a/src/gcc/ada/libgnarl/s-osinte__gnu.adb
-+++ b/src/gcc/ada/libgnarl/s-osinte__gnu.adb
-@@ -93,15 +93,6 @@ package body System.OS_Interface is
-       return 0;
-    end pthread_setschedparam;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration (TS : timespec) return Duration is
--   begin
--      return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
--   end To_Duration;
--
-    ------------------------
-    -- To_Target_Priority --
-    ------------------------
-@@ -113,28 +104,4 @@ package body System.OS_Interface is
-       return Interfaces.C.int (Prio);
-    end To_Target_Priority;
- 
--   -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return timespec'(tv_sec => S,
--                       tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
--   end To_Timespec;
--
- end System.OS_Interface;
---- a/src/gcc/ada/libgnarl/s-osinte__gnu.ads
-+++ b/src/gcc/ada/libgnarl/s-osinte__gnu.ads
-@@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion;
- 
- with Interfaces.C;
- 
-+with System.C_Time;
- with System.OS_Locks;
--with System.Parameters;
- 
- package System.OS_Interface is
-    pragma Preelaborate;
-@@ -210,9 +210,7 @@ package System.OS_Interface is
-    Time_Slice_Supported : constant Boolean := True;
-    --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
- 
--   type timespec is private;
--
--   function nanosleep (rqtp, rmtp : access timespec) return int;
-+   function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    type clockid_t is new int;
-@@ -221,21 +219,15 @@ package System.OS_Interface is
-    --  From: /usr/include/time.h
-    function clock_gettime
-      (clock_id : clockid_t;
--      tp       : access timespec)
-+      tp       : access C_Time.timespec)
-       return int;
-    pragma Import (C, clock_gettime, "clock_gettime");
- 
-    function clock_getres
-      (clock_id : clockid_t;
--      res      : access timespec) return int;
-+      res      : access C_Time.timespec) return int;
-    pragma Import (C, clock_getres, "clock_getres");
- 
--   function To_Duration (TS : timespec) return Duration;
--   pragma Inline (To_Duration);
--
--   function To_Timespec (D : Duration) return timespec;
--   pragma Inline (To_Timespec);
--
-    --  From: /usr/include/unistd.h
-    function sysconf (name : int) return long;
-    pragma Import (C, sysconf);
-@@ -487,7 +479,7 @@ package System.OS_Interface is
-    function pthread_cond_timedwait
-      (cond    : access pthread_cond_t;
-       mutex   : access pthread_mutex_t;
--      abstime : access timespec) return int;
-+      abstime : access C_Time.timespec) return int;
-    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
- 
-    Relative_Timed_Wait : constant Boolean := False;
-@@ -656,15 +648,6 @@ private
- 
-    type pid_t is new int;
- 
--   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
--     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--
--   type timespec is record
--      tv_sec  : time_t;
--      tv_nsec : long;
--   end record;
--   pragma Convention (C, timespec);
--
-    --  From: /usr/include/pthread/pthreadtypes.h:
-    --  typedef struct __pthread_attr pthread_attr_t;
-    --  /usr/include/i386-gnu/bits/thread-attr.h: struct __pthread_attr...
---- a/src/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
-+++ b/src/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads
-@@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion;
- 
- with Interfaces.C;
- 
-+with System.C_Time;
- with System.OS_Locks;
--with System.Parameters;
- 
- package System.OS_Interface is
-    pragma Preelaborate;
-@@ -205,9 +205,7 @@ package System.OS_Interface is
-    Time_Slice_Supported : constant Boolean := True;
-    --  Indicates whether time slicing is supported (i.e SCHED_RR is supported)
- 
--   type timespec is private;
--
--   function nanosleep (rqtp, rmtp : access timespec) return int;
-+   function nanosleep (rqtp, rmtp : access C_Time.timespec) return int;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    type clockid_t is new int;
-@@ -215,21 +213,15 @@ package System.OS_Interface is
- 
-    function clock_gettime
-      (clock_id : clockid_t;
--      tp       : access timespec)
-+      tp       : access C_Time.timespec)
-       return int;
-    pragma Import (C, clock_gettime, "clock_gettime");
- 
-    function clock_getres
-      (clock_id : clockid_t;
--      res      : access timespec) return int;
-+      res      : access C_Time.timespec) return int;
-    pragma Import (C, clock_getres, "clock_getres");
- 
--   function To_Duration (TS : timespec) return Duration;
--   pragma Inline (To_Duration);
--
--   function To_Timespec (D : Duration) return timespec;
--   pragma Inline (To_Timespec);
--
-    function sysconf (name : int) return long;
-    pragma Import (C, sysconf);
- 
-@@ -430,7 +422,7 @@ package System.OS_Interface is
-    function pthread_cond_timedwait
-      (cond    : access pthread_cond_t;
-       mutex   : access pthread_mutex_t;
--      abstime : access timespec) return int;
-+      abstime : access C_Time.timespec) return int;
-    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
- 
-    --------------------------
-@@ -602,15 +594,6 @@ private
- 
-    type pid_t is new int;
- 
--   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
--     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--
--   type timespec is record
--      tv_sec  : time_t;
--      tv_nsec : long;
--   end record;
--   pragma Convention (C, timespec);
--
-    type pthread_attr_t is record
-       detachstate   : int;
-       schedpolicy   : int;
---- a/src/gcc/ada/libgnarl/s-osinte__linux.ads
-+++ b/src/gcc/ada/libgnarl/s-osinte__linux.ads
-@@ -42,6 +42,7 @@ with Ada.Unchecked_Conversion;
- 
- with Interfaces.C;
- 
-+with System.C_Time;
- with System.Linux;
- with System.OS_Constants;
- with System.OS_Locks;
-@@ -54,8 +55,6 @@ package System.OS_Interface is
- 
-    pragma Linker_Options ("-lpthread");
- 
--   use type System.Linux.time_t;
--
-    subtype int            is Interfaces.C.int;
-    subtype char           is Interfaces.C.char;
-    subtype short          is Interfaces.C.short;
-@@ -229,26 +228,17 @@ package System.OS_Interface is
-    -- Time --
-    ----------
- 
--   subtype time_t    is System.Linux.time_t;
--   subtype timespec  is System.Linux.timespec;
--   subtype timeval   is System.Linux.timeval;
-    subtype clockid_t is System.Linux.clockid_t;
- 
-    function clock_gettime
--     (clock_id : clockid_t; tp : access timespec) return int;
-+     (clock_id : clockid_t; tp : access C_Time.timespec) return int;
-    pragma Import (C, clock_gettime, "clock_gettime");
- 
-    function clock_getres
-      (clock_id : clockid_t;
--      res      : access timespec) return int;
-+      res      : access C_Time.timespec) return int;
-    pragma Import (C, clock_getres, "clock_getres");
- 
--   function To_Duration (TS : timespec) return Duration;
--   pragma Inline (To_Duration);
--
--   function To_Timespec (D : Duration) return timespec;
--   pragma Inline (To_Timespec);
--
-    function sysconf (name : int) return long;
-    pragma Import (C, sysconf);
- 
-@@ -457,7 +447,7 @@ package System.OS_Interface is
-    function pthread_cond_timedwait
-      (cond    : access pthread_cond_t;
-       mutex   : access pthread_mutex_t;
--      abstime : access timespec) return int;
-+      abstime : access C_Time.timespec) return int;
-    pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
- 
-    --------------------------
---- a/src/gcc/ada/libgnarl/s-osinte__posix.adb
-+++ b/src/gcc/ada/libgnarl/s-osinte__posix.adb
-@@ -58,15 +58,6 @@ package body System.OS_Interface is
-       null;
-    end pthread_init;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration (TS : timespec) return Duration is
--   begin
--      return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
--   end To_Duration;
--
-    ------------------------
-    -- To_Target_Priority --
-    ------------------------
-@@ -78,28 +69,4 @@ package body System.OS_Interface is
-       return Interfaces.C.int (Prio);
-    end To_Target_Priority;
- 
--   -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return timespec'(tv_sec => S,
--                       tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
--   end To_Timespec;
--
- end System.OS_Interface;
---- a/src/gcc/ada/libgnarl/s-osinte__x32.adb
-+++ b/src/gcc/ada/libgnarl/s-osinte__x32.adb
-@@ -59,15 +59,6 @@ package body System.OS_Interface is
-       null;
-    end pthread_init;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration (TS : timespec) return Duration is
--   begin
--      return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
--   end To_Duration;
--
-    ------------------------
-    -- To_Target_Priority --
-    ------------------------
-@@ -79,28 +70,4 @@ package body System.OS_Interface is
-       return Interfaces.C.int (Prio);
-    end To_Target_Priority;
- 
--   -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return timespec'(tv_sec => S,
--                       tv_nsec => Long_Long_Integer (F * 10#1#E9));
--   end To_Timespec;
--
- end System.OS_Interface;
---- a/src/gcc/ada/libgnarl/s-tpopmo.adb
-+++ b/src/gcc/ada/libgnarl/s-tpopmo.adb
-@@ -31,6 +31,8 @@
- 
- --  This is the Monotonic version of this package for Posix and Linux targets.
- 
-+with System.C_Time;
-+
- separate (System.Task_Primitives.Operations)
- package body Monotonic is
- 
-@@ -54,14 +56,14 @@ package body Monotonic is
-    ---------------------
- 
-    function Monotonic_Clock return Duration is
--      TS     : aliased timespec;
-+      TS     : aliased C_Time.timespec;
-       Result : Interfaces.C.int;
-    begin
-       Result := clock_gettime
-         (clock_id => OSC.CLOCK_RT_Ada, tp => TS'Unchecked_Access);
-       pragma Assert (Result = 0);
- 
--      return To_Duration (TS);
-+      return C_Time.To_Duration (TS);
-    end Monotonic_Clock;
- 
-    -------------------
-@@ -69,14 +71,14 @@ package body Monotonic is
-    -------------------
- 
-    function RT_Resolution return Duration is
--      TS     : aliased timespec;
-+      TS     : aliased C_Time.timespec;
-       Result : Interfaces.C.int;
- 
-    begin
-       Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access);
-       pragma Assert (Result = 0);
- 
--      return To_Duration (TS);
-+      return C_Time.To_Duration (TS);
-    end RT_Resolution;
- 
-    ----------------------
-@@ -150,7 +152,7 @@ package body Monotonic is
-       Abs_Time   : Duration;
-       P_Abs_Time : Duration;
- 
--      Request    : aliased timespec;
-+      Request    : aliased C_Time.timespec;
-       Result     : Interfaces.C.int;
-       Exit_Outer : Boolean := False;
- 
-@@ -184,7 +186,7 @@ package body Monotonic is
-             end if;
-             pragma Warnings (On);
- 
--            Request := To_Timespec (P_Abs_Time);
-+            Request := C_Time.To_Timespec (P_Abs_Time);
- 
-             Inner : loop
-                exit Outer
-@@ -236,7 +238,7 @@ package body Monotonic is
-       Check_Time : Duration;
-       Abs_Time   : Duration;
-       P_Abs_Time : Duration;
--      Request    : aliased timespec;
-+      Request    : aliased C_Time.timespec;
- 
-       Result     : Interfaces.C.int;
-       Exit_Outer : Boolean := False;
-@@ -271,7 +273,7 @@ package body Monotonic is
-             end if;
-             pragma Warnings (On);
- 
--            Request := To_Timespec (P_Abs_Time);
-+            Request := C_Time.To_Timespec (P_Abs_Time);
- 
-             Inner : loop
-                exit Outer
---- a/src/gcc/ada/libgnat/g-calend.adb
-+++ b/src/gcc/ada/libgnat/g-calend.adb
-@@ -29,11 +29,8 @@
- --                                                                          --
- ------------------------------------------------------------------------------
- 
--with Interfaces.C.Extensions;
--
- package body GNAT.Calendar is
-    use Ada.Calendar;
--   use Interfaces;
- 
-    -----------------
-    -- Day_In_Year --
-@@ -328,61 +325,6 @@ package body GNAT.Calendar is
-            Time_Zone    => 0);
-    end Time_Of_At_Locale;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration (T : not null access timeval) return Duration is
--
--      procedure timeval_to_duration
--        (T    : not null access timeval;
--         sec  : not null access C.Extensions.long_long;
--         usec : not null access C.long);
--      pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
--
--      Micro : constant := 10**6;
--      sec   : aliased C.Extensions.long_long;
--      usec  : aliased C.long;
--
--   begin
--      timeval_to_duration (T, sec'Access, usec'Access);
--      pragma Annotate (CodePeer, Modified, sec);
--      pragma Annotate (CodePeer, Modified, usec);
--
--      return Duration (sec) + Duration (usec) / Micro;
--   end To_Duration;
--
--   ----------------
--   -- To_Timeval --
--   ----------------
--
--   function To_Timeval (D : Duration) return timeval is
--
--      procedure duration_to_timeval
--        (Sec  : C.Extensions.long_long;
--         Usec : C.long;
--         T : not null access timeval);
--      pragma Import (C, duration_to_timeval, "__gnat_duration_to_timeval");
--
--      Micro  : constant := 10**6;
--      Result : aliased timeval;
--      sec    : C.Extensions.long_long;
--      usec   : C.long;
--
--   begin
--      if D = 0.0 then
--         sec  := 0;
--         usec := 0;
--      else
--         sec  := C.Extensions.long_long (D - 0.5);
--         usec := C.long ((D - Duration (sec)) * Micro - 0.5);
--      end if;
--
--      duration_to_timeval (sec, usec, Result'Access);
--
--      return Result;
--   end To_Timeval;
--
-    ------------------
-    -- Week_In_Year --
-    ------------------
---- a/src/gcc/ada/libgnat/g-calend.ads
-+++ b/src/gcc/ada/libgnat/g-calend.ads
-@@ -40,7 +40,7 @@
- --  Day_Of_Week, Day_In_Year and Week_In_Year.
- 
- with Ada.Calendar.Formatting;
--with Interfaces.C;
-+with System.C_Time;
- 
- package GNAT.Calendar is
- 
-@@ -145,24 +145,19 @@ package GNAT.Calendar is
-    --  Return the week number as defined in ISO 8601 along with the year in
-    --  which the week occurs.
- 
--   --  C timeval conversion
-+   subtype timeval is System.C_Time.timeval;
-+   --  Deprecated.  Please use C_Time directly.
- 
--   --  C timeval represent a duration (used in Select for example). This
--   --  structure is composed of a number of seconds and a number of micro
--   --  seconds. The timeval structure is not exposed here because its
--   --  definition is target dependent. Interface to C programs is done via a
--   --  pointer to timeval structure.
--
--   type timeval is private;
--
--   function To_Duration (T : not null access timeval) return Duration;
--   function To_Timeval  (D : Duration) return timeval;
-+   function To_Duration (T : not null access timeval)
-+                        return System.C_Time.Non_Negative_Duration
-+   is (System.C_Time.To_Duration (T.all));
-+   --  Deprecated.  Please use C_Time directly.
-+
-+   function To_Timeval (D : System.C_Time.Non_Negative_Duration) return 
timeval
-+   renames System.C_Time.To_Timeval;
-+   --  Deprecated.  Please use C_Time directly.
- 
- private
--   --  This is a dummy declaration that should be the largest possible timeval
--   --  structure of all supported targets.
--
--   type timeval is array (1 .. 3) of Interfaces.C.long;
- 
-    function Julian_Day
-      (Year  : Ada.Calendar.Year_Number;
---- a/src/gcc/ada/libgnat/g-socket.adb
-+++ b/src/gcc/ada/libgnat/g-socket.adb
-@@ -45,6 +45,7 @@ pragma Warnings (Off, GNAT.Sockets.Linke
- with GNAT.Sockets.Poll;
- 
- with System;               use System;
-+with System.C_Time;
- with System.Communication; use System.Communication;
- with System.CRTL;          use System.CRTL;
- with System.Task_Lock;
-@@ -179,13 +180,6 @@ package body GNAT.Sockets is
-    function Value (S : System.Address) return String;
-    --  Same as Interfaces.C.Strings.Value but taking a System.Address
- 
--   function To_Timeval (Val : Timeval_Duration) return Timeval;
--   --  Separate Val in seconds and microseconds
--
--   function To_Duration (Val : Timeval) return Timeval_Duration;
--   --  Reconstruct a Duration value from a Timeval record (seconds and
--   --  microseconds).
--
-    function Dedot (Value : String) return String
-    is (if Value /= "" and then Value (Value'Last) = '.'
-        then Value (Value'First .. Value'Last - 1)
-@@ -528,7 +522,7 @@ package body GNAT.Sockets is
-       Res  : C.int;
-       Last : C.int;
-       RSig : Socket_Type := No_Socket;
--      TVal : aliased Timeval;
-+      TVal : aliased System.C_Time.timeval;
-       TPtr : Timeval_Access;
- 
-    begin
-@@ -543,7 +537,7 @@ package body GNAT.Sockets is
-       if Timeout = Forever then
-          TPtr := null;
-       else
--         TVal := To_Timeval (Timeout);
-+         TVal := System.C_Time.To_Timeval (Timeout);
-          TPtr := TVal'Unchecked_Access;
-       end if;
- 
-@@ -1423,7 +1417,7 @@ package body GNAT.Sockets is
-       U4  : aliased C.unsigned;
-       V1  : aliased C.unsigned_char;
-       VS  : aliased C.char_array (1 .. NS); -- for devices name
--      VT  : aliased Timeval;
-+      VT  : aliased System.C_Time.timeval;
-       Len : aliased C.int;
-       Add : System.Address;
-       Res : C.int;
-@@ -1596,8 +1590,10 @@ package body GNAT.Sockets is
-                   Opt.Timeout := Duration (U4) / 1000;
-                end if;
- 
-+            elsif System.C_Time.In_Duration (VT) then
-+               Opt.Timeout := System.C_Time.To_Duration (VT);
-             else
--               Opt.Timeout := To_Duration (VT);
-+               Opt.Timeout := Forever;
-             end if;
- 
-          when Bind_To_Device =>
-@@ -2633,7 +2629,7 @@ package body GNAT.Sockets is
-               (1 .. (if Option.Name = Bind_To_Device
-                      then C.size_t (ASU.Length (Option.Device) + 1)
-                      else 0));
--      VT  : aliased Timeval;
-+      VT  : aliased System.C_Time.timeval;
-       Len : C.int;
-       Add : System.Address := Null_Address;
-       Res : C.int;
-@@ -2767,7 +2763,7 @@ package body GNAT.Sockets is
-                end if;
- 
-             else
--               VT  := To_Timeval (Option.Timeout);
-+               VT  := System.C_Time.To_Timeval (Option.Timeout);
-                Len := VT'Size / 8;
-                Add := VT'Address;
-             end if;
-@@ -2865,33 +2861,6 @@ package body GNAT.Sockets is
-       return Integer (Socket);
-    end To_C;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration (Val : Timeval) return Timeval_Duration is
--      Max_D : constant Long_Long_Integer := Long_Long_Integer (Forever - 0.5);
--      Tv_sec_64 : constant Boolean := SOSC.SIZEOF_tv_sec = 8;
--      --  Need to separate this condition into the constant declaration to
--      --  avoid GNAT warning about "always true" or "always false".
--   begin
--      if Tv_sec_64 then
--         --  Check for possible Duration overflow when Tv_Sec field is 64 bit
--         --  integer.
--
--         if Val.Tv_Sec > time_t (Max_D)
--             or else
--           (Val.Tv_Sec = time_t (Max_D)
--              and then
--            Val.Tv_Usec > suseconds_t ((Forever - Duration (Max_D)) * 1E6))
--         then
--            return Forever;
--         end if;
--      end if;
--
--      return Duration (Val.Tv_Sec) + Duration (Val.Tv_Usec) * 1.0E-6;
--   end To_Duration;
--
-    -------------------
-    -- To_Host_Entry --
-    -------------------
-@@ -3041,36 +3010,6 @@ package body GNAT.Sockets is
-       return HN.Name (1 .. HN.Length);
-    end To_String;
- 
--   ----------------
--   -- To_Timeval --
--   ----------------
--
--   function To_Timeval (Val : Timeval_Duration) return Timeval is
--      S  : time_t;
--      uS : suseconds_t;
--
--   begin
--      --  If zero, set result as zero (otherwise it gets rounded down to -1)
--
--      if Val = 0.0 then
--         S  := 0;
--         uS := 0;
--
--      --  Normal case where we do round down
--
--      else
--         S  := time_t (Val - 0.5);
--         uS := suseconds_t (1_000_000 * (Val - Selector_Duration (S)) - 0.5);
--
--         if uS = -1 then
--            --  It happen on integer duration
--            uS := 0;
--         end if;
--      end if;
--
--      return (S, uS);
--   end To_Timeval;
--
-    -----------
-    -- Value --
-    -----------
---- a/src/gcc/ada/libgnat/g-socthi.adb
-+++ b/src/gcc/ada/libgnat/g-socthi.adb
-@@ -40,6 +40,8 @@ with GNAT.Task_Lock;
- 
- with Interfaces.C; use Interfaces.C;
- 
-+with System.C_Time;
-+
- package body GNAT.Sockets.Thin is
- 
-    Non_Blocking_Sockets : aliased Fd_Set;
-@@ -215,7 +217,7 @@ package body GNAT.Sockets.Thin is
-       declare -- unreachable if Thread_Blocking_IO is statically True
-          pragma Warnings (On, "unreachable code");
-          WSet : aliased Fd_Set;
--         Now  : aliased Timeval;
-+         Now  : aliased System.C_Time.timeval;
- 
-       begin
-          Reset_Socket_Set (WSet'Access);
---- a/src/gcc/ada/libgnat/g-sothco.ads
-+++ b/src/gcc/ada/libgnat/g-sothco.ads
-@@ -34,7 +34,7 @@
- 
- with Ada.Unchecked_Conversion;
- with Interfaces.C.Strings;
--with System.Parameters;
-+with System.C_Time;
- 
- package GNAT.Sockets.Thin_Common is
- 
-@@ -44,31 +44,13 @@ package GNAT.Sockets.Thin_Common is
-    Success : constant C.int :=  0;
-    Failure : constant C.int := -1;
- 
--   type time_t is
--     range -2 ** (System.Parameters.time_t_bits - 1)
--        .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--   for time_t'Size use System.Parameters.time_t_bits;
--   pragma Convention (C, time_t);
--
--   type suseconds_t is
--     range -2 ** (8 * SOSC.SIZEOF_tv_usec - 1)
--         .. 2 ** (8 * SOSC.SIZEOF_tv_usec - 1) - 1;
--   for suseconds_t'Size use 8 * SOSC.SIZEOF_tv_usec;
--   pragma Convention (C, suseconds_t);
--
--   type Timeval is record
--      Tv_Sec  : time_t;
--      Tv_Usec : suseconds_t;
--   end record;
--   pragma Convention (C, Timeval);
--
--   type Timeval_Access is access all Timeval;
-+   type Timeval_Access is access all System.C_Time.timeval;
-    pragma Convention (C, Timeval_Access);
- 
-    type socklen_t is mod 2 ** (8 * SOSC.SIZEOF_socklen_t);
-    for socklen_t'Size use (8 * SOSC.SIZEOF_socklen_t);
- 
--   Immediat : constant Timeval := (0, 0);
-+   Immediat : System.C_Time.timeval renames System.C_Time.Timeval_Zero;
- 
-    -------------------------------------------
-    -- Mapping tables to low level constants --
---- a/src/gcc/ada/libgnat/g-spogwa.adb
-+++ b/src/gcc/ada/libgnat/g-spogwa.adb
-@@ -29,7 +29,7 @@
- --                                                                          --
- ------------------------------------------------------------------------------
- 
--with GNAT.Sockets.Thin_Common;
-+with System.C_Time;
- 
- procedure GNAT.Sockets.Poll.G_Wait
-   (Fds : in out Set; Timeout : Interfaces.C.int; Result : out Integer)
-@@ -41,11 +41,11 @@ is
-       readfds   : access FD_Set_Type;
-       writefds  : access FD_Set_Type;
-       exceptfds : access FD_Set_Type;
--      timeout   : access Thin_Common.Timeval) return Integer
-+      timeout   : access System.C_Time.timeval) return Integer
-      with Import => True, Convention => Stdcall, External_Name => "select";
- 
--   Timeout_V : aliased Thin_Common.Timeval;
--   Timeout_A : access Thin_Common.Timeval;
-+   Timeout_V : aliased System.C_Time.timeval;
-+   Timeout_A : access System.C_Time.timeval;
- 
-    Rfds      : aliased FD_Set_Type;
-    Rcount    : Natural := 0;
-@@ -63,8 +63,7 @@ begin
- 
-    if Timeout >= 0 then
-       Timeout_A := Timeout_V'Access;
--      Timeout_V.Tv_Sec  := Thin_Common.time_t  (Timeout / 1000);
--      Timeout_V.Tv_Usec := Thin_Common.suseconds_t (Timeout rem 1000 * 1000);
-+      Timeout_V := System.C_Time.Milliseconds_To_Timeval (Timeout);
-    end if;
- 
-    Reset_Socket_Set (Rfds);
---- /dev/null
-+++ b/src/gcc/ada/libgnat/s-c_time.adb
-@@ -0,0 +1,248 @@
-+------------------------------------------------------------------------------
-+--                                                                          --
-+--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
-+--                                                                          --
-+--                  S Y S T E M . C _ T I M E                               --
-+--                                                                          --
-+--                                  B o d y                                 --
-+--                                                                          --
-+--          Copyright (C) 1998-2025, 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/>.                                          --
-+--                                                                          --
-+-- GNARL was developed by the GNARL team at Florida State University.       --
-+-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
-+--                                                                          --
-+------------------------------------------------------------------------------
-+
-+package body System.C_Time is
-+
-+   --  Two Duration representations are described in targparm.ads.
-+   --  Size       Delta       Last = (2**(Size - 1) - 1) * Delta
-+   --   32    0.02                   42_949_672.94
-+   --   64    0.000_000_001       9_223_372_036.854_775_807
-+
-+   --  The overflows listed in comments must raise Constraint_Error.
-+   pragma Unsuppress (Overflow_Check);
-+
-+   -----------------
-+   -- In_Duration --
-+   -----------------
-+
-+   function In_Duration (T : timeval) return Boolean is
-+
-+      --  Mimic To_Timeval (Duration'Last), except that
-+      --   * this computation happens at compile time
-+      --   * Sec may be far above MAX_tv_sec
-+      --   * on 64 bits, Usec is truncated instead of rounded up
-+      Sec  : constant := (if Duration'Size = 64
-+                          then (2**63 - 1)  /  1_000_000_000
-+                          else (2**31 - 1)  /             50);
-+      Usec : constant := (if Duration'Size = 64
-+                          then (2**63 - 1) mod 1_000_000_000 / 1_000
-+                          else (2**31 - 1) mod            50 * 20_000);
-+
-+      pragma Warnings (Off, "condition is always");
-+      Dur_Covers_Tv_Sec : constant Boolean := OS_Constants.MAX_tv_sec < Sec;
-+      pragma Warnings (On, "condition is always");
-+
-+      --  When Duration'Size = 64 and time_t'Size = 32, the compiler
-+      --  complains that Sec does not fit in time_t, hence cannot be
-+      --  compared with T.tv_sec.  But then Dur_Covers_Tv_Sec is True
-+      --  and the following comparisons are skipped.
-+      Maybe_Sec : constant := (if Dur_Covers_Tv_Sec then 1 else Sec);
-+   begin
-+      return Dur_Covers_Tv_Sec
-+        or else  T.tv_sec < Maybe_Sec
-+        or else (T.tv_sec = Maybe_Sec and then T.tv_usec <= Usec);
-+   end In_Duration;
-+
-+   -----------------------------
-+   -- Milliseconds_To_Timeval --
-+   -----------------------------
-+
-+   function Milliseconds_To_Timeval (M : Non_Negative_Int) return timeval is
-+      use Interfaces.C;
-+      Q : constant int range 0 .. int'Last / 1_000 := M  /  1_000;
-+      R : constant int range 0 .. 999              := M mod 1_000;
-+   begin
-+      return (tv_sec  => time_t (Q),
-+              tv_usec => 1_000 * usec_t (R));
-+   end Milliseconds_To_Timeval;
-+
-+   -----------------------------
-+   -- Nanoseconds_To_Timespec --
-+   -----------------------------
-+
-+   function Nanoseconds_To_Timespec (N : Non_Negative_Int) return timespec is
-+      use Interfaces.C;
-+      Q : constant int range 0 .. int'Last / 10**9 := N  /  10**9;
-+      R : constant int range 0 .. 999_999_999      := N mod 10**9;
-+   begin
-+      return (tv_sec  => time_t (Q),
-+              tv_nsec => nsec_t (R));
-+   end Nanoseconds_To_Timespec;
-+
-+   -----------------
-+   -- To_Duration --
-+   -----------------
-+
-+   function To_Duration (T : timeval) return Non_Negative_Duration is
-+      Usec : usec_t range 0 .. 1_009_999;
-+      Frac : Duration range 0.0 .. 1.0;
-+   begin
-+      if Duration'Size = 64 then
-+         Usec := T.tv_usec;
-+      else
-+         --  Fix the rounding (999_999.0 / 1_000_000 = 0.98)
-+         --  with a bias of half Duration'Small = 10 ms.
-+         Usec := T.tv_usec + 10_000;
-+      end if;
-+      Frac := Duration (Usec) / 1_000_000;
-+
-+      return Duration (T.tv_sec) + Frac;
-+      --  Both the conversion and the addition may overflow.
-+   end To_Duration;
-+
-+   function To_Duration (T : timespec) return Non_Negative_Duration is
-+      Frac : Duration range 0.0 .. 1.0;
-+   begin
-+      if Duration'Size = 64 then
-+         Frac := Duration (T.tv_nsec) / 1_000_000_000;
-+      else
-+         --  Avoid an overflow (Duration'Last < 999_999_999).
-+         --  Fix the rounding (999_999_999.0 / 1_000_000_000 = 0.98)
-+         --  with a bias of half Duration'Small = 10 ms.
-+         Frac := Duration (T.tv_nsec / 10_000_000 + 1) / 100;
-+      end if;
-+
-+      return Duration (T.tv_sec) + Frac;
-+      --  Both the conversion and the addition may overflow.
-+   end To_Duration;
-+
-+   function To_Duration (tv_sec  : Tv_Sec_Long;
-+                         tv_nsec : Tv_Nsec_Long)
-+                        return Non_Negative_Duration is
-+   begin
-+      return To_Duration (timespec'(tv_sec  => time_t (tv_sec),
-+                                    tv_nsec => nsec_t (tv_nsec)));
-+   end To_Duration;
-+
-+   function To_Duration (tv_sec  : Tv_Sec_Long_Long;
-+                         tv_nsec : Tv_Nsec_Long)
-+                        return Non_Negative_Duration is
-+   begin
-+      return To_Duration (timespec'(tv_sec  => time_t (tv_sec),
-+                                    tv_nsec => nsec_t (tv_nsec)));
-+   end To_Duration;
-+
-+   ------------------------
-+   -- To_Struct_Timespec --
-+   ------------------------
-+
-+   procedure To_Struct_Timespec (D       : Non_Negative_Duration;
-+                                 tv_sec  : out Tv_Sec_Long;
-+                                 tv_nsec : out Tv_Nsec_Long) is
-+      T : constant timespec := To_Timespec (D);
-+   begin
-+      tv_sec  := Tv_Sec_Long (T.tv_sec);  --  May overflow Interfaces.C.long.
-+      tv_nsec := Tv_Nsec_Long (T.tv_nsec);
-+   end To_Struct_Timespec;
-+
-+   procedure To_Struct_Timespec (D       : Non_Negative_Duration;
-+                                 tv_sec  : out Tv_Sec_Long_Long;
-+                                 tv_nsec : out Tv_Nsec_Long) is
-+      T : constant timespec := To_Timespec (D);
-+   begin
-+      tv_sec  := Tv_Sec_Long_Long (T.tv_sec);
-+      tv_nsec := Tv_Nsec_Long (T.tv_nsec);
-+   end To_Struct_Timespec;
-+
-+   -----------------
-+   -- To_Timespec --
-+   -----------------
-+
-+   function To_Timespec (T : timeval) return timespec is
-+   begin
-+      return (tv_sec  => T.tv_sec,
-+              tv_nsec => 1_000 * nsec_t (T.tv_usec));
-+   end To_Timespec;
-+
-+   function To_Timespec (D : Non_Negative_Duration) return timespec is
-+      --  See To_Timeval.
-+      Dm1  : constant Duration range -1.0 .. Duration'Last - 1.0 := D - 1.0;
-+      Sec  : constant time_t range -1 .. time_t'Last := time_t (Dm1);
-+      Frac : constant Duration range -0.5 .. 0.5 := Dm1 - Duration (Sec);
-+      Nsec : nsec_t range -500_000_000 .. 500_000_000;
-+   begin
-+      if Duration'Size = 64 then
-+         Nsec := nsec_t (1_000_000_000 * Frac);
-+      else
-+         --  Duration'Last < 500_000_000 so there is an overflow issue,
-+         --  easy to solve because Frac has few significative digits.
-+         Nsec := 20_000_000 * nsec_t (50 * Frac);
-+      end if;
-+      if Nsec < 0 then
-+         return (tv_sec => Sec,     tv_nsec => Nsec + 1_000_000_000);
-+      else
-+         return (tv_sec => Sec + 1, tv_nsec => Nsec);
-+      end if;
-+   end To_Timespec;
-+
-+   -----------------
-+   -- To_Timeval --
-+   -----------------
-+
-+   function To_Timeval (D : Non_Negative_Duration) return timeval is
-+
-+      --   Most comments also apply to the timespec variant.
-+
-+      --    Sec := time_t (D);
-+      --    Usec := usec_t (1_000_000 * (D - Duration (Sec)));
-+      --  fails when D is
-+      --    Duration'Last (Sec is rounded up and Duration (Sec) overflows)
-+      --    0.9           (Sec is rounded up and Usec < 0)
-+
-+      --    Sec := time_t (D - 0.5);
-+      --    Usec := usec_t (1_000_000 * (D - Duration (Sec)));
-+      --  leads to Usec = 1_000_000 when D is
-+      --    0.0           (Sec is rounded down)
-+      --    0.999_999_999 (Usec is rounded up) (not an issue with timespec)
-+
-+      Dm1  : constant Duration range -1.0 .. Duration'Last - 1.0 := D - 1.0;
-+      --  Converting D - 1 avoids overflows and simplifies roundings.
-+
-+      Sec  : constant time_t range -1 .. time_t'Last := time_t (Dm1);
-+      --  The conversion of Dm1 may overflow if time_t has 32 bits.
-+
-+      Frac : constant Duration range -0.5 .. 0.5 := Dm1 - Duration (Sec);
-+      --  The conversion back is always possible, Sec <= Duration'Last - 0.5.
-+
-+      Usec : constant usec_t range -500_000 .. 500_000
-+        := usec_t (1_000_000 * Frac);
-+   begin
-+      --  Add the second substracted at the beginning, in a way fixing
-+      --  the Usec interval if necessary.
-+      --  In both cases, tv_sec may exceed MAX_tv_sec.
-+      if Usec < 0 then
-+         return (tv_sec => Sec,     tv_usec => Usec + 1_000_000);
-+      else
-+         return (tv_sec => Sec + 1, tv_usec => Usec);
-+      end if;
-+   end To_Timeval;
-+
-+end System.C_Time;
---- /dev/null
-+++ b/src/gcc/ada/libgnat/s-c_time.ads
-@@ -0,0 +1,135 @@
-+------------------------------------------------------------------------------
-+--                                                                          --
-+--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
-+--                                                                          --
-+--                  S Y S T E M . C _ T I M E                               --
-+--                                                                          --
-+--                                  S p e c                                 --
-+--                                                                          --
-+--          Copyright (C) 1998-2025, 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/>.                                          --
-+--                                                                          --
-+-- GNARL was developed by the GNARL team at Florida State University.       --
-+-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
-+--                                                                          --
-+------------------------------------------------------------------------------
-+
-+--  This package provides the timeval, timespec C types and conversions.
-+--  It hides all details about time_t, suseconds_t.
-+
-+with Interfaces.C;
-+private with System.OS_Constants;
-+
-+package System.C_Time
-+  with Pure
-+is
-+
-+   --  These C structs represent non negative durations with different
-+   --  accuracies and maximal values.
-+   type timespec is private;  --  accurate to 1  nanosecond
-+   type timeval  is private;  --  accurate to 1 microsecond
-+
-+   --  Duration is accurate to either 1 nanosecond or 20 milliseconds.
-+   subtype Non_Negative_Duration is Duration range 0.0 .. Duration'Last;
-+
-+   --  All conversions round if the target type is less accurate than
-+   --  the source type, away from zero if the source value is midway
-+   --  between two values of the target type.
-+   --  They raise Constraint_Error when the value, after rounding,
-+   --  exceeds the last value of the target type.
-+
-+   function To_Duration (T : timespec) return Non_Negative_Duration;
-+   function To_Duration (T : timeval)  return Non_Negative_Duration;
-+
-+   function To_Timespec (D : Non_Negative_Duration) return timespec;
-+   function To_Timeval  (D : Non_Negative_Duration) return timeval;
-+
-+   Timeval_Zero : constant timeval;
-+   --  g-sothco.ads
-+
-+   function In_Duration (T : timeval) return Boolean with Inline;
-+   --  True if computing To_Duration (T) is safe,
-+   --  False if Constraint Error would be raised.
-+   --  g-socket.adb:
-+
-+   subtype Non_Negative_Int is
-+     Interfaces.C.int range 0 .. Interfaces.C.int'Last;
-+
-+   function Milliseconds_To_Timeval (M : Non_Negative_Int) return timeval
-+     with Inline;
-+   --  g-spogwa.adb
-+
-+   function Nanoseconds_To_Timespec (N : Non_Negative_Int) return timespec
-+     with Inline;
-+   function To_Timespec (T : timeval) return timespec with Inline;
-+   --  s-osinte__darwin.adb
-+
-+   --  These functions are provided for backward compatibility,
-+   --  but lead to non portable interfaces with C.
-+   --  Tv_sec and tv_nsec do not match the long int type on x32,
-+   --  or on 32 bits ARM with a 2038-compatible GNU libc.
-+   subtype Tv_Sec_Long_Long is Interfaces.C.long_long
-+     range 0 .. Interfaces.C.long_long'Last;
-+   subtype Tv_Sec_Long  is Interfaces.C.long range 0 .. 
Interfaces.C.long'Last;
-+   subtype Tv_Nsec_Long is Interfaces.C.long range 0 .. 999_999_999;
-+   function To_Duration (tv_sec  : Tv_Sec_Long;
-+                         tv_nsec : Tv_Nsec_Long) return Non_Negative_Duration
-+     with Inline;
-+   function To_Duration (tv_sec  : Tv_Sec_Long_Long;
-+                         tv_nsec : Tv_Nsec_Long) return Non_Negative_Duration
-+     with Inline;
-+   procedure To_Struct_Timespec (D       : Non_Negative_Duration;
-+                                 tv_sec  : out Tv_Sec_Long;
-+                                 tv_nsec : out Tv_Nsec_Long) with Inline;
-+   procedure To_Struct_Timespec (D       : Non_Negative_Duration;
-+                                 tv_sec  : out Tv_Sec_Long_Long;
-+                                 tv_nsec : out Tv_Nsec_Long) with Inline;
-+   --  a-calcon.ads
-+
-+private
-+
-+   type time_t is range -2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) ..
-+                         2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) - 1
-+     with Convention => C, Size => OS_Constants.SIZEOF_tv_sec * 8;
-+
-+   type usec_t is range -2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) ..
-+                         2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) - 1
-+     with Convention => C, Size => OS_Constants.SIZEOF_tv_usec * 8;
-+   --  Larger than the suseconds_t C type on ARM 32 bits with GNU libc
-+   --  when __TIME_BITS=64.
-+
-+   type nsec_t is range -2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) ..
-+                         2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) - 1
-+     with Convention => C, Size => OS_Constants.SIZEOF_tv_nsec * 8;
-+   --  Larger than the signed long int C type on x32.
-+
-+   type timeval is record
-+      tv_sec  : time_t range 0 .. OS_Constants.MAX_tv_sec;  --  seconds
-+      tv_usec : usec_t range 0 .. 999_999;                  --  microseconds
-+   end record
-+     with Convention => C;
-+
-+   type timespec is record
-+      tv_sec  : time_t range 0 .. OS_Constants.MAX_tv_sec;  --  seconds
-+      tv_nsec : nsec_t range 0 .. 999_999_999;              --  nanoseconds
-+   end record
-+     with Convention => C;
-+
-+   Timeval_Zero : constant timeval := (tv_sec => 0, tv_usec => 0);
-+
-+end System.C_Time;
---- a/src/gcc/ada/libgnat/s-optide.adb
-+++ b/src/gcc/ada/libgnat/s-optide.adb
-@@ -36,8 +36,8 @@ procedure Timed_Delay
-   (Time : Duration;
-    Mode : Integer)
- is
--   Request    : aliased timespec;
--   Remaind    : aliased timespec;
-+   Request    : aliased C_Time.timespec;
-+   Remaind    : aliased C_Time.timespec;
-    Rel_Time   : Duration;
-    Abs_Time   : Duration;
-    Base_Time  : constant Duration := Clock;
-@@ -71,7 +71,7 @@ begin
-          end if;
-          pragma Warnings (On);
- 
--         Request := To_Timespec (Time_Chunk);
-+         Request := C_Time.To_Timespec (Time_Chunk);
-          Result := nanosleep (Request'Access, Remaind'Access);
- 
-          Check_Time := Clock;
---- a/src/gcc/ada/libgnat/s-osprim__posix.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__posix.adb
-@@ -30,7 +30,7 @@
- ------------------------------------------------------------------------------
- 
- --  This version is for POSIX-like operating systems
--with System.Parameters;
-+with System.C_Time;
- 
- package body System.OS_Primitives is
- 
-@@ -39,16 +39,8 @@ package body System.OS_Primitives is
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
--   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
--     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--
--   type timespec is record
--      tv_sec  : time_t;
--      tv_nsec : Long_Integer;
--   end record;
--   pragma Convention (C, timespec);
--
--   function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
-+   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-+                      return Integer;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    -----------
-@@ -57,27 +49,12 @@ package body System.OS_Primitives is
- 
-    function Clock return Duration is
- 
--      type timeval is array (1 .. 3) of Long_Integer;
--      --  The timeval array is sized to contain Long_Long_Integer sec and
--      --  Long_Integer usec. If Long_Long_Integer'Size = Long_Integer'Size 
then
--      --  it will be overly large but that will not effect the implementation
--      --  since it is not accessed directly.
--
--      procedure timeval_to_duration
--        (T    : not null access timeval;
--         sec  : not null access Long_Long_Integer;
--         usec : not null access Long_Integer);
--      pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
--
--      Micro  : constant := 10**6;
--      sec    : aliased Long_Long_Integer;
--      usec   : aliased Long_Integer;
--      TV     : aliased timeval;
-+      TV     : aliased C_Time.timeval;
-       Result : Integer;
-       pragma Unreferenced (Result);
- 
-       function gettimeofday
--        (Tv : access timeval;
-+        (Tv : access C_Time.timeval;
-          Tz : System.Address := System.Null_Address) return Integer;
-       pragma Import (C, gettimeofday, "gettimeofday");
- 
-@@ -91,38 +68,10 @@ package body System.OS_Primitives is
-       --  value is never checked.
- 
-       Result := gettimeofday (TV'Access, System.Null_Address);
--      timeval_to_duration (TV'Access, sec'Access, usec'Access);
--      return Duration (sec) + Duration (usec) / Micro;
-+      return C_Time.To_Duration (TV);
-    end Clock;
- 
-    -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec;
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return
--        timespec'(tv_sec  => S,
--                  tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
--   end To_Timespec;
--
--   -----------------
-    -- Timed_Delay --
-    -----------------
- 
---- a/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-@@ -31,9 +31,10 @@
- 
- --  This version is for POSIX.1-2008-like operating systems
- 
-+with System.C_Time;
- with System.CRTL;
- with System.OS_Constants;
--with System.Parameters;
-+
- package body System.OS_Primitives is
- 
-    subtype int is System.CRTL.int;
-@@ -42,16 +43,8 @@ package body System.OS_Primitives is
-    --  we don't want to depend on any package. Consider removing these
-    --  declarations in System.OS_Interface and move these ones to the spec.
- 
--   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
--     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--
--   type timespec is record
--      tv_sec  : time_t;
--      tv_nsec : Long_Integer;
--   end record;
--   pragma Convention (C, timespec);
--
--   function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
-+   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-+                      return Integer;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    -----------
-@@ -59,7 +52,7 @@ package body System.OS_Primitives is
-    -----------
- 
-    function Clock return Duration is
--      TS     : aliased timespec;
-+      TS     : aliased C_Time.timespec;
-       Result : int;
- 
-       type clockid_t is new int;
-@@ -68,43 +61,16 @@ package body System.OS_Primitives is
- 
-       function clock_gettime
-         (clock_id : clockid_t;
--         tp       : access timespec) return int;
-+         tp       : access C_Time.timespec) return int;
-       pragma Import (C, clock_gettime, "clock_gettime");
- 
-    begin
-       Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access);
-       pragma Assert (Result = 0);
--      return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
-+      return C_Time.To_Duration (TS);
-    end Clock;
- 
-    -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec;
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return
--        timespec'(tv_sec  => S,
--                  tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9)));
--   end To_Timespec;
--
--   -----------------
-    -- Timed_Delay --
-    -----------------
- 
---- a/src/gcc/ada/libgnat/s-osprim__unix.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__unix.adb
-@@ -32,6 +32,8 @@
- --  This version uses gettimeofday and select
- --  This file is suitable for OpenNT, Dec Unix and SCO UnixWare.
- 
-+with System.C_Time;
-+
- package body System.OS_Primitives is
- 
-    --  ??? These definitions are duplicated from System.OS_Interface
-@@ -39,14 +41,8 @@ package body System.OS_Primitives is
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
--   type struct_timeval is record
--      tv_sec  : Integer;
--      tv_usec : Integer;
--   end record;
--   pragma Convention (C, struct_timeval);
--
-    procedure gettimeofday
--     (tv : not null access struct_timeval;
-+     (tv : not null access C_Time.timeval;
-       tz : Address := Null_Address);
-    pragma Import (C, gettimeofday, "gettimeofday");
- 
-@@ -55,7 +51,7 @@ package body System.OS_Primitives is
-       readfds,
-       writefds,
-       exceptfds : Address := Null_Address;
--      timeout   : not null access struct_timeval);
-+      timeout   : not null access C_Time.timeval);
-    pragma Import (C, C_select, "select");
- 
-    -----------
-@@ -63,11 +59,11 @@ package body System.OS_Primitives is
-    -----------
- 
-    function Clock return Duration is
--      TV : aliased struct_timeval;
-+      TV : aliased C_Time.timeval;
- 
-    begin
-       gettimeofday (TV'Access);
--      return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
-+      return C_Time.To_Duration (TV);
-    end Clock;
- 
-    -----------------
-@@ -82,7 +78,7 @@ package body System.OS_Primitives is
-       Abs_Time   : Duration;
-       Base_Time  : constant Duration := Clock;
-       Check_Time : Duration := Base_Time;
--      timeval    : aliased struct_timeval;
-+      timeval    : aliased C_Time.timeval;
- 
-    begin
-       if Mode = Relative then
-@@ -95,14 +91,7 @@ package body System.OS_Primitives is
- 
-       if Rel_Time > 0.0 then
-          loop
--            timeval.tv_sec := Integer (Rel_Time);
--
--            if Duration (timeval.tv_sec) > Rel_Time then
--               timeval.tv_sec := timeval.tv_sec - 1;
--            end if;
--
--            timeval.tv_usec :=
--              Integer ((Rel_Time - Duration (timeval.tv_sec)) * 10#1#E6);
-+            timeval := C_Time.To_Timeval (Rel_Time);
- 
-             C_select (timeout => timeval'Unchecked_Access);
-             Check_Time := Clock;
---- a/src/gcc/ada/libgnat/s-osprim__x32.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__x32.adb
-@@ -31,7 +31,7 @@
- 
- --  This version is for Linux/x32
- 
--with System.Parameters;
-+with System.C_Time;
- 
- package body System.OS_Primitives is
- 
-@@ -40,16 +40,8 @@ package body System.OS_Primitives is
-    --  these declarations in System.OS_Interface and move these ones in
-    --  the spec.
- 
--   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
--     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
--
--   type timespec is record
--      tv_sec  : time_t;
--      tv_nsec : Long_Long_Integer;
--   end record;
--   pragma Convention (C, timespec);
--
--   function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
-+   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-+                      return Integer;
-    pragma Import (C, nanosleep, "nanosleep");
- 
-    -----------
-@@ -57,23 +49,12 @@ package body System.OS_Primitives is
-    -----------
- 
-    function Clock return Duration is
--      type timeval is array (1 .. 2) of Long_Long_Integer;
--
--      procedure timeval_to_duration
--        (T    : not null access timeval;
--         sec  : not null access Long_Integer;
--         usec : not null access Long_Integer);
--      pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
--
--      Micro  : constant := 10**6;
--      sec    : aliased Long_Integer;
--      usec   : aliased Long_Integer;
--      TV     : aliased timeval;
-+      TV     : aliased C_Time.timeval;
-       Result : Integer;
-       pragma Unreferenced (Result);
- 
-       function gettimeofday
--        (Tv : access timeval;
-+        (Tv : access C_Time.timeval;
-          Tz : System.Address := System.Null_Address) return Integer;
-       pragma Import (C, gettimeofday, "gettimeofday");
- 
-@@ -87,38 +68,10 @@ package body System.OS_Primitives is
-       --  value is never checked.
- 
-       Result := gettimeofday (TV'Access, System.Null_Address);
--      timeval_to_duration (TV'Access, sec'Access, usec'Access);
--      return Duration (sec) + Duration (usec) / Micro;
-+      return C_Time.To_Duration (TV);
-    end Clock;
- 
-    -----------------
--   -- To_Timespec --
--   -----------------
--
--   function To_Timespec (D : Duration) return timespec;
--
--   function To_Timespec (D : Duration) return timespec is
--      S : time_t;
--      F : Duration;
--
--   begin
--      S := time_t (Long_Long_Integer (D));
--      F := D - Duration (S);
--
--      --  If F has negative value due to a round-up, adjust for positive F
--      --  value.
--
--      if F < 0.0 then
--         S := S - 1;
--         F := F + 1.0;
--      end if;
--
--      return
--        timespec'(tv_sec  => S,
--                  tv_nsec => Long_Long_Integer (F * 10#1#E9));
--   end To_Timespec;
--
--   -----------------
-    -- Timed_Delay --
-    -----------------
- 
-@@ -126,8 +79,8 @@ package body System.OS_Primitives is
-      (Time : Duration;
-       Mode : Integer)
-    is
--      Request    : aliased timespec;
--      Remaind    : aliased timespec;
-+      Request    : aliased C_Time.timespec;
-+      Remaind    : aliased C_Time.timespec;
-       Rel_Time   : Duration;
-       Abs_Time   : Duration;
-       Base_Time  : constant Duration := Clock;
-@@ -147,7 +100,7 @@ package body System.OS_Primitives is
- 
-       if Rel_Time > 0.0 then
-          loop
--            Request := To_Timespec (Rel_Time);
-+            Request := C_Time.To_Timespec (Rel_Time);
-             Result := nanosleep (Request'Access, Remaind'Access);
-             Check_Time := Clock;
- 
---- a/src/gcc/ada/s-oscons-tmplt.c
-+++ b/src/gcc/ada/s-oscons-tmplt.c
-@@ -1764,6 +1764,17 @@ CND(SIZEOF_tv_usec, "tv_usec")
- #endif
- CNS(MAX_tv_sec, "")
- }
-+
-+{
-+  struct timespec ts;
-+/*
-+   --  Sizes (in bytes) of the components of struct timespec.
-+   --  The tv_sec field is the same than in struct timeval.
-+*/
-+#define SIZEOF_tv_nsec (sizeof (ts.tv_nsec))
-+CND(SIZEOF_tv_nsec, "tv_nsec");
-+}
-+
- /*
- 
-    --  Sizes of various data types
diff --git 
a/debian/patches/0002-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff 
b/debian/patches/0002-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
index 7c7bbd38..b84ec239 100644
--- 
a/debian/patches/0002-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
+++ 
b/debian/patches/0002-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
@@ -1,4 +1,4 @@
-PR ada/114065, patches v15
+PR ada/114065, patches v21
 
 --- a/src/gcc/ada/libgnarl/a-exetim__posix.adb
 +++ b/src/gcc/ada/libgnarl/a-exetim__posix.adb
@@ -7,8 +7,8 @@ PR ada/114065, patches v15
  
  with System.C_Time;
 +with System.OS_Constants;
- with System.Tasking;
  with System.OS_Interface; use System.OS_Interface;
+ with System.Tasking;
  with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
 @@ -115,7 +116,8 @@ package body Ada.Execution_Time is
          (clock_id : Interfaces.C.int;
@@ -147,25 +147,36 @@ PR ada/114065, patches v15
  
     Timeout_V : aliased System.C_Time.timeval;
     Timeout_A : access System.C_Time.timeval;
+--- a/src/gcc/ada/libgnat/s-optide.adb
++++ b/src/gcc/ada/libgnat/s-optide.adb
+@@ -31,6 +31,8 @@
+ 
+ --  This is the Posix, Posix2008, and LynxOS version of this procedure.
+ 
++with System.OS_Constants;
++
+ separate (System.OS_Primitives)
+ procedure Timed_Delay
+   (Time : Duration;
+@@ -39,7 +41,7 @@ is
+ 
+    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
+                        return Integer;
+-   pragma Import (C, nanosleep, "nanosleep");
++   pragma Import (C, nanosleep, OS_Constants.Y2038_nanosleep);
+ 
+    Request    : aliased C_Time.timespec;
+    Remaind    : aliased C_Time.timespec;
 --- a/src/gcc/ada/libgnat/s-osprim__posix.adb
 +++ b/src/gcc/ada/libgnat/s-osprim__posix.adb
 @@ -31,6 +31,7 @@
- 
  --  This version is for POSIX-like operating systems
+ 
  with System.C_Time;
 +with System.OS_Constants;
  
  package body System.OS_Primitives is
  
-@@ -41,7 +42,7 @@ package body System.OS_Primitives is
- 
-    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-                       return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
-+   pragma Import (C, nanosleep, OS_Constants.Y2038_nanosleep);
- 
-    -----------
-    -- Clock --
 @@ -56,7 +57,7 @@ package body System.OS_Primitives is
        function gettimeofday
          (Tv : access C_Time.timeval;
@@ -177,15 +188,6 @@ PR ada/114065, patches v15
        --  The return codes for gettimeofday are as follows (from man pages):
 --- a/src/gcc/ada/libgnat/s-osprim__posix2008.adb
 +++ b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-@@ -45,7 +45,7 @@ package body System.OS_Primitives is
- 
-    function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-                       return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
-+   pragma Import (C, nanosleep, OS_Constants.Y2038_nanosleep);
- 
-    -----------
-    -- Clock --
 @@ -62,7 +62,7 @@ package body System.OS_Primitives is
        function clock_gettime
          (clock_id : clockid_t;
@@ -198,9 +200,11 @@ PR ada/114065, patches v15
 --- a/src/gcc/ada/s-oscons-tmplt.c
 +++ b/src/gcc/ada/s-oscons-tmplt.c
 @@ -1777,6 +1777,49 @@ CND(SIZEOF_tv_nsec, "tv_nsec");
+ CND(SIZEOF_tv_nsec, "tv_nsec");
+ }
  
- /*
- 
++/*
++
 +   --  On 32 bits architectures, glibc and musl also support representing time
 +   --  types on 64 bits.  The usual names are reserved symbols for the 32 bits
 +   --  function for backwards compatibility, so distinct symbols are necessary
@@ -242,8 +246,6 @@ PR ada/114065, patches v15
 +CST(Y2038_pthread_cond_wait, "")
 +CST(Y2038_select, "")
 +
-+/*
-+
-    --  Sizes of various data types
- */
+ /*
  
+    --  Sizes of various data types
diff --git a/debian/patches/ada-tv_nsec-size.diff 
b/debian/patches/ada-tv_nsec-size.diff
index 167fb11a..b6fc2ee5 100644
--- a/debian/patches/ada-tv_nsec-size.diff
+++ b/debian/patches/ada-tv_nsec-size.diff
@@ -1,19 +1,19 @@
-# DP: https://bugs.debian.org/1108322
+Bug-Debian: https://bugs.debian.org/1108322
+
+PR114065 v21
 
 --- a/src/gcc/ada/s-oscons-tmplt.c
 +++ b/src/gcc/ada/s-oscons-tmplt.c
-@@ -1769,9 +1769,12 @@ CNS(MAX_tv_sec, "")
-   struct timespec ts;
- /*
+@@ -1771,7 +1771,11 @@ CNS(MAX_tv_sec, "")
     --  Sizes (in bytes) of the components of struct timespec.
--   --  The tv_sec field is the same as in struct timeval.
-+   --  The tv_sec component is the same size as in struct timeval.
-+   --  In order to avoid the endian issues in the glibc __timespec64
-+   --  struct, we use the same size for the tv_nsec component as the
-+   --  tv_sec component.
+    --  The tv_sec field is the same as in struct timeval.
  */
 -#define SIZEOF_tv_nsec (sizeof (ts.tv_nsec))
-+#define SIZEOF_tv_nsec (sizeof (ts.tv_sec))
++/* On hppa with glibc, tv_nsec has 32 bits with 0 padding for 64 bits r/w. */
++/* https://sourceware.org/glibc/wiki/Y2038ProofnessDesign#struct_timespec */
++/* The following declaration is equivalent to (sizeof ts.tv_nsec) in other 
scenarios, */
++/* but then ensures that the Ada record has the same size as the C struct. */
++#define SIZEOF_tv_nsec (sizeof (ts) - sizeof (ts.tv_sec))
  CND(SIZEOF_tv_nsec, "tv_nsec");
  }
  
diff --git a/debian/rules.patch b/debian/rules.patch
index fd647089..a2add0bf 100644
--- a/debian/rules.patch
+++ b/debian/rules.patch
@@ -31,10 +31,8 @@ endif
 
 #      libstdc++-pic \
 
-
-#debian_patches += \
-#      0001-Ada-merge-all-timeval-and-timespec-definitions-and-c \
-#      0002-Ada-select-64-bits-time-functions-from-GNU-libc-when \
+debian_patches += \
+       0002-Ada-select-64-bits-time-functions-from-GNU-libc-when \
 
 debian_patches += \
        gcc-textdomain \
@@ -71,10 +69,7 @@ debian_patches += \
        libsanitizer-static-tls \
        pr123853 \
 
-# see https://bugs.debian.org/1108322
-ifneq (,$(filter $(DEB_TARGET_ARCH),hppa m68k powerpc))
   debian_patches += ada-tv_nsec-size
-endif
 
 # not yet backported, m68k only
 ifneq (,$(filter $(DEB_TARGET_ARCH),m68k))

Reply via email to