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 #include -#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 #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 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 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 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 #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 #endif #include @@ -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 +#define USE_OPENPTY #elif defined (__sun__) #define USE_CLONE_DEVICE "/dev/ptmx" #elif defined (_AIX)