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)