diff options
author | Nicolas Boulenguez <nicolas@debian.org> | 2025-07-25 15:02:06 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2025-07-31 17:41:00 +0200 |
commit | 41974d6ed349507ca1532629851b7b5d74f44abc (patch) | |
tree | 8102f899bd44ed9b77157af6404c2db9f6d050ac /gcc | |
parent | d46d8267b5a55e3194e879e691aeee1bc0648bed (diff) | |
download | gcc-41974d6ed349507ca1532629851b7b5d74f44abc.zip gcc-41974d6ed349507ca1532629851b7b5d74f44abc.tar.gz gcc-41974d6ed349507ca1532629851b7b5d74f44abc.tar.bz2 |
Ada: Add System.C_Time and GNAT.C_Time units to libgnat
The first unit provides the time_t, timeval and timespec types corresponding
to the C types defined by the OS, as well as various conversion functions.
The second unit is a mere renaming of the first under the GNAT hierarchy.
This removes C time types and conversions under System, and from bodies and
private parts under GNAT, while keeping visible types and conversions under
GNAT as Obsolescent.
[changelog]
PR ada/114065
* Makefile.rtl (GNATRTL_NONTASKING_OBJS): Add g-c_time$(objext) and
s-c_time$(objext).
(Aarch64/Android): Do not use s-osinte__android.adb.
(SPARC/Solaris): Do not use s-osprim__solaris.adb.
(x86/Solaris): Likewise.
(LynxOS178): Do not use s-parame__posix2008.ads.
(RTEMS): Likewise.
(x32/Linux): Likewise, as well as s-linux__x32.ads. Replace
s-osprim__x32.adb with s-osprim__posix.adb.
(LIBGNAT_OBJS): Remove cal.o.
* cal.c: Delete.
* doc/gnat_rm/the_gnat_library.rst (GNAT.C_Time): New entry.
(GNAT.Calendar): Do not mention the obsolete conversion functions.
* impunit.adb (Non_Imp_File_Names_95): Add g-c_time.
* libgnarl/a-exetim__posix.adb: Add with clause for System.C_Time
(Clock): Use type and functions from System.C_Time.
* libgnarl/s-linux.ads: Remove with clause for System.Parameters.
Remove declarations of C time types.
* libgnarl/s-linux__alpha.ads: Likewise.
* libgnarl/s-linux__android-aarch64.ads: Likewise.
* libgnarl/s-linux__android-arm.ads: Likewise.
* libgnarl/s-linux__hppa.ads: Likewise.
* libgnarl/s-linux__loongarch.ads: Likewise.
* libgnarl/s-linux__mips.ads: Likewise.
* libgnarl/s-linux__riscv.ads: Likewise.
* libgnarl/s-linux__sparc.ads: Likewise.
* libgnarl/s-osinte__aix.ads: Likewise.
* libgnarl/s-osinte__android.ads: Likewise.
* libgnarl/s-osinte__cheribsd.ads: Likewise.
* libgnarl/s-osinte__darwin.ads: Likewise.
* libgnarl/s-osinte__dragonfly.ads: Likewise.
* libgnarl/s-osinte__freebsd.ads: Likewise.
* libgnarl/s-osinte__gnu.ads: Likewise.
* libgnarl/s-osinte__hpux.ads: Likewise.
* libgnarl/s-osinte__kfreebsd-gnu.ads: Likewise.
* libgnarl/s-osinte__linux.ads: Likewise.
* libgnarl/s-osinte__lynxos178e.ads: Likewise.
* libgnarl/s-osinte__qnx.ads: Likewise.
* libgnarl/s-osinte__rtems.ads: Likewise.
* libgnarl/s-osinte__solaris.ads: Likewise.
* libgnarl/s-osinte__vxworks.ads: Likewise.
* libgnarl/s-qnx.ads: Likewise.
* libgnarl/s-linux__x32.ads: Delete.
* libgnarl/s-osinte__darwin.adb (To_Duration): Remove.
(To_Timespec): Likewise.
* libgnarl/s-osinte__aix.adb: Likewise.
* libgnarl/s-osinte__dragonfly.adb: Likewise.
* libgnarl/s-osinte__freebsd.adb: Likewise.
* libgnarl/s-osinte__gnu.adb: Likewise.
* libgnarl/s-osinte__lynxos178.adb: Likewise.
* libgnarl/s-osinte__posix.adb: Likewise.
* libgnarl/s-osinte__qnx.adb: Likewise.
* libgnarl/s-osinte__rtems.adb: Likewise.
* libgnarl/s-osinte__solaris.adb: Likewise.
* libgnarl/s-osinte__vxworks.adb: Likewise.
* libgnarl/s-osinte__x32.adb: Likewise.
* libgnarl/s-taprop__solaris.adb: Add with clause for System.C_Time.
(Monotonic_Clock): Use type and functions from System.C_Time.
(RT_Resolution): Likewise.
(Timed_Sleep): Likewise.
(Timed_Delay): Likewise.
* libgnarl/s-taprop__vxworks.adb: Likewise.
* libgnarl/s-tpopmo.adb: Likewise.
* libgnarl/s-osinte__android.adb: Delete.
* libgnat/g-c_time.ads: New file.
* libgnat/g-calend.adb: Delegate to System.C_Time.
* libgnat/g-calend.ads: Likewise.
* libgnat/g-socket.adb: Likewise.
* libgnat/g-socthi.adb: Likewise.
* libgnat/g-socthi__vxworks.adb: Likewise.
* libgnat/g-sothco.ads: Likewise.
* libgnat/g-spogwa.adb: Likewise.
* libgnat/s-c_time.adb: New file.
* libgnat/s-c_time.ads: Likewise.
* libgnat/s-optide.adb: Import nanosleep here.
* libgnat/s-os_lib.ads (time_t): Remove.
(To_Ada): Adjust.
(To_C): Likewise.
* libgnat/s-os_lib.adb: Likewise.
* libgnat/s-osprim__darwin.adb: Delegate to System.C_Time.
* libgnat/s-osprim__posix.adb: Likewise.
* libgnat/s-osprim__posix2008.adb: Likewise.
* libgnat/s-osprim__rtems.adb: Likewise.
* libgnat/s-osprim__unix.adb: Likewise.
* libgnat/s-osprim__solaris.adb: Delete.
* libgnat/s-osprim__x32.adb: Likewise.
* libgnat/s-parame.ads (time_t_bits): Remove.
* libgnat/s-parame__hpux.ads: Likewise.
* libgnat/s-parame__vxworks.ads: Likewise.
* libgnat/s-parame__posix2008.ads: Delete.
* s-oscons-tmplt.c (SIZEOF_tv_nsec): New constant.
Diffstat (limited to 'gcc')
71 files changed, 546 insertions, 2164 deletions
diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl index 50e683a..b383d9d 100644 --- a/gcc/ada/Makefile.rtl +++ b/gcc/ada/Makefile.rtl @@ -415,6 +415,7 @@ GNATRTL_NONTASKING_OBJS= \ g-busorg$(objext) \ g-byorma$(objext) \ g-bytswa$(objext) \ + g-c_time$(objext) \ g-calend$(objext) \ g-casuti$(objext) \ g-catiio$(objext) \ @@ -535,6 +536,7 @@ GNATRTL_NONTASKING_OBJS= \ s-boarop$(objext) \ s-boustr$(objext) \ s-bytswa$(objext) \ + s-c_time$(objext) \ s-carsi8$(objext) \ s-carun8$(objext) \ s-casi16$(objext) \ @@ -1418,7 +1420,6 @@ ifeq ($(strip $(filter-out arm% aarch64 linux-android%,$(target_cpu) $(target_os s-inmaop.adb<libgnarl/s-inmaop__posix.adb \ s-intman.adb<libgnarl/s-intman__android.adb \ s-osinte.ads<libgnarl/s-osinte__android.ads \ - s-osinte.adb<libgnarl/s-osinte__android.adb \ s-oslock.ads<libgnat/s-oslock__posix.ads \ s-osprim.adb<libgnat/s-osprim__posix.adb \ s-parame.adb<libgnat/s-parame__aarch64-linux.adb \ @@ -1531,7 +1532,7 @@ ifeq ($(strip $(filter-out sparc% sun solaris%,$(target_cpu) $(target_vendor) $( s-osinte.adb<libgnarl/s-osinte__solaris.adb \ s-osinte.ads<libgnarl/s-osinte__solaris.ads \ s-oslock.ads<libgnat/s-oslock__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 \ @@ -1580,7 +1581,7 @@ ifeq ($(strip $(filter-out %86 %x86_64 solaris2%,$(target_cpu) $(target_os))),) s-osinte.adb<libgnarl/s-osinte__solaris.adb \ s-osinte.ads<libgnarl/s-osinte__solaris.ads \ s-oslock.ads<libgnat/s-oslock__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 \ @@ -2146,7 +2147,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 @@ -2173,7 +2173,6 @@ ifeq ($(strip $(filter-out rtems%,$(target_os))),) s-oslock.ads<libgnat/s-oslock__posix.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 \ @@ -2941,13 +2940,11 @@ 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 \ s-oslock.ads<libgnat/s-oslock__posix.ads \ - s-osprim.adb<libgnat/s-osprim__x32.adb \ - s-parame.ads<libgnat/s-parame__posix2008.ads \ + s-osprim.adb<libgnat/s-osprim__posix.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 \ @@ -3194,7 +3191,7 @@ LIBGNAT_TARGET_PAIRS += \ # library. LIBGNAT_OBJS is the list of object files for libgnat. # thread.c is special as put into GNATRTL_TASKING_OBJS LIBGNAT_OBJS = adadecode.o adaint.o argv.o aux-io.o \ - cal.o cio.o cstreams.o ctrl_c.o \ + cio.o cstreams.o ctrl_c.o \ env.o errno.o exit.o expect.o final.o rtfinal.o rtinit.o \ init.o initialize.o locales.o mkdir.o \ raise.o seh_init.o socket.o sysdep.o \ diff --git a/gcc/ada/cal.c b/gcc/ada/cal.c deleted file mode 100644 index 0a61e0f..0000000 --- a/gcc/ada/cal.c +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** - * * - * GNAT COMPILER COMPONENTS * - * * - * C A L * - * * - * C Implementation File * - * * - * Copyright (C) 1992-2025, 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 file contains routines marked with pragmas Import in package */ -/* GNAT.Calendar. It is used to do Duration to timeval conversion. */ -/* These are simple wrapper functions to abstract the fact that the C */ -/* struct timeval fields are not normalized (they are generally */ -/* defined as int or long values). */ - -#if defined (__vxworks) -#ifdef __RTP__ -#include <time.h> -#include <version.h> -#if (_WRS_VXWORKS_MAJOR == 7) || (_WRS_VXWORKS_MINOR != 0) -#include <sys/time.h> -#endif -#else -#include <sys/times.h> -#endif -#elif defined (__nucleus__) -#include <time.h> -#else -#include <sys/time.h> -#endif - -#ifdef __MINGW32__ -#include "mingw32.h" -#include <winsock.h> -#endif - -void -__gnat_timeval_to_duration (struct timeval *t, long long *sec, long *usec) -{ - *sec = (long long) t->tv_sec; - *usec = (long) t->tv_usec; -} - -void -__gnat_duration_to_timeval (long long sec, long usec, struct timeval *t) -{ - /* here we are doing implicit conversion to the struct timeval - fields types. */ - - t->tv_sec = sec; - t->tv_usec = usec; -} diff --git a/gcc/ada/doc/gnat_rm/the_gnat_library.rst b/gcc/ada/doc/gnat_rm/the_gnat_library.rst index d041090..29642aa 100644 --- a/gcc/ada/doc/gnat_rm/the_gnat_library.rst +++ b/gcc/ada/doc/gnat_rm/the_gnat_library.rst @@ -663,6 +663,18 @@ sequences for various UCS input formats. General routines for swapping the bytes in 2-, 4-, and 8-byte quantities. Machine-specific implementations are available in some cases. +.. _`GNAT.C_Time_(g-c_time.ads)`: + +``GNAT.C_Time`` (:file:`g-c_time.ads`) +====================================== + +.. index:: GNAT.C_Time (g-c_time.ads) + +.. index:: Time + +Provides the time_t, timeval and timespec types corresponding to the C +types defined by the OS, as well as various conversion functions. + .. _`GNAT.Calendar_(g-calend.ads)`: ``GNAT.Calendar`` (:file:`g-calend.ads`) @@ -674,8 +686,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/gcc/ada/impunit.adb b/gcc/ada/impunit.adb index edb04a2..712d46c 100644 --- a/gcc/ada/impunit.adb +++ b/gcc/ada/impunit.adb @@ -250,6 +250,7 @@ package body Impunit is ("g-busorg", F), -- GNAT.Bubble_Sort_G ("g-byorma", F), -- GNAT.Byte_Order_Mark ("g-bytswa", F), -- GNAT.Byte_Swapping + ("g-c_time", F), -- GNAT.C_Time ("g-calend", F), -- GNAT.Calendar ("g-catiio", F), -- GNAT.Calendar.Time_IO ("g-casuti", F), -- GNAT.Case_Util diff --git a/gcc/ada/libgnarl/a-exetim__posix.adb b/gcc/ada/libgnarl/a-exetim__posix.adb index ee27ff2..a57689e 100644 --- a/gcc/ada/libgnarl/a-exetim__posix.adb +++ b/gcc/ada/libgnarl/a-exetim__posix.adb @@ -34,8 +34,9 @@ with Ada.Task_Identification; use Ada.Task_Identification; with Ada.Unchecked_Conversion; -with System.Tasking; +with System.C_Time; with System.OS_Interface; use System.OS_Interface; +with System.Tasking; with System.Task_Primitives.Operations; use System.Task_Primitives.Operations; with Interfaces.C; use Interfaces.C; @@ -98,7 +99,7 @@ package body Ada.Execution_Time is (T : Ada.Task_Identification.Task_Id := Ada.Task_Identification.Current_Task) return CPU_Time is - TS : aliased timespec; + TS : aliased System.C_Time.timespec; Clock_Id : aliased Interfaces.C.int; Result : Interfaces.C.int; @@ -112,7 +113,7 @@ package body Ada.Execution_Time is function clock_gettime (clock_id : Interfaces.C.int; - tp : access timespec) + tp : access System.C_Time.timespec) return Interfaces.C.int; pragma Import (C, clock_gettime, "clock_gettime"); -- Function from the POSIX.1b Realtime Extensions library @@ -139,7 +140,7 @@ package body Ada.Execution_Time is (clock_id => Clock_Id, tp => TS'Unchecked_Access); pragma Assert (Result = 0); - return To_CPU_Time (To_Duration (TS)); + return To_CPU_Time (System.C_Time.To_Duration (TS)); end Clock; -------------------------- diff --git a/gcc/ada/libgnarl/s-linux.ads b/gcc/ada/libgnarl/s-linux.ads index 62176f1..f41a67b 100644 --- a/gcc/ada/libgnarl/s-linux.ads +++ b/gcc/ada/libgnarl/s-linux.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__alpha.ads b/gcc/ada/libgnarl/s-linux__alpha.ads index 855e667..c05b90c 100644 --- a/gcc/ada/libgnarl/s-linux__alpha.ads +++ b/gcc/ada/libgnarl/s-linux__alpha.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package. with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__android-aarch64.ads b/gcc/ada/libgnarl/s-linux__android-aarch64.ads index 537c46b..c7a69fa 100644 --- a/gcc/ada/libgnarl/s-linux__android-aarch64.ads +++ b/gcc/ada/libgnarl/s-linux__android-aarch64.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__android-arm.ads b/gcc/ada/libgnarl/s-linux__android-arm.ads index 07bca55..fdc14c3 100644 --- a/gcc/ada/libgnarl/s-linux__android-arm.ads +++ b/gcc/ada/libgnarl/s-linux__android-arm.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__hppa.ads b/gcc/ada/libgnarl/s-linux__hppa.ads index a3ce02b..e249846 100644 --- a/gcc/ada/libgnarl/s-linux__hppa.ads +++ b/gcc/ada/libgnarl/s-linux__hppa.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package. with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__loongarch.ads b/gcc/ada/libgnarl/s-linux__loongarch.ads index e0eaaa4..20e3d90 100644 --- a/gcc/ada/libgnarl/s-linux__loongarch.ads +++ b/gcc/ada/libgnarl/s-linux__loongarch.ads @@ -35,7 +35,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -44,25 +43,8 @@ package System.Linux is -- Time -- ---------- - subtype int is Interfaces.C.int; - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__mips.ads b/gcc/ada/libgnarl/s-linux__mips.ads index 3ad7f45..6a575c7 100644 --- a/gcc/ada/libgnarl/s-linux__mips.ads +++ b/gcc/ada/libgnarl/s-linux__mips.ads @@ -35,7 +35,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -44,25 +43,8 @@ package System.Linux is -- Time -- ---------- - subtype int is Interfaces.C.int; - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- @@ -125,8 +107,8 @@ package System.Linux is -- struct_sigaction offsets - sa_handler_pos : constant := int'Size / 8; - sa_mask_pos : constant := int'Size / 8 + + sa_handler_pos : constant := Interfaces.C.int'Size / 8; + sa_mask_pos : constant := Interfaces.C.int'Size / 8 + Standard'Address_Size / 8; sa_flags_pos : constant := 0; diff --git a/gcc/ada/libgnarl/s-linux__riscv.ads b/gcc/ada/libgnarl/s-linux__riscv.ads index 867cb1f..ad0a07b 100644 --- a/gcc/ada/libgnarl/s-linux__riscv.ads +++ b/gcc/ada/libgnarl/s-linux__riscv.ads @@ -35,7 +35,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -44,25 +43,8 @@ package System.Linux is -- Time -- ---------- - subtype int is Interfaces.C.int; - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- @@ -125,8 +107,8 @@ package System.Linux is -- struct_sigaction offsets sa_handler_pos : constant := 0; - sa_mask_pos : constant := long'Size / 8; - sa_flags_pos : constant := long'Size / 8 + 128; + sa_mask_pos : constant := Interfaces.C.long'Size / 8; + sa_flags_pos : constant := Interfaces.C.long'Size / 8 + 128; SA_SIGINFO : constant := 16#04#; SA_ONSTACK : constant := 16#08000000#; diff --git a/gcc/ada/libgnarl/s-linux__sparc.ads b/gcc/ada/libgnarl/s-linux__sparc.ads index 5ff201c..0378346 100644 --- a/gcc/ada/libgnarl/s-linux__sparc.ads +++ b/gcc/ada/libgnarl/s-linux__sparc.ads @@ -36,7 +36,6 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; -with System.Parameters; package System.Linux is pragma Preelaborate; @@ -45,24 +44,8 @@ package System.Linux is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-linux__x32.ads b/gcc/ada/libgnarl/s-linux__x32.ads deleted file mode 100644 index 6144b8b..0000000 --- a/gcc/ada/libgnarl/s-linux__x32.ads +++ /dev/null @@ -1,133 +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-2025, Free Software Foundation, Inc. -- --- --- -- --- GNARL is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 3, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. -- --- -- --- As a special exception under Section 7 of GPL version 3, you are granted -- --- additional permissions described in the GCC Runtime Library Exception, -- --- version 3.1, as published by the Free Software Foundation. -- --- -- --- You should have received a copy of the GNU General Public License and -- --- a copy of the GCC Runtime Library Exception along with this program; -- --- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- --- <http://www.gnu.org/licenses/>. -- --- -- --- -- ------------------------------------------------------------------------------- - --- 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; - -with System.Parameters; - -package System.Linux is - pragma Preelaborate; - - ---------- - -- Time -- - ---------- - - subtype suseconds_t is Long_Long_Integer; - -- Note that suseconds_t is 64 bits. - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - subtype clockid_t is Interfaces.C.int; - - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Long_Integer; - -- Note that tv_nsec is 64 bits. - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - - ----------- - -- 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; diff --git a/gcc/ada/libgnarl/s-osinte__aix.adb b/gcc/ada/libgnarl/s-osinte__aix.adb index da057d4..3a2df42 100644 --- a/gcc/ada/libgnarl/s-osinte__aix.adb +++ b/gcc/ada/libgnarl/s-osinte__aix.adb @@ -35,15 +35,6 @@ package body System.OS_Interface is use Interfaces.C; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -73,29 +64,6 @@ package body System.OS_Interface is end To_Target_Priority; ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F is negative due to a round-up, adjust for positive F value - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - ----------------- -- sched_yield -- ----------------- diff --git a/gcc/ada/libgnarl/s-osinte__aix.ads b/gcc/ada/libgnarl/s-osinte__aix.ads index 1e115b8..eb417a2 100644 --- a/gcc/ada/libgnarl/s-osinte__aix.ads +++ b/gcc/ada/libgnarl/s-osinte__aix.ads @@ -43,8 +43,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; with Interfaces.C.Extensions; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -200,26 +200,18 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new long_long; function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -420,7 +412,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -543,15 +535,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_attr_t is new System.Address; pragma Convention (C, pthread_attr_t); -- typedef struct __pt_attr *pthread_attr_t; diff --git a/gcc/ada/libgnarl/s-osinte__android.ads b/gcc/ada/libgnarl/s-osinte__android.ads index 4383860..bf774fc 100644 --- a/gcc/ada/libgnarl/s-osinte__android.ads +++ b/gcc/ada/libgnarl/s-osinte__android.ads @@ -42,10 +42,10 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.Linux; with System.OS_Constants; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -213,25 +213,17 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new int; function clock_gettime - (clock_id : clockid_t; tp : access timespec) return int; + (clock_id : clockid_t; tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - function sysconf (name : int) return long; pragma Import (C, sysconf); @@ -463,7 +455,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -630,15 +622,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type unsigned_long_long_t is mod 2 ** 64; -- Local type only used to get the alignment of this type below diff --git a/gcc/ada/libgnarl/s-osinte__cheribsd.ads b/gcc/ada/libgnarl/s-osinte__cheribsd.ads index d9dae35..350fa1f 100644 --- a/gcc/ada/libgnarl/s-osinte__cheribsd.ads +++ b/gcc/ada/libgnarl/s-osinte__cheribsd.ads @@ -44,8 +44,8 @@ with Ada.Unchecked_Conversion; with Interfaces; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -232,30 +232,22 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - - function nanosleep (rqtp, rmtp : access timespec) return int; + function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access timespec) + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -463,7 +455,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -664,15 +656,6 @@ private Self_PID : constant pid_t := 0; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - ts_sec : time_t; - ts_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_t is new System.Address; type pthread_attr_t is new System.Address; type pthread_mutexattr_t is new System.Address; diff --git a/gcc/ada/libgnarl/s-osinte__darwin.adb b/gcc/ada/libgnarl/s-osinte__darwin.adb index f512210..eeafbdb 100644 --- a/gcc/ada/libgnarl/s-osinte__darwin.adb +++ b/gcc/ada/libgnarl/s-osinte__darwin.adb @@ -36,15 +36,6 @@ with Interfaces.C.Extensions; package body System.OS_Interface is use Interfaces.C; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -56,37 +47,13 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - ------------------- -- clock_gettime -- ------------------- function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int + tp : access C_Time.timespec) return int is pragma Unreferenced (clock_id); @@ -94,33 +61,18 @@ package body System.OS_Interface is use Interfaces; - type timeval is array (1 .. 3) of C.long; - -- The timeval array is sized to contain long_long sec and long usec. - -- If long_long'Size = long'Size then it will be overly large but that - -- won't effect the implementation since it's not accessed directly. - - 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; - TV : aliased timeval; + TV : aliased C_Time.timeval; Result : int; function gettimeofday - (Tv : access timeval; + (Tv : access C_Time.timeval; Tz : System.Address := System.Null_Address) return int; pragma Import (C, gettimeofday, "gettimeofday"); begin Result := gettimeofday (TV'Access, System.Null_Address); pragma Assert (Result = 0); - timeval_to_duration (TV'Access, sec'Access, usec'Access); - tp.all := To_Timespec (Duration (sec) + Duration (usec) / Micro); + tp.all := C_Time.To_Timespec (TV); return Result; end clock_gettime; @@ -130,13 +82,12 @@ package body System.OS_Interface is function clock_getres (clock_id : clockid_t; - res : access timespec) return int + res : access C_Time.timespec) return int is pragma Unreferenced (clock_id); -- Darwin Threads don't have clock_getres. - Nano : constant := 10**9; nsec : int := 0; Result : int := -1; @@ -145,7 +96,7 @@ package body System.OS_Interface is begin nsec := clock_get_res; - res.all := To_Timespec (Duration (0.0) + Duration (nsec) / Nano); + res.all := C_Time.Nanoseconds_To_Timespec (nsec); if nsec > 0 then Result := 0; diff --git a/gcc/ada/libgnarl/s-osinte__darwin.ads b/gcc/ada/libgnarl/s-osinte__darwin.ads index ea62f24..1b2a40b 100644 --- a/gcc/ada/libgnarl/s-osinte__darwin.ads +++ b/gcc/ada/libgnarl/s-osinte__darwin.ads @@ -40,9 +40,9 @@ with Interfaces.C; +with System.C_Time; with System.OS_Constants; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -184,23 +184,15 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new int; function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; function clock_getres (clock_id : clockid_t; - res : access timespec) return int; - - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); + res : access C_Time.timespec) return int; ------------------------- -- Priority Scheduling -- @@ -397,7 +389,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -517,15 +509,6 @@ private type pid_t is new int32_t; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - -- -- Darwin specific signal implementation -- diff --git a/gcc/ada/libgnarl/s-osinte__dragonfly.adb b/gcc/ada/libgnarl/s-osinte__dragonfly.adb index 73061d9..adfbaeb 100644 --- a/gcc/ada/libgnarl/s-osinte__dragonfly.adb +++ b/gcc/ada/libgnarl/s-osinte__dragonfly.adb @@ -69,15 +69,6 @@ package body System.OS_Interface is null; end pthread_init; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -89,28 +80,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(ts_sec => S, - ts_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-osinte__dragonfly.ads b/gcc/ada/libgnarl/s-osinte__dragonfly.ads index 00dc11d..9e7b88e 100644 --- a/gcc/ada/libgnarl/s-osinte__dragonfly.ads +++ b/gcc/ada/libgnarl/s-osinte__dragonfly.ads @@ -43,8 +43,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -198,30 +198,22 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - - function nanosleep (rqtp, rmtp : access timespec) return int; + function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new unsigned_long; function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access timespec) + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -432,7 +424,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); Relative_Timed_Wait : constant Boolean := False; @@ -636,15 +628,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - ts_sec : time_t; - ts_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_t is new System.Address; type pthread_attr_t is new System.Address; type pthread_mutexattr_t is new System.Address; diff --git a/gcc/ada/libgnarl/s-osinte__freebsd.adb b/gcc/ada/libgnarl/s-osinte__freebsd.adb index a3240bb..4516935 100644 --- a/gcc/ada/libgnarl/s-osinte__freebsd.adb +++ b/gcc/ada/libgnarl/s-osinte__freebsd.adb @@ -69,15 +69,6 @@ package body System.OS_Interface is null; end pthread_init; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -89,27 +80,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(ts_sec => S, - ts_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-osinte__freebsd.ads b/gcc/ada/libgnarl/s-osinte__freebsd.ads index b10270a..027f81d 100644 --- a/gcc/ada/libgnarl/s-osinte__freebsd.ads +++ b/gcc/ada/libgnarl/s-osinte__freebsd.ads @@ -43,8 +43,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -198,30 +198,22 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - - function nanosleep (rqtp, rmtp : access timespec) return int; + function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access timespec) + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -431,7 +423,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -633,15 +625,6 @@ private type pid_t is new int; Self_PID : constant pid_t := 0; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - ts_sec : time_t; - ts_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_t is new System.Address; type pthread_attr_t is new System.Address; type pthread_mutexattr_t is new System.Address; diff --git a/gcc/ada/libgnarl/s-osinte__gnu.adb b/gcc/ada/libgnarl/s-osinte__gnu.adb index 675cd0d..2c70f0d 100644 --- a/gcc/ada/libgnarl/s-osinte__gnu.adb +++ b/gcc/ada/libgnarl/s-osinte__gnu.adb @@ -93,15 +93,6 @@ package body System.OS_Interface is return 0; end pthread_setschedparam; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -113,28 +104,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-osinte__gnu.ads b/gcc/ada/libgnarl/s-osinte__gnu.ads index 870059d..18410c6 100644 --- a/gcc/ada/libgnarl/s-osinte__gnu.ads +++ b/gcc/ada/libgnarl/s-osinte__gnu.ads @@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -210,9 +210,7 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - - function nanosleep (rqtp, rmtp : access timespec) return int; + function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; @@ -221,21 +219,15 @@ package System.OS_Interface is -- From: /usr/include/time.h function clock_gettime (clock_id : clockid_t; - tp : access timespec) + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - -- From: /usr/include/unistd.h function sysconf (name : int) return long; pragma Import (C, sysconf); @@ -487,7 +479,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); Relative_Timed_Wait : constant Boolean := False; @@ -656,15 +648,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - -- From: /usr/include/pthread/pthreadtypes.h: -- typedef struct __pthread_attr pthread_attr_t; -- /usr/include/i386-gnu/bits/thread-attr.h: struct __pthread_attr... diff --git a/gcc/ada/libgnarl/s-osinte__hpux.ads b/gcc/ada/libgnarl/s-osinte__hpux.ads index 9d0f26d..60fab69 100644 --- a/gcc/ada/libgnarl/s-osinte__hpux.ads +++ b/gcc/ada/libgnarl/s-osinte__hpux.ads @@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -181,26 +181,18 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new int; function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -400,7 +392,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -517,15 +509,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_attr_t is new int; type pthread_condattr_t is new int; type pthread_mutexattr_t is new int; diff --git a/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads b/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads index 9924659..fc6d7a9 100644 --- a/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads +++ b/gcc/ada/libgnarl/s-osinte__kfreebsd-gnu.ads @@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -205,9 +205,7 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - - function nanosleep (rqtp, rmtp : access timespec) return int; + function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; @@ -215,21 +213,15 @@ package System.OS_Interface is function clock_gettime (clock_id : clockid_t; - tp : access timespec) + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - function sysconf (name : int) return long; pragma Import (C, sysconf); @@ -430,7 +422,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -602,15 +594,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type pthread_attr_t is record detachstate : int; schedpolicy : int; diff --git a/gcc/ada/libgnarl/s-osinte__linux.ads b/gcc/ada/libgnarl/s-osinte__linux.ads index 7aeb15d..2c6b353 100644 --- a/gcc/ada/libgnarl/s-osinte__linux.ads +++ b/gcc/ada/libgnarl/s-osinte__linux.ads @@ -42,6 +42,7 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.Linux; with System.OS_Constants; with System.OS_Locks; @@ -54,8 +55,6 @@ package System.OS_Interface is pragma Linker_Options ("-lpthread"); - use type System.Linux.time_t; - subtype int is Interfaces.C.int; subtype char is Interfaces.C.char; subtype short is Interfaces.C.short; @@ -229,26 +228,17 @@ package System.OS_Interface is -- Time -- ---------- - subtype time_t is System.Linux.time_t; - subtype timespec is System.Linux.timespec; - subtype timeval is System.Linux.timeval; subtype clockid_t is System.Linux.clockid_t; function clock_gettime - (clock_id : clockid_t; tp : access timespec) return int; + (clock_id : clockid_t; tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - function sysconf (name : int) return long; pragma Import (C, sysconf); @@ -457,7 +447,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- diff --git a/gcc/ada/libgnarl/s-osinte__lynxos178.adb b/gcc/ada/libgnarl/s-osinte__lynxos178.adb index 88758a9..beeefb6 100644 --- a/gcc/ada/libgnarl/s-osinte__lynxos178.adb +++ b/gcc/ada/libgnarl/s-osinte__lynxos178.adb @@ -85,15 +85,6 @@ package body System.OS_Interface is return int (sysconf (SC_PAGESIZE)); end Get_Page_Size; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -105,29 +96,6 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F is negative due to a round-up, adjust for positive F value - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - ------------- -- sigwait -- ------------- diff --git a/gcc/ada/libgnarl/s-osinte__lynxos178e.ads b/gcc/ada/libgnarl/s-osinte__lynxos178e.ads index 8b31e20..dcc36b2 100644 --- a/gcc/ada/libgnarl/s-osinte__lynxos178e.ads +++ b/gcc/ada/libgnarl/s-osinte__lynxos178e.ads @@ -42,9 +42,9 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.Multiprocessors; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -193,26 +193,18 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new int; function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - type struct_timezone is record tz_minuteswest : int; tz_dsttime : int; @@ -220,8 +212,6 @@ package System.OS_Interface is pragma Convention (C, struct_timezone); type struct_timezone_ptr is access all struct_timezone; - type struct_timeval is private; - ------------------------- -- Priority Scheduling -- ------------------------- @@ -415,7 +405,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -541,23 +531,6 @@ private type pid_t is new long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type suseconds_t is new int; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type struct_timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, struct_timeval); - type st_attr is record stksize : int; prio : int; diff --git a/gcc/ada/libgnarl/s-osinte__posix.adb b/gcc/ada/libgnarl/s-osinte__posix.adb index 1cb4f23..2d9baeb 100644 --- a/gcc/ada/libgnarl/s-osinte__posix.adb +++ b/gcc/ada/libgnarl/s-osinte__posix.adb @@ -36,6 +36,7 @@ -- that are needed by children of System. with Interfaces.C; use Interfaces.C; + package body System.OS_Interface is -------------------- @@ -58,15 +59,6 @@ package body System.OS_Interface is null; end pthread_init; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -78,28 +70,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-osinte__qnx.adb b/gcc/ada/libgnarl/s-osinte__qnx.adb index 7200225..bf95b0ea 100644 --- a/gcc/ada/libgnarl/s-osinte__qnx.adb +++ b/gcc/ada/libgnarl/s-osinte__qnx.adb @@ -36,6 +36,7 @@ -- that are needed by children of System. with Interfaces.C; use Interfaces.C; + package body System.OS_Interface is ----------------- @@ -70,15 +71,6 @@ package body System.OS_Interface is null; end pthread_init; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -90,28 +82,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-osinte__qnx.ads b/gcc/ada/libgnarl/s-osinte__qnx.ads index ea940d86..ee13235 100644 --- a/gcc/ada/libgnarl/s-osinte__qnx.ads +++ b/gcc/ada/libgnarl/s-osinte__qnx.ads @@ -41,9 +41,9 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Constants; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -213,25 +213,17 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported - type timespec is private; - type clockid_t is new int; function clock_gettime - (clock_id : clockid_t; tp : access timespec) return int; + (clock_id : clockid_t; tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - ------------------------- -- Priority Scheduling -- ------------------------- @@ -418,7 +410,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -572,15 +564,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type unsigned_long_long_t is mod 2 ** 64; -- Local type only used to get the alignment of this type below diff --git a/gcc/ada/libgnarl/s-osinte__rtems.adb b/gcc/ada/libgnarl/s-osinte__rtems.adb index c0f6c265..efd602e 100644 --- a/gcc/ada/libgnarl/s-osinte__rtems.adb +++ b/gcc/ada/libgnarl/s-osinte__rtems.adb @@ -92,15 +92,6 @@ package body System.OS_Interface is return int with Import, External_Name => "rtems_semaphore_release", Convention => C; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -112,27 +103,6 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to round-up, adjust for positive F value - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - ----------------------------- -- Binary_Semaphore_Create -- ----------------------------- diff --git a/gcc/ada/libgnarl/s-osinte__rtems.ads b/gcc/ada/libgnarl/s-osinte__rtems.ads index 21b1be8..184d489 100644 --- a/gcc/ada/libgnarl/s-osinte__rtems.ads +++ b/gcc/ada/libgnarl/s-osinte__rtems.ads @@ -52,9 +52,9 @@ with Interfaces.C; +with System.C_Time; with System.OS_Constants; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -181,8 +181,6 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - type timespec is private; - type clockid_t is new int; CLOCK_REALTIME : constant clockid_t; @@ -190,20 +188,14 @@ package System.OS_Interface is function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access timespec) return int; + res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - ------------------------- -- Priority Scheduling -- ------------------------- @@ -428,7 +420,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -454,8 +446,8 @@ package System.OS_Interface is type struct_sched_param is record sched_priority : int; ss_low_priority : int; - ss_replenish_period : timespec; - ss_initial_budget : timespec; + ss_replenish_period : C_Time.timespec; + ss_initial_budget : C_Time.timespec; sched_ss_max_repl : int; end record; pragma Convention (C, struct_sched_param); @@ -591,15 +583,6 @@ private type pid_t is new int; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - CLOCK_REALTIME : constant clockid_t := System.OS_Constants.CLOCK_REALTIME; CLOCK_MONOTONIC : constant clockid_t := System.OS_Constants.CLOCK_MONOTONIC; diff --git a/gcc/ada/libgnarl/s-osinte__solaris.adb b/gcc/ada/libgnarl/s-osinte__solaris.adb index e5626fc..78144ef 100644 --- a/gcc/ada/libgnarl/s-osinte__solaris.adb +++ b/gcc/ada/libgnarl/s-osinte__solaris.adb @@ -35,42 +35,8 @@ -- This package encapsulates all direct interfaces to OS services -- that are needed by children of System. -with Interfaces.C; use Interfaces.C; - package body System.OS_Interface is - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - ------------------ -- pthread_init -- ------------------ diff --git a/gcc/ada/libgnarl/s-osinte__solaris.ads b/gcc/ada/libgnarl/s-osinte__solaris.ads index d62dd37..e9b59fe 100644 --- a/gcc/ada/libgnarl/s-osinte__solaris.ads +++ b/gcc/ada/libgnarl/s-osinte__solaris.ads @@ -42,8 +42,8 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.OS_Locks; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -241,24 +241,16 @@ package System.OS_Interface is -- Time -- ---------- - type timespec is private; - type clockid_t is new int; function clock_gettime - (clock_id : clockid_t; tp : access timespec) return int; + (clock_id : clockid_t; tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres - (clock_id : clockid_t; res : access timespec) return int; + (clock_id : clockid_t; res : access C_Time.timespec) return int; pragma Import (C, clock_getres, "clock_getres"); - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - function sysconf (name : int) return long; pragma Import (C, sysconf); @@ -347,7 +339,7 @@ package System.OS_Interface is function cond_timedwait (cond : access cond_t; mutex : access mutex_t; - abstime : access timespec) return int; + abstime : access C_Time.timespec) return int; pragma Import (C, cond_timedwait, "cond_timedwait"); function cond_signal (cond : access cond_t) return int; @@ -526,15 +518,6 @@ private type pid_t is new long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - type array_type_9 is array (0 .. 3) of unsigned_char; type record_type_3 is record flag : array_type_9; diff --git a/gcc/ada/libgnarl/s-osinte__vxworks.adb b/gcc/ada/libgnarl/s-osinte__vxworks.adb index 5c227a1..0b2b5d4 100644 --- a/gcc/ada/libgnarl/s-osinte__vxworks.adb +++ b/gcc/ada/libgnarl/s-osinte__vxworks.adb @@ -41,38 +41,6 @@ package body System.OS_Interface is Low_Priority : constant := 255; -- VxWorks native (default) lowest scheduling priority - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9; - end To_Duration; - - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F is negative due to a round-up, adjust for positive F value - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(ts_sec => S, - ts_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - ------------------------- -- To_VxWorks_Priority -- ------------------------- diff --git a/gcc/ada/libgnarl/s-osinte__vxworks.ads b/gcc/ada/libgnarl/s-osinte__vxworks.ads index a409573..ecb6344 100644 --- a/gcc/ada/libgnarl/s-osinte__vxworks.ads +++ b/gcc/ada/libgnarl/s-osinte__vxworks.ads @@ -40,10 +40,10 @@ with Interfaces.C; +with System.C_Time; with System.VxWorks; with System.VxWorks.Ext; with System.Multiprocessors; -with System.Parameters; package System.OS_Interface is pragma Preelaborate; @@ -244,37 +244,13 @@ package System.OS_Interface is -- Time -- ---------- - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - -- Time_t here used to be unsigned to match the VxWorks header declaration. - -- The header declaration has changed in newer releases and is now signed - -- for applications. - - type timespec is record - ts_sec : time_t; - ts_nsec : long; - end record; - pragma Convention (C, timespec); - type clockid_t is new int; - function To_Duration (TS : timespec) return Duration; - pragma Inline (To_Duration); - - function To_Timespec (D : Duration) return timespec; - pragma Inline (To_Timespec); - -- Convert a Duration value to a timespec value. Note that in VxWorks, - -- timespec is always non-negative (since time_t is defined above as - -- unsigned long). This means that there is a potential problem if a - -- negative argument is passed for D. However, in actual usage, the - -- value of the input argument D is always non-negative, so no problem - -- arises in practice. - function To_Clock_Ticks (D : Duration) return int; -- Convert a duration value (in seconds) into clock ticks function clock_gettime - (clock_id : clockid_t; tp : access timespec) return int; + (clock_id : clockid_t; tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); ---------------------- diff --git a/gcc/ada/libgnarl/s-osinte__x32.adb b/gcc/ada/libgnarl/s-osinte__x32.adb index 27313a4b..2e65853 100644 --- a/gcc/ada/libgnarl/s-osinte__x32.adb +++ b/gcc/ada/libgnarl/s-osinte__x32.adb @@ -35,7 +35,7 @@ -- This package encapsulates all direct interfaces to OS services -- that are needed by children of System. -with Interfaces.C; use Interfaces.C; +with Interfaces.C; package body System.OS_Interface is @@ -59,15 +59,6 @@ package body System.OS_Interface is null; end pthread_init; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - ------------------------ -- To_Target_Priority -- ------------------------ @@ -79,28 +70,4 @@ package body System.OS_Interface is return Interfaces.C.int (Prio); end To_Target_Priority; - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => Long_Long_Integer (F * 10#1#E9)); - end To_Timespec; - end System.OS_Interface; diff --git a/gcc/ada/libgnarl/s-qnx.ads b/gcc/ada/libgnarl/s-qnx.ads index 1197be1..f342ad6 100644 --- a/gcc/ada/libgnarl/s-qnx.ads +++ b/gcc/ada/libgnarl/s-qnx.ads @@ -37,8 +37,6 @@ with Interfaces.C; -with System.Parameters; - package System.QNX is pragma Preelaborate; @@ -46,24 +44,8 @@ package System.QNX is -- Time -- ---------- - subtype long is Interfaces.C.long; - subtype suseconds_t is Interfaces.C.long; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; subtype clockid_t is Interfaces.C.int; - type timespec is record - tv_sec : time_t; - tv_nsec : long; - end record; - pragma Convention (C, timespec); - - type timeval is record - tv_sec : time_t; - tv_usec : suseconds_t; - end record; - pragma Convention (C, timeval); - ----------- -- Errno -- ----------- diff --git a/gcc/ada/libgnarl/s-taprop__solaris.adb b/gcc/ada/libgnarl/s-taprop__solaris.adb index 8edc58e..1b65100 100644 --- a/gcc/ada/libgnarl/s-taprop__solaris.adb +++ b/gcc/ada/libgnarl/s-taprop__solaris.adb @@ -36,6 +36,7 @@ with Interfaces.C; +with System.C_Time; with System.Interrupt_Management; with System.Multiprocessors; with System.OS_Constants; @@ -762,12 +763,12 @@ package body System.Task_Primitives.Operations is --------------------- function Monotonic_Clock return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : Interfaces.C.int; begin Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access); pragma Assert (Result = 0); - return To_Duration (TS); + return C_Time.To_Duration (TS); end Monotonic_Clock; ------------------- @@ -775,13 +776,13 @@ package body System.Task_Primitives.Operations is ------------------- function RT_Resolution return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : Interfaces.C.int; begin Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return To_Duration (TS); + return C_Time.To_Duration (TS); end RT_Resolution; ----------- @@ -1175,7 +1176,7 @@ package body System.Task_Primitives.Operations is Base_Time : constant Duration := Monotonic_Clock; Check_Time : Duration := Base_Time; Abs_Time : Duration; - Request : aliased timespec; + Request : aliased C_Time.timespec; Result : Interfaces.C.int; begin @@ -1189,7 +1190,7 @@ package body System.Task_Primitives.Operations is else Duration'Min (Check_Time + Max_Sensible_Delay, Time)); if Abs_Time > Check_Time then - Request := To_Timespec (Abs_Time); + Request := C_Time.To_Timespec (Abs_Time); loop exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level; @@ -1230,7 +1231,7 @@ package body System.Task_Primitives.Operations is Base_Time : constant Duration := Monotonic_Clock; Check_Time : Duration := Base_Time; Abs_Time : Duration; - Request : aliased timespec; + Request : aliased C_Time.timespec; Result : Interfaces.C.int; Yielded : Boolean := False; @@ -1243,7 +1244,7 @@ package body System.Task_Primitives.Operations is else Duration'Min (Check_Time + Max_Sensible_Delay, Time)); if Abs_Time > Check_Time then - Request := To_Timespec (Abs_Time); + Request := C_Time.To_Timespec (Abs_Time); Self_ID.Common.State := Delay_Sleep; pragma Assert (Check_Sleep (Delay_Sleep)); diff --git a/gcc/ada/libgnarl/s-taprop__vxworks.adb b/gcc/ada/libgnarl/s-taprop__vxworks.adb index a0f1885..a4dab5f 100644 --- a/gcc/ada/libgnarl/s-taprop__vxworks.adb +++ b/gcc/ada/libgnarl/s-taprop__vxworks.adb @@ -38,6 +38,7 @@ with Ada.Unchecked_Conversion; with Interfaces.C; +with System.C_Time; with System.Float_Control; with System.Interrupt_Management; with System.Multiprocessors; @@ -681,12 +682,12 @@ package body System.Task_Primitives.Operations is --------------------- function Monotonic_Clock return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : int; begin Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access); pragma Assert (Result = 0); - return To_Duration (TS); + return C_Time.To_Duration (TS); end Monotonic_Clock; ------------------- diff --git a/gcc/ada/libgnarl/s-tpopmo.adb b/gcc/ada/libgnarl/s-tpopmo.adb index 9ff1ecd..547a5e4 100644 --- a/gcc/ada/libgnarl/s-tpopmo.adb +++ b/gcc/ada/libgnarl/s-tpopmo.adb @@ -31,6 +31,8 @@ -- This is the Monotonic version of this package for Posix and Linux targets. +with System.C_Time; + separate (System.Task_Primitives.Operations) package body Monotonic is @@ -54,14 +56,14 @@ package body Monotonic is --------------------- function Monotonic_Clock return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : Interfaces.C.int; begin Result := clock_gettime (clock_id => OSC.CLOCK_RT_Ada, tp => TS'Unchecked_Access); pragma Assert (Result = 0); - return To_Duration (TS); + return C_Time.To_Duration (TS); end Monotonic_Clock; ------------------- @@ -69,14 +71,14 @@ package body Monotonic is ------------------- function RT_Resolution return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : Interfaces.C.int; begin Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return To_Duration (TS); + return C_Time.To_Duration (TS); end RT_Resolution; ---------------------- @@ -150,7 +152,7 @@ package body Monotonic is Abs_Time : Duration; P_Abs_Time : Duration; - Request : aliased timespec; + Request : aliased C_Time.timespec; Result : Interfaces.C.int; Exit_Outer : Boolean := False; @@ -184,7 +186,7 @@ package body Monotonic is end if; pragma Warnings (On); - Request := To_Timespec (P_Abs_Time); + Request := C_Time.To_Timespec (P_Abs_Time); Inner : loop exit Outer @@ -236,7 +238,7 @@ package body Monotonic is Check_Time : Duration; Abs_Time : Duration; P_Abs_Time : Duration; - Request : aliased timespec; + Request : aliased C_Time.timespec; Result : Interfaces.C.int; Exit_Outer : Boolean := False; @@ -271,7 +273,7 @@ package body Monotonic is end if; pragma Warnings (On); - Request := To_Timespec (P_Abs_Time); + Request := C_Time.To_Timespec (P_Abs_Time); Inner : loop exit Outer diff --git a/gcc/ada/libgnarl/s-osinte__android.adb b/gcc/ada/libgnat/g-c_time.ads index 3e36d28..0246195 100644 --- a/gcc/ada/libgnarl/s-osinte__android.adb +++ b/gcc/ada/libgnat/g-c_time.ads @@ -1,12 +1,12 @@ ------------------------------------------------------------------------------ -- -- --- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- +-- GNAT RUN-TIME COMPONENTS -- -- -- --- S Y S T E M . O S _ I N T E R F A C E -- +-- G N A T . C _ T I M E -- -- -- --- B o d y -- +-- S p e c -- -- -- --- Copyright (C) 1995-2025, AdaCore -- +-- Copyright (C) 2025, AdaCore -- -- -- -- 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- -- @@ -24,51 +24,15 @@ -- 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. -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- Extensive contributions were provided by Ada Core Technologies Inc. -- -- -- ------------------------------------------------------------------------------ --- This is an Android version of this package. +-- This package provides the time_t, timeval and timespec types corresponding +-- to the C types defined by the OS, as well as various conversion functions. --- This package encapsulates all direct interfaces to OS services --- that are needed by children of System. +-- See file s-c_time.ads for full documentation of the interface -with Interfaces.C; use Interfaces.C; - -package body System.OS_Interface is - - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (TS : timespec) return Duration is - begin - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return timespec'(tv_sec => S, - tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - -end System.OS_Interface; +with System.C_Time; +package GNAT.C_Time renames System.C_Time; diff --git a/gcc/ada/libgnat/g-calend.adb b/gcc/ada/libgnat/g-calend.adb index a2bc77c..80b62b7 100644 --- a/gcc/ada/libgnat/g-calend.adb +++ b/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 -- @@ -333,25 +330,8 @@ package body GNAT.Calendar is ----------------- 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; - - pragma Unsuppress (Overflow_Check); - 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; + return System.C_Time.To_Duration (T.all); end To_Duration; ---------------- @@ -359,45 +339,8 @@ package body GNAT.Calendar is ---------------- 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; - - pragma Unsuppress (Overflow_Check); - begin - if D = 0.0 then - sec := 0; - usec := 0; - - elsif D < 0.0 then - sec := C.Extensions.long_long (D + 0.5); - if D = Duration (sec) then - usec := 0; - else - usec := C.long ((D - Duration (sec)) * Micro + 0.5); - end if; - - else - sec := C.Extensions.long_long (D - 0.5); - if D = Duration (sec) then - usec := 0; - else - usec := C.long ((D - Duration (sec)) * Micro - 0.5); - end if; - end if; - - duration_to_timeval (sec, usec, Result'Access); - - return Result; + return System.C_Time.To_Timeval (D); end To_Timeval; ------------------ diff --git a/gcc/ada/libgnat/g-calend.ads b/gcc/ada/libgnat/g-calend.ads index a329499..c57b7df 100644 --- a/gcc/ada/libgnat/g-calend.ads +++ b/gcc/ada/libgnat/g-calend.ads @@ -40,7 +40,8 @@ -- 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 @@ -126,7 +127,7 @@ package GNAT.Calendar is -- locale (equivalent to Clock). Due to this simplified behavior, the -- implementation does not require expensive system calls on targets such -- as Windows. - -- WARNING: Split_At_Locale is no longer aware of historic events and may + -- WARNING: Time_At_Locale is no longer aware of historic events and may -- produce inaccurate results over DST changes which occurred in the past. function Week_In_Year (Date : Ada.Calendar.Time) return Week_In_Year_Number; @@ -145,24 +146,18 @@ 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; + subtype timeval is System.C_Time.timeval; + pragma Obsolescent (timeval, "use type from GNAT.C_Time instead"); function To_Duration (T : not null access timeval) return Duration; + pragma Inline (To_Duration); + pragma Obsolescent (To_Duration, "use function from GNAT.C_Time instead"); + function To_Timeval (D : Duration) return timeval; + pragma Inline (To_Timeval); + pragma Obsolescent (To_Timeval, "use function from GNAT.C_Time instead"); 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/gcc/ada/libgnat/g-socket.adb b/gcc/ada/libgnat/g-socket.adb index 0fed791..346e79d 100644 --- a/gcc/ada/libgnat/g-socket.adb +++ b/gcc/ada/libgnat/g-socket.adb @@ -47,6 +47,7 @@ with GNAT.Sockets.Poll; with System; use System; with System.Communication; use System.Communication; with System.CRTL; use System.CRTL; +with System.C_Time; with System.Task_Lock; package body GNAT.Sockets is @@ -179,13 +180,6 @@ package body GNAT.Sockets is function Value (S : System.Address) return String; -- Same as Interfaces.C.Strings.Value but taking a System.Address - function To_Timeval (Val : Timeval_Duration) return Timeval; - -- Separate Val in seconds and microseconds - - function To_Duration (Val : Timeval) return Timeval_Duration; - -- Reconstruct a Duration value from a Timeval record (seconds and - -- microseconds). - function Dedot (Value : String) return String is (if Value /= "" and then Value (Value'Last) = '.' then Value (Value'First .. Value'Last - 1) @@ -528,7 +522,7 @@ package body GNAT.Sockets is Res : C.int; Last : C.int; RSig : Socket_Type := No_Socket; - TVal : aliased Timeval; + TVal : aliased System.C_Time.timeval; TPtr : Timeval_Access; begin @@ -543,7 +537,7 @@ package body GNAT.Sockets is if Timeout = Forever then TPtr := null; else - TVal := To_Timeval (Timeout); + TVal := System.C_Time.To_Timeval (Timeout); TPtr := TVal'Unchecked_Access; end if; @@ -1423,7 +1417,7 @@ package body GNAT.Sockets is U4 : aliased C.unsigned; V1 : aliased C.unsigned_char; VS : aliased C.char_array (1 .. NS); -- for devices name - VT : aliased Timeval; + VT : aliased System.C_Time.timeval; Len : aliased C.int; Add : System.Address; Res : C.int; @@ -1596,8 +1590,10 @@ package body GNAT.Sockets is Opt.Timeout := Duration (U4) / 1000; end if; + elsif System.C_Time.In_Timeval_Duration (VT) then + Opt.Timeout := System.C_Time.To_Duration (VT); else - Opt.Timeout := To_Duration (VT); + Opt.Timeout := Forever; end if; when Bind_To_Device => @@ -2633,7 +2629,7 @@ package body GNAT.Sockets is (1 .. (if Option.Name = Bind_To_Device then C.size_t (ASU.Length (Option.Device) + 1) else 0)); - VT : aliased Timeval; + VT : aliased System.C_Time.timeval; Len : C.int; Add : System.Address := Null_Address; Res : C.int; @@ -2767,7 +2763,7 @@ package body GNAT.Sockets is end if; else - VT := To_Timeval (Option.Timeout); + VT := System.C_Time.To_Timeval (Option.Timeout); Len := VT'Size / 8; Add := VT'Address; end if; @@ -2865,33 +2861,6 @@ package body GNAT.Sockets is return Integer (Socket); end To_C; - ----------------- - -- To_Duration -- - ----------------- - - function To_Duration (Val : Timeval) return Timeval_Duration is - Max_D : constant Long_Long_Integer := Long_Long_Integer (Forever - 0.5); - Tv_sec_64 : constant Boolean := SOSC.SIZEOF_tv_sec = 8; - -- Need to separate this condition into the constant declaration to - -- avoid GNAT warning about "always true" or "always false". - begin - if Tv_sec_64 then - -- Check for possible Duration overflow when Tv_Sec field is 64 bit - -- integer. - - if Val.Tv_Sec > time_t (Max_D) - or else - (Val.Tv_Sec = time_t (Max_D) - and then - Val.Tv_Usec > suseconds_t ((Forever - Duration (Max_D)) * 1E6)) - then - return Forever; - end if; - end if; - - return Duration (Val.Tv_Sec) + Duration (Val.Tv_Usec) * 1.0E-6; - end To_Duration; - ------------------- -- To_Host_Entry -- ------------------- @@ -3041,35 +3010,6 @@ package body GNAT.Sockets is return HN.Name (1 .. HN.Length); end To_String; - ---------------- - -- To_Timeval -- - ---------------- - - function To_Timeval (Val : Timeval_Duration) return Timeval is - S : time_t; - uS : suseconds_t; - - begin - -- If zero, set result as zero (otherwise it gets rounded down to -1) - - if Val = 0.0 then - S := 0; - uS := 0; - - -- Normal case where we do round down - - else - S := time_t (Val - 0.5); - if Val = Timeval_Duration (S) then - uS := 0; - else - uS := suseconds_t ((Val - Timeval_Duration (S)) * 1_000_000 - 0.5); - end if; - end if; - - return (S, uS); - end To_Timeval; - ----------- -- Value -- ----------- diff --git a/gcc/ada/libgnat/g-socthi.adb b/gcc/ada/libgnat/g-socthi.adb index 5540dce..c79b8db 100644 --- a/gcc/ada/libgnat/g-socthi.adb +++ b/gcc/ada/libgnat/g-socthi.adb @@ -40,6 +40,8 @@ with GNAT.Task_Lock; with Interfaces.C; use Interfaces.C; +with System.C_Time; + package body GNAT.Sockets.Thin is Non_Blocking_Sockets : aliased Fd_Set; @@ -215,7 +217,7 @@ package body GNAT.Sockets.Thin is declare -- unreachable if Thread_Blocking_IO is statically True pragma Warnings (On, "unreachable code"); WSet : aliased Fd_Set; - Now : aliased Timeval; + Now : aliased System.C_Time.timeval; begin Reset_Socket_Set (WSet'Access); diff --git a/gcc/ada/libgnat/g-socthi__vxworks.adb b/gcc/ada/libgnat/g-socthi__vxworks.adb index a3f05b3..6ae74eb 100644 --- a/gcc/ada/libgnat/g-socthi__vxworks.adb +++ b/gcc/ada/libgnat/g-socthi__vxworks.adb @@ -40,6 +40,8 @@ with GNAT.Task_Lock; with Interfaces.C; use Interfaces.C; +with System.C_Time; + package body GNAT.Sockets.Thin is Non_Blocking_Sockets : aliased Fd_Set; @@ -194,7 +196,7 @@ package body GNAT.Sockets.Thin is declare -- unreachable if Thread_Blocking_IO is statically True pragma Warnings (On, "unreachable code"); WSet : aliased Fd_Set; - Now : aliased Timeval; + Now : aliased System.C_Time.timeval; begin Reset_Socket_Set (WSet'Access); loop diff --git a/gcc/ada/libgnat/g-sothco.ads b/gcc/ada/libgnat/g-sothco.ads index cdf0a16..ec9b574 100644 --- a/gcc/ada/libgnat/g-sothco.ads +++ b/gcc/ada/libgnat/g-sothco.ads @@ -33,8 +33,10 @@ -- This package should not be directly with'ed by an applications program. with Ada.Unchecked_Conversion; + with Interfaces.C.Strings; -with System.Parameters; + +with System.C_Time; package GNAT.Sockets.Thin_Common is @@ -44,31 +46,23 @@ package GNAT.Sockets.Thin_Common is Success : constant C.int := 0; Failure : constant C.int := -1; - type time_t is - range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - for time_t'Size use System.Parameters.time_t_bits; - pragma Convention (C, time_t); - - type suseconds_t is - range -2 ** (8 * SOSC.SIZEOF_tv_usec - 1) - .. 2 ** (8 * SOSC.SIZEOF_tv_usec - 1) - 1; - for suseconds_t'Size use 8 * SOSC.SIZEOF_tv_usec; - pragma Convention (C, suseconds_t); - - type Timeval is record - Tv_Sec : time_t; - Tv_Usec : suseconds_t; - end record; - pragma Convention (C, Timeval); + subtype time_t is System.C_Time.time_t; + pragma Obsolescent (time_t, "use type from GNAT.C_Time instead"); + + subtype suseconds_t is System.C_Time.usec_t; + pragma Obsolescent (suseconds_t, "use type from GNAT.C_Time instead"); + + subtype timeval is System.C_Time.timeval; + pragma Obsolescent (timeval, "use type from GNAT.C_Time instead"); - type Timeval_Access is access all Timeval; + type Timeval_Access is access all System.C_Time.timeval; pragma Convention (C, Timeval_Access); type socklen_t is mod 2 ** (8 * SOSC.SIZEOF_socklen_t); for socklen_t'Size use (8 * SOSC.SIZEOF_socklen_t); - Immediat : constant Timeval := (0, 0); + Immediat : constant System.C_Time.timeval + := System.C_Time.Milliseconds_To_Timeval (0); ------------------------------------------- -- Mapping tables to low level constants -- diff --git a/gcc/ada/libgnat/g-spogwa.adb b/gcc/ada/libgnat/g-spogwa.adb index a4bbf96..3752b2b 100644 --- a/gcc/ada/libgnat/g-spogwa.adb +++ b/gcc/ada/libgnat/g-spogwa.adb @@ -29,7 +29,7 @@ -- -- ------------------------------------------------------------------------------ -with GNAT.Sockets.Thin_Common; +with System.C_Time; procedure GNAT.Sockets.Poll.G_Wait (Fds : in out Set; Timeout : Interfaces.C.int; Result : out Integer) @@ -41,11 +41,11 @@ is readfds : access FD_Set_Type; writefds : access FD_Set_Type; exceptfds : access FD_Set_Type; - timeout : access Thin_Common.Timeval) return Integer + timeout : access System.C_Time.timeval) return Integer with Import => True, Convention => Stdcall, External_Name => "select"; - Timeout_V : aliased Thin_Common.Timeval; - Timeout_A : access Thin_Common.Timeval; + Timeout_V : aliased System.C_Time.timeval; + Timeout_A : access System.C_Time.timeval; Rfds : aliased FD_Set_Type; Rcount : Natural := 0; @@ -63,8 +63,7 @@ begin if Timeout >= 0 then Timeout_A := Timeout_V'Access; - Timeout_V.Tv_Sec := Thin_Common.time_t (Timeout / 1000); - Timeout_V.Tv_Usec := Thin_Common.suseconds_t (Timeout rem 1000 * 1000); + Timeout_V := System.C_Time.Milliseconds_To_Timeval (Timeout); end if; Reset_Socket_Set (Rfds); diff --git a/gcc/ada/libgnat/s-c_time.adb b/gcc/ada/libgnat/s-c_time.adb new file mode 100644 index 0000000..70f8a9c --- /dev/null +++ b/gcc/ada/libgnat/s-c_time.adb @@ -0,0 +1,203 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- S Y S T E M . C _ T I M E -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 2025, 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. -- +-- -- +------------------------------------------------------------------------------ + +package body System.C_Time is + + -- Two Duration representations are described in targparm.ads: + -- Size Small Last = (2**(Size - 1) - 1) * Small + -- 32 0.02 42_949_672.94 + -- 64 0.000_000_001 9_223_372_036.854_775_807 + + Recip : constant := (if Duration'Size = 32 then 50 else 1_000_000_000); + -- The reciprocal of the Small used to write "* Small" as "/ Recip" + + Milli : constant := 1_000; + Micro : constant := 1_000_000; + Nano : constant := 1_000_000_000; + -- The standard divisors + + pragma Unsuppress (Overflow_Check); + -- Overflow may occur during the various conversions + + ------------------------- + -- In_Timeval_Duration -- + ------------------------- + + -- Immediate : constant Duration := 0.0; + + -- Forever : constant Duration := + -- Duration'Min (Duration'Last, 1.0 * OS_Constants.MAX_tv_sec); + + -- subtype Timeval_Duration is Duration range Immediate .. Forever; + + function In_Timeval_Duration (T : timeval) return Boolean is + Max_Dur : constant := 2**(Duration'Size - 1) - 1; + Max_Sec : constant := Max_Dur / Recip; + Max_Usec : constant := (Max_Dur mod Recip) * Micro / Recip; + + -- When Duration'Size = 64 and time_t'Size = 32, the compiler + -- complains that Max_Sec does not fit in time_t, hence cannot + -- be compared with T.tv_sec. + Safe_Max_Sec : constant := + (if Max_Sec > time_t'Last then time_t'Last else Max_Sec); + Safe_Max_Usec : constant := + (if Max_Sec > time_t'Last then usec_t'Last else Max_Usec); + + begin + pragma Warnings (Off, "condition is always"); + return T.tv_sec >= 0 + and then (T.tv_sec > 0 or else T.tv_usec >= 0) + and then T.tv_sec <= Safe_Max_Sec + and then (T.tv_sec < Safe_Max_Sec or else T.tv_usec <= Safe_Max_Usec) + and then T.tv_sec <= OS_Constants.MAX_tv_sec + and then (T.tv_sec < OS_Constants.MAX_tv_sec or else T.tv_usec = 0); + pragma Warnings (On, "condition is always"); + end In_Timeval_Duration; + + ----------------------------- + -- Milliseconds_To_Timeval -- + ----------------------------- + + function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval is + use Interfaces.C; + Q : constant int := M / Milli; + R : constant int := M rem Milli; + + begin + return (tv_sec => time_t (Q), tv_usec => usec_t (R) * (Micro / Milli)); + end Milliseconds_To_Timeval; + + ----------------------------- + -- Nanoseconds_To_Timespec -- + ----------------------------- + + function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec is + use Interfaces.C; + Q : constant int := N / Nano; + R : constant int := N rem Nano; + + begin + return (tv_sec => time_t (Q), tv_nsec => nsec_t (R)); + end Nanoseconds_To_Timespec; + + ----------------- + -- To_Duration -- + ----------------- + + -- Duration (tv_usec) is OK even when Duration'Size = 32, see above + + function To_Duration (T : timeval) return Duration is + begin + return Duration (T.tv_sec) + Duration (T.tv_usec) / Micro; + end To_Duration; + + -- Duration (tv_nsec) overflows when Duration'Size = 32, see above. + -- Scale down nanoseconds by the value of the Small in nanoseconds. + + function To_Duration (T : timespec) return Duration is + S : constant := Nano / Recip; + + begin + return Duration (T.tv_sec) + Duration (T.tv_nsec / S) / (Nano / S); + end To_Duration; + + ----------------- + -- To_Timespec -- + ----------------- + + function To_Timespec (T : timeval) return timespec is + begin + return (tv_sec => T.tv_sec, tv_nsec => nsec_t (T.tv_usec) * Milli); + end To_Timespec; + + function To_Timespec (D : Duration) return timespec is + tv_sec : time_t; + tv_nsec : nsec_t; + + begin + if D = 0.0 then + tv_sec := 0; + tv_nsec := 0; + + elsif D < 0.0 then + tv_sec := time_t (D + 0.5); + if D = Duration (tv_sec) then + tv_nsec := 0; + else + tv_nsec := nsec_t ((D - Duration (tv_sec)) * Nano + 0.5); + end if; + + else + tv_sec := time_t (D - 0.5); + if D = Duration (tv_sec) then + tv_nsec := 0; + else + tv_nsec := nsec_t ((D - Duration (tv_sec)) * Nano - 0.5); + end if; + end if; + + return (tv_sec, tv_nsec); + end To_Timespec; + + ----------------- + -- To_Timeval -- + ----------------- + + function To_Timeval (D : Duration) return timeval is + tv_sec : time_t; + tv_usec : usec_t; + + begin + if D = 0.0 then + tv_sec := 0; + tv_usec := 0; + + elsif D < 0.0 then + tv_sec := time_t (D + 0.5); + if D = Duration (tv_sec) then + tv_usec := 0; + else + tv_usec := usec_t ((D - Duration (tv_sec)) * Micro + 0.5); + end if; + + else + tv_sec := time_t (D - 0.5); + if D = Duration (tv_sec) then + tv_usec := 0; + else + tv_usec := usec_t ((D - Duration (tv_sec)) * Micro - 0.5); + end if; + end if; + + return (tv_sec, tv_usec); + end To_Timeval; + +end System.C_Time; diff --git a/gcc/ada/libgnat/s-c_time.ads b/gcc/ada/libgnat/s-c_time.ads new file mode 100644 index 0000000..626a02d --- /dev/null +++ b/gcc/ada/libgnat/s-c_time.ads @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- S Y S T E M . C _ T I M E -- +-- -- +-- S p e c -- +-- -- +-- Copyright (C) 2025, 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 package provides the time_t, timeval and timespec types corresponding +-- to the C types defined by the OS, as well as various conversion functions. + +with Interfaces.C; + +with System.OS_Constants; + +package System.C_Time + with Pure +is + -- These two C structs represent durations with different accuracies and + -- maximal values. + + type time_t is range -2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) .. + 2 ** (OS_Constants.SIZEOF_tv_sec * 8 - 1) - 1 + with Convention => C, Size => OS_Constants.SIZEOF_tv_sec * 8; + + type usec_t is range -2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) .. + 2 ** (OS_Constants.SIZEOF_tv_usec * 8 - 1) - 1 + with Convention => C, Size => OS_Constants.SIZEOF_tv_usec * 8; + -- Larger than the suseconds_t C type on ARM 32 bits with GNU libc + -- when __TIME_BITS=64. + + type timeval is record + tv_sec : time_t; -- seconds + tv_usec : usec_t; -- microseconds + end record + with Convention => C; + + 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 timespec is record + tv_sec : time_t; -- seconds + tv_nsec : nsec_t; -- nanoseconds + end record + with Convention => C; + + -- All conversion functions truncate the result if it is inexact + + function To_Duration (T : timespec) return Duration with Inline; + function To_Duration (T : timeval) return Duration with Inline; + + function To_Timespec (D : Duration) return timespec with Inline; + function To_Timeval (D : Duration) return timeval with Inline; + + function In_Timeval_Duration (T : timeval) return Boolean with Inline; + -- g-socket.adb if not Windows target + + function Milliseconds_To_Timeval (M : Interfaces.C.int) return timeval + with Inline; + -- g-sothco.ads + -- g-spogwa.adb + + function Nanoseconds_To_Timespec (N : Interfaces.C.int) return timespec + with Inline; + function To_Timespec (T : timeval) return timespec with Inline; + -- s-osinte__darwin.adb + +end System.C_Time; diff --git a/gcc/ada/libgnat/s-optide.adb b/gcc/ada/libgnat/s-optide.adb index 6abe6d3..e39c7cb 100644 --- a/gcc/ada/libgnat/s-optide.adb +++ b/gcc/ada/libgnat/s-optide.adb @@ -36,8 +36,13 @@ procedure Timed_Delay (Time : Duration; Mode : Integer) is - Request : aliased timespec; - Remaind : aliased timespec; + + function nanosleep (rqtp, rmtp : not null access C_Time.timespec) + return Integer; + pragma Import (C, nanosleep, "nanosleep"); + + Request : aliased C_Time.timespec; + Remaind : aliased C_Time.timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -71,7 +76,7 @@ begin end if; pragma Warnings (On); - Request := To_Timespec (Time_Chunk); + Request := C_Time.To_Timespec (Time_Chunk); Result := nanosleep (Request'Access, Remaind'Access); Check_Time := Clock; diff --git a/gcc/ada/libgnat/s-os_lib.adb b/gcc/ada/libgnat/s-os_lib.adb index b07bdea..d0a0ad3 100644 --- a/gcc/ada/libgnat/s-os_lib.adb +++ b/gcc/ada/libgnat/s-os_lib.adb @@ -2985,7 +2985,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; @@ -3023,9 +3023,9 @@ package body System.OS_Lib is -- To_C -- ---------- - function To_C (Time : OS_Time) return time_t is + function To_C (Time : OS_Time) return Long_Long_Integer is begin - return time_t (Time); + return Long_Long_Integer (Time); end To_C; ------------------ diff --git a/gcc/ada/libgnat/s-os_lib.ads b/gcc/ada/libgnat/s-os_lib.ads index 38cfc88..734f4fd 100644 --- a/gcc/ada/libgnat/s-os_lib.ads +++ b/gcc/ada/libgnat/s-os_lib.ads @@ -115,6 +115,12 @@ package System.OS_Lib is -- these have Intrinsic convention, so for example it is not permissible -- to create accesses to any of these functions. + function To_Ada (Time : Long_Long_Integer) return OS_Time; + -- Convert Long_Long_Integer to OS_Time + + function To_C (Time : OS_Time) return Long_Long_Integer; + -- Convert OS_Time to Long_Long_Integer + subtype Year_Type is Integer range 1900 .. 2099; subtype Month_Type is Integer range 1 .. 12; subtype Day_Type is Integer range 1 .. 31; @@ -161,27 +167,6 @@ package System.OS_Lib is -- component parts to be interpreted in the local time zone, and returns -- an OS_Time. Returns Invalid_Time if the creation fails. - ------------------ - -- 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; - -- Convert C time_t type to OS_Time - ---------------- -- File Stuff -- ---------------- @@ -1126,8 +1111,8 @@ private pragma Import (Intrinsic, ">"); pragma Import (Intrinsic, "<="); pragma Import (Intrinsic, ">="); - pragma Inline (To_C); pragma Inline (To_Ada); + pragma Inline (To_C); type Process_Id is new Integer; Invalid_Pid : constant Process_Id := -1; diff --git a/gcc/ada/libgnat/s-osprim__darwin.adb b/gcc/ada/libgnat/s-osprim__darwin.adb index 28bfcb8..7b978a3 100644 --- a/gcc/ada/libgnat/s-osprim__darwin.adb +++ b/gcc/ada/libgnat/s-osprim__darwin.adb @@ -29,9 +29,10 @@ -- -- ------------------------------------------------------------------------------ --- This version is for darwin +-- This version is for Darwin + +with System.C_Time; -with System.Parameters; package body System.OS_Primitives is -- ??? These definitions are duplicated from System.OS_Interface @@ -46,27 +47,13 @@ package body System.OS_Primitives is pragma Convention (C, struct_timezone); type struct_timezone_ptr is access all struct_timezone; - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type struct_timeval is record - tv_sec : time_t; - tv_usec : Integer; - end record; - pragma Convention (C, struct_timeval); - function gettimeofday - (tv : not null access struct_timeval; + (tv : not null access C_Time.timeval; tz : struct_timezone_ptr) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Integer; - end record; - pragma Convention (C, timespec); - - function nanosleep (rqtp, rmtp : not null access timespec) return Integer; + function nanosleep (rqtp, rmtp : not null access C_Time.timespec) + return Integer; pragma Import (C, nanosleep, "nanosleep"); ----------- @@ -74,7 +61,7 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - TV : aliased struct_timeval; + TV : aliased C_Time.timeval; Result : Integer; pragma Unreferenced (Result); @@ -89,37 +76,10 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, null); - return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; + return C_Time.To_Duration (TV); end Clock; ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec; - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return - timespec'(tv_sec => S, - tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - ----------------- -- Timed_Delay -- ----------------- @@ -127,8 +87,8 @@ package body System.OS_Primitives is (Time : Duration; Mode : Integer) is - Request : aliased timespec; - Remaind : aliased timespec; + Request : aliased C_Time.timespec; + Remaind : aliased C_Time.timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -148,7 +108,7 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - Request := To_Timespec (Rel_Time); + Request := C_Time.To_Timespec (Rel_Time); Result := nanosleep (Request'Access, Remaind'Access); Check_Time := Clock; diff --git a/gcc/ada/libgnat/s-osprim__posix.adb b/gcc/ada/libgnat/s-osprim__posix.adb index 94d06c3..45836ac 100644 --- a/gcc/ada/libgnat/s-osprim__posix.adb +++ b/gcc/ada/libgnat/s-osprim__posix.adb @@ -30,26 +30,10 @@ ------------------------------------------------------------------------------ -- This version is for POSIX-like operating systems -with System.Parameters; -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 time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; +with System.C_Time; - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Integer; - end record; - pragma Convention (C, timespec); - - function nanosleep (rqtp, rmtp : not null access timespec) return Integer; - pragma Import (C, nanosleep, "nanosleep"); +package body System.OS_Primitives is ----------- -- Clock -- @@ -57,27 +41,12 @@ package body System.OS_Primitives is function Clock return Duration is - type timeval is array (1 .. 3) of Long_Integer; - -- The timeval array is sized to contain Long_Long_Integer sec and - -- Long_Integer usec. If Long_Long_Integer'Size = Long_Integer'Size then - -- it will be overly large but that will not effect the implementation - -- since it is not accessed directly. - - procedure timeval_to_duration - (T : not null access timeval; - sec : not null access Long_Long_Integer; - usec : not null access Long_Integer); - pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); - - Micro : constant := 10**6; - sec : aliased Long_Long_Integer; - usec : aliased Long_Integer; - TV : aliased timeval; + TV : aliased C_Time.timeval; Result : Integer; pragma Unreferenced (Result); function gettimeofday - (Tv : access timeval; + (Tv : access C_Time.timeval; Tz : System.Address := System.Null_Address) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); @@ -91,38 +60,10 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, System.Null_Address); - timeval_to_duration (TV'Access, sec'Access, usec'Access); - return Duration (sec) + Duration (usec) / Micro; + return C_Time.To_Duration (TV); end Clock; ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec; - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return - timespec'(tv_sec => S, - tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - ----------------- -- Timed_Delay -- ----------------- diff --git a/gcc/ada/libgnat/s-osprim__posix2008.adb b/gcc/ada/libgnat/s-osprim__posix2008.adb index 78b21c6..fceb37c 100644 --- a/gcc/ada/libgnat/s-osprim__posix2008.adb +++ b/gcc/ada/libgnat/s-osprim__posix2008.adb @@ -32,34 +32,19 @@ -- This version is for POSIX.1-2008-like operating systems with System.CRTL; +with System.C_Time; with System.OS_Constants; -with System.Parameters; + 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. - - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Integer; - end record; - pragma Convention (C, timespec); - - function nanosleep (rqtp, rmtp : not null access timespec) return Integer; - pragma Import (C, nanosleep, "nanosleep"); - ----------- -- Clock -- ----------- function Clock return Duration is - TS : aliased timespec; + TS : aliased C_Time.timespec; Result : int; type clockid_t is new int; @@ -68,43 +53,16 @@ package body System.OS_Primitives is function clock_gettime (clock_id : clockid_t; - tp : access timespec) return int; + tp : access C_Time.timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); begin Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; + return C_Time.To_Duration (TS); end Clock; ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec; - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return - timespec'(tv_sec => S, - tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - ----------------- -- Timed_Delay -- ----------------- diff --git a/gcc/ada/libgnat/s-osprim__rtems.adb b/gcc/ada/libgnat/s-osprim__rtems.adb index c8fbc82..99644b3 100644 --- a/gcc/ada/libgnat/s-osprim__rtems.adb +++ b/gcc/ada/libgnat/s-osprim__rtems.adb @@ -31,7 +31,8 @@ -- This version is for POSIX-like operating systems -with System.Parameters; +with System.C_Time; + package body System.OS_Primitives is -- ??? These definitions are duplicated from System.OS_Interface @@ -39,16 +40,8 @@ package body System.OS_Primitives is -- these declarations in System.OS_Interface and move these ones in -- the spec. - type time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Integer; - end record; - pragma Convention (C, timespec); - - function nanosleep (rqtp, rmtp : not null access timespec) return Integer; + function nanosleep (rqtp, rmtp : not null access C_Time.timespec) + return Integer; pragma Import (C, nanosleep, "nanosleep"); ----------- @@ -56,28 +49,12 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - - type timeval is record - tv_sec : time_t; - tv_usec : Long_Integer; - end record; - pragma Convention (C, timeval); - - procedure timeval_to_duration - (T : not null access timeval; - sec : not null access Long_Long_Integer; - usec : not null access Long_Integer); - pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); - - Micro : constant := 10**6; - sec : aliased Long_Long_Integer; - usec : aliased Long_Integer; - TV : aliased timeval; + TV : aliased C_Time.timeval; Result : Integer; pragma Unreferenced (Result); function gettimeofday - (Tv : access timeval; + (Tv : access C_Time.timeval; Tz : System.Address := System.Null_Address) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); @@ -91,38 +68,10 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, System.Null_Address); - timeval_to_duration (TV'Access, sec'Access, usec'Access); - return Duration (sec) + Duration (usec) / Micro; + return C_Time.To_Duration (TV); end Clock; ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec; - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return - timespec'(tv_sec => S, - tv_nsec => Long_Integer (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - ----------------- -- Timed_Delay -- ----------------- @@ -130,8 +79,8 @@ package body System.OS_Primitives is (Time : Duration; Mode : Integer) is - Request : aliased timespec; - Remaind : aliased timespec; + Request : aliased C_Time.timespec; + Remaind : aliased C_Time.timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -151,7 +100,7 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - Request := To_Timespec (Rel_Time); + Request := C_Time.To_Timespec (Rel_Time); Result := nanosleep (Request'Access, Remaind'Access); Check_Time := Clock; diff --git a/gcc/ada/libgnat/s-osprim__solaris.adb b/gcc/ada/libgnat/s-osprim__solaris.adb deleted file mode 100644 index a08feb5..0000000 --- a/gcc/ada/libgnat/s-osprim__solaris.adb +++ /dev/null @@ -1,126 +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-2025, Free Software Foundation, Inc. -- --- -- --- GNARL is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 3, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. -- --- -- --- As a special exception under Section 7 of GPL version 3, you are granted -- --- additional permissions described in the GCC Runtime Library Exception, -- --- version 3.1, as published by the Free Software Foundation. -- --- -- --- You should have received a copy of the GNU General Public License and -- --- a copy of the GCC Runtime Library Exception along with this program; -- --- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- --- <http://www.gnu.org/licenses/>. -- --- -- --- GNARL was developed by the GNARL team at Florida State University. -- --- Extensive contributions were provided by Ada Core Technologies, Inc. -- --- -- ------------------------------------------------------------------------------- - --- This version uses gettimeofday and select --- This file is suitable for Solaris (32 and 64 bits). - -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_timeval is record - tv_sec : Long_Integer; - tv_usec : Long_Integer; - end record; - pragma Convention (C, struct_timeval); - - procedure gettimeofday - (tv : not null access struct_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 struct_timeval); - pragma Import (C, C_select, "select"); - - ----------- - -- Clock -- - ----------- - - function Clock return Duration is - TV : aliased struct_timeval; - - begin - gettimeofday (TV'Access); - return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; - 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 struct_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.tv_sec := Long_Integer (Rel_Time); - - if Duration (timeval.tv_sec) > Rel_Time then - timeval.tv_sec := timeval.tv_sec - 1; - end if; - - timeval.tv_usec := - Long_Integer ((Rel_Time - Duration (timeval.tv_sec)) * 10#1#E6); - - 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/gcc/ada/libgnat/s-osprim__unix.adb b/gcc/ada/libgnat/s-osprim__unix.adb index 5848df6..c48fbe1 100644 --- a/gcc/ada/libgnat/s-osprim__unix.adb +++ b/gcc/ada/libgnat/s-osprim__unix.adb @@ -30,7 +30,9 @@ ------------------------------------------------------------------------------ -- This version uses gettimeofday and select --- This file is suitable for OpenNT, Dec Unix and SCO UnixWare. +-- This file is suitable for Dec Unix, SCO UnixWare and Sun Solaris. + +with System.C_Time; package body System.OS_Primitives is @@ -39,14 +41,8 @@ package body System.OS_Primitives is -- these declarations in System.OS_Interface and move these ones in -- the spec. - type struct_timeval is record - tv_sec : Integer; - tv_usec : Integer; - end record; - pragma Convention (C, struct_timeval); - procedure gettimeofday - (tv : not null access struct_timeval; + (tv : not null access C_Time.timeval; tz : Address := Null_Address); pragma Import (C, gettimeofday, "gettimeofday"); @@ -55,7 +51,7 @@ package body System.OS_Primitives is readfds, writefds, exceptfds : Address := Null_Address; - timeout : not null access struct_timeval); + timeout : not null access C_Time.timeval); pragma Import (C, C_select, "select"); ----------- @@ -63,11 +59,11 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - TV : aliased struct_timeval; + TV : aliased C_Time.timeval; begin gettimeofday (TV'Access); - return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; + return C_Time.To_Duration (TV); end Clock; ----------------- @@ -82,7 +78,7 @@ package body System.OS_Primitives is Abs_Time : Duration; Base_Time : constant Duration := Clock; Check_Time : Duration := Base_Time; - timeval : aliased struct_timeval; + timeval : aliased C_Time.timeval; begin if Mode = Relative then @@ -95,14 +91,7 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - timeval.tv_sec := Integer (Rel_Time); - - if Duration (timeval.tv_sec) > Rel_Time then - timeval.tv_sec := timeval.tv_sec - 1; - end if; - - timeval.tv_usec := - Integer ((Rel_Time - Duration (timeval.tv_sec)) * 10#1#E6); + timeval := C_Time.To_Timeval (Rel_Time); C_select (timeout => timeval'Unchecked_Access); Check_Time := Clock; diff --git a/gcc/ada/libgnat/s-osprim__x32.adb b/gcc/ada/libgnat/s-osprim__x32.adb deleted file mode 100644 index e127107a..0000000 --- a/gcc/ada/libgnat/s-osprim__x32.adb +++ /dev/null @@ -1,170 +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-2025, Free Software Foundation, Inc. -- --- -- --- GNARL is free software; you can redistribute it and/or modify it under -- --- terms of the GNU General Public License as published by the Free Soft- -- --- ware Foundation; either version 3, or (at your option) any later ver- -- --- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- --- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- --- or FITNESS FOR A PARTICULAR PURPOSE. -- --- -- --- As a special exception under Section 7 of GPL version 3, you are granted -- --- additional permissions described in the GCC Runtime Library Exception, -- --- version 3.1, as published by the Free Software Foundation. -- --- -- --- You should have received a copy of the GNU General Public License and -- --- a copy of the GCC Runtime Library Exception along with this program; -- --- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- --- <http://www.gnu.org/licenses/>. -- --- -- --- GNARL was developed by the GNARL team at Florida State University. -- --- Extensive contributions were provided by Ada Core Technologies, Inc. -- --- -- ------------------------------------------------------------------------------- - --- This version is for Linux/x32 - -with System.Parameters; - -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 time_t is range -2 ** (System.Parameters.time_t_bits - 1) - .. 2 ** (System.Parameters.time_t_bits - 1) - 1; - - type timespec is record - tv_sec : time_t; - tv_nsec : Long_Long_Integer; - end record; - pragma Convention (C, timespec); - - function nanosleep (rqtp, rmtp : not null access timespec) return Integer; - pragma Import (C, nanosleep, "nanosleep"); - - ----------- - -- Clock -- - ----------- - - function Clock return Duration is - type timeval is array (1 .. 2) of Long_Long_Integer; - - procedure timeval_to_duration - (T : not null access timeval; - sec : not null access Long_Integer; - usec : not null access Long_Integer); - pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); - - Micro : constant := 10**6; - sec : aliased Long_Integer; - usec : aliased Long_Integer; - TV : aliased timeval; - Result : Integer; - pragma Unreferenced (Result); - - function gettimeofday - (Tv : access 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); - timeval_to_duration (TV'Access, sec'Access, usec'Access); - return Duration (sec) + Duration (usec) / Micro; - end Clock; - - ----------------- - -- To_Timespec -- - ----------------- - - function To_Timespec (D : Duration) return timespec; - - function To_Timespec (D : Duration) return timespec is - S : time_t; - F : Duration; - - begin - S := time_t (Long_Long_Integer (D)); - F := D - Duration (S); - - -- If F has negative value due to a round-up, adjust for positive F - -- value. - - if F < 0.0 then - S := S - 1; - F := F + 1.0; - end if; - - return - timespec'(tv_sec => S, - tv_nsec => Long_Long_Integer (F * 10#1#E9)); - end To_Timespec; - - ----------------- - -- Timed_Delay -- - ----------------- - - procedure Timed_Delay - (Time : Duration; - Mode : Integer) - is - Request : aliased timespec; - Remaind : aliased 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 := 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/gcc/ada/libgnat/s-parame.ads b/gcc/ada/libgnat/s-parame.ads index 98284a4..8587453 100644 --- a/gcc/ada/libgnat/s-parame.ads +++ b/gcc/ada/libgnat/s-parame.ads @@ -97,13 +97,6 @@ package System.Parameters is -- 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 time_t type -- - ------------------------------------ - - time_t_bits : constant := Long_Integer'Size; - -- Number of bits in type time_t - ---------------------------------------------- -- Characteristics of types in Interfaces.C -- ---------------------------------------------- diff --git a/gcc/ada/libgnat/s-parame__hpux.ads b/gcc/ada/libgnat/s-parame__hpux.ads index a8a7b69..832f344 100644 --- a/gcc/ada/libgnat/s-parame__hpux.ads +++ b/gcc/ada/libgnat/s-parame__hpux.ads @@ -96,13 +96,6 @@ package System.Parameters is -- 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 time_t type -- - ------------------------------------ - - time_t_bits : constant := Long_Integer'Size; - -- Number of bits in type time_t - ---------------------------------------------- -- Characteristics of Types in Interfaces.C -- ---------------------------------------------- diff --git a/gcc/ada/libgnat/s-parame__posix2008.ads b/gcc/ada/libgnat/s-parame__posix2008.ads deleted file mode 100644 index 1cf09c6..0000000 --- a/gcc/ada/libgnat/s-parame__posix2008.ads +++ /dev/null @@ -1,189 +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-2025, 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 time_t type -- - ------------------------------------ - - time_t_bits : constant := Long_Long_Integer'Size; - -- Number of bits in type time_t. Use for targets that are Posix 2008 - -- compliant (fixes the year 2038 time_t overflow). - - ---------------------------------------------- - -- 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; diff --git a/gcc/ada/libgnat/s-parame__vxworks.ads b/gcc/ada/libgnat/s-parame__vxworks.ads index dbaadb4..de9afdb 100644 --- a/gcc/ada/libgnat/s-parame__vxworks.ads +++ b/gcc/ada/libgnat/s-parame__vxworks.ads @@ -98,21 +98,6 @@ package System.Parameters is -- 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 time_t type -- - ------------------------------------ - - -- IMPORTANT NOTE: - -- Select the appropriate time_t_bits for the VSB in use, then rebuild - -- the runtime using instructions in adainclude/libada.gpr. - - -- time_t_bits : constant := Long_Integer'Size; - -- Number of bits in type time_t for SR0650 and before and SR0660 with - -- non-default configuration. - - time_t_bits : constant := Long_Long_Integer'Size; - -- Number of bits in type time_t for SR0660 with default configuration. - ---------------------------------------------- -- Characteristics of types in Interfaces.C -- ---------------------------------------------- diff --git a/gcc/ada/s-oscons-tmplt.c b/gcc/ada/s-oscons-tmplt.c index 7a5e987..74cf1e5 100644 --- a/gcc/ada/s-oscons-tmplt.c +++ b/gcc/ada/s-oscons-tmplt.c @@ -1764,6 +1764,17 @@ CND(SIZEOF_tv_usec, "tv_usec") #endif CNS(MAX_tv_sec, "") } + +{ + struct timespec ts; +/* + -- Sizes (in bytes) of the components of struct timespec. + -- The tv_sec field is the same as in struct timeval. +*/ +#define SIZEOF_tv_nsec (sizeof (ts.tv_nsec)) +CND(SIZEOF_tv_nsec, "tv_nsec"); +} + /* -- Sizes of various data types |