From: Eric Botcazou Date: Thu, 31 Jul 2025 15:47:07 +0000 (+0200) Subject: Revert "Ada: Add System.C_Time and GNAT.C_Time units to libgnat" X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d3828e64a888866c39131fd9feab5d0ee2bd90cf;p=thirdparty%2Fgcc.git Revert "Ada: Add System.C_Time and GNAT.C_Time units to libgnat" This reverts commit 41974d6ed349507ca1532629851b7b5d74f44abc. --- diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl index b383d9dc73ce..50e683aa80a7 100644 --- a/gcc/ada/Makefile.rtl +++ b/gcc/ada/Makefile.rtl @@ -415,7 +415,6 @@ 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) \ @@ -536,7 +535,6 @@ 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) \ @@ -1420,6 +1418,7 @@ ifeq ($(strip $(filter-out arm% aarch64 linux-android%,$(target_cpu) $(target_os s-inmaop.adb. * + * * + * 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 +#include +#if (_WRS_VXWORKS_MAJOR == 7) || (_WRS_VXWORKS_MINOR != 0) +#include +#endif +#else +#include +#endif +#elif defined (__nucleus__) +#include +#else +#include +#endif + +#ifdef __MINGW32__ +#include "mingw32.h" +#include +#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 29642aa89709..d041090eab06 100644 --- a/gcc/ada/doc/gnat_rm/the_gnat_library.rst +++ b/gcc/ada/doc/gnat_rm/the_gnat_library.rst @@ -663,18 +663,6 @@ 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`) @@ -686,6 +674,8 @@ types defined by the OS, as well as various conversion functions. 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 712d46c54abb..edb04a20f418 100644 --- a/gcc/ada/impunit.adb +++ b/gcc/ada/impunit.adb @@ -250,7 +250,6 @@ 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 a57689e0847d..ee27ff29f156 100644 --- a/gcc/ada/libgnarl/a-exetim__posix.adb +++ b/gcc/ada/libgnarl/a-exetim__posix.adb @@ -34,9 +34,8 @@ with Ada.Task_Identification; use Ada.Task_Identification; with Ada.Unchecked_Conversion; -with System.C_Time; -with System.OS_Interface; use System.OS_Interface; with System.Tasking; +with System.OS_Interface; use System.OS_Interface; with System.Task_Primitives.Operations; use System.Task_Primitives.Operations; with Interfaces.C; use Interfaces.C; @@ -99,7 +98,7 @@ package body Ada.Execution_Time is (T : Ada.Task_Identification.Task_Id := Ada.Task_Identification.Current_Task) return CPU_Time is - TS : aliased System.C_Time.timespec; + TS : aliased timespec; Clock_Id : aliased Interfaces.C.int; Result : Interfaces.C.int; @@ -113,7 +112,7 @@ package body Ada.Execution_Time is function clock_gettime (clock_id : Interfaces.C.int; - tp : access System.C_Time.timespec) + tp : access timespec) return Interfaces.C.int; pragma Import (C, clock_gettime, "clock_gettime"); -- Function from the POSIX.1b Realtime Extensions library @@ -140,7 +139,7 @@ package body Ada.Execution_Time is (clock_id => Clock_Id, tp => TS'Unchecked_Access); pragma Assert (Result = 0); - return To_CPU_Time (System.C_Time.To_Duration (TS)); + return To_CPU_Time (To_Duration (TS)); end Clock; -------------------------- diff --git a/gcc/ada/libgnarl/s-linux.ads b/gcc/ada/libgnarl/s-linux.ads index f41a67bd8a3a..62176f1bd968 100644 --- a/gcc/ada/libgnarl/s-linux.ads +++ b/gcc/ada/libgnarl/s-linux.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 c05b90c04cb7..855e6672e365 100644 --- a/gcc/ada/libgnarl/s-linux__alpha.ads +++ b/gcc/ada/libgnarl/s-linux__alpha.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 c7a69fa29c01..537c46b5d3cc 100644 --- a/gcc/ada/libgnarl/s-linux__android-aarch64.ads +++ b/gcc/ada/libgnarl/s-linux__android-aarch64.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 fdc14c387fb9..07bca55f6c47 100644 --- a/gcc/ada/libgnarl/s-linux__android-arm.ads +++ b/gcc/ada/libgnarl/s-linux__android-arm.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 e249846cd302..a3ce02bcb6e7 100644 --- a/gcc/ada/libgnarl/s-linux__hppa.ads +++ b/gcc/ada/libgnarl/s-linux__hppa.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 20e3d909c0e0..e0eaaa47e71d 100644 --- a/gcc/ada/libgnarl/s-linux__loongarch.ads +++ b/gcc/ada/libgnarl/s-linux__loongarch.ads @@ -35,6 +35,7 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; +with System.Parameters; package System.Linux is pragma Preelaborate; @@ -43,8 +44,25 @@ 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 6a575c7a865e..3ad7f45379eb 100644 --- a/gcc/ada/libgnarl/s-linux__mips.ads +++ b/gcc/ada/libgnarl/s-linux__mips.ads @@ -35,6 +35,7 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; +with System.Parameters; package System.Linux is pragma Preelaborate; @@ -43,8 +44,25 @@ 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 -- ----------- @@ -107,8 +125,8 @@ package System.Linux is -- struct_sigaction offsets - sa_handler_pos : constant := Interfaces.C.int'Size / 8; - sa_mask_pos : constant := Interfaces.C.int'Size / 8 + + sa_handler_pos : constant := int'Size / 8; + sa_mask_pos : constant := 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 ad0a07b8c506..867cb1fa8070 100644 --- a/gcc/ada/libgnarl/s-linux__riscv.ads +++ b/gcc/ada/libgnarl/s-linux__riscv.ads @@ -35,6 +35,7 @@ -- Preelaborate. This package is designed to be a bottom-level (leaf) package with Interfaces.C; +with System.Parameters; package System.Linux is pragma Preelaborate; @@ -43,8 +44,25 @@ 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 -- ----------- @@ -107,8 +125,8 @@ package System.Linux is -- struct_sigaction offsets sa_handler_pos : constant := 0; - sa_mask_pos : constant := Interfaces.C.long'Size / 8; - sa_flags_pos : constant := Interfaces.C.long'Size / 8 + 128; + sa_mask_pos : constant := long'Size / 8; + sa_flags_pos : constant := 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 037834617d72..5ff201cf832c 100644 --- a/gcc/ada/libgnarl/s-linux__sparc.ads +++ b/gcc/ada/libgnarl/s-linux__sparc.ads @@ -36,6 +36,7 @@ -- 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,8 +45,24 @@ 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 new file mode 100644 index 000000000000..6144b8b34ce1 --- /dev/null +++ b/gcc/ada/libgnarl/s-linux__x32.ads @@ -0,0 +1,133 @@ +------------------------------------------------------------------------------ +-- -- +-- 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 -- +-- . -- +-- -- +-- -- +------------------------------------------------------------------------------ + +-- 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 3a2df424d91b..da057d47cf5b 100644 --- a/gcc/ada/libgnarl/s-osinte__aix.adb +++ b/gcc/ada/libgnarl/s-osinte__aix.adb @@ -35,6 +35,15 @@ 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 -- ------------------------ @@ -63,6 +72,29 @@ package body System.OS_Interface is end if; 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 eb417a2cc999..1e115b80d6fb 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,18 +200,26 @@ 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 C_Time.timespec) return int; + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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; @@ -412,7 +420,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -535,6 +543,15 @@ 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/libgnat/g-c_time.ads b/gcc/ada/libgnarl/s-osinte__android.adb similarity index 59% rename from gcc/ada/libgnat/g-c_time.ads rename to gcc/ada/libgnarl/s-osinte__android.adb index 02461955b2f4..3e36d284c918 100644 --- a/gcc/ada/libgnat/g-c_time.ads +++ b/gcc/ada/libgnarl/s-osinte__android.adb @@ -1,12 +1,12 @@ ------------------------------------------------------------------------------ -- -- --- GNAT RUN-TIME COMPONENTS -- +-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -- -- --- G N A T . C _ T I M E -- +-- S Y S T E M . O S _ I N T E R F A C E -- -- -- --- S p e c -- +-- B o d y -- -- -- --- Copyright (C) 2025, AdaCore -- +-- Copyright (C) 1995-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,15 +24,51 @@ -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -- . -- -- -- --- GNAT was originally developed by the GNAT team at New York University. -- --- Extensive contributions were provided by Ada Core Technologies Inc. -- +-- GNARL was developed by the GNARL team at Florida State 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. +-- This is an Android version of this package. --- See file s-c_time.ads for full documentation of the interface +-- This package encapsulates all direct interfaces to OS services +-- that are needed by children of System. -with System.C_Time; -package GNAT.C_Time renames System.C_Time; +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; diff --git a/gcc/ada/libgnarl/s-osinte__android.ads b/gcc/ada/libgnarl/s-osinte__android.ads index bf774fc491af..4383860ed2b1 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,17 +213,25 @@ 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 C_Time.timespec) return int; + (clock_id : clockid_t; tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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); @@ -455,7 +463,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -622,6 +630,15 @@ 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 350fa1f15ad9..d9dae354d41e 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,22 +232,30 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) + tp : access 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; @@ -455,7 +463,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -656,6 +664,15 @@ 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 eeafbdbef8f1..f512210d3437 100644 --- a/gcc/ada/libgnarl/s-osinte__darwin.adb +++ b/gcc/ada/libgnarl/s-osinte__darwin.adb @@ -36,6 +36,15 @@ 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 -- ------------------------ @@ -47,13 +56,37 @@ 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 C_Time.timespec) return int + tp : access timespec) return int is pragma Unreferenced (clock_id); @@ -61,18 +94,33 @@ package body System.OS_Interface is use Interfaces; - TV : aliased C_Time.timeval; + 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; Result : int; function gettimeofday - (Tv : access C_Time.timeval; + (Tv : access 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); - tp.all := C_Time.To_Timespec (TV); + timeval_to_duration (TV'Access, sec'Access, usec'Access); + tp.all := To_Timespec (Duration (sec) + Duration (usec) / Micro); return Result; end clock_gettime; @@ -82,12 +130,13 @@ package body System.OS_Interface is function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int + res : access 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; @@ -96,7 +145,7 @@ package body System.OS_Interface is begin nsec := clock_get_res; - res.all := C_Time.Nanoseconds_To_Timespec (nsec); + res.all := To_Timespec (Duration (0.0) + Duration (nsec) / Nano); 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 1b2a40b3cbe8..ea62f24cbc0d 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,15 +184,23 @@ 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 C_Time.timespec) return int; + tp : access timespec) return int; function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + 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); ------------------------- -- Priority Scheduling -- @@ -389,7 +397,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -509,6 +517,15 @@ 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 adfbaeb27fc7..73061d9eeb0c 100644 --- a/gcc/ada/libgnarl/s-osinte__dragonfly.adb +++ b/gcc/ada/libgnarl/s-osinte__dragonfly.adb @@ -69,6 +69,15 @@ 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 -- ------------------------ @@ -80,4 +89,28 @@ 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 9e7b88e3c6e9..00dc11de2745 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,22 +198,30 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new unsigned_long; function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) + tp : access 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; @@ -424,7 +432,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); Relative_Timed_Wait : constant Boolean := False; @@ -628,6 +636,15 @@ 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 4516935bbc8e..a3240bb38d18 100644 --- a/gcc/ada/libgnarl/s-osinte__freebsd.adb +++ b/gcc/ada/libgnarl/s-osinte__freebsd.adb @@ -69,6 +69,15 @@ 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 -- ------------------------ @@ -80,4 +89,27 @@ 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 027f81d060bf..b10270a4cc49 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,22 +198,30 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access timespec) return int; pragma Import (C, clock_getres, "clock_getres"); function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) + tp : access 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; @@ -423,7 +431,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -625,6 +633,15 @@ 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 2c70f0dea157..675cd0d93990 100644 --- a/gcc/ada/libgnarl/s-osinte__gnu.adb +++ b/gcc/ada/libgnarl/s-osinte__gnu.adb @@ -93,6 +93,15 @@ 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 -- ------------------------ @@ -104,4 +113,28 @@ 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 18410c60415e..870059d09670 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,7 +210,9 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; @@ -219,15 +221,21 @@ package System.OS_Interface is -- From: /usr/include/time.h function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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); @@ -479,7 +487,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); Relative_Timed_Wait : constant Boolean := False; @@ -648,6 +656,15 @@ 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 60fab698113b..9d0f26d50f70 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,18 +181,26 @@ 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 C_Time.timespec) return int; + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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; @@ -392,7 +400,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -509,6 +517,15 @@ 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 fc6d7a992f19..9924659cce5d 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,7 +205,9 @@ package System.OS_Interface is Time_Slice_Supported : constant Boolean := True; -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) - function nanosleep (rqtp, rmtp : access C_Time.timespec) return int; + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; pragma Import (C, nanosleep, "nanosleep"); type clockid_t is new int; @@ -213,15 +215,21 @@ package System.OS_Interface is function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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); @@ -422,7 +430,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -594,6 +602,15 @@ 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 2c6b353a5e0f..7aeb15da523b 100644 --- a/gcc/ada/libgnarl/s-osinte__linux.ads +++ b/gcc/ada/libgnarl/s-osinte__linux.ads @@ -42,7 +42,6 @@ with Ada.Unchecked_Conversion; with Interfaces.C; -with System.C_Time; with System.Linux; with System.OS_Constants; with System.OS_Locks; @@ -55,6 +54,8 @@ 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; @@ -228,17 +229,26 @@ 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 C_Time.timespec) return int; + (clock_id : clockid_t; tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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); @@ -447,7 +457,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access 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 beeefb617fe9..88758a954f8a 100644 --- a/gcc/ada/libgnarl/s-osinte__lynxos178.adb +++ b/gcc/ada/libgnarl/s-osinte__lynxos178.adb @@ -85,6 +85,15 @@ 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 -- ------------------------ @@ -96,6 +105,29 @@ 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 dcc36b251857..8b31e204acb5 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,18 +193,26 @@ 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 C_Time.timespec) return int; + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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; @@ -212,6 +220,8 @@ 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 -- ------------------------- @@ -405,7 +415,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -531,6 +541,23 @@ 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 2d9baeb7f363..1cb4f23aec6e 100644 --- a/gcc/ada/libgnarl/s-osinte__posix.adb +++ b/gcc/ada/libgnarl/s-osinte__posix.adb @@ -36,7 +36,6 @@ -- that are needed by children of System. with Interfaces.C; use Interfaces.C; - package body System.OS_Interface is -------------------- @@ -59,6 +58,15 @@ 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 -- ------------------------ @@ -70,4 +78,28 @@ 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 bf95b0eab34f..720022548df1 100644 --- a/gcc/ada/libgnarl/s-osinte__qnx.adb +++ b/gcc/ada/libgnarl/s-osinte__qnx.adb @@ -36,7 +36,6 @@ -- that are needed by children of System. with Interfaces.C; use Interfaces.C; - package body System.OS_Interface is ----------------- @@ -71,6 +70,15 @@ 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 -- ------------------------ @@ -82,4 +90,28 @@ 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 ee13235d891b..ea940d86330d 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,17 +213,25 @@ 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 C_Time.timespec) return int; + (clock_id : clockid_t; tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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 -- ------------------------- @@ -410,7 +418,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -564,6 +572,15 @@ 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 efd602e73f82..c0f6c265b509 100644 --- a/gcc/ada/libgnarl/s-osinte__rtems.adb +++ b/gcc/ada/libgnarl/s-osinte__rtems.adb @@ -92,6 +92,15 @@ 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 -- ------------------------ @@ -103,6 +112,27 @@ 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 184d48978364..21b1be8a306a 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,6 +181,8 @@ 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; @@ -188,14 +190,20 @@ package System.OS_Interface is function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) return int; + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres (clock_id : clockid_t; - res : access C_Time.timespec) return int; + res : access 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 -- ------------------------- @@ -420,7 +428,7 @@ package System.OS_Interface is function pthread_cond_timedwait (cond : access pthread_cond_t; mutex : access pthread_mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -------------------------- @@ -446,8 +454,8 @@ package System.OS_Interface is type struct_sched_param is record sched_priority : int; ss_low_priority : int; - ss_replenish_period : C_Time.timespec; - ss_initial_budget : C_Time.timespec; + ss_replenish_period : timespec; + ss_initial_budget : timespec; sched_ss_max_repl : int; end record; pragma Convention (C, struct_sched_param); @@ -583,6 +591,15 @@ 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 78144efdbcdb..e5626fc4f0d8 100644 --- a/gcc/ada/libgnarl/s-osinte__solaris.adb +++ b/gcc/ada/libgnarl/s-osinte__solaris.adb @@ -35,8 +35,42 @@ -- 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 e9b59fe1ca92..d62dd37110eb 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,16 +241,24 @@ 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 C_Time.timespec) return int; + (clock_id : clockid_t; tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); function clock_getres - (clock_id : clockid_t; res : access C_Time.timespec) return int; + (clock_id : clockid_t; res : access 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); @@ -339,7 +347,7 @@ package System.OS_Interface is function cond_timedwait (cond : access cond_t; mutex : access mutex_t; - abstime : access C_Time.timespec) return int; + abstime : access timespec) return int; pragma Import (C, cond_timedwait, "cond_timedwait"); function cond_signal (cond : access cond_t) return int; @@ -518,6 +526,15 @@ 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 0b2b5d442698..5c227a1e54c8 100644 --- a/gcc/ada/libgnarl/s-osinte__vxworks.adb +++ b/gcc/ada/libgnarl/s-osinte__vxworks.adb @@ -41,6 +41,38 @@ 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 ecb63440a5db..a4095735bd6d 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,13 +244,37 @@ 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 C_Time.timespec) return int; + (clock_id : clockid_t; tp : access 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 2e6585352d3d..27313a4bcc07 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; +with Interfaces.C; use Interfaces.C; package body System.OS_Interface is @@ -59,6 +59,15 @@ 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 -- ------------------------ @@ -70,4 +79,28 @@ 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 f342ad673056..1197be15ef6c 100644 --- a/gcc/ada/libgnarl/s-qnx.ads +++ b/gcc/ada/libgnarl/s-qnx.ads @@ -37,6 +37,8 @@ with Interfaces.C; +with System.Parameters; + package System.QNX is pragma Preelaborate; @@ -44,8 +46,24 @@ 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 1b65100362c4..8edc58ea9d80 100644 --- a/gcc/ada/libgnarl/s-taprop__solaris.adb +++ b/gcc/ada/libgnarl/s-taprop__solaris.adb @@ -36,7 +36,6 @@ with Interfaces.C; -with System.C_Time; with System.Interrupt_Management; with System.Multiprocessors; with System.OS_Constants; @@ -763,12 +762,12 @@ package body System.Task_Primitives.Operations is --------------------- function Monotonic_Clock return Duration is - TS : aliased C_Time.timespec; + TS : aliased timespec; Result : Interfaces.C.int; begin Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return To_Duration (TS); end Monotonic_Clock; ------------------- @@ -776,13 +775,13 @@ package body System.Task_Primitives.Operations is ------------------- function RT_Resolution return Duration is - TS : aliased C_Time.timespec; + TS : aliased timespec; Result : Interfaces.C.int; begin Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return To_Duration (TS); end RT_Resolution; ----------- @@ -1176,7 +1175,7 @@ package body System.Task_Primitives.Operations is Base_Time : constant Duration := Monotonic_Clock; Check_Time : Duration := Base_Time; Abs_Time : Duration; - Request : aliased C_Time.timespec; + Request : aliased timespec; Result : Interfaces.C.int; begin @@ -1190,7 +1189,7 @@ package body System.Task_Primitives.Operations is else Duration'Min (Check_Time + Max_Sensible_Delay, Time)); if Abs_Time > Check_Time then - Request := C_Time.To_Timespec (Abs_Time); + Request := To_Timespec (Abs_Time); loop exit when Self_ID.Pending_ATC_Level < Self_ID.ATC_Nesting_Level; @@ -1231,7 +1230,7 @@ package body System.Task_Primitives.Operations is Base_Time : constant Duration := Monotonic_Clock; Check_Time : Duration := Base_Time; Abs_Time : Duration; - Request : aliased C_Time.timespec; + Request : aliased timespec; Result : Interfaces.C.int; Yielded : Boolean := False; @@ -1244,7 +1243,7 @@ package body System.Task_Primitives.Operations is else Duration'Min (Check_Time + Max_Sensible_Delay, Time)); if Abs_Time > Check_Time then - Request := C_Time.To_Timespec (Abs_Time); + Request := 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 a4dab5fa9d1e..a0f1885a7e8d 100644 --- a/gcc/ada/libgnarl/s-taprop__vxworks.adb +++ b/gcc/ada/libgnarl/s-taprop__vxworks.adb @@ -38,7 +38,6 @@ with Ada.Unchecked_Conversion; with Interfaces.C; -with System.C_Time; with System.Float_Control; with System.Interrupt_Management; with System.Multiprocessors; @@ -682,12 +681,12 @@ package body System.Task_Primitives.Operations is --------------------- function Monotonic_Clock return Duration is - TS : aliased C_Time.timespec; + TS : aliased timespec; Result : int; begin Result := clock_gettime (OSC.CLOCK_RT_Ada, TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return To_Duration (TS); end Monotonic_Clock; ------------------- diff --git a/gcc/ada/libgnarl/s-tpopmo.adb b/gcc/ada/libgnarl/s-tpopmo.adb index 547a5e44abcd..9ff1ecdc329f 100644 --- a/gcc/ada/libgnarl/s-tpopmo.adb +++ b/gcc/ada/libgnarl/s-tpopmo.adb @@ -31,8 +31,6 @@ -- 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 @@ -56,14 +54,14 @@ package body Monotonic is --------------------- function Monotonic_Clock return Duration is - TS : aliased C_Time.timespec; + TS : aliased timespec; Result : Interfaces.C.int; begin Result := clock_gettime (clock_id => OSC.CLOCK_RT_Ada, tp => TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return To_Duration (TS); end Monotonic_Clock; ------------------- @@ -71,14 +69,14 @@ package body Monotonic is ------------------- function RT_Resolution return Duration is - TS : aliased C_Time.timespec; + TS : aliased timespec; Result : Interfaces.C.int; begin Result := clock_getres (OSC.CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return To_Duration (TS); end RT_Resolution; ---------------------- @@ -152,7 +150,7 @@ package body Monotonic is Abs_Time : Duration; P_Abs_Time : Duration; - Request : aliased C_Time.timespec; + Request : aliased timespec; Result : Interfaces.C.int; Exit_Outer : Boolean := False; @@ -186,7 +184,7 @@ package body Monotonic is end if; pragma Warnings (On); - Request := C_Time.To_Timespec (P_Abs_Time); + Request := To_Timespec (P_Abs_Time); Inner : loop exit Outer @@ -238,7 +236,7 @@ package body Monotonic is Check_Time : Duration; Abs_Time : Duration; P_Abs_Time : Duration; - Request : aliased C_Time.timespec; + Request : aliased timespec; Result : Interfaces.C.int; Exit_Outer : Boolean := False; @@ -273,7 +271,7 @@ package body Monotonic is end if; pragma Warnings (On); - Request := C_Time.To_Timespec (P_Abs_Time); + Request := To_Timespec (P_Abs_Time); Inner : loop exit Outer diff --git a/gcc/ada/libgnat/g-calend.adb b/gcc/ada/libgnat/g-calend.adb index 80b62b7547f5..a2bc77c1cc7b 100644 --- a/gcc/ada/libgnat/g-calend.adb +++ b/gcc/ada/libgnat/g-calend.adb @@ -29,8 +29,11 @@ -- -- ------------------------------------------------------------------------------ +with Interfaces.C.Extensions; + package body GNAT.Calendar is use Ada.Calendar; + use Interfaces; ----------------- -- Day_In_Year -- @@ -330,8 +333,25 @@ 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 - return System.C_Time.To_Duration (T.all); + timeval_to_duration (T, sec'Access, usec'Access); + pragma Annotate (CodePeer, Modified, sec); + pragma Annotate (CodePeer, Modified, usec); + + return Duration (sec) + Duration (usec) / Micro; end To_Duration; ---------------- @@ -339,8 +359,45 @@ 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 - return System.C_Time.To_Timeval (D); + 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; end To_Timeval; ------------------ diff --git a/gcc/ada/libgnat/g-calend.ads b/gcc/ada/libgnat/g-calend.ads index c57b7df7a220..a3294993aa6d 100644 --- a/gcc/ada/libgnat/g-calend.ads +++ b/gcc/ada/libgnat/g-calend.ads @@ -40,8 +40,7 @@ -- Day_Of_Week, Day_In_Year and Week_In_Year. with Ada.Calendar.Formatting; - -with System.C_Time; +with Interfaces.C; package GNAT.Calendar is @@ -127,7 +126,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: Time_At_Locale is no longer aware of historic events and may + -- WARNING: Split_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; @@ -146,18 +145,24 @@ package GNAT.Calendar is -- Return the week number as defined in ISO 8601 along with the year in -- which the week occurs. - subtype timeval is System.C_Time.timeval; - pragma Obsolescent (timeval, "use type from GNAT.C_Time instead"); + -- C timeval conversion - 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"); + -- C timeval represent a duration (used in Select for example). This + -- structure is composed of a number of seconds and a number of micro + -- seconds. The timeval structure is not exposed here because its + -- definition is target dependent. Interface to C programs is done via a + -- pointer to timeval structure. + type timeval is private; + + function To_Duration (T : not null access timeval) return Duration; function To_Timeval (D : Duration) return timeval; - 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 346e79d5c46a..0fed79177544 100644 --- a/gcc/ada/libgnat/g-socket.adb +++ b/gcc/ada/libgnat/g-socket.adb @@ -47,7 +47,6 @@ 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 @@ -180,6 +179,13 @@ 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) @@ -522,7 +528,7 @@ package body GNAT.Sockets is Res : C.int; Last : C.int; RSig : Socket_Type := No_Socket; - TVal : aliased System.C_Time.timeval; + TVal : aliased Timeval; TPtr : Timeval_Access; begin @@ -537,7 +543,7 @@ package body GNAT.Sockets is if Timeout = Forever then TPtr := null; else - TVal := System.C_Time.To_Timeval (Timeout); + TVal := To_Timeval (Timeout); TPtr := TVal'Unchecked_Access; end if; @@ -1417,7 +1423,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 System.C_Time.timeval; + VT : aliased Timeval; Len : aliased C.int; Add : System.Address; Res : C.int; @@ -1590,10 +1596,8 @@ 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 := Forever; + Opt.Timeout := To_Duration (VT); end if; when Bind_To_Device => @@ -2629,7 +2633,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 System.C_Time.timeval; + VT : aliased Timeval; Len : C.int; Add : System.Address := Null_Address; Res : C.int; @@ -2763,7 +2767,7 @@ package body GNAT.Sockets is end if; else - VT := System.C_Time.To_Timeval (Option.Timeout); + VT := To_Timeval (Option.Timeout); Len := VT'Size / 8; Add := VT'Address; end if; @@ -2861,6 +2865,33 @@ 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 -- ------------------- @@ -3010,6 +3041,35 @@ 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 c79b8db868be..5540dce04aef 100644 --- a/gcc/ada/libgnat/g-socthi.adb +++ b/gcc/ada/libgnat/g-socthi.adb @@ -40,8 +40,6 @@ 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; @@ -217,7 +215,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 System.C_Time.timeval; + Now : aliased 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 6ae74eb5f6bf..a3f05b384025 100644 --- a/gcc/ada/libgnat/g-socthi__vxworks.adb +++ b/gcc/ada/libgnat/g-socthi__vxworks.adb @@ -40,8 +40,6 @@ 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; @@ -196,7 +194,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 System.C_Time.timeval; + Now : aliased 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 ec9b5746f0c6..cdf0a16ef086 100644 --- a/gcc/ada/libgnat/g-sothco.ads +++ b/gcc/ada/libgnat/g-sothco.ads @@ -33,10 +33,8 @@ -- This package should not be directly with'ed by an applications program. with Ada.Unchecked_Conversion; - with Interfaces.C.Strings; - -with System.C_Time; +with System.Parameters; package GNAT.Sockets.Thin_Common is @@ -46,23 +44,31 @@ package GNAT.Sockets.Thin_Common is Success : constant C.int := 0; Failure : constant C.int := -1; - 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 time_t is + range -2 ** (System.Parameters.time_t_bits - 1) + .. 2 ** (System.Parameters.time_t_bits - 1) - 1; + for time_t'Size use System.Parameters.time_t_bits; + pragma Convention (C, time_t); + + type suseconds_t is + range -2 ** (8 * SOSC.SIZEOF_tv_usec - 1) + .. 2 ** (8 * SOSC.SIZEOF_tv_usec - 1) - 1; + for suseconds_t'Size use 8 * SOSC.SIZEOF_tv_usec; + pragma Convention (C, suseconds_t); + + type Timeval is record + Tv_Sec : time_t; + Tv_Usec : suseconds_t; + end record; + pragma Convention (C, Timeval); - type Timeval_Access is access all System.C_Time.timeval; + type Timeval_Access is access all 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 System.C_Time.timeval - := System.C_Time.Milliseconds_To_Timeval (0); + Immediat : constant Timeval := (0, 0); ------------------------------------------- -- Mapping tables to low level constants -- diff --git a/gcc/ada/libgnat/g-spogwa.adb b/gcc/ada/libgnat/g-spogwa.adb index 3752b2bf4422..a4bbf962a9f3 100644 --- a/gcc/ada/libgnat/g-spogwa.adb +++ b/gcc/ada/libgnat/g-spogwa.adb @@ -29,7 +29,7 @@ -- -- ------------------------------------------------------------------------------ -with System.C_Time; +with GNAT.Sockets.Thin_Common; 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 System.C_Time.timeval) return Integer + timeout : access Thin_Common.Timeval) return Integer with Import => True, Convention => Stdcall, External_Name => "select"; - Timeout_V : aliased System.C_Time.timeval; - Timeout_A : access System.C_Time.timeval; + Timeout_V : aliased Thin_Common.Timeval; + Timeout_A : access Thin_Common.Timeval; Rfds : aliased FD_Set_Type; Rcount : Natural := 0; @@ -63,7 +63,8 @@ begin if Timeout >= 0 then Timeout_A := Timeout_V'Access; - Timeout_V := System.C_Time.Milliseconds_To_Timeval (Timeout); + Timeout_V.Tv_Sec := Thin_Common.time_t (Timeout / 1000); + Timeout_V.Tv_Usec := Thin_Common.suseconds_t (Timeout rem 1000 * 1000); end if; Reset_Socket_Set (Rfds); diff --git a/gcc/ada/libgnat/s-c_time.adb b/gcc/ada/libgnat/s-c_time.adb deleted file mode 100644 index 70f8a9cac08f..000000000000 --- a/gcc/ada/libgnat/s-c_time.adb +++ /dev/null @@ -1,203 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- 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 -- --- . -- --- -- --- 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 deleted file mode 100644 index 626a02df5be0..000000000000 --- a/gcc/ada/libgnat/s-c_time.ads +++ /dev/null @@ -1,93 +0,0 @@ ------------------------------------------------------------------------------- --- -- --- 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 -- --- . -- --- -- --- 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 e39c7cbe2d20..6abe6d3a0e69 100644 --- a/gcc/ada/libgnat/s-optide.adb +++ b/gcc/ada/libgnat/s-optide.adb @@ -36,13 +36,8 @@ procedure Timed_Delay (Time : Duration; Mode : Integer) is - - 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; + Request : aliased timespec; + Remaind : aliased timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -76,7 +71,7 @@ begin end if; pragma Warnings (On); - Request := C_Time.To_Timespec (Time_Chunk); + Request := 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 d0a0ad34859d..b07bdeadd092 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 : Long_Long_Integer) return OS_Time is + function To_Ada (Time : time_t) 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 Long_Long_Integer is + function To_C (Time : OS_Time) return time_t is begin - return Long_Long_Integer (Time); + return time_t (Time); end To_C; ------------------ diff --git a/gcc/ada/libgnat/s-os_lib.ads b/gcc/ada/libgnat/s-os_lib.ads index 734f4fd50a5d..38cfc88c4eaa 100644 --- a/gcc/ada/libgnat/s-os_lib.ads +++ b/gcc/ada/libgnat/s-os_lib.ads @@ -115,12 +115,6 @@ 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; @@ -167,6 +161,27 @@ 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 -- ---------------- @@ -1111,8 +1126,8 @@ private pragma Import (Intrinsic, ">"); pragma Import (Intrinsic, "<="); pragma Import (Intrinsic, ">="); - pragma Inline (To_Ada); pragma Inline (To_C); + pragma Inline (To_Ada); 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 7b978a3b486d..28bfcb8c6831 100644 --- a/gcc/ada/libgnat/s-osprim__darwin.adb +++ b/gcc/ada/libgnat/s-osprim__darwin.adb @@ -29,10 +29,9 @@ -- -- ------------------------------------------------------------------------------ --- This version is for Darwin - -with System.C_Time; +-- This version is for darwin +with System.Parameters; package body System.OS_Primitives is -- ??? These definitions are duplicated from System.OS_Interface @@ -47,13 +46,27 @@ 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 C_Time.timeval; + (tv : not null access struct_timeval; tz : struct_timezone_ptr) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); - function nanosleep (rqtp, rmtp : not null access C_Time.timespec) - return Integer; + 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"); ----------- @@ -61,7 +74,7 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - TV : aliased C_Time.timeval; + TV : aliased struct_timeval; Result : Integer; pragma Unreferenced (Result); @@ -76,9 +89,36 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, null); - return C_Time.To_Duration (TV); + return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; 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 -- ----------------- @@ -87,8 +127,8 @@ package body System.OS_Primitives is (Time : Duration; Mode : Integer) is - Request : aliased C_Time.timespec; - Remaind : aliased C_Time.timespec; + Request : aliased timespec; + Remaind : aliased timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -108,7 +148,7 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - Request := C_Time.To_Timespec (Rel_Time); + Request := 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 45836ac806d3..94d06c325bb2 100644 --- a/gcc/ada/libgnat/s-osprim__posix.adb +++ b/gcc/ada/libgnat/s-osprim__posix.adb @@ -30,23 +30,54 @@ ------------------------------------------------------------------------------ -- This version is for POSIX-like operating systems - -with System.C_Time; +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_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 - TV : aliased C_Time.timeval; + 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; Result : Integer; pragma Unreferenced (Result); function gettimeofday - (Tv : access C_Time.timeval; + (Tv : access timeval; Tz : System.Address := System.Null_Address) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); @@ -60,9 +91,37 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, System.Null_Address); - return C_Time.To_Duration (TV); + 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_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 fceb37cdd011..78b21c6444d9 100644 --- a/gcc/ada/libgnat/s-osprim__posix2008.adb +++ b/gcc/ada/libgnat/s-osprim__posix2008.adb @@ -32,19 +32,34 @@ -- 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 C_Time.timespec; + TS : aliased timespec; Result : int; type clockid_t is new int; @@ -53,15 +68,42 @@ package body System.OS_Primitives is function clock_gettime (clock_id : clockid_t; - tp : access C_Time.timespec) return int; + tp : access timespec) return int; pragma Import (C, clock_gettime, "clock_gettime"); begin Result := clock_gettime (CLOCK_REALTIME, TS'Unchecked_Access); pragma Assert (Result = 0); - return C_Time.To_Duration (TS); + return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; 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 99644b39424a..c8fbc8270ca8 100644 --- a/gcc/ada/libgnat/s-osprim__rtems.adb +++ b/gcc/ada/libgnat/s-osprim__rtems.adb @@ -31,8 +31,7 @@ -- This version is for POSIX-like operating systems -with System.C_Time; - +with System.Parameters; package body System.OS_Primitives is -- ??? These definitions are duplicated from System.OS_Interface @@ -40,8 +39,16 @@ package body System.OS_Primitives is -- these declarations in System.OS_Interface and move these ones in -- the spec. - function nanosleep (rqtp, rmtp : not null access C_Time.timespec) - return Integer; + 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"); ----------- @@ -49,12 +56,28 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - TV : aliased C_Time.timeval; + + 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; Result : Integer; pragma Unreferenced (Result); function gettimeofday - (Tv : access C_Time.timeval; + (Tv : access timeval; Tz : System.Address := System.Null_Address) return Integer; pragma Import (C, gettimeofday, "gettimeofday"); @@ -68,9 +91,37 @@ package body System.OS_Primitives is -- value is never checked. Result := gettimeofday (TV'Access, System.Null_Address); - return C_Time.To_Duration (TV); + 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_Integer (Long_Long_Integer (F * 10#1#E9))); + end To_Timespec; + ----------------- -- Timed_Delay -- ----------------- @@ -79,8 +130,8 @@ package body System.OS_Primitives is (Time : Duration; Mode : Integer) is - Request : aliased C_Time.timespec; - Remaind : aliased C_Time.timespec; + Request : aliased timespec; + Remaind : aliased timespec; Rel_Time : Duration; Abs_Time : Duration; Base_Time : constant Duration := Clock; @@ -100,7 +151,7 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - Request := C_Time.To_Timespec (Rel_Time); + Request := 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 new file mode 100644 index 000000000000..a08feb5f666f --- /dev/null +++ b/gcc/ada/libgnat/s-osprim__solaris.adb @@ -0,0 +1,126 @@ +------------------------------------------------------------------------------ +-- -- +-- 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 -- +-- . -- +-- -- +-- 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 c48fbe1001f0..5848df6f63fc 100644 --- a/gcc/ada/libgnat/s-osprim__unix.adb +++ b/gcc/ada/libgnat/s-osprim__unix.adb @@ -30,9 +30,7 @@ ------------------------------------------------------------------------------ -- This version uses gettimeofday and select --- This file is suitable for Dec Unix, SCO UnixWare and Sun Solaris. - -with System.C_Time; +-- This file is suitable for OpenNT, Dec Unix and SCO UnixWare. package body System.OS_Primitives is @@ -41,8 +39,14 @@ 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 C_Time.timeval; + (tv : not null access struct_timeval; tz : Address := Null_Address); pragma Import (C, gettimeofday, "gettimeofday"); @@ -51,7 +55,7 @@ package body System.OS_Primitives is readfds, writefds, exceptfds : Address := Null_Address; - timeout : not null access C_Time.timeval); + timeout : not null access struct_timeval); pragma Import (C, C_select, "select"); ----------- @@ -59,11 +63,11 @@ package body System.OS_Primitives is ----------- function Clock return Duration is - TV : aliased C_Time.timeval; + TV : aliased struct_timeval; begin gettimeofday (TV'Access); - return C_Time.To_Duration (TV); + return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; end Clock; ----------------- @@ -78,7 +82,7 @@ package body System.OS_Primitives is Abs_Time : Duration; Base_Time : constant Duration := Clock; Check_Time : Duration := Base_Time; - timeval : aliased C_Time.timeval; + timeval : aliased struct_timeval; begin if Mode = Relative then @@ -91,7 +95,14 @@ package body System.OS_Primitives is if Rel_Time > 0.0 then loop - timeval := C_Time.To_Timeval (Rel_Time); + 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); 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 new file mode 100644 index 000000000000..e127107aa57d --- /dev/null +++ b/gcc/ada/libgnat/s-osprim__x32.adb @@ -0,0 +1,170 @@ +------------------------------------------------------------------------------ +-- -- +-- 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 -- +-- . -- +-- -- +-- 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 8587453c947e..98284a4d13ec 100644 --- a/gcc/ada/libgnat/s-parame.ads +++ b/gcc/ada/libgnat/s-parame.ads @@ -97,6 +97,13 @@ 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 832f344a5927..a8a7b691802d 100644 --- a/gcc/ada/libgnat/s-parame__hpux.ads +++ b/gcc/ada/libgnat/s-parame__hpux.ads @@ -96,6 +96,13 @@ 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 new file mode 100644 index 000000000000..1cf09c6e39f1 --- /dev/null +++ b/gcc/ada/libgnat/s-parame__posix2008.ads @@ -0,0 +1,189 @@ +------------------------------------------------------------------------------ +-- -- +-- 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 -- +-- . -- +-- -- +-- 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 de9afdbb0b2b..dbaadb404b75 100644 --- a/gcc/ada/libgnat/s-parame__vxworks.ads +++ b/gcc/ada/libgnat/s-parame__vxworks.ads @@ -98,6 +98,21 @@ 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 74cf1e58553f..7a5e987cefc4 100644 --- a/gcc/ada/s-oscons-tmplt.c +++ b/gcc/ada/s-oscons-tmplt.c @@ -1764,17 +1764,6 @@ 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