From 6d15a167ddc482f9988d4b455447343ff1d6f8d6 Mon Sep 17 00:00:00 2001 From: marino Date: Wed, 9 Apr 2014 13:52:50 +0000 Subject: lang/gcc-aux: Upgrade from 30 March snapshot to 6 April Since the April 6 snapshot, a lot of work has entered the GCC tree to fix the arm-android GNAT port. Currently it passes everything except stack checking. A lot of the additional lines in diff-ada will be removed with the next snapshot. Future plans also include significantly reducing the size of the diff-cxx-testsuite file too. --- lang/gcc-aux/Makefile.version | 2 +- lang/gcc-aux/distinfo | 4 +- lang/gcc-aux/files/diff-ada | 775 +++++++++++++++++++++++++++++++++- lang/gcc-aux/files/diff-ada-testsuite | 2 +- lang/gcc-aux/files/diff-core | 31 +- lang/gcc-aux/files/diff-cxx | 5 +- lang/gcc-aux/files/diff-cxx-testsuite | 13 + lang/gcc-aux/files/diff-fortran | 2 +- lang/gcc-aux/files/patch-Makefile.def | 10 - lang/gcc-aux/files/patch-Makefile.in | 10 - 10 files changed, 810 insertions(+), 44 deletions(-) delete mode 100644 lang/gcc-aux/files/patch-Makefile.def delete mode 100644 lang/gcc-aux/files/patch-Makefile.in (limited to 'lang/gcc-aux') diff --git a/lang/gcc-aux/Makefile.version b/lang/gcc-aux/Makefile.version index 6216ea8a2d63..d82208b800ff 100644 --- a/lang/gcc-aux/Makefile.version +++ b/lang/gcc-aux/Makefile.version @@ -3,7 +3,7 @@ GCC_BRANCH= 4.9 GCC_POINT= 0 GCC_VERSION= ${GCC_BRANCH}.${GCC_POINT} -SNAPSHOT= 20140330 +SNAPSHOT= 20140406 IDENTIFICATION= gcc-${GCC_BRANCH}-${SNAPSHOT} MS_SUBDIR= snapshots/${GCC_BRANCH}-${SNAPSHOT} diff --git a/lang/gcc-aux/distinfo b/lang/gcc-aux/distinfo index ff62f2ffc3ca..c44e9f30de87 100644 --- a/lang/gcc-aux/distinfo +++ b/lang/gcc-aux/distinfo @@ -1,5 +1,5 @@ -SHA256 (gcc-4.9-20140330.tar.bz2) = 34374d87b1a58bf5d11d7bc53b921088281c731bc141907049f2f57f453af104 -SIZE (gcc-4.9-20140330.tar.bz2) = 85486216 +SHA256 (gcc-4.9-20140406.tar.bz2) = 5f9e1c96b5bc000456b7fe7805dca90866cd18b6fbe00e26f3f3e8236d07d0a3 +SIZE (gcc-4.9-20140406.tar.bz2) = 85440592 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 b3c301897cb8..1763266297c6 100644 --- a/lang/gcc-aux/files/diff-ada +++ b/lang/gcc-aux/files/diff-ada @@ -1993,6 +1993,531 @@ 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 @@ +------------------------------------------------------------------------------ @@ -6953,6 +7478,213 @@ + 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/sysdep.c.orig +++ gcc/ada/sysdep.c @@ -263,6 +263,7 @@ @@ -8136,20 +8868,27 @@ TARGET_ADA_SRCS = --- gcc/ada/gcc-interface/Makefile.in.orig +++ gcc/ada/gcc-interface/Makefile.in -@@ -1044,9 +1044,11 @@ +@@ -1044,25 +1044,27 @@ ifeq ($(strip $(filter-out arm% linux-androideabi,$(target_cpu) $(target_os))),) LIBGNAT_TARGET_PAIRS = \ a-intnam.ads