Source: gcc-13
Followup-For: Bug #1074577

Matthias Klose:
> Simon Chopin came up with a conditional to work with both variants
[before and after glibc introduces __USE_TIME64_REDIRECTS]
> #if defined(__USE_TIME64_REDIRECTS) || (__TIMESIZE == 32 && __USE_TIME_BITS64)

I have forwarded this upstream as version 11.

This changes the libgnat-13 sources (System.OS_Constants).

Most Ada packages will require a bin-NMU after you upload gcc-13,
ideally before people start filling FTBS bug reports.

I take the opportunity to apply some postponed changes.
I do not commit them because I have tested no build,
but the only changes since the (tested) version 10 are
 * the line above, tested by Simon Chopin in Ubuntu
 * unapplying small style changes reviewed by upstream
From: Nicolas Boulenguez <nico...@debian.org>
Subject: [PATCH] Ada: update patches for PR114065 (time_64) to v11

The fix 2bacf86d for #1074577 by Simon Chopin at
https://bugs.launchpad.net/ubuntu/+source/gcc-13/+bug/2071605 requires
a rebuild of all Ada libraries, so we might as well
* update all patches to version 11
* apply the parts fixing bugs, but not the style suggestions
---
 ...ersions-with-C-struct-timeval-from-GN.diff | 143 -----
 ...ersions-with-C-struct-timespec-from-A.diff | 167 -----
 ...ersions-with-C-time_t-from-System.OS_.diff |  79 ---
 ...imeval-and-timespec-definitions-and-c.diff | 604 ++++++++++++++----
 ...-unneeded-x32-variant-of-System.Linux.diff | 146 -----
 ...ed-posix2008-variant-of-System.Parame.diff | 229 -------
 ...ed-darwin-solaris-x32-variants-of-Sys.diff | 472 --------------
 ...sleep-from-System.OS_Primitives.Timed.diff |  74 ---
 ...its-time-functions-from-GNU-libc-when.diff |  74 ++-
 debian/rules.patch                            |   7 -
 10 files changed, 520 insertions(+), 1475 deletions(-)
 delete mode 100644 debian/patches/0001-Ada-remove-conversions-with-C-struct-timeval-from-GN.diff
 delete mode 100644 debian/patches/0002-Ada-remove-conversions-with-C-struct-timespec-from-A.diff
 delete mode 100644 debian/patches/0003-Ada-remove-conversions-with-C-time_t-from-System.OS_.diff
 delete mode 100644 debian/patches/0005-Ada-drop-unneeded-x32-variant-of-System.Linux.diff
 delete mode 100644 debian/patches/0006-Ada-drop-unneeded-posix2008-variant-of-System.Parame.diff
 delete mode 100644 debian/patches/0007-Ada-drop-unneeded-darwin-solaris-x32-variants-of-Sys.diff
 delete mode 100644 debian/patches/0008-Ada-import-nanosleep-from-System.OS_Primitives.Timed.diff

