diff --git a/lang/gcc-aux/Makefile.version b/lang/gcc-aux/Makefile.version index 2b7aee618ec8..569214e9201d 100644 --- a/lang/gcc-aux/Makefile.version +++ b/lang/gcc-aux/Makefile.version @@ -3,10 +3,10 @@ GCC_BRANCH= 4.9 GCC_POINT= 0 GCC_VERSION= ${GCC_BRANCH}.${GCC_POINT} -SNAPSHOT= 20140406 -MAIN_PR= 2 -ARMV5_PR= 1 -ARMV7_PR= 2 +SNAPSHOT= 20140416 +MAIN_PR= 0 +ARMV5_PR= 0 +ARMV7_PR= 0 IDENTIFICATION= gcc-${GCC_BRANCH}-${SNAPSHOT} MS_SUBDIR= snapshots/${GCC_BRANCH}-${SNAPSHOT} diff --git a/lang/gcc-aux/distinfo b/lang/gcc-aux/distinfo index c44e9f30de87..b5028d3f9cf1 100644 --- a/lang/gcc-aux/distinfo +++ b/lang/gcc-aux/distinfo @@ -1,5 +1,5 @@ -SHA256 (gcc-4.9-20140406.tar.bz2) = 5f9e1c96b5bc000456b7fe7805dca90866cd18b6fbe00e26f3f3e8236d07d0a3 -SIZE (gcc-4.9-20140406.tar.bz2) = 85440592 +SHA256 (gcc-4.9-20140416.tar.bz2) = a1bac4e9fe8d8eca0c70fe22374e34abecd138dfc49130b01d73133f68b03b48 +SIZE (gcc-4.9-20140416.tar.bz2) = 85454889 SHA256 (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 6b1a6ff0fe0e3bf13c667db2fef177b811329cd998400a1303969a86911cb1c8 SIZE (ada-bootstrap.i386.dragonfly.36A.tar.bz2) = 39357314 SHA256 (ada-bootstrap.i386.freebsd.84.tar.bz2) = b410336cb0e71c8a29dd5f831a17b4b7282e7d590f452475a94c6a625cfc8846 diff --git a/lang/gcc-aux/files/diff-ada b/lang/gcc-aux/files/diff-ada index 53b26e3b6497..5d65a860e1ec 100644 --- a/lang/gcc-aux/files/diff-ada +++ b/lang/gcc-aux/files/diff-ada @@ -1994,531 +1994,6 @@ Non_Empty_Node : constant Project_Node_Id := 1; --- /dev/null -+++ gcc/ada/s-intman-android.adb -@@ -0,0 +1,331 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . I N T E R R U P T _ M A N A G E M E N T -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 2014, Free Software Foundation, Inc. -- -+-- -- -+-- GNARL is free software; you can redistribute it and/or modify it under -- -+-- terms of the GNU General Public License as published by the Free Soft- -- -+-- ware Foundation; either version 3, or (at your option) any later ver- -- -+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- -+-- or FITNESS FOR A PARTICULAR PURPOSE. -- -+-- -- -+-- As a special exception under Section 7 of GPL version 3, you are granted -- -+-- additional permissions described in the GCC Runtime Library Exception, -- -+-- version 3.1, as published by the Free Software Foundation. -- -+-- -- -+-- In particular, you can freely distribute your programs built with the -- -+-- GNAT Pro compiler, including any required library run-time units, using -- -+-- any licensing terms of your choosing. See the AdaCore Software License -- -+-- for full details. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the Android version of this package -+ -+-- Make a careful study of all signals available under the OS, to see which -+-- need to be reserved, kept always unmasked, or kept always unmasked. Be on -+-- the lookout for special signals that may be used by the thread library. -+ -+-- Since this is a multi target file, the signal <-> exception mapping -+-- is simple minded. If you need a more precise and target specific -+-- signal handling, create a new s-intman.adb that will fit your needs. -+ -+-- This file assumes that: -+ -+-- SIGFPE, SIGILL, SIGSEGV and SIGBUS exist. They are mapped as follows: -+-- SIGPFE => Constraint_Error -+-- SIGILL => Program_Error -+-- SIGSEGV => Storage_Error -+-- SIGBUS => Storage_Error -+ -+-- SIGINT exists and will be kept unmasked unless the pragma -+-- Unreserve_All_Interrupts is specified anywhere in the application. -+ -+-- System.OS_Interface contains the following: -+-- SIGADAABORT: the signal that will be used to abort tasks. -+-- Unmasked: the OS specific set of signals that should be unmasked in -+-- all the threads. SIGADAABORT is unmasked by -+-- default -+-- Reserved: the OS specific set of signals that are reserved. -+ -+with System.Task_Primitives; -+ -+package body System.Interrupt_Management is -+ -+ use Interfaces.C; -+ use System.OS_Interface; -+ -+ type Interrupt_List is array (Interrupt_ID range <>) of Interrupt_ID; -+ Exception_Interrupts : constant Interrupt_List := -+ (SIGFPE, SIGILL, SIGSEGV, SIGBUS); -+ -+ Unreserve_All_Interrupts : Interfaces.C.int; -+ pragma Import -+ (C, Unreserve_All_Interrupts, "__gl_unreserve_all_interrupts"); -+ -+ ----------------------- -+ -- Local Subprograms -- -+ ----------------------- -+ -+ procedure Signal_Trampoline -+ (signo : Signal; -+ siginfo : System.Address; -+ ucontext : System.Address; -+ handler : System.Address); -+ pragma Import (C, Signal_Trampoline, "__gnat_sigtramp"); -+ -- Pass the real handler to a speical function that handles unwinding by -+ -- skipping over the kernel signal frame (which doesn't contain any unwind -+ -- information). -+ -+ function State (Int : Interrupt_ID) return Character; -+ pragma Import (C, State, "__gnat_get_interrupt_state"); -+ -- Get interrupt state. Defined in init.c The input argument is the -+ -- interrupt number, and the result is one of the following: -+ -+ procedure Map_Signal -+ (signo : Signal; -+ siginfo : System.Address; -+ ucontext : System.Address); -+ -- This function identifies the Ada exception to be raised using the -+ -- information when the system received a synchronous signal. -+ -+---------------- -+-- Map_Signal -- -+---------------- -+ -+ procedure Map_Signal -+ (signo : Signal; -+ siginfo : System.Address; -+ ucontext : System.Address) -+ is -+ pragma Unreferenced (siginfo); -+ pragma Unreferenced (ucontext); -+ -+ begin -+ -+ -- Check that treatment of exception propagation here is consistent with -+ -- treatment of the abort signal in System.Task_Primitives.Operations. -+ -+ case signo is -+ when SIGFPE => -+ raise Constraint_Error; -+ when SIGILL => -+ raise Program_Error; -+ when SIGSEGV => -+ raise Storage_Error; -+ when SIGBUS => -+ raise Storage_Error; -+ when others => -+ null; -+ end case; -+ end Map_Signal; -+ -+---------------------- -+-- Notify_Exception -- -+---------------------- -+ -+ User : constant Character := 'u'; -+ Runtime : constant Character := 'r'; -+ Default : constant Character := 's'; -+ -- 'n' this interrupt not set by any Interrupt_State pragma -+ -- 'u' Interrupt_State pragma set state to User -+ -- 'r' Interrupt_State pragma set state to Runtime -+ -- 's' Interrupt_State pragma set state to System (use "default" -+ -- system handler) -+ -+ procedure Notify_Exception -+ (signo : Signal; -+ siginfo : System.Address; -+ ucontext : System.Address); -+ -- This function is the signal handler and calls a trampoline subprogram -+ -- that adjusts the unwind information so the ARM unwinder can find it's -+ -- way back to the context of the originating subprogram. Compare with -+ -- __gnat_error_handler for non-tasking programs. -+ -+ ---------------------- -+ -- Notify_Exception -- -+ ---------------------- -+ -+ Signal_Mask : aliased sigset_t; -+ -- The set of signals handled by Notify_Exception -+ -+ procedure Notify_Exception -+ (signo : Signal; -+ siginfo : System.Address; -+ ucontext : System.Address) -+ is -+ Result : Interfaces.C.int; -+ -+ begin -+ -- With the __builtin_longjmp, the signal mask is not restored, so we -+ -- need to restore it explicitly. ??? We don't use __builtin_longjmp -+ -- anymore, so do we still need this? */ -+ -+ Result := pthread_sigmask (SIG_UNBLOCK, Signal_Mask'Access, null); -+ pragma Assert (Result = 0); -+ -+ -- Perform the necessary context adjustments prior to calling the -+ -- trampoline subprogram with the "real" signal handler. -+ -+ Adjust_Context_For_Raise (signo, ucontext); -+ -+ Signal_Trampoline (signo, siginfo, ucontext, Map_Signal'Address); -+ end Notify_Exception; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ Initialized : Boolean := False; -+ -+ procedure Initialize is -+ act : aliased struct_sigaction; -+ old_act : aliased struct_sigaction; -+ Result : System.OS_Interface.int; -+ -+ Use_Alternate_Stack : constant Boolean := -+ System.Task_Primitives.Alternate_Stack_Size /= 0; -+ -- Whether to use an alternate signal stack for stack overflows -+ -+ begin -+ if Initialized then -+ return; -+ end if; -+ -+ Initialized := True; -+ -+ -- Need to call pthread_init very early because it is doing signal -+ -- initializations. -+ -+ pthread_init; -+ -+ Abort_Task_Interrupt := SIGADAABORT; -+ -+ act.sa_handler := Notify_Exception'Address; -+ -+ -- Setting SA_SIGINFO asks the kernel to pass more than just the signal -+ -- number argument to the handler when it is called. The set of extra -+ -- parameters includes a pointer to the interrupted context, which the -+ -- ZCX propagation scheme needs. -+ -+ -- Most man pages for sigaction mention that sa_sigaction should be set -+ -- instead of sa_handler when SA_SIGINFO is on. In practice, the two -+ -- fields are actually union'ed and located at the same offset. -+ -+ -- On some targets, we set sa_flags to SA_NODEFER so that during the -+ -- handler execution we do not change the Signal_Mask to be masked for -+ -- the Signal. -+ -+ -- This is a temporary fix to the problem that the Signal_Mask is not -+ -- restored after the exception (longjmp) from the handler. The right -+ -- fix should be made in sigsetjmp so that we save the Signal_Set and -+ -- restore it after a longjmp. -+ -+ -- We set SA_NODEFER to be compatible with what is done in -+ -- __gnat_error_handler. -+ -+ Result := sigemptyset (Signal_Mask'Access); -+ pragma Assert (Result = 0); -+ -+ -- Add signals that map to Ada exceptions to the mask -+ -+ for J in Exception_Interrupts'Range loop -+ if State (Exception_Interrupts (J)) /= Default then -+ Result := -+ sigaddset -+ (Signal_Mask'Access, Signal (Exception_Interrupts (J))); -+ pragma Assert (Result = 0); -+ end if; -+ end loop; -+ -+ act.sa_mask := Signal_Mask; -+ -+ pragma Assert (Keep_Unmasked = (Interrupt_ID'Range => False)); -+ pragma Assert (Reserve = (Interrupt_ID'Range => False)); -+ -+ -- Process state of exception signals -+ -+ for J in Exception_Interrupts'Range loop -+ if State (Exception_Interrupts (J)) /= User then -+ Keep_Unmasked (Exception_Interrupts (J)) := True; -+ Reserve (Exception_Interrupts (J)) := True; -+ -+ if State (Exception_Interrupts (J)) /= Default then -+ act.sa_flags := SA_NODEFER + SA_RESTART + SA_SIGINFO; -+ -+ if Use_Alternate_Stack -+ and then Exception_Interrupts (J) = SIGSEGV -+ then -+ act.sa_flags := act.sa_flags + SA_ONSTACK; -+ end if; -+ -+ Result := -+ sigaction -+ (Signal (Exception_Interrupts (J)), act'Unchecked_Access, -+ old_act'Unchecked_Access); -+ pragma Assert (Result = 0); -+ end if; -+ end if; -+ end loop; -+ -+ if State (Abort_Task_Interrupt) /= User then -+ Keep_Unmasked (Abort_Task_Interrupt) := True; -+ Reserve (Abort_Task_Interrupt) := True; -+ end if; -+ -+ -- Set SIGINT to unmasked state as long as it is not in "User" state. -+ -- Check for Unreserve_All_Interrupts last. -+ -+ if State (SIGINT) /= User then -+ Keep_Unmasked (SIGINT) := True; -+ Reserve (SIGINT) := True; -+ end if; -+ -+ -- Check all signals for state that requires keeping them unmasked and -+ -- reserved. -+ -+ for J in Interrupt_ID'Range loop -+ if State (J) = Default or else State (J) = Runtime then -+ Keep_Unmasked (J) := True; -+ Reserve (J) := True; -+ end if; -+ end loop; -+ -+ -- Add the set of signals that must always be unmasked for this target -+ -+ for J in Unmasked'Range loop -+ Keep_Unmasked (Interrupt_ID (Unmasked (J))) := True; -+ Reserve (Interrupt_ID (Unmasked (J))) := True; -+ end loop; -+ -+ -- Add target-specific reserved signals -+ -+ for J in Reserved'Range loop -+ Reserve (Interrupt_ID (Reserved (J))) := True; -+ end loop; -+ -+ -- Process pragma Unreserve_All_Interrupts. This overrides any settings -+ -- due to pragma Interrupt_State: -+ -+ if Unreserve_All_Interrupts /= 0 then -+ Keep_Unmasked (SIGINT) := False; -+ Reserve (SIGINT) := False; -+ end if; -+ -+ -- We do not really have Signal 0. We just use this value to identify -+ -- non-existent signals (see s-intnam.ads). Therefore, Signal should not -+ -- be used in all signal related operations hence mark it as reserved. -+ -+ Reserve (0) := True; -+ end Initialize; -+ -+end System.Interrupt_Management; ---- /dev/null -+++ gcc/ada/s-linux-android.ads -@@ -0,0 +1,112 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . L I N U X -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 2014, Free Software Foundation, Inc. -- -+-- -- -+-- GNARL is free software; you can redistribute it and/or modify it under -- -+-- terms of the GNU General Public License as published by the Free Soft- -- -+-- ware Foundation; either version 3, or (at your option) any later ver- -- -+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- -+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- -+-- or FITNESS FOR A PARTICULAR PURPOSE. -- -+-- -- -+-- As a special exception under Section 7 of GPL version 3, you are granted -- -+-- additional permissions described in the GCC Runtime Library Exception, -- -+-- version 3.1, as published by the Free Software Foundation. -- -+-- -- -+-- In particular, you can freely distribute your programs built with the -- -+-- GNAT Pro compiler, including any required library run-time units, using -- -+-- any licensing terms of your choosing. See the AdaCore Software License -- -+-- for full details. -- -+-- -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the Android version of this package -+ -+-- This package encapsulates cpu specific differences between implementations -+-- of GNU/Linux, in order to share s-osinte-linux.ads. -+ -+-- PLEASE DO NOT add any with-clauses to this package or remove the pragma -+-- Preelaborate. This package is designed to be a bottom-level (leaf) package -+ -+package System.Linux is -+ pragma Preelaborate; -+ -+ ------------ -+ -- time_t -- -+ ------------ -+ -+ type time_t is new Long_Integer; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ EAGAIN : constant := 11; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ EPERM : constant := 1; -+ ETIMEDOUT : constant := 110; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ SIGHUP : constant := 1; -- hangup -+ SIGINT : constant := 2; -- interrupt (rubout) -+ SIGQUIT : constant := 3; -- quit (ASCD FS) -+ SIGILL : constant := 4; -- illegal instruction (not reset) -+ SIGTRAP : constant := 5; -- trace trap (not reset) -+ SIGIOT : constant := 6; -- IOT instruction -+ SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 7; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGPIPE : constant := 13; -- write on a pipe with no one to read it -+ SIGALRM : constant := 14; -- alarm clock -+ SIGTERM : constant := 15; -- software termination signal from kill -+ SIGUSR1 : constant := 10; -- user defined signal 1 -+ SIGUSR2 : constant := 12; -- user defined signal 2 -+ SIGCLD : constant := 17; -- alias for SIGCHLD -+ SIGCHLD : constant := 17; -- child status change -+ SIGPWR : constant := 30; -- power-fail restart -+ SIGWINCH : constant := 28; -- window size change -+ SIGURG : constant := 23; -- urgent condition on IO channel -+ SIGPOLL : constant := 29; -- pollable event occurred -+ SIGIO : constant := 29; -- I/O now possible (4.2 BSD) -+ SIGLOST : constant := 29; -- File lock lost -+ SIGSTOP : constant := 19; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 20; -- user stop requested from tty -+ SIGCONT : constant := 18; -- stopped process has been continued -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGUNUSED : constant := 31; -- unused signal (GNU/Linux) -+ SIGSTKFLT : constant := 16; -- coprocessor stack fault (Linux) -+ SIGLTHRRES : constant := 32; -- GNU/LinuxThreads restart signal -+ SIGLTHRCAN : constant := 33; -- GNU/LinuxThreads cancel signal -+ SIGLTHRDBG : constant := 34; -- GNU/LinuxThreads debugger signal -+ -+ -- struct_sigaction offsets -+ -+ sa_handler_pos : constant := 0; -+ sa_mask_pos : constant := Standard'Address_Size / 8; -+ sa_flags_pos : constant := 4 + sa_mask_pos; -+ -+ SA_SIGINFO : constant := 16#00000004#; -+ SA_ONSTACK : constant := 16#08000000#; -+ SA_RESTART : constant := 16#10000000#; -+ SA_NODEFER : constant := 16#40000000#; -+ -+end System.Linux; ---- gcc/ada/s-osinte-android.ads.orig -+++ gcc/ada/s-osinte-android.ads -@@ -6,7 +6,7 @@ - -- -- - -- S p e c -- - -- -- ---- Copyright (C) 1995-2013, Free Software Foundation, Inc. -- -+-- Copyright (C) 1995-2014, Free Software Foundation, Inc. -- - -- -- - -- GNAT is free software; you can redistribute it and/or modify it under -- - -- terms of the GNU General Public License as published by the Free Soft- -- -@@ -75,7 +75,7 @@ - -- Signals -- - ------------- - -- Max_Interrupt : constant := 63; -+ Max_Interrupt : constant := 31; - type Signal is new int range 0 .. Max_Interrupt; - for Signal'Size use int'Size; - -@@ -114,9 +114,6 @@ - SIGXFSZ : constant := System.Linux.SIGXFSZ; - SIGUNUSED : constant := System.Linux.SIGUNUSED; - SIGSTKFLT : constant := System.Linux.SIGSTKFLT; -- SIGLTHRRES : constant := System.Linux.SIGLTHRRES; -- SIGLTHRCAN : constant := System.Linux.SIGLTHRCAN; -- SIGLTHRDBG : constant := System.Linux.SIGLTHRDBG; - - SIGADAABORT : constant := SIGABRT; - -- Change this to use another signal for task abort. SIGTERM might be a -@@ -138,13 +135,9 @@ - SIGPROF, - -- To avoid confusing the profiler - -- SIGKILL, SIGSTOP, -+ SIGKILL, SIGSTOP); - -- These two signals actually can't be masked (POSIX won't allow it) - -- SIGLTHRRES, SIGLTHRCAN, SIGLTHRDBG); -- -- These three signals are used by GNU/LinuxThreads starting from glibc -- -- 2.1 (future 2.2). -- - Reserved : constant Signal_Set := (SIGVTALRM, SIGUNUSED); - -- Not clear why these two signals are reserved. Perhaps they are not - -- supported by this version of GNU/Linux ??? -@@ -187,6 +180,8 @@ - - SA_SIGINFO : constant := System.Linux.SA_SIGINFO; - SA_ONSTACK : constant := System.Linux.SA_ONSTACK; -+ SA_NODEFER : constant := System.Linux.SA_NODEFER; -+ SA_RESTART : constant := System.Linux.SA_RESTART; - - SIG_BLOCK : constant := 0; - SIG_UNBLOCK : constant := 1; -@@ -580,17 +575,16 @@ - - private - -- type sigset_t is -- -- array (0 .. OS_Constants.SIZEOF_sigset - 1) of unsigned_char; -- array (1 .. 127) of unsigned_char; -+ type sigset_t is new Interfaces.C.unsigned_long; - pragma Convention (C, sigset_t); - for sigset_t'Alignment use Interfaces.C.unsigned_long'Alignment; - - pragma Warnings (Off); - for struct_sigaction use record - sa_handler at Linux.sa_handler_pos range 0 .. Standard'Address_Size - 1; -- sa_mask at Linux.sa_mask_pos range 0 .. 1023; -- sa_flags at Linux.sa_flags_pos range 0 .. Standard'Address_Size - 1; -+ sa_mask at Linux.sa_mask_pos range 0 .. sigset_t'Size - 1; -+ sa_flags at Linux.sa_flags_pos -+ range 0 .. Interfaces.C.unsigned_long'Size - 1; - end record; - -- We intentionally leave sa_restorer unspecified and let the compiler - -- append it after the last field, so disable corresponding warning. ---- /dev/null +++ gcc/ada/s-osinte-dragonfly.adb @@ -0,0 +1,116 @@ +------------------------------------------------------------------------------ @@ -7479,213 +6954,6 @@ + end Initialize; + +end System.OS_Primitives; ---- /dev/null -+++ gcc/ada/sigtramp-armdroid.c -@@ -0,0 +1,161 @@ -+/**************************************************************************** -+ * * -+ * GNAT COMPILER COMPONENTS * -+ * * -+ * S I G T R A M P * -+ * * -+ * Asm Implementation File * -+ * * -+ * Copyright (C) 2014, Free Software Foundation, Inc. * -+ * * -+ * GNAT is free software; you can redistribute it and/or modify it under * -+ * terms of the GNU General Public License as published by the Free Soft- * -+ * ware Foundation; either version 3, or (at your option) any later ver- * -+ * sion. GNAT is distributed in the hope that it will be useful, but WITH- * -+ * OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * -+ * or FITNESS FOR A PARTICULAR PURPOSE. * -+ * * -+ * As a special exception under Section 7 of GPL version 3, you are granted * -+ * additional permissions described in the GCC Runtime Library Exception, * -+ * version 3.1, as published by the Free Software Foundation. * -+ * * -+ * In particular, you can freely distribute your programs built with the * -+ * GNAT Pro compiler, including any required library run-time units, using * -+ * any licensing terms of your choosing. See the AdaCore Software License * -+ * for full details. * -+ * * -+ * GNAT was originally developed by the GNAT team at New York University. * -+ * Extensive contributions were provided by Ada Core Technologies Inc. * -+ * * -+ ****************************************************************************/ -+ -+/****************************************************** -+ * ARM-Android version of the __gnat_sigtramp service * -+ ******************************************************/ -+ -+#include "sigtramp.h" -+/* See sigtramp.h for a general explanation of functionality. */ -+ -+/* ---------------------- -+ -- General comments -- -+ ---------------------- -+ -+ Stubs are generated from toplevel asms, -+ The general idea is to establish CFA as the sigcontext -+ and state where to find the registers as offsets from there. -+ -+ We support stubs for VxWorks and Android, providing unwind info for -+ common registers. We might need variants with support for floating -+ point or altivec registers as well at some point. -+ -+ For Android it would be simpler to write this in Asm since there's only -+ one variant, but to keep it looking like the VxWorks stubs, -+ C is the choice for our toplevel interface. -+ -+ Note that the registers we "restore" here are those to which we have -+ direct access through the system sigcontext structure, which includes -+ only a partial set of the non-volatiles ABI-wise. */ -+ -+/* ----------------------------------------- -+ -- Protypes for our internal asm stubs -- -+ ----------------------------------------- -+ -+ The registers are expected to be at SIGCONTEXT + 12 (reference the -+ sicontext structure in asm/sigcontext.h which describes the first -+ 3 * 4byte fields.) Even though our symbols will remain local, the -+ prototype claims "extern" and not "static" to prevent compiler complaints -+ about a symbol used but never defined. */ -+ -+/* sigtramp stub providing unwind info for common registers. */ -+ -+extern void __gnat_sigtramp_common -+ (int signo, void *siginfo, void *sigcontext, -+ __sigtramphandler_t * handler); -+ -+void __gnat_sigtramp (int signo, void *si, void *sc, -+ __sigtramphandler_t * handler) -+ __attribute__((optimize(2))); -+ -+void __gnat_sigtramp (int signo, void *si, void *ucontext, -+ __sigtramphandler_t * handler) -+{ -+ struct sigcontext *mcontext = &((ucontext_t *) ucontext)->uc_mcontext; -+ -+ __gnat_sigtramp_common (signo, si, mcontext, handler); -+} -+ -+/* asm string construction helpers. */ -+ -+#define STR(TEXT) #TEXT -+/* stringify expanded TEXT, surrounding it with double quotes. */ -+ -+#define S(E) STR(E) -+/* stringify E, which will resolve as text but may contain macros -+ still to be expanded. */ -+ -+/* asm (TEXT) outputs TEXT. These facilitate the output of -+ multiline contents: */ -+#define TAB(S) "\t" S -+#define CR(S) S "\n" -+ -+#undef TCR -+#define TCR(S) TAB(CR(S)) -+ -+/* Trampoline body block -+ --------------------- */ -+ -+#define SIGTRAMP_BODY \ -+CR("") \ -+TCR("# Allocate frame and also save r2 which is the argument register") \ -+TCR("# containing the sigcontext, so that we can restore it during") \ -+TCR("# unwinding and thereby load the rest of the desired context.") \ -+TCR("stmfd sp!, {r2, r3, lr}") \ -+TCR("# The unwinder undo's these operations in reverse order so starting") \ -+TCR("# from bottom, restore r2 from the current vsp location, move r2 into") \ -+TCR("# the vsp, add 12 bytes to get the start of the register save area") \ -+TCR("# then restore the 15 general purpose registers of the frame which") \ -+TCR("# raised the signal.") \ -+TCR(".save {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15}") \ -+TCR(".pad #12") \ -+TCR(".movsp r2") \ -+TCR(".save {r2}") \ -+TCR("# Call the real handler. The signo, siginfo and sigcontext") \ -+TCR("# arguments are the same as those we received in r0, r1 and r2.") \ -+TCR("blx r3") \ -+TCR("# Restore our callee-saved items, release our frame and return") \ -+TCR("# (should never get here!).") \ -+TCR("ldmfd sp, {r2, r3, pc}") -+ -+/* Symbol definition block -+ ----------------------- */ -+ -+#define SIGTRAMP_START(SYM) \ -+CR("# " S(SYM) " unwind trampoline") \ -+TCR(".type " S(SYM) ", %function") \ -+CR("") \ -+CR(S(SYM) ":") \ -+TCR(".fnstart") -+ -+/* Symbol termination block -+ ------------------------ */ -+ -+#define SIGTRAMP_END(SYM) \ -+CR(".fnend") \ -+TCR(".size " S(SYM) ", .-" S(SYM)) -+ -+/*---------------------------- -+ -- And now, the real code -- -+ ---------------------------- */ -+ -+/* Text section start. The compiler isn't aware of that switch. */ -+ -+asm (".text\n" -+ TCR(".align 2")); -+ -+/* sigtramp stub for common registers. */ -+ -+#define TRAMP_COMMON __gnat_sigtramp_common -+ -+asm (SIGTRAMP_START(TRAMP_COMMON)); -+asm (SIGTRAMP_BODY); -+asm (SIGTRAMP_END(TRAMP_COMMON)); ---- gcc/ada/sigtramp.h.orig -+++ gcc/ada/sigtramp.h -@@ -6,7 +6,7 @@ - * * - * C Header File * - * * -- * Copyright (C) 2011-2013, Free Software Foundation, Inc. * -+ * Copyright (C) 2011-2014, Free Software Foundation, Inc. * - * * - * GNAT is free software; you can redistribute it and/or modify it under * - * terms of the GNU General Public License as published by the Free Soft- * -@@ -41,10 +41,29 @@ - extern "C" { - #endif - -- typedef void sighandler_t (int signo, void *siginfo, void *sigcontext); -+#ifdef __ANDROID__ -+#include -+#include -+#include -+ -+/* Android SDK doesn't define these structs */ -+typedef struct sigcontext mcontext_t; -+ -+typedef struct ucontext -+ { -+ unsigned long uc_flags; -+ struct ucontext *uc_link; -+ stack_t uc_stack; -+ mcontext_t uc_mcontext; -+} ucontext_t; -+#endif -+ -+ /* This typedef signature sometimes conflicts with the sighandler_t from -+ system headers so call it something unique. */ -+ typedef void __sigtramphandler_t (int signo, void *siginfo, void *sigcontext); - - void __gnat_sigtramp (int signo, void *siginfo, void *sigcontext, -- sighandler_t * handler); -+ __sigtramphandler_t * handler); - - /* To be called from an established signal handler. Setup the DWARF CFI - bits letting unwinders walk through the signal frame up into the --- gcc/ada/socket.c.orig +++ gcc/ada/socket.c @@ -65,7 +65,10 @@ @@ -8883,42 +8151,31 @@ TARGET_ADA_SRCS = --- gcc/ada/gcc-interface/Makefile.in.orig +++ gcc/ada/gcc-interface/Makefile.in -@@ -1044,25 +1044,24 @@ +@@ -1044,6 +1044,7 @@ ifeq ($(strip $(filter-out arm% linux-androideabi,$(target_cpu) $(target_os))),) LIBGNAT_TARGET_PAIRS = \ a-intnam.ads