diff --git a/gcc/ada/adadecode.c b/gcc/ada/adadecode.c index a63b7e7641b0..92155ef2025a 100644 --- a/gcc/ada/adadecode.c +++ b/gcc/ada/adadecode.c @@ -29,6 +29,7 @@ * * ****************************************************************************/ +#include "adaint.h" /* for a macro version of xstrdup. */ #if defined(IN_RTS) #include "tconfig.h" @@ -42,8 +43,6 @@ #include <stdio.h> #include <ctype.h> -#include "adaint.h" /* for a macro version of xstrdup. */ - #ifndef ISDIGIT #define ISDIGIT(c) isdigit(c) #endif 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 @@ -85,6 +85,8 @@ #define _LARGEFILE64_SOURCE 1 #endif +#include "adaint.h" + #ifdef IN_RTS #include "tconfig.h" #include "tsystem.h" @@ -202,8 +204,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 @@ -316,6 +316,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 "tconfig.h" #include "tsystem.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 "tconfig.h" #include "tsystem.h" @@ -38,8 +40,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 @@ -52,6 +52,8 @@ #include "vxWorks.h" #endif +#include "adaint.h" + #ifdef IN_RTS #include "tconfig.h" #include "tsystem.h" @@ -61,8 +63,6 @@ #include "system.h" #endif -#include "adaint.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/gcc/ada/exit.c b/gcc/ada/exit.c index 6274571c6f04..336b0f8f386b 100644 --- a/gcc/ada/exit.c +++ b/gcc/ada/exit.c @@ -33,6 +33,8 @@ #include "vxWorks.h" #endif +#include "adaint.h" + #ifdef IN_RTS #include "tconfig.h" #include "tsystem.h" @@ -42,8 +44,6 @@ #include "system.h" #endif -#include "adaint.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in index 0258f106d404..0416244ae428 100644 --- a/gcc/ada/gcc-interface/Makefile.in +++ b/gcc/ada/gcc-interface/Makefile.in @@ -1574,7 +1574,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 #include "tconfig.h" #include "tsystem.h" @@ -65,7 +67,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 @@ -394,12 +394,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; @@ -464,11 +458,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 @@ -202,9 +202,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. @@ -214,38 +211,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-static call not allowed in preelaborated unit"); - Ceiling_Support : constant Boolean := Get_Ceiling_Support; - pragma Warnings (On, "non-static call not allowed in preelaborated unit"); -- 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, @@ -348,7 +313,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; @@ -360,16 +327,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); @@ -409,11 +367,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 @@ -382,7 +382,7 @@ package body System.Dwarf_Lines is function Low (C : Dwarf_Context) return Address is begin - return C.Low; + return To_Address (To_Integer (C.Low) + C.Load_Slide); end Low; ---------- @@ -1210,19 +1210,21 @@ package body System.Dwarf_Lines is -- Discard symbols whose length is 0 Sz := uint32 (Size (S)); - -- Try to filter symbols at the same address. This is a best - -- effort as they might not be consecutive. - Addr := uint32 (Value (S) - uint64 (C.Low)); - if Sz > 0 and then Addr /= Prev_Addr then - Nbr_Symbols := Nbr_Symbols + 1; - Prev_Addr := Addr; - - if Phase = 2 then - C.Cache (Nbr_Symbols) := - (First => Addr, - Size => Sz, - Sym => uint32 (Off (S)), - Line => 0); + if Sz > 0 then + -- Try to filter symbols at the same address. This is a best + -- effort as they might not be consecutive. + Addr := uint32 (Value (S) - uint64 (C.Low)); + if Addr /= Prev_Addr then + Nbr_Symbols := Nbr_Symbols + 1; + Prev_Addr := Addr; + + if Phase = 2 then + C.Cache (Nbr_Symbols) := + (First => Addr, + Size => Sz, + Sym => uint32 (Off (S)), + Line => 0); + end if; end if; end if; @@ -1267,6 +1269,10 @@ package body System.Dwarf_Lines is -- Read table loop Read_Aranges_Entry (C, Ar_Start, Ar_Len); + -- Skip references to discarded sections + while Ar_Start = 0 and Ar_Len /= 0 loop + Read_Aranges_Entry (C, Ar_Start, Ar_Len); + end loop; exit when Ar_Start = 0 and Ar_Len = 0; Len := uint32 (Ar_Len); diff --git a/gcc/ada/libgnat/s-trasym__dwarf.adb b/gcc/ada/libgnat/s-trasym__dwarf.adb index db7c5eb4cdd8..3cd60ecbc37b 100644 --- a/gcc/ada/libgnat/s-trasym__dwarf.adb +++ b/gcc/ada/libgnat/s-trasym__dwarf.adb @@ -123,7 +123,8 @@ package body System.Traceback.Symbolic is -- Return the String contained in Item, up until the first NUL character pragma Warnings (Off, "*Add_Module_To_Cache*"); - procedure Add_Module_To_Cache (Module_Name : String); + procedure Add_Module_To_Cache (Module_Name : String; + Load_Address : System.Address); -- To be called by Build_Cache_For_All_Modules to add a new module to the -- list. May not be referenced. @@ -217,12 +218,13 @@ package body System.Traceback.Symbolic is -- Add_Module_To_Cache -- ------------------------- - procedure Add_Module_To_Cache (Module_Name : String) is + procedure Add_Module_To_Cache (Module_Name : String; + Load_Address : System.Address) is Module : Module_Cache_Acc; Success : Boolean; begin Module := new Module_Cache; - Init_Module (Module.all, Success, Module_Name); + Init_Module (Module.all, Success, Module_Name, Load_Address); if not Success then Free (Module); return; 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)); - 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 "tconfig.h" #include "tsystem.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 "tconfig.h" #include "tsystem.h" @@ -40,7 +42,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 "tconfig.h" @@ -72,8 +74,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 diff --git a/gcc/ada/terminals.c b/gcc/ada/terminals.c index 7025f57d645e..074845584958 100644 --- a/gcc/ada/terminals.c +++ b/gcc/ada/terminals.c @@ -1112,7 +1112,6 @@ __gnat_setup_winsize (void *desc, int rows, int columns) (HP-UX) */ #if !defined (__hpux__) && !defined (BSD) && !defined (__APPLE__) \ && !defined (__rtems__) && !defined (__QNXNTO__) -# include <termio.h> #endif #include <sys/ioctl.h> @@ -1159,7 +1158,8 @@ __gnat_setup_winsize (void *desc, int rows, int columns) #if defined (__APPLE__) || defined (BSD) #define USE_OPENPTY #elif defined (__linux__) -#define USE_GETPT +#include <pty.h> +#define USE_OPENPTY #elif defined (__sun__) #define USE_CLONE_DEVICE "/dev/ptmx" #elif defined (_AIX)