diff --git a/debian/patches/0001-Ada-remove-conversions-with-C-struct-timeval-from-GN.diff b/debian/patches/0001-Ada-remove-conversions-with-C-struct-timeval-from-GN.diff
deleted file mode 100644
index d57d7ec7..00000000
--- a/debian/patches/0001-Ada-remove-conversions-with-C-struct-timeval-from-GN.diff
+++ /dev/null
@@ -1,143 +0,0 @@
-From bedb7553c420da59938eacb115fd9384e54ceae0 Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Fri, 5 Apr 2024 16:51:54 +0200
-Subject: [PATCH 1/9] Ada: remove conversions with C struct timeval from
- GNAT.Calendar
-
----
- gcc/ada/doc/gnat_rm/the_gnat_library.rst |  2 -
- gcc/ada/libgnat/g-calend.adb             | 58 ------------------------
- gcc/ada/libgnat/g-calend.ads             | 18 --------
- 3 files changed, 78 deletions(-)
-
-diff --git a/src/gcc/ada/doc/gnat_rm/the_gnat_library.rst b/src/gcc/ada/doc/gnat_rm/the_gnat_library.rst
-index 3aae70a..bcec49f 100644
---- a/src/gcc/ada/doc/gnat_rm/the_gnat_library.rst
-+++ b/src/gcc/ada/doc/gnat_rm/the_gnat_library.rst
-@@ -674,8 +674,6 @@ Machine-specific implementations are available in some cases.
- 
- Extends the facilities provided by ``Ada.Calendar`` to include handling
- of days of the week, an extended ``Split`` and ``Time_Of`` capability.
--Also provides conversion of ``Ada.Calendar.Time`` values to and from the
--C ``timeval`` format.
- 
- .. _`GNAT.Calendar.Time_IO_(g-catiio.ads)`:
- 
-diff --git a/src/gcc/ada/libgnat/g-calend.adb b/src/gcc/ada/libgnat/g-calend.adb
-index 0a98eb2..e0d34f5 100644
---- 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 --
-    ------------------
-diff --git a/src/gcc/ada/libgnat/g-calend.ads b/src/gcc/ada/libgnat/g-calend.ads
-index b9dd15d..f317ab4 100644
---- a/src/gcc/ada/libgnat/g-calend.ads
-+++ b/src/gcc/ada/libgnat/g-calend.ads
-@@ -40,7 +40,6 @@
- --  Day_Of_Week, Day_In_Year and Week_In_Year.
- 
- with Ada.Calendar.Formatting;
--with Interfaces.C;
- 
- package GNAT.Calendar is
- 
-@@ -145,24 +144,7 @@ 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
--
--   --  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;
--
- 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;
--- 
-2.39.2
-
diff --git a/debian/patches/0002-Ada-remove-conversions-with-C-struct-timespec-from-A.diff b/debian/patches/0002-Ada-remove-conversions-with-C-struct-timespec-from-A.diff
deleted file mode 100644
index 6d11def2..00000000
--- a/debian/patches/0002-Ada-remove-conversions-with-C-struct-timespec-from-A.diff
+++ /dev/null
@@ -1,167 +0,0 @@
-From 4099038b7c9c5a5b5747ddc3a05dbb6b5d95f544 Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Thu, 4 Apr 2024 16:50:18 +0200
-Subject: [PATCH 2/9] Ada: remove conversions with C struct timespec from
- Ada.Calendar
-
----
- gcc/ada/libgnat/a-calcon.adb | 33 -------------------------------
- gcc/ada/libgnat/a-calcon.ads | 18 +----------------
- gcc/ada/libgnat/a-calend.adb | 38 ------------------------------------
- gcc/ada/libgnat/a-calend.ads | 11 -----------
- 4 files changed, 1 insertion(+), 99 deletions(-)
-
-diff --git a/src/gcc/ada/libgnat/a-calcon.adb b/src/gcc/ada/libgnat/a-calcon.adb
-index 8654d1e..3c5ec21 100644
---- a/src/gcc/ada/libgnat/a-calcon.adb
-+++ b/src/gcc/ada/libgnat/a-calcon.adb
-@@ -69,39 +69,6 @@ package body Ada.Calendar.Conversions is
-           (Year, Month, Day, Hour, Minute, Second, DST);
-    end To_Ada_Time;
- 
--   -----------------
--   -- To_Duration --
--   -----------------
--
--   function To_Duration
--     (tv_sec  : long;
--      tv_nsec : long) return Duration
--   is
--      Secs      : constant Long_Integer := Long_Integer (tv_sec);
--      Nano_Secs : constant Long_Integer := Long_Integer (tv_nsec);
--   begin
--      return Conversion_Operations.To_Duration (Secs, Nano_Secs);
--   end To_Duration;
--
--   ------------------------
--   -- To_Struct_Timespec --
--   ------------------------
--
--   procedure To_Struct_Timespec
--     (D       : Duration;
--      tv_sec  : out long;
--      tv_nsec : out long)
--   is
--      Secs      : Long_Integer;
--      Nano_Secs : Long_Integer;
--
--   begin
--      Conversion_Operations.To_Struct_Timespec (D, Secs, Nano_Secs);
--
--      tv_sec  := long (Secs);
--      tv_nsec := long (Nano_Secs);
--   end To_Struct_Timespec;
--
-    ------------------
-    -- To_Struct_Tm --
-    ------------------
-diff --git a/src/gcc/ada/libgnat/a-calcon.ads b/src/gcc/ada/libgnat/a-calcon.ads
-index 97df2a9..ad4ca64 100644
---- a/src/gcc/ada/libgnat/a-calcon.ads
-+++ b/src/gcc/ada/libgnat/a-calcon.ads
-@@ -30,7 +30,7 @@
- ------------------------------------------------------------------------------
- 
- --  This package provides various routines for conversion between Ada and Unix
----  time models - Time, Duration, struct tm and struct timespec.
-+--  time models - Time, Duration and struct tm.
- 
- with Interfaces.C;
- 
-@@ -67,22 +67,6 @@ package Ada.Calendar.Conversions is
-    --  the input values are out of the defined ranges or if tm_sec equals 60
-    --  and the instance in time is not a leap second occurrence.
- 
--   function To_Duration
--     (tv_sec  : Interfaces.C.long;
--      tv_nsec : Interfaces.C.long) return Duration;
--   --  Convert an elapsed time value expressed in Unix-like fields of struct
--   --  timespec into a Duration value. The expected ranges are:
--
--   --     tv_sec   -  seconds
--   --     tv_nsec  -  nanoseconds
--
--   procedure To_Struct_Timespec
--     (D       : Duration;
--      tv_sec  : out Interfaces.C.long;
--      tv_nsec : out Interfaces.C.long);
--   --  Convert a Duration value into the constituents of struct timespec.
--   --  Formal tv_sec denotes seconds and tv_nsecs denotes nanoseconds.
--
-    procedure To_Struct_Tm
-      (T       : Time;
-       tm_year : out Interfaces.C.int;
-diff --git a/src/gcc/ada/libgnat/a-calend.adb b/src/gcc/ada/libgnat/a-calend.adb
-index 1083ece..06946a5 100644
---- a/src/gcc/ada/libgnat/a-calend.adb
-+++ b/src/gcc/ada/libgnat/a-calend.adb
-@@ -990,44 +990,6 @@ is
-             raise Time_Error;
-       end To_Ada_Time;
- 
--      -----------------
--      -- To_Duration --
--      -----------------
--
--      function To_Duration
--        (tv_sec  : Long_Integer;
--         tv_nsec : Long_Integer) return Duration
--      is
--         pragma Unsuppress (Overflow_Check);
--      begin
--         return Duration (tv_sec) + Duration (tv_nsec) / Nano_F;
--      end To_Duration;
--
--      ------------------------
--      -- To_Struct_Timespec --
--      ------------------------
--
--      procedure To_Struct_Timespec
--        (D       : Duration;
--         tv_sec  : out Long_Integer;
--         tv_nsec : out Long_Integer)
--      is
--         pragma Unsuppress (Overflow_Check);
--         Secs      : Duration;
--         Nano_Secs : Duration;
--
--      begin
--         --  Seconds extraction, avoid potential rounding errors
--
--         Secs   := D - 0.5;
--         tv_sec := Long_Integer (Secs);
--
--         --  Nanoseconds extraction
--
--         Nano_Secs := D - Duration (tv_sec);
--         tv_nsec := Long_Integer (Nano_Secs * Nano);
--      end To_Struct_Timespec;
--
-       ------------------
-       -- To_Struct_Tm --
-       ------------------
-diff --git a/src/gcc/ada/libgnat/a-calend.ads b/src/gcc/ada/libgnat/a-calend.ads
-index 9625f4d..cfffc70 100644
---- a/src/gcc/ada/libgnat/a-calend.ads
-+++ b/src/gcc/ada/libgnat/a-calend.ads
-@@ -303,17 +303,6 @@ private
-          tm_isdst : Integer) return Time;
-       --  Struct tm to Ada Epoch conversion
- 
--      function To_Duration
--        (tv_sec  : Long_Integer;
--         tv_nsec : Long_Integer) return Duration;
--      --  Struct timespec to Duration conversion
--
--      procedure To_Struct_Timespec
--        (D       : Duration;
--         tv_sec  : out Long_Integer;
--         tv_nsec : out Long_Integer);
--      --  Duration to struct timespec conversion
--
-       procedure To_Struct_Tm
-         (T       : Time;
-          tm_year : out Integer;
--- 
-2.39.2
-
diff --git a/debian/patches/0003-Ada-remove-conversions-with-C-time_t-from-System.OS_.diff b/debian/patches/0003-Ada-remove-conversions-with-C-time_t-from-System.OS_.diff
deleted file mode 100644
index 57b73ba8..00000000
--- a/debian/patches/0003-Ada-remove-conversions-with-C-time_t-from-System.OS_.diff
+++ /dev/null
@@ -1,79 +0,0 @@
-From 3e2838d416c7dbe4100625302a899a5b0194e8b6 Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Sat, 13 Apr 2024 19:31:25 +0200
-Subject: [PATCH 3/9] Ada: remove conversions with C time_t from System.OS_Lib
-
-Only one conversion is used by Ada.Calendar, and it is unrelated with
-the C time_t type.
----
- gcc/ada/libgnat/s-os_lib.adb | 11 +----------
- gcc/ada/libgnat/s-os_lib.ads | 17 +----------------
- 2 files changed, 2 insertions(+), 26 deletions(-)
-
-diff --git a/src/gcc/ada/libgnat/s-os_lib.adb b/src/gcc/ada/libgnat/s-os_lib.adb
-index 20e109a..976d39c 100644
---- a/src/gcc/ada/libgnat/s-os_lib.adb
-+++ b/src/gcc/ada/libgnat/s-os_lib.adb
-@@ -2980,7 +2980,7 @@ package body System.OS_Lib is
-    -- To_Ada --
-    ------------
- 
--   function To_Ada (Time : time_t) return OS_Time is
-+   function To_Ada (Time : Long_Long_Integer) return OS_Time is
-    begin
-       return OS_Time (Time);
-    end To_Ada;
-@@ -3014,15 +3014,6 @@ package body System.OS_Lib is
-       return Return_Val;
-    end To_Path_String_Access;
- 
--   ----------
--   -- To_C --
--   ----------
--
--   function To_C (Time : OS_Time) return time_t is
--   begin
--      return time_t (Time);
--   end To_C;
--
-    ------------------
-    -- Wait_Process --
-    ------------------
-diff --git a/src/gcc/ada/libgnat/s-os_lib.ads b/src/gcc/ada/libgnat/s-os_lib.ads
-index 46e11f7..c69e357 100644
---- a/src/gcc/ada/libgnat/s-os_lib.ads
-+++ b/src/gcc/ada/libgnat/s-os_lib.ads
-@@ -165,21 +165,7 @@ package System.OS_Lib is
-    -- Time_t Stuff --
-    ------------------
- 
--   --  Note: Do not use time_t in the compiler and host-based tools; instead
--   --  use OS_Time.
--
--   subtype time_t is Long_Long_Integer;
--   --  C time_t can be either long or long long, so we choose the Ada
--   --  equivalent of the latter because eventually that will be the
--   --  type used out of necessity. This may affect some user code on 32-bit
--   --  targets that have not yet migrated to the Posix 2008 standard,
--   --  particularly pre version 5 32-bit Linux. Do not change this
--   --  declaration without coordinating it with conversions in Ada.Calendar.
--
--   function To_C (Time : OS_Time) return time_t;
--   --  Convert OS_Time to C time_t type
--
--   function To_Ada (Time : time_t) return OS_Time;
-+   function To_Ada (Time : Long_Long_Integer) return OS_Time;
-    --  Convert C time_t type to OS_Time
- 
-    ----------------
-@@ -1119,7 +1105,6 @@ private
-    pragma Import (Intrinsic, ">");
-    pragma Import (Intrinsic, "<=");
-    pragma Import (Intrinsic, ">=");
--   pragma Inline (To_C);
-    pragma Inline (To_Ada);
- 
-    type Process_Id is new Integer;
--- 
-2.39.2
-
diff --git a/debian/patches/0004-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff b/debian/patches/0004-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff
index b1744f6b..c5e02410 100644
--- a/debian/patches/0004-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff
+++ b/debian/patches/0004-Ada-merge-all-timeval-and-timespec-definitions-and-c.diff
@@ -1,8 +1,8 @@
-From 517d53475e2c46ed0593791c6cb02842a53c410f Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
+From 405868861a4b2b0f1b4272f312131ec9a4906ef4 Mon Sep 17 00:00:00 2001
+From: Nicolas Boulenguez <nico...@debian.org>
 Date: Tue, 23 Apr 2024 08:37:43 +0200
-Subject: [PATCH 4/9] Ada: merge all timeval and timespec definitions and
- conversions
+Subject: [PATCH 1/8] Ada: merge all timeval and timespec definitions and
+ conversions [PR114065]
 
 Add a new System.C_Time unit in libgnat,
  * not in libgnarl like OS_Interface,
@@ -11,24 +11,37 @@ Add a new System.C_Time unit in libgnat,
 OS_Primitives is a candidate, but has several variants
 and would cause duplication again.
 
+Merge all conversions to and from Duration and remove the wrappers in
+cal.c using long long int as an intermediate 64 bits type.
+
 The System.OS_Interface specification for Android now forbids a body.
 
-Remove lots of variants of the conversion functions with Duration.
-Remove the C wrapper using long long int as an intermediate 64 bits type.
+In System.OS_Interface for Darwin and System.OS_Primitives for
+POSIX/RTEMS/X32, replace intermediate Durations with direct integer
+conversions, preventing some avoidable roundings (when Duration'Size =
+32) or overflows (when time_t'Size = 64).
+
+Remove the non portable conversions based on long int from the private
+part of a-calend.ads but keep them in Ada.Calendar.Conversions and
+GNAT.Calendar for backward compatibility.
+
+In s-oscons-tmplt.c, add sizeof(timespec.tv_nsec) because it is not
+always a long int.
+
+In the new System.C_Time:
+Fix some versions for D = 0.0.
 When Duration'Size = 32 bits
  * round correctly in both variants of To_Duration.
  * prevent an overflow in To_Duration when nsec = 999_999_999.
  * prevent an overflow in To_Timespec without intermediate 64 bits.
-
-Provide direct conversions for System.OS_Interface (Darwin) and
-GNAt.Sockets.Poll.G_Wait, replacing an intermediate Duration that may
-loose overflow or loose precision.
-
-Provide a test checking if a timeval value can be converted to
+Provide a way to check if a timeval value can be represented as
 Duration for GNAT.Sockets.
+
+PR ada/114065
+Signed-off-by: Nicolas Boulenguez <nico...@debian.org>
 ---
  gcc/ada/Makefile.rtl                        |   4 +-
- gcc/ada/cal.c                               |  74 --------
+ gcc/ada/cal.c                               |  74 -------
  gcc/ada/gcc-interface/Makefile.in           |   1 -
  gcc/ada/libgnarl/a-exetim__posix.adb        |   7 +-
  gcc/ada/libgnarl/s-linux.ads                |  17 --
@@ -36,65 +49,71 @@ Duration for GNAT.Sockets.
  gcc/ada/libgnarl/s-linux__android.ads       |  17 --
  gcc/ada/libgnarl/s-linux__hppa.ads          |  17 --
  gcc/ada/libgnarl/s-linux__loongarch.ads     |  18 --
- gcc/ada/libgnarl/s-linux__mips.ads          |  22 +--
- gcc/ada/libgnarl/s-linux__riscv.ads         |  22 +--
+ gcc/ada/libgnarl/s-linux__mips.ads          |  22 +-
+ gcc/ada/libgnarl/s-linux__riscv.ads         |  22 +-
  gcc/ada/libgnarl/s-linux__sparc.ads         |  17 --
  gcc/ada/libgnarl/s-linux__x32.ads           |  19 --
- gcc/ada/libgnarl/s-osinte__aix.adb          |  32 ----
+ gcc/ada/libgnarl/s-osinte__aix.adb          |  32 ---
  gcc/ada/libgnarl/s-osinte__aix.ads          |  25 +--
- gcc/ada/libgnarl/s-osinte__android.adb      |  74 --------
+ gcc/ada/libgnarl/s-osinte__android.adb      |  74 -------
  gcc/ada/libgnarl/s-osinte__android.ads      |  25 +--
- gcc/ada/libgnarl/s-osinte__darwin.adb       |  61 +------
+ gcc/ada/libgnarl/s-osinte__darwin.adb       |  61 +-----
  gcc/ada/libgnarl/s-osinte__darwin.ads       |  25 +--
- gcc/ada/libgnarl/s-osinte__dragonfly.adb    |  33 ----
+ gcc/ada/libgnarl/s-osinte__dragonfly.adb    |  33 ---
  gcc/ada/libgnarl/s-osinte__dragonfly.ads    |  27 +--
- gcc/ada/libgnarl/s-osinte__freebsd.adb      |  32 ----
+ gcc/ada/libgnarl/s-osinte__freebsd.adb      |  32 ---
  gcc/ada/libgnarl/s-osinte__freebsd.ads      |  27 +--
- gcc/ada/libgnarl/s-osinte__gnu.adb          |  33 ----
+ gcc/ada/libgnarl/s-osinte__gnu.adb          |  33 ---
  gcc/ada/libgnarl/s-osinte__gnu.ads          |  27 +--
- gcc/ada/libgnarl/s-osinte__hpux-dce.adb     |  36 +---
+ gcc/ada/libgnarl/s-osinte__hpux-dce.adb     |  36 +--
  gcc/ada/libgnarl/s-osinte__hpux-dce.ads     |  25 +--
  gcc/ada/libgnarl/s-osinte__hpux.ads         |  25 +--
  gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads |  27 +--
  gcc/ada/libgnarl/s-osinte__linux.ads        |  18 +-
- gcc/ada/libgnarl/s-osinte__lynxos178.adb    |  32 ----
- gcc/ada/libgnarl/s-osinte__lynxos178e.ads   |  35 +---
- gcc/ada/libgnarl/s-osinte__posix.adb        |  33 ----
- gcc/ada/libgnarl/s-osinte__qnx.adb          |  33 ----
+ gcc/ada/libgnarl/s-osinte__lynxos178.adb    |  32 ---
+ gcc/ada/libgnarl/s-osinte__lynxos178e.ads   |  35 +--
+ gcc/ada/libgnarl/s-osinte__posix.adb        |  33 ---
+ gcc/ada/libgnarl/s-osinte__qnx.adb          |  33 ---
  gcc/ada/libgnarl/s-osinte__qnx.ads          |  25 +--
- gcc/ada/libgnarl/s-osinte__rtems.adb        |  30 ----
+ gcc/ada/libgnarl/s-osinte__rtems.adb        |  30 ---
  gcc/ada/libgnarl/s-osinte__rtems.ads        |  29 +--
- gcc/ada/libgnarl/s-osinte__solaris.adb      |  34 ----
+ gcc/ada/libgnarl/s-osinte__solaris.adb      |  34 ---
  gcc/ada/libgnarl/s-osinte__solaris.ads      |  25 +--
- gcc/ada/libgnarl/s-osinte__vxworks.adb      |  32 ----
+ gcc/ada/libgnarl/s-osinte__vxworks.adb      |  32 ---
  gcc/ada/libgnarl/s-osinte__vxworks.ads      |  28 +--
- gcc/ada/libgnarl/s-osinte__x32.adb          |  33 ----
+ gcc/ada/libgnarl/s-osinte__x32.adb          |  33 ---
  gcc/ada/libgnarl/s-qnx.ads                  |  17 --
  gcc/ada/libgnarl/s-taprop__hpux-dce.adb     |  13 +-
  gcc/ada/libgnarl/s-taprop__solaris.adb      |  17 +-
  gcc/ada/libgnarl/s-taprop__vxworks.adb      |   5 +-
  gcc/ada/libgnarl/s-tpopmo.adb               |  18 +-
- gcc/ada/libgnat/g-socket.adb                |  79 +-------
+ gcc/ada/libgnat/a-calcon.adb                |  33 ---
+ gcc/ada/libgnat/a-calcon.ads                |  23 +-
+ gcc/ada/libgnat/a-calend.adb                |  38 ----
+ gcc/ada/libgnat/a-calend.ads                |  11 -
+ gcc/ada/libgnat/g-calend.adb                |  58 -----
+ gcc/ada/libgnat/g-calend.ads                |  26 +--
+ gcc/ada/libgnat/g-socket.adb                |  79 +------
  gcc/ada/libgnat/g-socthi.adb                |   4 +-
  gcc/ada/libgnat/g-socthi__vxworks.adb       |   4 +-
- gcc/ada/libgnat/g-sothco.ads                |  24 +--
+ gcc/ada/libgnat/g-sothco.ads                |  24 +-
  gcc/ada/libgnat/g-spogwa.adb                |  11 +-
- gcc/ada/libgnat/s-c_time.adb                | 188 ++++++++++++++++++++
- gcc/ada/libgnat/s-c_time.ads                | 112 ++++++++++++
+ gcc/ada/libgnat/s-c_time.adb                | 231 ++++++++++++++++++++
+ gcc/ada/libgnat/s-c_time.ads                | 128 +++++++++++
  gcc/ada/libgnat/s-optide.adb                |   6 +-
- gcc/ada/libgnat/s-osprim__darwin.adb        |  59 +-----
- gcc/ada/libgnat/s-osprim__posix.adb         |  63 +------
- gcc/ada/libgnat/s-osprim__posix2008.adb     |  48 +----
- gcc/ada/libgnat/s-osprim__rtems.adb         |  71 ++------
+ gcc/ada/libgnat/s-osprim__darwin.adb        |  59 +----
+ gcc/ada/libgnat/s-osprim__posix.adb         |  63 +-----
+ gcc/ada/libgnat/s-osprim__posix2008.adb     |  48 +---
+ gcc/ada/libgnat/s-osprim__rtems.adb         |  71 +-----
  gcc/ada/libgnat/s-osprim__solaris.adb       |  27 +--
  gcc/ada/libgnat/s-osprim__unix.adb          |  27 +--
- gcc/ada/libgnat/s-osprim__x32.adb           |  65 +------
+ gcc/ada/libgnat/s-osprim__x32.adb           |  65 +-----
  gcc/ada/libgnat/s-parame.ads                |   7 -
  gcc/ada/libgnat/s-parame__hpux.ads          |   7 -
  gcc/ada/libgnat/s-parame__posix2008.ads     |   8 -
  gcc/ada/libgnat/s-parame__vxworks.ads       |  15 --
- gcc/ada/s-oscons-tmplt.c                    |  15 +-
- 67 files changed, 507 insertions(+), 1576 deletions(-)
+ gcc/ada/s-oscons-tmplt.c                    |  11 +
+ 73 files changed, 586 insertions(+), 1741 deletions(-)
  delete mode 100644 gcc/ada/cal.c
  delete mode 100644 gcc/ada/libgnarl/s-osinte__android.adb
  create mode 100644 gcc/ada/libgnat/s-c_time.adb
@@ -818,7 +837,7 @@ index 4670807..0000000
 -
 -end System.OS_Interface;
 diff --git a/src/gcc/ada/libgnarl/s-osinte__android.ads b/src/gcc/ada/libgnarl/s-osinte__android.ads
-index ca35aab..ee3a5dc 100644
+index ca35aab..ecf4a32 100644
 --- a/src/gcc/ada/libgnarl/s-osinte__android.ads
 +++ b/src/gcc/ada/libgnarl/s-osinte__android.ads
 @@ -40,9 +40,9 @@
@@ -842,7 +861,7 @@ index ca35aab..ee3a5dc 100644
  
     function clock_gettime
 -     (clock_id : clockid_t; tp : access timespec) return int;
-+     (clock_id : clockid_t; tp : access C_time.timespec) return int;
++     (clock_id : clockid_t; tp : access C_Time.timespec) return int;
     pragma Import (C, clock_gettime, "clock_gettime");
  
     function clock_getres
@@ -2731,6 +2750,290 @@ index a38f9f4..7fb0dea 100644
  
              Inner : loop
                 exit Outer
+diff --git a/src/gcc/ada/libgnat/a-calcon.adb b/src/gcc/ada/libgnat/a-calcon.adb
+index 8654d1e..3c5ec21 100644
+--- a/src/gcc/ada/libgnat/a-calcon.adb
++++ b/src/gcc/ada/libgnat/a-calcon.adb
+@@ -69,39 +69,6 @@ package body Ada.Calendar.Conversions is
+           (Year, Month, Day, Hour, Minute, Second, DST);
+    end To_Ada_Time;
+ 
+-   -----------------
+-   -- To_Duration --
+-   -----------------
+-
+-   function To_Duration
+-     (tv_sec  : long;
+-      tv_nsec : long) return Duration
+-   is
+-      Secs      : constant Long_Integer := Long_Integer (tv_sec);
+-      Nano_Secs : constant Long_Integer := Long_Integer (tv_nsec);
+-   begin
+-      return Conversion_Operations.To_Duration (Secs, Nano_Secs);
+-   end To_Duration;
+-
+-   ------------------------
+-   -- To_Struct_Timespec --
+-   ------------------------
+-
+-   procedure To_Struct_Timespec
+-     (D       : Duration;
+-      tv_sec  : out long;
+-      tv_nsec : out long)
+-   is
+-      Secs      : Long_Integer;
+-      Nano_Secs : Long_Integer;
+-
+-   begin
+-      Conversion_Operations.To_Struct_Timespec (D, Secs, Nano_Secs);
+-
+-      tv_sec  := long (Secs);
+-      tv_nsec := long (Nano_Secs);
+-   end To_Struct_Timespec;
+-
+    ------------------
+    -- To_Struct_Tm --
+    ------------------
+diff --git a/src/gcc/ada/libgnat/a-calcon.ads b/src/gcc/ada/libgnat/a-calcon.ads
+index 97df2a9..196028e 100644
+--- a/src/gcc/ada/libgnat/a-calcon.ads
++++ b/src/gcc/ada/libgnat/a-calcon.ads
+@@ -33,6 +33,7 @@
+ --  time models - Time, Duration, struct tm and struct timespec.
+ 
+ with Interfaces.C;
++with System.C_Time;
+ 
+ package Ada.Calendar.Conversions is
+ 
+@@ -68,20 +69,18 @@ package Ada.Calendar.Conversions is
+    --  and the instance in time is not a leap second occurrence.
+ 
+    function To_Duration
+-     (tv_sec  : Interfaces.C.long;
+-      tv_nsec : Interfaces.C.long) return Duration;
+-   --  Convert an elapsed time value expressed in Unix-like fields of struct
+-   --  timespec into a Duration value. The expected ranges are:
+-
+-   --     tv_sec   -  seconds
+-   --     tv_nsec  -  nanoseconds
++     (tv_sec  : System.C_Time.Tv_Sec_Long;
++      tv_nsec : System.C_Time.Tv_Nsec_Long)
++     return System.C_Time.Non_Negative_Duration
++   renames System.C_Time.To_Duration;
++   --  Deprecated.  Please use C_Time directly.
+ 
+    procedure To_Struct_Timespec
+-     (D       : Duration;
+-      tv_sec  : out Interfaces.C.long;
+-      tv_nsec : out Interfaces.C.long);
+-   --  Convert a Duration value into the constituents of struct timespec.
+-   --  Formal tv_sec denotes seconds and tv_nsecs denotes nanoseconds.
++     (D       : System.C_Time.Non_Negative_Duration;
++      tv_sec  : out System.C_Time.Tv_Sec_Long;
++      tv_nsec : out System.C_Time.Tv_Nsec_Long)
++   renames System.C_Time.To_Struct_Timespec;
++   --  Deprecated.  Please use C_Time directly.
+ 
+    procedure To_Struct_Tm
+      (T       : Time;
+diff --git a/src/gcc/ada/libgnat/a-calend.adb b/src/gcc/ada/libgnat/a-calend.adb
+index 1083ece..06946a5 100644
+--- a/src/gcc/ada/libgnat/a-calend.adb
++++ b/src/gcc/ada/libgnat/a-calend.adb
+@@ -990,44 +990,6 @@ is
+             raise Time_Error;
+       end To_Ada_Time;
+ 
+-      -----------------
+-      -- To_Duration --
+-      -----------------
+-
+-      function To_Duration
+-        (tv_sec  : Long_Integer;
+-         tv_nsec : Long_Integer) return Duration
+-      is
+-         pragma Unsuppress (Overflow_Check);
+-      begin
+-         return Duration (tv_sec) + Duration (tv_nsec) / Nano_F;
+-      end To_Duration;
+-
+-      ------------------------
+-      -- To_Struct_Timespec --
+-      ------------------------
+-
+-      procedure To_Struct_Timespec
+-        (D       : Duration;
+-         tv_sec  : out Long_Integer;
+-         tv_nsec : out Long_Integer)
+-      is
+-         pragma Unsuppress (Overflow_Check);
+-         Secs      : Duration;
+-         Nano_Secs : Duration;
+-
+-      begin
+-         --  Seconds extraction, avoid potential rounding errors
+-
+-         Secs   := D - 0.5;
+-         tv_sec := Long_Integer (Secs);
+-
+-         --  Nanoseconds extraction
+-
+-         Nano_Secs := D - Duration (tv_sec);
+-         tv_nsec := Long_Integer (Nano_Secs * Nano);
+-      end To_Struct_Timespec;
+-
+       ------------------
+       -- To_Struct_Tm --
+       ------------------
+diff --git a/src/gcc/ada/libgnat/a-calend.ads b/src/gcc/ada/libgnat/a-calend.ads
+index 9625f4d..cfffc70 100644
+--- a/src/gcc/ada/libgnat/a-calend.ads
++++ b/src/gcc/ada/libgnat/a-calend.ads
+@@ -303,17 +303,6 @@ private
+          tm_isdst : Integer) return Time;
+       --  Struct tm to Ada Epoch conversion
+ 
+-      function To_Duration
+-        (tv_sec  : Long_Integer;
+-         tv_nsec : Long_Integer) return Duration;
+-      --  Struct timespec to Duration conversion
+-
+-      procedure To_Struct_Timespec
+-        (D       : Duration;
+-         tv_sec  : out Long_Integer;
+-         tv_nsec : out Long_Integer);
+-      --  Duration to struct timespec conversion
+-
+       procedure To_Struct_Tm
+         (T       : Time;
+          tm_year : out Integer;
+diff --git a/src/gcc/ada/libgnat/g-calend.adb b/src/gcc/ada/libgnat/g-calend.adb
+index 0a98eb2..e0d34f5 100644
+--- 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 --
+    ------------------
+diff --git a/src/gcc/ada/libgnat/g-calend.ads b/src/gcc/ada/libgnat/g-calend.ads
+index b9dd15d..7791943 100644
+--- 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,20 @@ 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.
++   function To_Duration (T : not null access timeval)
++                        return System.C_Time.Non_Negative_Duration
++     with Inline
++   is (System.C_Time.To_Duration (T.all));
++   --  Deprecated.  Please use C_Time directly.
+ 
+-   type timeval is private;
+-
+-   function To_Duration (T : not null access timeval) return Duration;
+-   function To_Timeval  (D : Duration) return timeval;
++   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;
 diff --git a/src/gcc/ada/libgnat/g-socket.adb b/src/gcc/ada/libgnat/g-socket.adb
 index e2f91b3..02c2bab 100644
 --- a/src/gcc/ada/libgnat/g-socket.adb
@@ -3016,10 +3319,10 @@ index c16674e..530a6cd 100644
     Reset_Socket_Set (Rfds);
 diff --git a/src/gcc/ada/libgnat/s-c_time.adb b/src/gcc/ada/libgnat/s-c_time.adb
 new file mode 100644
-index 0000000..9f862ec
+index 0000000..d44727c
 --- /dev/null
 +++ b/src/gcc/ada/libgnat/s-c_time.adb
-@@ -0,0 +1,188 @@
+@@ -0,0 +1,231 @@
 +------------------------------------------------------------------------------
 +--                                                                          --
 +--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
@@ -3058,6 +3361,9 @@ index 0000000..9f862ec
 +   --   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 --
 +   -----------------
@@ -3094,57 +3400,86 @@ index 0000000..9f862ec
 +   -- Milliseconds_To_Timeval --
 +   -----------------------------
 +
-+   function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval is
++   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 * suseconds_t (R));
++              tv_usec => 1_000 * usec_t (R));
 +   end Milliseconds_To_Timeval;
 +
 +   -----------------------------
 +   -- Nanoseconds_To_Timespec --
 +   -----------------------------
 +
-+   function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec is
++   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 => snseconds_t (R));
++      return (tv_sec  => time_t (Q),
++              tv_nsec => nsec_t (R));
 +   end Nanoseconds_To_Timespec;
 +
 +   -----------------
 +   -- To_Duration --
 +   -----------------
 +
