summaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
Diffstat (limited to 'system')
-rw-r--r--system/gcc/006_as-needed-gold.patch58
-rw-r--r--system/gcc/201-ada.patch565
-rw-r--r--system/gcc/401-libsanitizer-linux.patch100
-rw-r--r--system/gcc/402-libsanitizer-utmp.patch75
-rw-r--r--system/gcc/APKBUILD12
-rw-r--r--system/gcc/ada-musl.patch12
6 files changed, 806 insertions, 16 deletions
diff --git a/system/gcc/006_as-needed-gold.patch b/system/gcc/006_as-needed-gold.patch
new file mode 100644
index 000000000..3dc0aee7a
--- /dev/null
+++ b/system/gcc/006_as-needed-gold.patch
@@ -0,0 +1,58 @@
+# DP: Use --push-state/--pop-state for gold as well when linking libtsan.
+
+Index: src/gcc/gcc.c
+===================================================================
+--- src/gcc/gcc.c
++++ src/gcc/gcc.c
+@@ -686,10 +686,10 @@ proper position among the other output f
+ #define LIBASAN_SPEC STATIC_LIBASAN_LIBS
+ #elif defined(HAVE_LD_STATIC_DYNAMIC)
+ #define LIBASAN_SPEC "%{static-libasan:" LD_STATIC_OPTION "}" \
+- " %{!static-libasan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
++ " %{!static-libasan:--push-state --no-as-needed}" \
+ " -lasan " \
+ " %{static-libasan:" LD_DYNAMIC_OPTION "}" \
+- " %{!static-libasan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
++ " %{!static-libasan:--pop-state}" \
+ STATIC_LIBASAN_LIBS
+ #else
+ #define LIBASAN_SPEC "-lasan" STATIC_LIBASAN_LIBS
+@@ -707,10 +707,10 @@ proper position among the other output f
+ #define LIBTSAN_SPEC STATIC_LIBTSAN_LIBS
+ #elif defined(HAVE_LD_STATIC_DYNAMIC)
+ #define LIBTSAN_SPEC "%{static-libtsan:" LD_STATIC_OPTION "}" \
+- " %{!static-libtsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
++ " %{!static-libtsan:--push-state --no-as-needed}" \
+ " -ltsan " \
+ " %{static-libtsan:" LD_DYNAMIC_OPTION "}" \
+- " %{!static-libtsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
++ " %{!static-libtsan:--pop-state}" \
+ STATIC_LIBTSAN_LIBS
+ #else
+ #define LIBTSAN_SPEC "-ltsan" STATIC_LIBTSAN_LIBS
+@@ -728,10 +728,10 @@ proper position among the other output f
+ #define LIBLSAN_SPEC STATIC_LIBLSAN_LIBS
+ #elif defined(HAVE_LD_STATIC_DYNAMIC)
+ #define LIBLSAN_SPEC "%{static-liblsan:" LD_STATIC_OPTION "}" \
+- " %{!static-liblsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
++ " %{!static-liblsan:--push-state --no-as-needed}" \
+ " -llsan " \
+ " %{static-liblsan:" LD_DYNAMIC_OPTION "}" \
+- " %{!static-liblsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
++ " %{!static-liblsan:--pop-state}" \
+ STATIC_LIBLSAN_LIBS
+ #else
+ #define LIBLSAN_SPEC "-llsan" STATIC_LIBLSAN_LIBS
+@@ -747,10 +747,10 @@ proper position among the other output f
+ " %{static-libubsan|static:%:include(libsanitizer.spec)%(link_libubsan)}"
+ #ifdef HAVE_LD_STATIC_DYNAMIC
+ #define LIBUBSAN_SPEC "%{static-libubsan:" LD_STATIC_OPTION "}" \
+- " %{!static-libubsan:%{!fuse-ld=gold:--push-state }--no-as-needed}" \
++ " %{!static-libubsan:--push-state --no-as-needed}" \
+ " -lubsan " \
+ " %{static-libubsan:" LD_DYNAMIC_OPTION "}" \
+- " %{!static-libubsan:%{fuse-ld=gold:--as-needed;:--pop-state}}" \
++ " %{!static-libubsan:--pop-state}" \
+ STATIC_LIBUBSAN_LIBS
+ #else
+ #define LIBUBSAN_SPEC "-lubsan" STATIC_LIBUBSAN_LIBS
diff --git a/system/gcc/201-ada.patch b/system/gcc/201-ada.patch
new file mode 100644
index 000000000..acb1e1f1b
--- /dev/null
+++ b/system/gcc/201-ada.patch
@@ -0,0 +1,565 @@
+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)
diff --git a/system/gcc/401-libsanitizer-linux.patch b/system/gcc/401-libsanitizer-linux.patch
new file mode 100644
index 000000000..8a662a268
--- /dev/null
+++ b/system/gcc/401-libsanitizer-linux.patch
@@ -0,0 +1,100 @@
+--- gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_linux.cc.old 2017-10-19 11:23:59.000000000 +0000
++++ gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_linux.cc 2019-06-27 05:39:48.258332316 +0000
+@@ -752,7 +752,9 @@
+ }
+
+ #if SANITIZER_LINUX
++#ifndef SA_RESTORER
+ #define SA_RESTORER 0x04000000
++#endif
+ // Doesn't set sa_restorer if the caller did not set it, so use with caution
+ //(see below).
+ int internal_sigaction_norestorer(int signum, const void *act, void *oldact) {
+@@ -1687,65 +1689,59 @@
+ }
+
+ static void GetPcSpBp(void *context, uptr *pc, uptr *sp, uptr *bp) {
+-#if defined(__arm__)
+ ucontext_t *ucontext = (ucontext_t*)context;
++#if defined(__arm__)
+ *pc = ucontext->uc_mcontext.arm_pc;
+ *bp = ucontext->uc_mcontext.arm_fp;
+ *sp = ucontext->uc_mcontext.arm_sp;
+ #elif defined(__aarch64__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.pc;
+ *bp = ucontext->uc_mcontext.regs[29];
+ *sp = ucontext->uc_mcontext.sp;
+ #elif defined(__hppa__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.sc_iaoq[0];
+ /* GCC uses %r3 whenever a frame pointer is needed. */
+ *bp = ucontext->uc_mcontext.sc_gr[3];
+ *sp = ucontext->uc_mcontext.sc_gr[30];
+ #elif defined(__x86_64__)
+ # if SANITIZER_FREEBSD
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.mc_rip;
+ *bp = ucontext->uc_mcontext.mc_rbp;
+ *sp = ucontext->uc_mcontext.mc_rsp;
+ #elif SANITIZER_NETBSD
+- ucontext_t *ucontext = (ucontext_t *)context;
+ *pc = ucontext->uc_mcontext.__gregs[_REG_RIP];
+ *bp = ucontext->uc_mcontext.__gregs[_REG_RBP];
+ *sp = ucontext->uc_mcontext.__gregs[_REG_RSP];
+ # else
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.gregs[REG_RIP];
+ *bp = ucontext->uc_mcontext.gregs[REG_RBP];
+ *sp = ucontext->uc_mcontext.gregs[REG_RSP];
+ # endif
+ #elif defined(__i386__)
+ # if SANITIZER_FREEBSD
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.mc_eip;
+ *bp = ucontext->uc_mcontext.mc_ebp;
+ *sp = ucontext->uc_mcontext.mc_esp;
+ #elif SANITIZER_NETBSD
+- ucontext_t *ucontext = (ucontext_t *)context;
+ *pc = ucontext->uc_mcontext.__gregs[_REG_EIP];
+ *bp = ucontext->uc_mcontext.__gregs[_REG_EBP];
+ *sp = ucontext->uc_mcontext.__gregs[_REG_ESP];
+ # else
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.gregs[REG_EIP];
+ *bp = ucontext->uc_mcontext.gregs[REG_EBP];
+ *sp = ucontext->uc_mcontext.gregs[REG_ESP];
+ # endif
+-#elif defined(__powerpc__) || defined(__powerpc64__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+- *pc = ucontext->uc_mcontext.regs->nip;
+- *sp = ucontext->uc_mcontext.regs->gpr[PT_R1];
++#elif defined(__powerpc64__)
++ *pc = ucontext->uc_mcontext.gp_regs[32];
++ *sp = ucontext->uc_mcontext.gp_regs[1];
++ *bp = ucontext->uc_mcontext.gp_regs[31];
++#elif defined(__powerpc__)
++ *pc = ucontext->uc_mcontext.gregs[32];
++ *sp = ucontext->uc_mcontext.gregs[1];
+ // The powerpc{,64}-linux ABIs do not specify r31 as the frame
+ // pointer, but GCC always uses r31 when we need a frame pointer.
+- *bp = ucontext->uc_mcontext.regs->gpr[PT_R31];
++ *bp = ucontext->uc_mcontext.gregs[31];
+ #elif defined(__sparc__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+ uptr *stk_ptr;
+ # if defined (__arch64__)
+ *pc = ucontext->uc_mcontext.mc_gregs[MC_PC];
+@@ -1759,12 +1755,10 @@
+ *bp = stk_ptr[15];
+ # endif
+ #elif defined(__mips__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+ *pc = ucontext->uc_mcontext.pc;
+ *bp = ucontext->uc_mcontext.gregs[30];
+ *sp = ucontext->uc_mcontext.gregs[29];
+ #elif defined(__s390__)
+- ucontext_t *ucontext = (ucontext_t*)context;
+ # if defined(__s390x__)
+ *pc = ucontext->uc_mcontext.psw.addr;
+ # else
diff --git a/system/gcc/402-libsanitizer-utmp.patch b/system/gcc/402-libsanitizer-utmp.patch
new file mode 100644
index 000000000..7929cd8b9
--- /dev/null
+++ b/system/gcc/402-libsanitizer-utmp.patch
@@ -0,0 +1,75 @@
+--- gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc.old 2018-05-31 09:58:32.000000000 +0000
++++ gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc 2019-06-27 08:52:53.520080465 +0000
+@@ -43,9 +43,6 @@
+ #include <termios.h>
+ #include <time.h>
+ #include <wchar.h>
+-#if !SANITIZER_MAC && !SANITIZER_FREEBSD
+-#include <utmp.h>
+-#endif
+
+ #if !SANITIZER_IOS
+ #include <net/route.h>
+@@ -291,9 +288,6 @@
+ int shmctl_shm_stat = (int)SHM_STAT;
+ #endif
+
+-#if !SANITIZER_MAC && !SANITIZER_FREEBSD
+- unsigned struct_utmp_sz = sizeof(struct utmp);
+-#endif
+ #if !SANITIZER_ANDROID
+ unsigned struct_utmpx_sz = sizeof(struct utmpx);
+ #endif
+--- gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h.old 2017-10-19 11:23:59.000000000 +0000
++++ gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h 2019-06-27 08:53:41.114993442 +0000
+@@ -873,9 +873,6 @@
+ extern int shmctl_shm_stat;
+ #endif
+
+-#if !SANITIZER_MAC && !SANITIZER_FREEBSD
+- extern unsigned struct_utmp_sz;
+-#endif
+ #if !SANITIZER_ANDROID
+ extern unsigned struct_utmpx_sz;
+ #endif
+--- gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc.old 2017-10-19 11:23:59.000000000 +0000
++++ gcc-8.3.0/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc 2019-06-27 08:54:20.530780618 +0000
+@@ -6106,38 +6106,7 @@
+
+ // FIXME: add other *stat interceptor
+
+-#if SANITIZER_INTERCEPT_UTMP
+-INTERCEPTOR(void *, getutent, int dummy) {
+- void *ctx;
+- COMMON_INTERCEPTOR_ENTER(ctx, getutent, dummy);
+- void *res = REAL(getutent)(dummy);
+- if (res)
+- COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, __sanitizer::struct_utmp_sz);
+- return res;
+-}
+-INTERCEPTOR(void *, getutid, void *ut) {
+- void *ctx;
+- COMMON_INTERCEPTOR_ENTER(ctx, getutid, ut);
+- void *res = REAL(getutid)(ut);
+- if (res)
+- COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, __sanitizer::struct_utmp_sz);
+- return res;
+-}
+-INTERCEPTOR(void *, getutline, void *ut) {
+- void *ctx;
+- COMMON_INTERCEPTOR_ENTER(ctx, getutline, ut);
+- void *res = REAL(getutline)(ut);
+- if (res)
+- COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, __sanitizer::struct_utmp_sz);
+- return res;
+-}
+-#define INIT_UTMP \
+- COMMON_INTERCEPT_FUNCTION(getutent); \
+- COMMON_INTERCEPT_FUNCTION(getutid); \
+- COMMON_INTERCEPT_FUNCTION(getutline);
+-#else
+ #define INIT_UTMP
+-#endif
+
+ #if SANITIZER_INTERCEPT_UTMPX
+ INTERCEPTOR(void *, getutxent, int dummy) {
diff --git a/system/gcc/APKBUILD b/system/gcc/APKBUILD
index 2ab149205..0cde409b5 100644
--- a/system/gcc/APKBUILD
+++ b/system/gcc/APKBUILD
@@ -6,7 +6,7 @@ pkgver=8.3.0
[ "$CHOST" != "$CTARGET" ] && _target="-$CTARGET_ARCH" || _target=""
pkgname="$pkgname$_target"
-pkgrel=0
+pkgrel=1
pkgdesc="The GNU Compiler Collection"
url="https://gcc.gnu.org"
arch="all"
@@ -26,7 +26,7 @@ options="$options !check !dbg strip toolchain"
: ${LANG_OBJC:=true}
: ${LANG_GO:=true}
: ${LANG_FORTRAN:=true}
-: ${LANG_ADA:=false}
+: ${LANG_ADA:=true}
LIBGOMP=true
LIBGCC=true
@@ -149,11 +149,13 @@ source="https://ftp.gnu.org/gnu/gcc/gcc-$pkgver/gcc-$pkgver.tar.xz
002_all_default-relro.patch
005_all_default-as-needed.patch
+ 006_as-needed-gold.patch
011_all_default-warn-format-security.patch
012_all_default-warn-trampolines.patch
020_all_msgfmt-libstdc++-link.patch
051_all_libiberty-pic.patch
+ 201-ada.patch
205-nopie.patch
libgcc-always-build-gcceh.a.patch
@@ -244,7 +246,7 @@ build() {
case "$CTARGET_LIBC" in
musl)
- # musl does not support mudflap, or libsanitizer
+ # musl does not support mudflap
# libmpx uses secure_getenv and struct _libc_fpstate not present in musl
_libc_configure="--disable-libmpx --disable-libmudflap --disable-libsanitizer"
_symvers="--disable-symvers"
@@ -546,10 +548,12 @@ cd3ba928121e8578ba9f73215e4d81ee3ebbab33e00b04cdfd62b46d21f9536297ae12dc021aad6e
dfedf48829cff22ee836ece743de20ad467b40e86c8f4034326a4c32df35b10affd69d6b9ab3382df2871a99ad0c2e99d4342183b59f9bca7f15112eed58ec8d 0016-invalid-tls-model.patch
625c02e03c2f1db04da12cc6a086ec85790a031a13df36486243fd9569cd17f7c8ebeec91ac16cc1f87c3ec1ffe4c421153e98a9aeb5eea35943a6f015d81f50 002_all_default-relro.patch
02b725b220e540077efef741e9d457f9e004fe53ae642a138e214875d076a60f7c2f27de0ed9a4225db2030fc9c3d2c5b0414c895b9eec0f5f48fad70e2fb029 005_all_default-as-needed.patch
+9073a5ae46e46a44a77adba183db301194a3666afca07a8444a4c10dc2c087dd41d6065a051b1024454bb37bee06fabf4361e5fae62dab8d4c9620520924f606 006_as-needed-gold.patch
622fdbcbbf2feb86bd839af627ec3613c6d2c77b14d37d31165b19f73f45b3663a203efff5d224f194edb15eb62d3d5885e32f85d1b584f071e580fea4e12664 011_all_default-warn-format-security.patch
03cddde56b2a355f08716c8efcd5616606d42946c87831d77d55570636c46e351e81a04c7dabd3466d9406c40476bead857cfe1eceaf7f0d86dd2757c8cf4a9e 012_all_default-warn-trampolines.patch
d35a3ac7e13a4446921a90e1ff3eec1079840c845f9d523c868e24ae21f94cf69ba041de5341ebef96432a6f57598e223381d4286e8fb8baaa25906707f29fbd 020_all_msgfmt-libstdc++-link.patch
0a0bc72b9366158f5d23fff1928e756fdd212433bac6ab1f00d632f241382820db8db5d475ddf11ea020eaf7e2e71b12fb9b1c3c870cf84adf6c2b16f15aabca 051_all_libiberty-pic.patch
+a3702c1f642412413d0ffc69f6439a3e101b2b56c16610f94c66556c88e52d01b0b6d1e57bfc5a972668f976c02fbf2fc22bcf707b000867e44744d9eb7b7566 201-ada.patch
98473bcaa77903a223ca9b0d2087c0921b287a2816d308cc32c8fe009e6cbf5dd1ae7fba27794ab8d9c09e117fe534413d91a464d1218474fc123ce0adfdc2c1 205-nopie.patch
d08d7ead2de0429e5c9055d5b029ec2be9a8c821d22cecaf9b51f633652c493333f98963d9267fa2fa63850c50ae5eefd5f59e5910ec10d20044dac082182a8b libgcc-always-build-gcceh.a.patch
600fe5098dc54edaa9808fd5717af9dec058953f9ad37d49cfba1db4f7e9a7a8f02019342f75157fc575946fa693259422184de27b7ecc8386d9f3ecc0f7cc5d gcc-4.9-musl-fortify.patch
@@ -557,7 +561,7 @@ dbe0ee917fc7668571722364ab7c806731e3a31e8bfa30b4941b28b16b877d2a32b4a3897ef53339
fa62556719449caec6b2b434355bfbcaa5ae55ffe017b3e1f827f66a2aae21b79c571ee7a4ce723ea69169bc3a6447e73650991a200cc372adf2f102677518d7 gcc-pure64.patch
35d6d59f0b7b968f282f56767c9e0823a7bdc5aa0d450aca50fbd802649a7ca608b47671244a3faa208a9b0d6832cabb5a22724157dc817b2c0ad63d09f93282 fix-cxxflags-passing.patch
3f5bc334d9f73d06f5f7c876738d02356acdd08958bea0e4d2095ebf15c2c2ec4e411abdae0297505ae9a1699ca01b17338e853184e84663203b192b0d35fc19 ada-shared.patch
-631d4bdef6d8bde34df7978bb53ec28c3c909cf1f87139e5f148138d0f09adc58b41ecf0148bbf50fb4bc916c411e9bf8a2b6c046c75c0e77d754d8c35bcd4d7 ada-musl.patch
+a1049167028db900024d3fc4f785e54a5f6eadbbc5d94e2bd3c3ba1a15bf3f2881acb82d647ac3fef7601cc9cb39b55989cffbe9966bd8cf9a4945e1566e936e ada-musl.patch
f4ef08454e28c8732db69115e4998ec153399e8d229dd27f923dbdcf57b68128a65640d026cc7f45b58ba8764ab1eb575d4eb6d6dfc550a87a183f8b94e76181 320-libffi-gnulinux.patch
8efd028febb962ae100be32f72f7450c4f77d67ad96a5f47072136cdf47043f9d54835a87c7ab5aaa0fa0108c4c7a97ba2d7732d5aaf2efce70fe1f7e1c39d6e 330-gccgo-link-to-ucontext.patch
24c8708f64b9b7945b3f07e9bbecf17ab8bcde2524f49cbd694ca2f6146ccc3f13bb027db282f326525ea79d50a2868fa3fa2b0d688a914b5ea77bbfd7e5cbe4 331-gccgo-use-real-off_t-type.patch
diff --git a/system/gcc/ada-musl.patch b/system/gcc/ada-musl.patch
index 464c3d57d..a7c06c155 100644
--- a/system/gcc/ada-musl.patch
+++ b/system/gcc/ada-musl.patch
@@ -123,15 +123,3 @@ diff -rup gcc-5.1.0/gcc.orig/ada/adaint.h gcc-5.1.0/gcc/ada/adaint.h
#endif
#if defined (_WIN32)
-diff -rup gcc-5.1.0/gcc.orig/ada/gcc-interface/Makefile.in gcc-5.1.0/gcc/ada/gcc-interface/Makefile.in
---- gcc-5.1.0/gcc.orig/ada/gcc-interface/Makefile.in 2015-04-09 20:29:28.000000000 +0000
-+++ gcc-5.1.0/gcc/ada/gcc-interface/Makefile.in 2015-06-02 10:47:23.188910894 +0000
-@@ -1910,7 +1910,7 @@ ifeq ($(strip $(filter-out powerpc% linu
- 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<a-intnam-linux.ads \
- s-inmaop.adb<s-inmaop-posix.adb \