diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 414346558654..2586a1368903 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -101,6 +101,8 @@ #define _LARGEFILE64_SOURCE 1 #endif +#include "adaint.h" + #ifdef IN_RTS #include "tconfig.h" #include "tsystem.h" @@ -243,8 +245,6 @@ UINT __gnat_current_ccs_encoding; #include <utime.h> #endif -#include "adaint.h" - /* Define symbols O_BINARY and O_TEXT as harmless zeroes if they are not defined in the current system. On DOS-like systems these flags control whether the file is opened/created in text-translation mode (CR/LF in diff --git a/gcc/ada/adaint.h b/gcc/ada/adaint.h index 0d12f7e90209..74182446d4ac 100644 --- a/gcc/ada/adaint.h +++ b/gcc/ada/adaint.h @@ -319,6 +319,7 @@ extern void *__gnat_lwp_self (void); /* Routines for interface to required CPU set primitives */ +#define _GNU_SOURCE #include <sched.h> extern cpu_set_t *__gnat_cpu_alloc (size_t); diff --git a/gcc/ada/argv.c b/gcc/ada/argv.c index f62cf1eb37dc..0b6c5fe6f0df 100644 --- a/gcc/ada/argv.c +++ b/gcc/ada/argv.c @@ -42,6 +42,8 @@ main program, and these routines are accessed from the Ada.Command_Line.Environment package. */ +#include "adaint.h" + #ifdef IN_RTS #include "runtime.h" #include <stdlib.h> @@ -51,8 +53,6 @@ #include "system.h" #endif -#include "adaint.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/gcc/ada/cio.c b/gcc/ada/cio.c index ff97abe36ef1..56aa3477c8cd 100644 --- a/gcc/ada/cio.c +++ b/gcc/ada/cio.c @@ -29,6 +29,8 @@ * * ****************************************************************************/ +#include "adaint.h" + #ifdef IN_RTS #include "runtime.h" #include <sys/stat.h> @@ -37,8 +39,6 @@ #include "system.h" #endif -#include "adaint.h" - /* We need L_tmpnam definition */ #include <stdio.h> diff --git a/gcc/ada/cstreams.c b/gcc/ada/cstreams.c index cdcb531e2b3f..dde6b9948089 100644 --- a/gcc/ada/cstreams.c +++ b/gcc/ada/cstreams.c @@ -58,6 +58,8 @@ #include "vxWorks.h" #endif +#include "adaint.h" + #ifdef IN_RTS #include <string.h> #else @@ -65,8 +67,6 @@ #include "system.h" #endif -#include "adaint.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl index 0258f106d404..0416244ae428 100644 --- a/gcc/ada/Makefile.rtl +++ b/gcc/ada/Makefile.rtl @@ -2205,7 +2205,7 @@ ifeq ($(strip $(filter-out powerpc% linux%,$(target_cpu) $(target_os))),) endif # ARM linux, GNU eabi -ifeq ($(strip $(filter-out arm% linux-gnueabi%,$(target_cpu) $(target_os))),) +ifeq ($(strip $(filter-out arm% linux-gnueabi% linux-musleabi% linux-muslgnueabi%,$(target_cpu) $(target_os))),) LIBGNAT_TARGET_PAIRS = \ a-intnam.ads<libgnarl/a-intnam__linux.ads \ s-inmaop.adb<libgnarl/s-inmaop__posix.adb \ diff --git a/gcc/ada/init.c b/gcc/ada/init.c index 5088ecffc4f1..02a45b3ce7ca 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -53,6 +53,8 @@ #undef __linux__ #endif +#include "adaint.h" + #ifdef IN_RTS #ifdef STANDALONE @@ -71,7 +73,6 @@ #include "system.h" #endif -#include "adaint.h" #include "raise.h" #ifdef __cplusplus diff --git a/gcc/ada/libgnarl/s-osinte__linux.ads b/gcc/ada/libgnarl/s-osinte__linux.ads index 5bf4a5fe1d26..c52cc70dfbab 100644 --- a/gcc/ada/libgnarl/s-osinte__linux.ads +++ b/gcc/ada/libgnarl/s-osinte__linux.ads @@ -403,12 +403,6 @@ package System.OS_Interface is PTHREAD_RWLOCK_PREFER_WRITER_NP : constant := 1; PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP : constant := 2; - function pthread_rwlockattr_setkind_np - (attr : access pthread_rwlockattr_t; - pref : int) return int; - pragma Import - (C, pthread_rwlockattr_setkind_np, "pthread_rwlockattr_setkind_np"); - function pthread_rwlock_init (mutex : access pthread_rwlock_t; attr : access pthread_rwlockattr_t) return int; @@ -470,11 +464,6 @@ package System.OS_Interface is protocol : int) return int; pragma Import (C, pthread_mutexattr_setprotocol); - function pthread_mutexattr_setprioceiling - (attr : access pthread_mutexattr_t; - prioceiling : int) return int; - pragma Import (C, pthread_mutexattr_setprioceiling); - type struct_sched_param is record sched_priority : int; -- scheduling priority end record; diff --git a/gcc/ada/libgnarl/s-taprop__linux.adb b/gcc/ada/libgnarl/s-taprop__linux.adb index e55cd65e54f6..32d72b3980a6 100644 --- a/gcc/ada/libgnarl/s-taprop__linux.adb +++ b/gcc/ada/libgnarl/s-taprop__linux.adb @@ -198,9 +198,6 @@ package body System.Task_Primitives.Operations is pragma Import (C, GNAT_pthread_condattr_setup, "__gnat_pthread_condattr_setup"); - function GNAT_has_cap_sys_nice return C.int; - pragma Import - (C, GNAT_has_cap_sys_nice, "__gnat_has_cap_sys_nice"); -- We do not have pragma Linker_Options ("-lcap"); here, because this -- library is not present on many Linux systems. 'libcap' is the Linux -- "capabilities" library, called by __gnat_has_cap_sys_nice. @@ -210,38 +207,6 @@ package body System.Task_Primitives.Operations is -- Convert Ada priority to Linux priority. Priorities are 1 .. 99 on -- GNU/Linux, so we map 0 .. 98 to 1 .. 99. - function Get_Ceiling_Support return Boolean; - -- Get the value of the Ceiling_Support constant (see below). - -- Note well: If this function or related code is modified, it should be - -- tested by hand, because automated testing doesn't exercise it. - - ------------------------- - -- Get_Ceiling_Support -- - ------------------------- - - function Get_Ceiling_Support return Boolean is - Ceiling_Support : Boolean := False; - begin - if Locking_Policy /= 'C' then - return False; - end if; - - declare - function geteuid return Integer; - pragma Import (C, geteuid, "geteuid"); - Superuser : constant Boolean := geteuid = 0; - Has_Cap : constant C.int := GNAT_has_cap_sys_nice; - pragma Assert (Has_Cap in 0 | 1); - begin - Ceiling_Support := Superuser or else Has_Cap = 1; - end; - - return Ceiling_Support; - end Get_Ceiling_Support; - - pragma Warnings (Off, "non-preelaborable call not allowed*"); - Ceiling_Support : constant Boolean := Get_Ceiling_Support; - pragma Warnings (On, "non-preelaborable call not allowed*"); -- True if the locking policy is Ceiling_Locking, and the current process -- has permission to use this policy. The process has permission if it is -- running as 'root', or if the capability was set by the setcap command, @@ -344,7 +309,9 @@ package body System.Task_Primitives.Operations is -- Init_Mutex -- ---------------- + pragma Warnings (Off, "formal parameter * is not referenced"); function Init_Mutex (L : RTS_Lock_Ptr; Prio : Any_Priority) return C.int is + pragma Warnings (On, "formal parameter * is not referenced"); Mutex_Attr : aliased pthread_mutexattr_t; Result, Result_2 : C.int; @@ -356,16 +323,7 @@ package body System.Task_Primitives.Operations is return Result; end if; - if Ceiling_Support then - Result := pthread_mutexattr_setprotocol - (Mutex_Attr'Access, PTHREAD_PRIO_PROTECT); - pragma Assert (Result = 0); - - Result := pthread_mutexattr_setprioceiling - (Mutex_Attr'Access, Prio_To_Linux_Prio (Prio)); - pragma Assert (Result = 0); - - elsif Locking_Policy = 'I' then + if Locking_Policy = 'I' then Result := pthread_mutexattr_setprotocol (Mutex_Attr'Access, PTHREAD_PRIO_INHERIT); pragma Assert (Result = 0); @@ -405,11 +363,6 @@ package body System.Task_Primitives.Operations is Result := pthread_rwlockattr_init (RWlock_Attr'Access); pragma Assert (Result = 0); - Result := pthread_rwlockattr_setkind_np - (RWlock_Attr'Access, - PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); - pragma Assert (Result = 0); - Result := pthread_rwlock_init (L.RW'Access, RWlock_Attr'Access); pragma Assert (Result in 0 | ENOMEM); diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb index a857b67132af..1e2bb4c545ad 100644 --- a/gcc/ada/libgnat/s-dwalin.adb +++ b/gcc/ada/libgnat/s-dwalin.adb @@ -1538,7 +1538,11 @@ package body System.Dwarf_Lines is -- Read table loop Read_Aranges_Entry (C, Addr_Size, Ar_Start, Ar_Len); + -- Skip references to discarded sections + while Ar_Start = 0 and Ar_Len /= 0 loop + Read_Aranges_Entry (C, Addr_Size, Ar_Start, Ar_Len); + end loop; exit when Ar_Start = Null_Address and Ar_Len = 0; Len := uint32 (Ar_Len); diff --git a/gcc/ada/libgnat/s-parame.ads b/gcc/ada/libgnat/s-parame.ads index 3d6e345a1ba9..cfe0b4d3ca6c 100644 --- a/gcc/ada/libgnat/s-parame.ads +++ b/gcc/ada/libgnat/s-parame.ads @@ -102,7 +102,7 @@ package System.Parameters is -- Characteristics of time_t type -- ------------------------------------ - time_t_bits : constant := Long_Integer'Size; + time_t_bits : constant := Long_Long_Integer'Size; -- Number of bits in type time_t ---------------------------------------------- diff --git a/gcc/ada/libgnat/s-tsmona__linux.adb b/gcc/ada/libgnat/s-tsmona__linux.adb index cbebd0652048..c882aa64a6e2 100644 --- a/gcc/ada/libgnat/s-tsmona__linux.adb +++ b/gcc/ada/libgnat/s-tsmona__linux.adb @@ -87,45 +87,49 @@ package body Module_Name is -- Build_Cache_For_All_Modules -- --------------------------------- - procedure Build_Cache_For_All_Modules is - type link_map; - type link_map_acc is access all link_map; - pragma Convention (C, link_map_acc); - - type link_map is record - l_addr : Address; - -- Base address of the shared object - - l_name : Address; - -- Null-terminated absolute file name - - l_ld : Address; - -- Dynamic section - - l_next, l_prev : link_map_acc; - -- Chain - end record; - pragma Convention (C, link_map); - - type r_debug_type is record - r_version : Integer; - r_map : link_map_acc; - end record; - pragma Convention (C, r_debug_type); + type dl_phdr_info is record + dlpi_addr : Address; + dlpi_name : Address; + dlpi_phdr : Address; + dlpi_phnum : unsigned_short; + end record; + pragma Convention (C, dl_phdr_info); + + type Callback_Type is access function + (info : not null access dl_phdr_info; + size : size_t; + data : Address) return int; + pragma Convention (C, Callback_Type); + + function Build_Cache_Callback + (info : not null access dl_phdr_info; + size : size_t; + data : Address) return int; + pragma Convention (C, Build_Cache_Callback); + + function Build_Cache_Callback + (info : not null access dl_phdr_info; + size : size_t; + data : Address) return int is + pragma Unreferenced (size); + pragma Unreferenced (data); + begin + if Big_String_Conv.To_Pointer (info.dlpi_name) (1) /= ASCII.NUL then + -- Discard non-file (like the executable itself or the gate). + Add_Module_To_Cache (Value (info.dlpi_name), info.dlpi_addr); + end if; + return 0; + end Build_Cache_Callback; - r_debug : r_debug_type; - pragma Import (C, r_debug, "_r_debug"); + function dl_iterate_phdr + (callback : Callback_Type; + data : Address) return int; + pragma Import (C, dl_iterate_phdr, "dl_iterate_phdr"); - lm : link_map_acc; + procedure Build_Cache_For_All_Modules is + unused : int; begin - lm := r_debug.r_map; - while lm /= null loop - if Big_String_Conv.To_Pointer (lm.l_name) (1) /= ASCII.NUL then - -- Discard non-file (like the executable itself or the gate). - Add_Module_To_Cache (Value (lm.l_name), lm.l_addr); - end if; - lm := lm.l_next; - end loop; + unused := dl_iterate_phdr (Build_Cache_Callback'Access, Null_Address); end Build_Cache_For_All_Modules; --------- diff --git a/gcc/ada/mkdir.c b/gcc/ada/mkdir.c index c101d968a851..43cdd51e8320 100644 --- a/gcc/ada/mkdir.c +++ b/gcc/ada/mkdir.c @@ -34,6 +34,8 @@ #include <version.h> #endif /* __vxworks */ +#include "adaint.h" + #ifdef IN_RTS #include "runtime.h" #include <sys/stat.h> @@ -53,8 +55,6 @@ #endif #endif -#include "adaint.h" - /* This function provides a portable binding to the mkdir function. */ int diff --git a/gcc/ada/raise.c b/gcc/ada/raise.c index 70ad6cd3282a..eb92de1b2137 100644 --- a/gcc/ada/raise.c +++ b/gcc/ada/raise.c @@ -32,6 +32,8 @@ /* Shared routines to support exception handling. __gnat_unhandled_terminate is shared between all exception handling mechanisms. */ +#include "adaint.h" + #ifdef IN_RTS #include "runtime.h" #else @@ -39,7 +41,6 @@ #include "system.h" #endif -#include "adaint.h" #include "raise.h" #ifdef __cplusplus diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c index 98b3901cb16f..98db6a14c2d5 100644 --- a/gcc/ada/sysdep.c +++ b/gcc/ada/sysdep.c @@ -52,6 +52,8 @@ #undef __linux__ #endif +#include "adaint.h" + #ifdef IN_RTS #define POSIX #include "runtime.h" @@ -74,8 +76,6 @@ extern struct tm *localtime_r(const time_t *, struct tm *); #endif -#include "adaint.h" - /* Don't use macros versions of this functions on VxWorks since they cause imcompatible changes in some VxWorks versions */ #ifdef __vxworks --- a/gcc/ada/terminals.c 2019-01-08 10:54:04.000000000 +0100 +++ b/gcc/ada/terminals.c 2019-05-15 13:14:09.935742526 +0200 @@ -1136,7 +1136,7 @@ /* POSIX does not specify how to open the master side of a terminal.Several methods are available (system specific): 1- using a cloning device (USE_CLONE_DEVICE) - 2- getpt (USE_GETPT) + 2- posix_openpt (USE_POSIX_OPENPT) 3- openpty (USE_OPENPTY) When using the cloning device method, the macro USE_CLONE_DEVICE should @@ -1150,7 +1150,7 @@ #if defined (__APPLE__) || defined (BSD) #define USE_OPENPTY #elif defined (__linux__) -#define USE_GETPT +#define USE_POSIX_OPENPT #elif defined (__sun__) #define USE_CLONE_DEVICE "/dev/ptmx" #elif defined (_AIX) @@ -1199,8 +1199,8 @@ int master_fd = -1; char *slave_name = NULL; -#ifdef USE_GETPT - master_fd = getpt (); +#if defined(USE_POSIX_OPENPT) + master_fd = posix_openpt(O_RDWR | O_NOCTTY); #elif defined (USE_OPENPTY) status = openpty (&master_fd, &slave_fd, NULL, NULL, NULL); #elif defined (USE_CLONE_DEVICE)