-+   function To_Duration (T : timeval) return Duration is
++   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
-+         Frac := Duration (T.tv_usec)          / 1_000_000;
++         Usec := T.tv_usec;
 +      else
-+         --  Fix the rounding (999_999.0 / 1_000_000 = 0.98).
-+         Frac := Duration (T.tv_usec + 10_000) / 1_000_000;
++         --  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 Duration is
++   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).
++         --  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;
++
++   ------------------------
++   -- 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;
++
 +   -----------------
 +   -- To_Timespec --
 +   -----------------
@@ -3152,26 +3487,27 @@ index 0000000..9f862ec
 +   function To_Timespec (T : timeval) return timespec is
 +   begin
 +      return (tv_sec  => T.tv_sec,
-+              tv_nsec => 1_000 * snseconds_t (T.tv_usec));
++              tv_nsec => 1_000 * nsec_t (T.tv_usec));
 +   end To_Timespec;
 +
-+   function To_Timespec (D : Duration) return timespec is
++   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 : snseconds_t range -500_000_000 .. 500_000_000;
++      Nsec : nsec_t range -500_000_000 .. 500_000_000;
 +   begin
 +      if Duration'Size = 64 then
-+         Nsec := snseconds_t (1_000_000_000 * Frac);
++         Nsec := nsec_t (1_000_000_000 * Frac);
 +      else
-+         --  Avoid an overflow when Duration'Last < 999_999_999.
-+         Nsec := 10_000_000 * snseconds_t (100 * Frac);
++         --  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 (Sec,     Nsec + 1_000_000_000);
++         return (tv_sec => Sec,     tv_nsec => Nsec + 1_000_000_000);
 +      else
-+         return (Sec + 1, Nsec);
++         return (tv_sec => Sec + 1, tv_nsec => Nsec);
 +      end if;
 +   end To_Timespec;
 +
@@ -3179,27 +3515,37 @@ index 0000000..9f862ec
 +   -- To_Timeval --
 +   -----------------
 +
-+   function To_Timeval (D : Duration) return timeval is
++   function To_Timeval (D : Non_Negative_Duration) return timeval is
++
++      --   Most comments also apply to the timespec variant.
 +
 +      --    Sec := time_t (D);
-+      --    Usec := suseconds_t (1_000_000 * (D - Duration (Sec)));
++      --    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 := suseconds_t (1_000_000 * (D - Duration (Sec)));
-+      --  fails when D is
-+      --    0.0           (Sec is rounded down and Usec = 1_000_000)
-+      --    0.999_999_999 (Usec is rounded up to 1_000_000)
++      --    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)
 +
-+      --  Converting D - 1 seems to solve overflow and simplify roundings.
 +      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);
-+      Usec : constant suseconds_t range -500_000 .. 500_000
-+        := suseconds_t (1_000_000 * Frac);
++      --  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
@@ -3210,10 +3556,10 @@ index 0000000..9f862ec
 +end System.C_Time;
 diff --git a/src/gcc/ada/libgnat/s-c_time.ads b/src/gcc/ada/libgnat/s-c_time.ads
 new file mode 100644
-index 0000000..0feabb3
+index 0000000..8eaf22d
 --- /dev/null
 +++ b/src/gcc/ada/libgnat/s-c_time.ads
-@@ -0,0 +1,112 @@
+@@ -0,0 +1,128 @@
 +------------------------------------------------------------------------------
 +--                                                                          --
 +--                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
@@ -3252,50 +3598,63 @@ index 0000000..0feabb3
 +private with System.OS_Constants;
 +
 +package System.C_Time
-+  with Preelaborate
++  with Pure
 +is
 +
-+   type timeval is private;  --  Non negative duration in microseconds.
++   --  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
 +
-+   Timeval_Zero : constant timeval;
-+   --  g-sothco.ads
++   --  Duration is accurate to either 1 nanosecond or 20 milliseconds.
++   subtype Non_Negative_Duration is Duration range 0.0 .. Duration'Last;
 +
-+   function To_Timeval (D : Duration) return timeval
-+     with Pre => 0.0 <= D;
-+   --  The value is rounded if Duration'Size = 64.
++   --  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 In_Duration (T : timeval) return Boolean
-+     with Inline;
-+   --  True if computing To_Duration (T) is safe,
-+   --  False if Constraint Error would be raised.
++   function To_Duration (T : timespec) return Non_Negative_Duration;
++   function To_Duration (T : timeval)  return Non_Negative_Duration;
 +
-+   function To_Duration (T : timeval) return Duration
-+     with Post => 0.0 <= To_Duration'Result;
-+   --  The value is rounded if Duration'Size = 32.
++   function To_Timespec (D : Non_Negative_Duration) return timespec;
++   function To_Timeval  (D : Non_Negative_Duration) return timeval;
 +
-+   type timespec is private;  --  Non negative duration in nanoseconds.
++   Timeval_Zero : constant timeval;
++   --  g-sothco.ads
 +
-+   function To_Timespec (D : Duration) return timespec
-+     with Pre => 0.0 <= D;
++   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:
 +
-+   function To_Duration (T : timespec) return Duration
-+     with Post => 0.0 <= To_Duration'Result;
-+   --  The value is rounded if Duration'Size = 32.
++   subtype Non_Negative_Int is
++     Interfaces.C.int range 0 .. Interfaces.C.int'Last;
 +
-+   --  Direct conversions avoiding an intermediate Duration that may
-+   --  loose precision (when Duration'Size = 32) or overflow (when
-+   --  time_t'Size = 64).
++   function Milliseconds_To_Timeval (M : Non_Negative_Int) return timeval
++     with Inline;
++   --  g-spogwa.adb
 +
-+   function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval
-+     with Inline,
-+          Pre => Interfaces.C."<=" (0, M);
++   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
 +
-+   function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec
-+     with Inline,
-+          Pre => Interfaces.C."<=" (0, N);
++   --  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.
 +
-+   function To_Timespec (T : timeval) return timespec
++   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;
++   procedure To_Struct_Timespec (D       : Non_Negative_Duration;
++                                 tv_sec  : out Tv_Sec_Long;
++                                 tv_nsec : out Tv_Nsec_Long) with Inline;
++   --  a-calcon.ads
 +
 +private
 +
@@ -3303,23 +3662,26 @@ index 0000000..0feabb3
 +                         2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) - 1
 +     with Convention => C, Size => OS_Constants.SIZEOF_tv_sec * 8;
 +
-+   type suseconds_t is range -2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) ..
-+                              2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) - 1
++   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 snseconds_t is range -2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) ..
-+                              2 ** (OS_Constants.SIZEOF_tv_nsec * 8 - 1) - 1
++   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 : suseconds_t range 0 .. 999_999;             -- microseconds
++      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 : snseconds_t range 0 .. 999_999_999;         -- nanoseconds
++      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;
 +
@@ -4127,21 +4489,9 @@ index 802357e..d0bcecd 100644
     -- Characteristics of types in Interfaces.C --
     ----------------------------------------------
 diff --git a/src/gcc/ada/s-oscons-tmplt.c b/src/gcc/ada/s-oscons-tmplt.c
-index 4e512b9..5beb929 100644
+index 4e512b9..e5dad44 100644
 --- a/src/gcc/ada/s-oscons-tmplt.c
 +++ b/src/gcc/ada/s-oscons-tmplt.c
-@@ -1740,9 +1740,9 @@ CND(IPV6_V6ONLY, "Restricted to IPv6 communications only")
-    --  Sizes (in bytes) of the components of struct timeval
- */
- #define SIZEOF_tv_sec (sizeof tv.tv_sec)
--CND(SIZEOF_tv_sec, "tv_sec")
-+CND(SIZEOF_tv_sec, "tv_sec, time_t")
- #define SIZEOF_tv_usec (sizeof tv.tv_usec)
--CND(SIZEOF_tv_usec, "tv_usec")
-+CND(SIZEOF_tv_usec, "tv_usec, suseconds_t")
- /*
- 
-    --  Maximum allowed value for tv_sec
 @@ -1764,6 +1764,17 @@ CND(SIZEOF_tv_usec, "tv_usec")
  #endif
  CNS(MAX_tv_sec, "")
@@ -4154,7 +4504,7 @@ index 4e512b9..5beb929 100644
 +   --  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, long except on x32");
++CND(SIZEOF_tv_nsec, "tv_nsec");
 +}
 +
  /*
diff --git a/debian/patches/0005-Ada-drop-unneeded-x32-variant-of-System.Linux.diff b/debian/patches/0005-Ada-drop-unneeded-x32-variant-of-System.Linux.diff
deleted file mode 100644
index 2204336d..00000000
--- a/debian/patches/0005-Ada-drop-unneeded-x32-variant-of-System.Linux.diff
+++ /dev/null
@@ -1,146 +0,0 @@
-From 9f073499ba8249a6f510634c7a8c876bd45dc5d9 Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Mon, 1 Apr 2024 12:20:43 +0200
-Subject: [PATCH 5/9] Ada: drop unneeded x32 variant of System.Linux
-
----
- gcc/ada/Makefile.rtl              |   1 -
- gcc/ada/libgnarl/s-linux__x32.ads | 114 ------------------------------
- 2 files changed, 115 deletions(-)
- delete mode 100644 gcc/ada/libgnarl/s-linux__x32.ads
-
-diff --git a/src/gcc/ada/Makefile.rtl b/src/gcc/ada/Makefile.rtl
-index 8b34047..7bcfb81 100644
---- a/src/gcc/ada/Makefile.rtl
-+++ b/src/gcc/ada/Makefile.rtl
-@@ -2618,7 +2618,6 @@ ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
-   a-synbar.ads<libgnarl/a-synbar__posix.ads \
-   s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
-   s-intman.adb<libgnarl/s-intman__posix.adb \
--  s-linux.ads<libgnarl/s-linux__x32.ads \
-   s-mudido.adb<libgnarl/s-mudido__affinity.adb \
-   s-osinte.ads<libgnarl/s-osinte__linux.ads \
-   s-osinte.adb<libgnarl/s-osinte__x32.adb \
-diff --git a/src/gcc/ada/libgnarl/s-linux__x32.ads b/src/gcc/ada/libgnarl/s-linux__x32.ads
-deleted file mode 100644
-index e586ae0..0000000
---- a/src/gcc/ada/libgnarl/s-linux__x32.ads
-+++ /dev/null
-@@ -1,114 +0,0 @@
--------------------------------------------------------------------------------
----                                                                          --
----                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
----                                                                          --
----                          S Y S T E M .  L I N U X                        --
----                                                                          --
----                                  S p e c                                 --
----                                                                          --
----          Copyright (C) 2013-2024, 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 x32 version of this package
--
----  This package encapsulates cpu specific differences between implementations
----  of GNU/Linux, in order to share s-osinte-linux.ads.
--
----  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
--
--with Interfaces.C;
--
--package System.Linux is
--   pragma Preelaborate;
--
--   ----------
--   -- Time --
--   ----------
--
--   subtype clockid_t   is Interfaces.C.int;
--
--   -----------
--   -- Errno --
--   -----------
--
--   EAGAIN    : constant := 11;
--   EINTR     : constant := 4;
--   EINVAL    : constant := 22;
--   ENOMEM    : constant := 12;
--   EPERM     : constant := 1;
--   ETIMEDOUT : constant := 110;
--
--   -------------
--   -- Signals --
--   -------------
--
--   SIGHUP     : constant := 1; --  hangup
--   SIGINT     : constant := 2; --  interrupt (rubout)
--   SIGQUIT    : constant := 3; --  quit (ASCD FS)
--   SIGILL     : constant := 4; --  illegal instruction (not reset)
--   SIGTRAP    : constant := 5; --  trace trap (not reset)
--   SIGIOT     : constant := 6; --  IOT instruction
--   SIGABRT    : constant := 6; --  used by abort, replace SIGIOT in the future
--   SIGFPE     : constant := 8; --  floating point exception
--   SIGKILL    : constant := 9; --  kill (cannot be caught or ignored)
--   SIGBUS     : constant := 7; --  bus error
--   SIGUSR1    : constant := 10; --  user defined signal 1
--   SIGSEGV    : constant := 11; --  segmentation violation
--   SIGUSR2    : constant := 12; --  user defined signal 2
--   SIGPIPE    : constant := 13; --  write on a pipe with no one to read it
--   SIGALRM    : constant := 14; --  alarm clock
--   SIGTERM    : constant := 15; --  software termination signal from kill
--   SIGSTKFLT  : constant := 16; --  coprocessor stack fault (Linux)
--   SIGCLD     : constant := 17; --  alias for SIGCHLD
--   SIGCHLD    : constant := 17; --  child status change
--   SIGSTOP    : constant := 19; --  stop (cannot be caught or ignored)
--   SIGTSTP    : constant := 20; --  user stop requested from tty
--   SIGCONT    : constant := 18; --  stopped process has been continued
--   SIGTTIN    : constant := 21; --  background tty read attempted
--   SIGTTOU    : constant := 22; --  background tty write attempted
--   SIGURG     : constant := 23; --  urgent condition on IO channel
--   SIGXCPU    : constant := 24; --  CPU time limit exceeded
--   SIGXFSZ    : constant := 25; --  filesize limit exceeded
--   SIGVTALRM  : constant := 26; --  virtual timer expired
--   SIGPROF    : constant := 27; --  profiling timer expired
--   SIGWINCH   : constant := 28; --  window size change
--   SIGPOLL    : constant := 29; --  pollable event occurred
--   SIGIO      : constant := 29; --  I/O now possible (4.2 BSD)
--   SIGLOST    : constant := 29; --  File lock lost
--   SIGPWR     : constant := 30; --  power-fail restart
--   SIGSYS     : constant := 31; --  bad system call
--   SIGUNUSED  : constant := 31; --  unused signal (mapped to SIGSYS)
--   SIG32      : constant := 32; --  glibc internal signal
--   SIG33      : constant := 33; --  glibc internal signal
--   SIG34      : constant := 34; --  glibc internal signal
--
--   --  struct_sigaction offsets
--
--   sa_handler_pos : constant := 0;
--   sa_mask_pos    : constant := Standard'Address_Size / 8;
--   sa_flags_pos   : constant := 128 + sa_mask_pos;
--
--   SA_SIGINFO  : constant := 16#04#;
--   SA_ONSTACK  : constant := 16#08000000#;
--
--end System.Linux;
--- 
-2.39.2
-
diff --git a/debian/patches/0006-Ada-drop-unneeded-posix2008-variant-of-System.Parame.diff b/debian/patches/0006-Ada-drop-unneeded-posix2008-variant-of-System.Parame.diff
deleted file mode 100644
index 7e208de0..00000000
--- a/debian/patches/0006-Ada-drop-unneeded-posix2008-variant-of-System.Parame.diff
+++ /dev/null
@@ -1,229 +0,0 @@
-From 135d79c7622faf09e1fe6ba8b1ac4f119079e32d Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Sat, 30 Mar 2024 17:32:51 +0100
-Subject: [PATCH 6/9] Ada: drop unneeded posix2008 variant of System.Parameters
-
----
- gcc/ada/Makefile.rtl                    |   3 -
- gcc/ada/libgnat/s-parame__posix2008.ads | 181 ------------------------
- 2 files changed, 184 deletions(-)
- delete mode 100644 gcc/ada/libgnat/s-parame__posix2008.ads
-
-diff --git a/src/gcc/ada/Makefile.rtl b/src/gcc/ada/Makefile.rtl
-index 7bcfb81..82d01b2 100644
---- a/src/gcc/ada/Makefile.rtl
-+++ b/src/gcc/ada/Makefile.rtl
-@@ -1955,7 +1955,6 @@ ifeq ($(strip $(filter-out lynxos178%,$(target_os))),)
- 
-   ifeq ($(strip $(filter-out lynxos178e,$(target_os))),)
-     LIBGNAT_TARGET_PAIRS += \
--    s-parame.ads<libgnat/s-parame__posix2008.ads \
-     s-osinte.ads<libgnarl/s-osinte__lynxos178e.ads \
-     s-osprim.adb<libgnat/s-osprim__posix2008.adb \
-     s-tracon.adb<hie/s-tracon__ppc-eabi.adb
-@@ -1976,7 +1975,6 @@ ifeq ($(strip $(filter-out rtems%,$(target_os))),)
-   s-osinte.ads<libgnarl/s-osinte__rtems.ads \
-   s-osprim.adb<libgnat/s-osprim__rtems.adb \
-   s-parame.adb<libgnat/s-parame__rtems.adb \
--  s-parame.ads<libgnat/s-parame__posix2008.ads \
-   s-taprop.adb<libgnarl/s-taprop__rtems.adb \
-   s-taspri.ads<libgnarl/s-taspri__posix.ads \
-   s-tpopsp.adb<libgnarl/s-tpopsp__tls.adb \
-@@ -2622,7 +2620,6 @@ ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
-   s-osinte.ads<libgnarl/s-osinte__linux.ads \
-   s-osinte.adb<libgnarl/s-osinte__x32.adb \
-   s-osprim.adb<libgnat/s-osprim__x32.adb \
--  s-parame.ads<libgnat/s-parame__posix2008.ads \
-   s-taprop.adb<libgnarl/s-taprop__linux.adb \
-   s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
-   s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
-diff --git a/src/gcc/ada/libgnat/s-parame__posix2008.ads b/src/gcc/ada/libgnat/s-parame__posix2008.ads
-deleted file mode 100644
-index 5d4cf28..0000000
---- a/src/gcc/ada/libgnat/s-parame__posix2008.ads
-+++ /dev/null
-@@ -1,181 +0,0 @@
--------------------------------------------------------------------------------
----                                                                          --
----                         GNAT COMPILER COMPONENTS                         --
----                                                                          --
----                    S Y S T E M . P A R A M E T E R S                     --
----                                                                          --
----                                 S p e c                                  --
----                                                                          --
----          Copyright (C) 1992-2024, Free Software Foundation, Inc.         --
----                                                                          --
---- GNAT 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/>.                                          --
----                                                                          --
---- GNAT was originally developed  by the GNAT team at  New York University. --
---- Extensive contributions were provided by Ada Core Technologies Inc.      --
----                                                                          --
--------------------------------------------------------------------------------
--
----  This is the Posix 2008 version for 64 bit time_t.
--
----  This package defines some system dependent parameters for GNAT. These
----  are values that are referenced by the runtime library and are therefore
----  relevant to the target machine.
--
----  The parameters whose value is defined in the spec are not generally
----  expected to be changed. If they are changed, it will be necessary to
----  recompile the run-time library.
--
----  The parameters which are defined by functions can be changed by modifying
----  the body of System.Parameters in file s-parame.adb. A change to this body
----  requires only rebinding and relinking of the application.
--
----  Note: do not introduce any pragma Inline statements into this unit, since
----  otherwise the relinking and rebinding capability would be deactivated.
--
--package System.Parameters is
--   pragma Pure;
--
--   ---------------------------------------
--   -- Task And Stack Allocation Control --
--   ---------------------------------------
--
--   type Size_Type is range -Memory_Size / 2 .. Memory_Size / 2 - 1;
--   --  Type used to provide task stack sizes to the runtime. Sized to permit
--   --  stack sizes of up to half the total addressable memory space. This may
--   --  seem excessively large (even for 32-bit systems), however there are many
--   --  instances of users requiring large stack sizes (for example string
--   --  processing).
--
--   Unspecified_Size : constant Size_Type := Size_Type'First;
--   --  Value used to indicate that no size type is set
--
--   function Default_Stack_Size return Size_Type;
--   --  Default task stack size used if none is specified
--
--   function Minimum_Stack_Size return Size_Type;
--   --  Minimum task stack size permitted
--
--   function Adjust_Storage_Size (Size : Size_Type) return Size_Type;
--   --  Given the storage size stored in the TCB, return the Storage_Size
--   --  value required by the RM for the Storage_Size attribute. The
--   --  required adjustment is as follows:
--   --
--   --    when Size = Unspecified_Size, return Default_Stack_Size
--   --    when Size < Minimum_Stack_Size, return Minimum_Stack_Size
--   --    otherwise return given Size
--
--   Default_Env_Stack_Size : constant Size_Type := 8_192_000;
--   --  Assumed size of the environment task, if no other information is
--   --  available. This value is used when stack checking is enabled and
--   --  no GNAT_STACK_LIMIT environment variable is set.
--
--   Stack_Grows_Down  : constant Boolean := True;
--   --  This constant indicates whether the stack grows up (False) or
--   --  down (True) in memory as functions are called. It is used for
--   --  proper implementation of the stack overflow check.
--
--   Runtime_Default_Sec_Stack_Size : constant Size_Type := 10 * 1024;
--   --  The run-time chosen default size for secondary stacks that may be
--   --  overridden by the user with the use of binder -D switch.
--
--   Sec_Stack_Dynamic : constant Boolean := True;
--   --  Indicates if secondary stacks can grow and shrink at run-time. If False,
--   --  the size of a secondary stack is fixed at the point of its creation.
--
--   ----------------------------------------------
--   -- Characteristics of types in Interfaces.C --
--   ----------------------------------------------
--
--   long_bits : constant := Long_Integer'Size;
--   --  Number of bits in type long and unsigned_long. The normal convention
--   --  is that this is the same as type Long_Integer, but this may not be true
--   --  of all targets.
--
--   ptr_bits  : constant := Standard'Address_Size;
--   subtype C_Address is System.Address;
--   --  Number of bits in Interfaces.C pointers, normally a standard address
--
--   C_Malloc_Linkname : constant String := "__gnat_malloc";
--   --  Name of runtime function used to allocate such a pointer
--
--   ----------------------------------------------
--   -- Behavior of Pragma Finalize_Storage_Only --
--   ----------------------------------------------
--
--   --  Garbage_Collected is a Boolean constant whose value indicates the
--   --  effect of the pragma Finalize_Storage_Entry on a controlled type.
--
--   --    Garbage_Collected = False
--
--   --      The system releases all storage on program termination only,
--   --      but not other garbage collection occurs, so finalization calls
--   --      are omitted only for outer level objects can be omitted if
--   --      pragma Finalize_Storage_Only is used.
--
--   --    Garbage_Collected = True
--
--   --      The system provides full garbage collection, so it is never
--   --      necessary to release storage for controlled objects for which
--   --      a pragma Finalize_Storage_Only is used.
--
--   Garbage_Collected : constant Boolean := False;
--   --  The storage mode for this system (release on program exit)
--
--   ---------------------
--   -- Tasking Profile --
--   ---------------------
--
--   --  In the following sections, constant parameters are defined to
--   --  allow some optimizations and fine tuning within the tasking run time
--   --  based on restrictions on the tasking features.
--
--   -------------------
--   -- Task Abortion --
--   -------------------
--
--   No_Abort : constant Boolean := False;
--   --  This constant indicates whether abort statements and asynchronous
--   --  transfer of control (ATC) are disallowed. If set to True, it is
--   --  assumed that neither construct is used, and the run time does not
--   --  need to defer/undefer abort and check for pending actions at
--   --  completion points. A value of True for No_Abort corresponds to:
--   --  pragma Restrictions (No_Abort_Statements);
--   --  pragma Restrictions (Max_Asynchronous_Select_Nesting => 0);
--
--   ---------------------
--   -- Task Attributes --
--   ---------------------
--
--   Max_Attribute_Count : constant := 32;
--   --  Number of task attributes stored in the task control block
--
--   -----------------------
--   -- Task Image Length --
--   -----------------------
--
--   Max_Task_Image_Length : constant := 256;
--   --  This constant specifies the maximum length of a task's image
--
--   ------------------------------
--   -- Exception Message Length --
--   ------------------------------
--
--   Default_Exception_Msg_Max_Length : constant := 200;
--   --  This constant specifies the default number of characters to allow
--   --  in an exception message (200 is minimum required by RM 11.4.1(18)).
--
--end System.Parameters;
--- 
-2.39.2
-
diff --git a/debian/patches/0007-Ada-drop-unneeded-darwin-solaris-x32-variants-of-Sys.diff b/debian/patches/0007-Ada-drop-unneeded-darwin-solaris-x32-variants-of-Sys.diff
deleted file mode 100644
index c325ff0e..00000000
--- a/debian/patches/0007-Ada-drop-unneeded-darwin-solaris-x32-variants-of-Sys.diff
+++ /dev/null
@@ -1,472 +0,0 @@
-From 943270964c66eee60fe3f75659978479ad2d54ae Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Sun, 21 Apr 2024 19:52:28 +0200
-Subject: [PATCH 7/9] Ada: drop unneeded darwin, solaris, x32 variants of
- System.OS_Primitives
-
----
- gcc/ada/Makefile.rtl                  |  14 +--
- gcc/ada/libgnat/s-osprim__darwin.adb  | 130 --------------------------
- gcc/ada/libgnat/s-osprim__solaris.adb | 115 -----------------------
- gcc/ada/libgnat/s-osprim__x32.adb     | 123 ------------------------
- 4 files changed, 7 insertions(+), 375 deletions(-)
- delete mode 100644 gcc/ada/libgnat/s-osprim__darwin.adb
- delete mode 100644 gcc/ada/libgnat/s-osprim__solaris.adb
- delete mode 100644 gcc/ada/libgnat/s-osprim__x32.adb
-
-diff --git a/src/gcc/ada/Makefile.rtl b/src/gcc/ada/Makefile.rtl
-index 82d01b2..1f339f3 100644
---- a/src/gcc/ada/Makefile.rtl
-+++ b/src/gcc/ada/Makefile.rtl
-@@ -1461,7 +1461,7 @@ ifeq ($(strip $(filter-out sparc% sun solaris%,$(target_cpu) $(target_vendor) $(
-   s-mudido.adb<libgnarl/s-mudido__affinity.adb \
-   s-osinte.adb<libgnarl/s-osinte__solaris.adb \
-   s-osinte.ads<libgnarl/s-osinte__solaris.ads \
--  s-osprim.adb<libgnat/s-osprim__solaris.adb \
-+  s-osprim.adb<libgnat/s-osprim__unix.adb \
-   s-taprop.adb<libgnarl/s-taprop__solaris.adb \
-   s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
-   s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
-@@ -1504,7 +1504,7 @@ ifeq ($(strip $(filter-out %86 %x86_64 solaris2%,$(target_cpu) $(target_os))),)
-   s-mudido.adb<libgnarl/s-mudido__affinity.adb \
-   s-osinte.adb<libgnarl/s-osinte__solaris.adb \
-   s-osinte.ads<libgnarl/s-osinte__solaris.ads \
--  s-osprim.adb<libgnat/s-osprim__solaris.adb \
-+  s-osprim.adb<libgnat/s-osprim__unix.adb \
-   s-taprop.adb<libgnarl/s-taprop__solaris.adb \
-   s-tasinf.adb<libgnarl/s-tasinf__solaris.adb \
-   s-tasinf.ads<libgnarl/s-tasinf__solaris.ads \
-@@ -2619,7 +2619,7 @@ ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
-   s-mudido.adb<libgnarl/s-mudido__affinity.adb \
-   s-osinte.ads<libgnarl/s-osinte__linux.ads \
-   s-osinte.adb<libgnarl/s-osinte__x32.adb \
--  s-osprim.adb<libgnat/s-osprim__x32.adb \
-+  s-osprim.adb<libgnat/s-osprim__rtems.adb \
-   s-taprop.adb<libgnarl/s-taprop__linux.adb \
-   s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
-   s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
-@@ -2703,7 +2703,7 @@ ifeq ($(strip $(filter-out darwin%,$(target_os))),)
-   ifeq ($(strip $(filter-out %86,$(target_cpu))),)
-     LIBGNAT_TARGET_PAIRS += \
-       s-intman.adb<libgnarl/s-intman__susv3.adb \
--      s-osprim.adb<libgnat/s-osprim__darwin.adb \
-+      s-osprim.adb<libgnat/s-osprim__rtems.adb \
-       $(ATOMICS_TARGET_PAIRS) \
-       system.ads<libgnat/system-darwin-x86.ads
- 
-@@ -2722,7 +2722,7 @@ ifeq ($(strip $(filter-out darwin%,$(target_os))),)
-   ifeq ($(strip $(filter-out %x86_64,$(target_cpu))),)
-     LIBGNAT_TARGET_PAIRS += \
-       s-intman.adb<libgnarl/s-intman__susv3.adb \
--      s-osprim.adb<libgnat/s-osprim__darwin.adb \
-+      s-osprim.adb<libgnat/s-osprim__rtems.adb \
-       a-exetim.ads<libgnarl/a-exetim__default.ads \
-       a-exetim.adb<libgnarl/a-exetim__darwin.adb \
-       $(ATOMICS_TARGET_PAIRS) \
-@@ -2769,7 +2769,7 @@ ifeq ($(strip $(filter-out darwin%,$(target_os))),)
-   ifeq ($(strip $(filter-out arm,$(target_cpu))),)
-     LIBGNAT_TARGET_PAIRS += \
-       s-intman.adb<libgnarl/s-intman__susv3.adb \
--      s-osprim.adb<libgnat/s-osprim__darwin.adb \
-+      s-osprim.adb<libgnat/s-osprim__rtems.adb \
-       $(ATOMICS_TARGET_PAIRS) \
-       $(ATOMICS_BUILTINS_TARGET_PAIRS)
- 
-@@ -2782,7 +2782,7 @@ ifeq ($(strip $(filter-out darwin%,$(target_os))),)
-       a-nallfl.ads<libgnat/a-nallfl__wraplf.ads \
-       s-intman.adb<libgnarl/s-intman__susv3.adb \
-       s-dorepr.adb<libgnat/s-dorepr__fma.adb \
--      s-osprim.adb<libgnat/s-osprim__darwin.adb \
-+      s-osprim.adb<libgnat/s-osprim__rtems.adb \
-       $(ATOMICS_TARGET_PAIRS) \
-       $(ATOMICS_BUILTINS_TARGET_PAIRS) \
-       $(GNATRTL_128BIT_PAIRS)
-diff --git a/src/gcc/ada/libgnat/s-osprim__darwin.adb b/src/gcc/ada/libgnat/s-osprim__darwin.adb
-deleted file mode 100644
-index 5f75688..0000000
---- a/src/gcc/ada/libgnat/s-osprim__darwin.adb
-+++ /dev/null
-@@ -1,130 +0,0 @@
--------------------------------------------------------------------------------
----                                                                          --
----                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
----                                                                          --
----                  S Y S T E M . O S _ P R I M I T I V E S                 --
----                                                                          --
----                                  B o d y                                 --
----                                                                          --
----          Copyright (C) 1998-2024, 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 version is for darwin
--
--with System.C_Time;
--package body System.OS_Primitives is
--
--   --  ??? 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.
--
--   type struct_timezone is record
--      tz_minuteswest  : Integer;
--      tz_dsttime   : Integer;
--   end record;
--   pragma Convention (C, struct_timezone);
--   type struct_timezone_ptr is access all struct_timezone;
--
--   function gettimeofday
--     (tv : not null access C_Time.timeval;
--      tz : struct_timezone_ptr) return Integer;
--   pragma Import (C, gettimeofday, "gettimeofday");
--
--   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
--                      return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
--
--   -----------
--   -- Clock --
--   -----------
--
--   function Clock return Duration is
--      TV     : aliased C_Time.timeval;
--
--      Result : Integer;
--      pragma Unreferenced (Result);
--
--   begin
--      --  The return codes for gettimeofday are as follows (from man pages):
--      --    EPERM  settimeofday is called by someone other than the superuser
--      --    EINVAL Timezone (or something else) is invalid
--      --    EFAULT One of tv or tz pointed outside accessible address space
--
--      --  None of these codes signal a potential clock skew, hence the return
--      --  value is never checked.
--
--      Result := gettimeofday (TV'Access, null);
--      return C_Time.To_Duration (TV);
--   end Clock;
--
--   -----------------
--   -- Timed_Delay --
--   -----------------
--
--   procedure Timed_Delay
--     (Time : Duration;
--      Mode : Integer)
--   is
--      Request    : aliased C_Time.timespec;
--      Remaind    : aliased C_Time.timespec;
--      Rel_Time   : Duration;
--      Abs_Time   : Duration;
--      Base_Time  : constant Duration := Clock;
--      Check_Time : Duration := Base_Time;
--
--      Result : Integer;
--      pragma Unreferenced (Result);
--
--   begin
--      if Mode = Relative then
--         Rel_Time := Time;
--         Abs_Time := Time + Check_Time;
--      else
--         Rel_Time := Time - Check_Time;
--         Abs_Time := Time;
--      end if;
--
--      if Rel_Time > 0.0 then
--         loop
--            Request := C_Time.To_Timespec (Rel_Time);
--            Result := nanosleep (Request'Access, Remaind'Access);
--            Check_Time := Clock;
--
--            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
--
--            Rel_Time := Abs_Time - Check_Time;
--         end loop;
--      end if;
--   end Timed_Delay;
--
--   ----------------
--   -- Initialize --
--   ----------------
--
--   procedure Initialize is
--   begin
--      null;
--   end Initialize;
--
--end System.OS_Primitives;
-diff --git a/src/gcc/ada/libgnat/s-osprim__solaris.adb b/src/gcc/ada/libgnat/s-osprim__solaris.adb
-deleted file mode 100644
-index 70c8dc4..0000000
---- a/src/gcc/ada/libgnat/s-osprim__solaris.adb
-+++ /dev/null
-@@ -1,115 +0,0 @@
--------------------------------------------------------------------------------
----                                                                          --
----                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
----                                                                          --
----                  S Y S T E M . O S _ P R I M I T I V E S                 --
----                                                                          --
----                                  B o d y                                 --
----                                                                          --
----          Copyright (C) 1998-2024, 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 version uses gettimeofday and select
----  This file is suitable for Solaris (32 and 64 bits).
--
--with System.C_Time;
--
--package body System.OS_Primitives is
--
--   --  ??? 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.
--
--   procedure gettimeofday
--     (tv : not null access C_Time.timeval;
--      tz : Address := Null_Address);
--   pragma Import (C, gettimeofday, "gettimeofday");
--
--   procedure C_select
--     (n         : Integer := 0;
--      readfds,
--      writefds,
--      exceptfds : Address := Null_Address;
--      timeout   : not null access C_Time.timeval);
--   pragma Import (C, C_select, "select");
--
--   -----------
--   -- Clock --
--   -----------
--
--   function Clock return Duration is
--      TV : aliased C_Time.timeval;
--
--   begin
--      gettimeofday (TV'Access);
--      return C_Time.To_Duration (TV);
--   end Clock;
--
--   -----------------
--   -- Timed_Delay --
--   -----------------
--
--   procedure Timed_Delay
--     (Time : Duration;
--      Mode : Integer)
--   is
--      Rel_Time   : Duration;
--      Abs_Time   : Duration;
--      Base_Time  : constant Duration := Clock;
--      Check_Time : Duration := Base_Time;
--      timeval    : aliased C_Time.timeval;
--
--   begin
--      if Mode = Relative then
--         Rel_Time := Time;
--         Abs_Time := Time + Check_Time;
--      else
--         Rel_Time := Time - Check_Time;
--         Abs_Time := Time;
--      end if;
--
--      if Rel_Time > 0.0 then
--         loop
--            timeval := C_Time.To_Timeval (Rel_Time);
--
--            C_select (timeout => timeval'Unchecked_Access);
--            Check_Time := Clock;
--
--            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
--
--            Rel_Time := Abs_Time - Check_Time;
--         end loop;
--      end if;
--   end Timed_Delay;
--
--   ----------------
--   -- Initialize --
--   ----------------
--
--   procedure Initialize is
--   begin
--      null;
--   end Initialize;
--
--end System.OS_Primitives;
-diff --git a/src/gcc/ada/libgnat/s-osprim__x32.adb b/src/gcc/ada/libgnat/s-osprim__x32.adb
-deleted file mode 100644
-index 644c41c..0000000
---- a/src/gcc/ada/libgnat/s-osprim__x32.adb
-+++ /dev/null
-@@ -1,123 +0,0 @@
--------------------------------------------------------------------------------
----                                                                          --
----                 GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                 --
----                                                                          --
----                  S Y S T E M . O S _ P R I M I T I V E S                 --
----                                                                          --
----                                  B o d y                                 --
----                                                                          --
----             Copyright (C) 2013-2024, 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 version is for Linux/x32
--
--with System.C_Time;
--
--package body System.OS_Primitives is
--
--   --  ??? 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.
--
--   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
--                      return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
--
--   -----------
--   -- Clock --
--   -----------
--
--   function Clock return Duration is
--      TV     : aliased C_Time.timeval;
--      Result : Integer;
--      pragma Unreferenced (Result);
--
--      function gettimeofday
--        (Tv : access C_Time.timeval;
--         Tz : System.Address := System.Null_Address) return Integer;
--      pragma Import (C, gettimeofday, "gettimeofday");
--
--   begin
--      --  The return codes for gettimeofday are as follows (from man pages):
--      --    EPERM  settimeofday is called by someone other than the superuser
--      --    EINVAL Timezone (or something else) is invalid
--      --    EFAULT One of tv or tz pointed outside accessible address space
--
--      --  None of these codes signal a potential clock skew, hence the return
--      --  value is never checked.
--
--      Result := gettimeofday (TV'Access, System.Null_Address);
--      return C_Time.To_Duration (TV);
--   end Clock;
--
--   -----------------
--   -- Timed_Delay --
--   -----------------
--
--   procedure Timed_Delay
--     (Time : Duration;
--      Mode : Integer)
--   is
--      Request    : aliased C_Time.timespec;
--      Remaind    : aliased C_Time.timespec;
--      Rel_Time   : Duration;
--      Abs_Time   : Duration;
--      Base_Time  : constant Duration := Clock;
--      Check_Time : Duration := Base_Time;
--
--      Result : Integer;
--      pragma Unreferenced (Result);
--
--   begin
--      if Mode = Relative then
--         Rel_Time := Time;
--         Abs_Time := Time + Check_Time;
--      else
--         Rel_Time := Time - Check_Time;
--         Abs_Time := Time;
--      end if;
--
--      if Rel_Time > 0.0 then
--         loop
--            Request := C_Time.To_Timespec (Rel_Time);
--            Result := nanosleep (Request'Access, Remaind'Access);
--            Check_Time := Clock;
--
--            exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
--
--            Rel_Time := Abs_Time - Check_Time;
--         end loop;
--      end if;
--   end Timed_Delay;
--
--   ----------------
--   -- Initialize --
--   ----------------
--
--   procedure Initialize is
--   begin
--      null;
--   end Initialize;
--
--end System.OS_Primitives;
--- 
-2.39.2
-
diff --git a/debian/patches/0008-Ada-import-nanosleep-from-System.OS_Primitives.Timed.diff b/debian/patches/0008-Ada-import-nanosleep-from-System.OS_Primitives.Timed.diff
deleted file mode 100644
index 9fed4ad0..00000000
--- a/debian/patches/0008-Ada-import-nanosleep-from-System.OS_Primitives.Timed.diff
+++ /dev/null
@@ -1,74 +0,0 @@
-From 2bcae0199842035b99ae28659f821b51fbc9b537 Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
-Date: Wed, 3 Apr 2024 17:43:50 +0200
-Subject: [PATCH 8/9] Ada: import nanosleep from
- System.OS_Primitives.Timed_Delay
-
-It improves readability to import this C function in the file where it
-is actually used.
----
- gcc/ada/libgnat/s-optide.adb            | 7 +++++++
- gcc/ada/libgnat/s-osprim__posix.adb     | 9 ---------
- gcc/ada/libgnat/s-osprim__posix2008.adb | 8 --------
- 3 files changed, 7 insertions(+), 17 deletions(-)
-
-diff --git a/src/gcc/ada/libgnat/s-optide.adb b/src/gcc/ada/libgnat/s-optide.adb
-index e15493c..4ad16a2 100644
---- a/src/gcc/ada/libgnat/s-optide.adb
-+++ b/src/gcc/ada/libgnat/s-optide.adb
-@@ -36,6 +36,13 @@ procedure Timed_Delay
-   (Time : Duration;
-    Mode : Integer)
- is
-+
-+   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
-+                      return Integer
-+     with Import,
-+          Convention => C,
-+          External_Name => "nanosleep";
-+
-    Request    : aliased C_Time.timespec;
-    Remaind    : aliased C_Time.timespec;
-    Rel_Time   : Duration;
-diff --git a/src/gcc/ada/libgnat/s-osprim__posix.adb b/src/gcc/ada/libgnat/s-osprim__posix.adb
-index bb9a28d..b331d5c 100644
---- a/src/gcc/ada/libgnat/s-osprim__posix.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__posix.adb
-@@ -34,15 +34,6 @@ with System.C_Time;
- 
- package body System.OS_Primitives is
- 
--   --  ??? 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.
--
--   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
--                      return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
--
-    -----------
-    -- Clock --
-    -----------
-diff --git a/src/gcc/ada/libgnat/s-osprim__posix2008.adb b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-index 377fb3a..7f44efa 100644
---- a/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-+++ b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-@@ -39,14 +39,6 @@ package body System.OS_Primitives is
- 
-    subtype int is System.CRTL.int;
- 
--   --  ??? 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 to the spec.
--
--   function nanosleep (rqtp, rmtp : not null access C_Time.timespec)
--                      return Integer;
--   pragma Import (C, nanosleep, "nanosleep");
--
-    -----------
-    -- Clock --
-    -----------
--- 
-2.39.2
-
diff --git a/debian/patches/0009-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff b/debian/patches/0009-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
index 9186b209..059ba67f 100644
--- a/debian/patches/0009-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
+++ b/debian/patches/0009-Ada-select-64-bits-time-functions-from-GNU-libc-when.diff
@@ -1,22 +1,28 @@
-From a40087b15892f6870d51842b1f6a8f019bcbee3b Mon Sep 17 00:00:00 2001
-From: Nicolas Boulenguez <nicolas.bouleng...@free.fr>
+From 40f8f487e14bff98c270fc559c7ea814ccf1534a Mon Sep 17 00:00:00 2001
+From: Nicolas Boulenguez <nico...@debian.org>
 Date: Fri, 26 Apr 2024 20:08:21 +0200
-Subject: [PATCH 9/9] Ada: select 64 bits time functions from GNU libc when
- __USE_TIME_BITS64
+Subject: [PATCH 2/8] Ada: select 64 bits time functions from GNU libc when
+ __USE_TIME64_REDIRECTS [PR114065]
 
-else Ada.Calendar returns random dates on system affected by the
-Y2038 Glibc transition (pr114065).
+Without this, on system affected by the Y2038 Glibc transition,
+Ada.Calendar imports the 32 bits version of the C date functions but
+reads 64 bits types from memory.
+
+The interaction of __USE_TIME64_REDIRECTS, __TIMESIZE==32 and
+__USE_TIME_BITS64 has changed with libc 2.39 (fix by Simon Chopin).
+
+PR ada/114065
+Signed-off-by: Nicolas Boulenguez <nico...@debian.org>
 ---
  gcc/ada/libgnarl/a-exetim__posix.adb        |  5 ++++-
  gcc/ada/libgnarl/s-osinte__gnu.ads          | 14 ++++++++++----
  gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads | 14 ++++++++++----
  gcc/ada/libgnarl/s-osinte__linux.ads        | 10 +++++++---
  gcc/ada/libgnat/g-spogwa.adb                |  4 +++-
- gcc/ada/libgnat/s-optide.adb                |  3 ++-
- gcc/ada/libgnat/s-osprim__posix.adb         |  4 +++-
- gcc/ada/libgnat/s-osprim__posix2008.adb     |  3 ++-
+ gcc/ada/libgnat/s-osprim__posix.adb         |  7 +++++--
+ gcc/ada/libgnat/s-osprim__posix2008.adb     |  6 ++++--
  gcc/ada/s-oscons-tmplt.c                    | 16 ++++++++++++++++
- 9 files changed, 57 insertions(+), 16 deletions(-)
+ 8 files changed, 59 insertions(+), 17 deletions(-)
 
 diff --git a/src/gcc/ada/libgnarl/a-exetim__posix.adb b/src/gcc/ada/libgnarl/a-exetim__posix.adb
 index db873fb..7fbd6c1 100644
@@ -42,7 +48,7 @@ index db873fb..7fbd6c1 100644
  
        function pthread_getcpuclockid
 diff --git a/src/gcc/ada/libgnarl/s-osinte__gnu.ads b/src/gcc/ada/libgnarl/s-osinte__gnu.ads
-index b4597c5..90ef2d5 100644
+index b4597c5..08884ec 100644
 --- a/src/gcc/ada/libgnarl/s-osinte__gnu.ads
 +++ b/src/gcc/ada/libgnarl/s-osinte__gnu.ads
 @@ -39,6 +39,7 @@
@@ -188,22 +194,8 @@ index 530a6cd..598f3fc 100644
  
     Timeout_V : aliased System.C_Time.timeval;
     Timeout_A : access System.C_Time.timeval;
-diff --git a/src/gcc/ada/libgnat/s-optide.adb b/src/gcc/ada/libgnat/s-optide.adb
-index 4ad16a2..a9025d0 100644
---- a/src/gcc/ada/libgnat/s-optide.adb
-+++ b/src/gcc/ada/libgnat/s-optide.adb
-@@ -41,7 +41,8 @@ is
-                       return Integer
-      with Import,
-           Convention => C,
--          External_Name => "nanosleep";
-+          External_Name => (if OS_Constants.Glibc_Use_Time_Bits64
-+            then "__nanosleep64" else "nanosleep");
- 
-    Request    : aliased C_Time.timespec;
-    Remaind    : aliased C_Time.timespec;
 diff --git a/src/gcc/ada/libgnat/s-osprim__posix.adb b/src/gcc/ada/libgnat/s-osprim__posix.adb
-index b331d5c..f647968 100644
+index bb9a28d..9e86121 100644
 --- a/src/gcc/ada/libgnat/s-osprim__posix.adb
 +++ b/src/gcc/ada/libgnat/s-osprim__posix.adb
 @@ -31,6 +31,7 @@
@@ -214,7 +206,17 @@ index b331d5c..f647968 100644
  
  package body System.OS_Primitives is
  
-@@ -47,7 +48,8 @@ package body System.OS_Primitives is
+@@ -41,7 +42,8 @@ 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, (if OS_Constants.Glibc_Use_Time_Bits64
++     then "__nanosleep64" else "nanosleep"));
+ 
+    -----------
+    -- Clock --
+@@ -56,7 +58,8 @@ package body System.OS_Primitives is
        function gettimeofday
          (Tv : access C_Time.timeval;
           Tz : System.Address := System.Null_Address) return Integer;
@@ -225,10 +227,20 @@ index b331d5c..f647968 100644
     begin
        --  The return codes for gettimeofday are as follows (from man pages):
 diff --git a/src/gcc/ada/libgnat/s-osprim__posix2008.adb b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-index 7f44efa..0dbde83 100644
+index 377fb3a..76823c1 100644
 --- a/src/gcc/ada/libgnat/s-osprim__posix2008.adb
 +++ b/src/gcc/ada/libgnat/s-osprim__posix2008.adb
-@@ -54,7 +54,8 @@ package body System.OS_Primitives is
+@@ -45,7 +45,8 @@ 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, (if OS_Constants.Glibc_Use_Time_Bits64
++     then "__nanosleep64" else "nanosleep"));
+ 
+    -----------
+    -- Clock --
+@@ -62,7 +63,8 @@ package body System.OS_Primitives is
        function clock_gettime
          (clock_id : clockid_t;
           tp       : access C_Time.timespec) return int;
@@ -239,11 +251,11 @@ index 7f44efa..0dbde83 100644
     begin
        Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access);
 diff --git a/src/gcc/ada/s-oscons-tmplt.c b/src/gcc/ada/s-oscons-tmplt.c
-index 5beb929..8551d78 100644
+index e5dad44..a64e578 100644
 --- a/src/gcc/ada/s-oscons-tmplt.c
 +++ b/src/gcc/ada/s-oscons-tmplt.c
 @@ -1775,6 +1775,22 @@ CNS(MAX_tv_sec, "")
- CND(SIZEOF_tv_nsec, "tv_nsec, long except on x32");
+ CND(SIZEOF_tv_nsec, "tv_nsec");
  }
  
 +/*
diff --git a/debian/rules.patch b/debian/rules.patch
index 7bb6c802..1f9937cf 100644
--- a/debian/rules.patch
+++ b/debian/rules.patch
@@ -32,14 +32,7 @@ debian_patches += \
 #	libstdc++-pic \
 
 debian_patches += \
-	0001-Ada-remove-conversions-with-C-struct-timeval-from-GN \
-	0002-Ada-remove-conversions-with-C-struct-timespec-from-A \
-	0003-Ada-remove-conversions-with-C-time_t-from-System.OS_ \
 	0004-Ada-merge-all-timeval-and-timespec-definitions-and-c \
-	0005-Ada-drop-unneeded-x32-variant-of-System.Linux \
-	0006-Ada-drop-unneeded-posix2008-variant-of-System.Parame \
-	0007-Ada-drop-unneeded-darwin-solaris-x32-variants-of-Sys \
-	0008-Ada-import-nanosleep-from-System.OS_Primitives.Timed \
 	0009-Ada-select-64-bits-time-functions-from-GNU-libc-when \
 	gcc-textdomain \
 	gcc-distro-specs \
-- 
2.39.2

Reply via email to