diff options
Diffstat (limited to 'lang/gcc47-aux/files/diff-ada')
| -rw-r--r-- | lang/gcc47-aux/files/diff-ada | 9620 |
1 files changed, 0 insertions, 9620 deletions
diff --git a/lang/gcc47-aux/files/diff-ada b/lang/gcc47-aux/files/diff-ada deleted file mode 100644 index a05dd717ba94..000000000000 --- a/lang/gcc47-aux/files/diff-ada +++ /dev/null @@ -1,9620 +0,0 @@ ---- gcc/ada/a-exetim-posix.adb.orig -+++ gcc/ada/a-exetim-posix.adb -@@ -106,11 +106,11 @@ - -- Time is equal to Duration (although it is a private type) and - -- CPU_Time is equal to Time. - -- function clock_gettime -+ function clock_gettime_int - (clock_id : Interfaces.C.int; - tp : access timespec) - return int; -- pragma Import (C, clock_gettime, "clock_gettime"); -+ pragma Import (C, clock_gettime_int, "clock_gettime"); - -- Function from the POSIX.1b Realtime Extensions library - - begin -@@ -118,7 +118,7 @@ - raise Program_Error; - end if; - -- Result := clock_gettime -+ Result := clock_gettime_int - (clock_id => CLOCK_THREAD_CPUTIME_ID, tp => TS'Unchecked_Access); - pragma Assert (Result = 0); - ---- /dev/null -+++ gcc/ada/a-intnam-dragonfly.ads -@@ -0,0 +1,136 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- A D A . I N T E R R U P T S . N A M E S -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the DragonFly BSD THREADS version of this package -+ -+with System.OS_Interface; -+ -+package Ada.Interrupts.Names is -+ -+ -- All identifiers in this unit are implementation defined -+ -+ pragma Implementation_Defined; -+ -+ -- Beware that the mapping of names to signals may be many-to-one. There -+ -- may be aliases. Also, for all signal names that are not supported on -+ -- the current system the value of the corresponding constant will be zero. -+ -+ SIGHUP : constant Interrupt_ID := -+ System.OS_Interface.SIGHUP; -- hangup -+ -+ SIGINT : constant Interrupt_ID := -+ System.OS_Interface.SIGINT; -- interrupt (rubout) -+ -+ SIGQUIT : constant Interrupt_ID := -+ System.OS_Interface.SIGQUIT; -- quit (ASCD FS) -+ -+ SIGILL : constant Interrupt_ID := -+ System.OS_Interface.SIGILL; -- illegal instruction (not reset) -+ -+ SIGTRAP : constant Interrupt_ID := -+ System.OS_Interface.SIGTRAP; -- trace trap (not reset) -+ -+ SIGIOT : constant Interrupt_ID := -+ System.OS_Interface.SIGIOT; -- IOT instruction -+ -+ SIGABRT : constant Interrupt_ID := -- used by abort, -+ System.OS_Interface.SIGABRT; -- replace SIGIOT in the future -+ -+ SIGFPE : constant Interrupt_ID := -+ System.OS_Interface.SIGFPE; -- floating point exception -+ -+ SIGKILL : constant Interrupt_ID := -+ System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored) -+ -+ SIGBUS : constant Interrupt_ID := -+ System.OS_Interface.SIGBUS; -- bus error -+ -+ SIGSEGV : constant Interrupt_ID := -+ System.OS_Interface.SIGSEGV; -- segmentation violation -+ -+ SIGPIPE : constant Interrupt_ID := -- write on a pipe with -+ System.OS_Interface.SIGPIPE; -- no one to read it -+ -+ SIGALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGALRM; -- alarm clock -+ -+ SIGTERM : constant Interrupt_ID := -+ System.OS_Interface.SIGTERM; -- software termination signal from kill -+ -+ SIGURG : constant Interrupt_ID := -+ System.OS_Interface.SIGURG; -- urgent condition on IO channel -+ -+ SIGSTOP : constant Interrupt_ID := -+ System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored) -+ -+ SIGTSTP : constant Interrupt_ID := -+ System.OS_Interface.SIGTSTP; -- user stop requested from tty -+ -+ SIGCONT : constant Interrupt_ID := -+ System.OS_Interface.SIGCONT; -- stopped process has been continued -+ -+ SIGCHLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD -+ -+ SIGCLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCLD; -- child status change -+ -+ SIGTTIN : constant Interrupt_ID := -+ System.OS_Interface.SIGTTIN; -- background tty read attempted -+ -+ SIGTTOU : constant Interrupt_ID := -+ System.OS_Interface.SIGTTOU; -- background tty write attempted -+ -+ SIGIO : constant Interrupt_ID := -- input/output possible, -+ System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris) -+ -+ SIGXCPU : constant Interrupt_ID := -+ System.OS_Interface.SIGXCPU; -- CPU time limit exceeded -+ -+ SIGXFSZ : constant Interrupt_ID := -+ System.OS_Interface.SIGXFSZ; -- filesize limit exceeded -+ -+ SIGVTALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGVTALRM; -- virtual timer expired -+ -+ SIGPROF : constant Interrupt_ID := -+ System.OS_Interface.SIGPROF; -- profiling timer expired -+ -+ SIGWINCH : constant Interrupt_ID := -+ System.OS_Interface.SIGWINCH; -- window size change -+ -+ SIGUSR1 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR1; -- user defined signal 1 -+ -+ SIGUSR2 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR2; -- user defined signal 2 -+ -+end Ada.Interrupts.Names; ---- /dev/null -+++ gcc/ada/a-intnam-netbsd.ads -@@ -0,0 +1,139 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- A D A . I N T E R R U P T S . N A M E S -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the NetBSD THREADS version of this package -+ -+with System.OS_Interface; -+ -+package Ada.Interrupts.Names is -+ -+ -- All identifiers in this unit are implementation defined -+ -+ pragma Implementation_Defined; -+ -+ -- Beware that the mapping of names to signals may be many-to-one. There -+ -- may be aliases. Also, for all signal names that are not supported on -+ -- the current system the value of the corresponding constant will be zero. -+ -+ SIGHUP : constant Interrupt_ID := -+ System.OS_Interface.SIGHUP; -- hangup -+ -+ SIGINT : constant Interrupt_ID := -+ System.OS_Interface.SIGINT; -- interrupt (rubout) -+ -+ SIGQUIT : constant Interrupt_ID := -+ System.OS_Interface.SIGQUIT; -- quit (ASCD FS) -+ -+ SIGILL : constant Interrupt_ID := -+ System.OS_Interface.SIGILL; -- illegal instruction (not reset) -+ -+ SIGTRAP : constant Interrupt_ID := -+ System.OS_Interface.SIGTRAP; -- trace trap (not reset) -+ -+ SIGIOT : constant Interrupt_ID := -+ System.OS_Interface.SIGIOT; -- IOT instruction -+ -+ SIGABRT : constant Interrupt_ID := -- used by abort, -+ System.OS_Interface.SIGABRT; -- replace SIGIOT in the future -+ -+ SIGFPE : constant Interrupt_ID := -+ System.OS_Interface.SIGFPE; -- floating point exception -+ -+ SIGKILL : constant Interrupt_ID := -+ System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored) -+ -+ SIGBUS : constant Interrupt_ID := -+ System.OS_Interface.SIGBUS; -- bus error -+ -+ SIGSEGV : constant Interrupt_ID := -+ System.OS_Interface.SIGSEGV; -- segmentation violation -+ -+ SIGPIPE : constant Interrupt_ID := -- write on a pipe with -+ System.OS_Interface.SIGPIPE; -- no one to read it -+ -+ SIGALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGALRM; -- alarm clock -+ -+ SIGTERM : constant Interrupt_ID := -+ System.OS_Interface.SIGTERM; -- software termination signal from kill -+ -+ SIGURG : constant Interrupt_ID := -+ System.OS_Interface.SIGURG; -- urgent condition on IO channel -+ -+ SIGSTOP : constant Interrupt_ID := -+ System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored) -+ -+ SIGTSTP : constant Interrupt_ID := -+ System.OS_Interface.SIGTSTP; -- user stop requested from tty -+ -+ SIGCONT : constant Interrupt_ID := -+ System.OS_Interface.SIGCONT; -- stopped process has been continued -+ -+ SIGCHLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD -+ -+ SIGCLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCLD; -- child status change -+ -+ SIGTTIN : constant Interrupt_ID := -+ System.OS_Interface.SIGTTIN; -- background tty read attempted -+ -+ SIGTTOU : constant Interrupt_ID := -+ System.OS_Interface.SIGTTOU; -- background tty write attempted -+ -+ SIGIO : constant Interrupt_ID := -- input/output possible, -+ System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris) -+ -+ SIGXCPU : constant Interrupt_ID := -+ System.OS_Interface.SIGXCPU; -- CPU time limit exceeded -+ -+ SIGXFSZ : constant Interrupt_ID := -+ System.OS_Interface.SIGXFSZ; -- filesize limit exceeded -+ -+ SIGVTALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGVTALRM; -- virtual timer expired -+ -+ SIGPROF : constant Interrupt_ID := -+ System.OS_Interface.SIGPROF; -- profiling timer expired -+ -+ SIGWINCH : constant Interrupt_ID := -+ System.OS_Interface.SIGWINCH; -- window size change -+ -+ SIGUSR1 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR1; -- user defined signal 1 -+ -+ SIGUSR2 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR2; -- user defined signal 2 -+ -+ SIGPWR : constant Interrupt_ID := -+ System.OS_Interface.SIGPWR; -- power fail/restart -+ -+end Ada.Interrupts.Names; ---- /dev/null -+++ gcc/ada/a-intnam-openbsd.ads -@@ -0,0 +1,136 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- A D A . I N T E R R U P T S . N A M E S -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the OpenBSD THREADS version of this package -+ -+with System.OS_Interface; -+ -+package Ada.Interrupts.Names is -+ -+ -- All identifiers in this unit are implementation defined -+ -+ pragma Implementation_Defined; -+ -+ -- Beware that the mapping of names to signals may be many-to-one. There -+ -- may be aliases. Also, for all signal names that are not supported on -+ -- the current system the value of the corresponding constant will be zero. -+ -+ SIGHUP : constant Interrupt_ID := -+ System.OS_Interface.SIGHUP; -- hangup -+ -+ SIGINT : constant Interrupt_ID := -+ System.OS_Interface.SIGINT; -- interrupt (rubout) -+ -+ SIGQUIT : constant Interrupt_ID := -+ System.OS_Interface.SIGQUIT; -- quit (ASCD FS) -+ -+ SIGILL : constant Interrupt_ID := -+ System.OS_Interface.SIGILL; -- illegal instruction (not reset) -+ -+ SIGTRAP : constant Interrupt_ID := -+ System.OS_Interface.SIGTRAP; -- trace trap (not reset) -+ -+ SIGIOT : constant Interrupt_ID := -+ System.OS_Interface.SIGIOT; -- IOT instruction -+ -+ SIGABRT : constant Interrupt_ID := -- used by abort, -+ System.OS_Interface.SIGABRT; -- replace SIGIOT in the future -+ -+ SIGFPE : constant Interrupt_ID := -+ System.OS_Interface.SIGFPE; -- floating point exception -+ -+ SIGKILL : constant Interrupt_ID := -+ System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored) -+ -+ SIGBUS : constant Interrupt_ID := -+ System.OS_Interface.SIGBUS; -- bus error -+ -+ SIGSEGV : constant Interrupt_ID := -+ System.OS_Interface.SIGSEGV; -- segmentation violation -+ -+ SIGPIPE : constant Interrupt_ID := -- write on a pipe with -+ System.OS_Interface.SIGPIPE; -- no one to read it -+ -+ SIGALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGALRM; -- alarm clock -+ -+ SIGTERM : constant Interrupt_ID := -+ System.OS_Interface.SIGTERM; -- software termination signal from kill -+ -+ SIGURG : constant Interrupt_ID := -+ System.OS_Interface.SIGURG; -- urgent condition on IO channel -+ -+ SIGSTOP : constant Interrupt_ID := -+ System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored) -+ -+ SIGTSTP : constant Interrupt_ID := -+ System.OS_Interface.SIGTSTP; -- user stop requested from tty -+ -+ SIGCONT : constant Interrupt_ID := -+ System.OS_Interface.SIGCONT; -- stopped process has been continued -+ -+ SIGCHLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD -+ -+ SIGCLD : constant Interrupt_ID := -+ System.OS_Interface.SIGCLD; -- child status change -+ -+ SIGTTIN : constant Interrupt_ID := -+ System.OS_Interface.SIGTTIN; -- background tty read attempted -+ -+ SIGTTOU : constant Interrupt_ID := -+ System.OS_Interface.SIGTTOU; -- background tty write attempted -+ -+ SIGIO : constant Interrupt_ID := -- input/output possible, -+ System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris) -+ -+ SIGXCPU : constant Interrupt_ID := -+ System.OS_Interface.SIGXCPU; -- CPU time limit exceeded -+ -+ SIGXFSZ : constant Interrupt_ID := -+ System.OS_Interface.SIGXFSZ; -- filesize limit exceeded -+ -+ SIGVTALRM : constant Interrupt_ID := -+ System.OS_Interface.SIGVTALRM; -- virtual timer expired -+ -+ SIGPROF : constant Interrupt_ID := -+ System.OS_Interface.SIGPROF; -- profiling timer expired -+ -+ SIGWINCH : constant Interrupt_ID := -+ System.OS_Interface.SIGWINCH; -- window size change -+ -+ SIGUSR1 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR1; -- user defined signal 1 -+ -+ SIGUSR2 : constant Interrupt_ID := -+ System.OS_Interface.SIGUSR2; -- user defined signal 2 -+ -+end Ada.Interrupts.Names; ---- gcc/ada/adaint.c.orig -+++ gcc/ada/adaint.c -@@ -1077,6 +1077,7 @@ - strcpy (path, "GNAT-XXXXXX"); - - #if (defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) \ -+ || defined (__DragonFly__) \ - || defined (linux) || defined(__GLIBC__)) && !defined (__vxworks) - return mkstemp (path); - #elif defined (__Lynx__) -@@ -1227,7 +1228,49 @@ - free (pname); - } - -+#elif defined (__ANDROID__) -+ -+ /* -+ * ext2 /ext3/ext4/fat16/fat32 have no path limits -+ * /data/local/tmp normally requires rooted devices, if it even exists -+ * /sdcard is the standard location for external storage. Nativeactivity -+ * manifest needs to authorize its use, otherwise it might not have the -+ * proper permissions. -+ */ -+ -+ int testfd; -+ char *datadir = getenv ("ANDROID_DATA"); -+ -+ if (datadir == NULL) -+ strcpy (tmp_filename, "/data/local/tmp/gnat-XXXXXX"); -+ else -+ sprintf (tmp_filename, "%s/local/tmp/gnat-XXXXXX", datadir); -+ -+ testfd = mkstemp (tmp_filename); -+ if (testfd != -1) -+ { -+ close (testfd); -+ return; -+ } -+ -+ char *sdcard = getenv ("EXTERNAL_STORAGE"); -+ -+ if (sdcard == NULL) -+ strcpy (tmp_filename, "/sdcard/gnat-XXXXXX"); -+ else -+ sprintf (tmp_filename, "%s/gnat-XXXXXX", sdcard); -+ -+ testfd = mkstemp (tmp_filename); -+ if (testfd != -1) -+ { -+ close (testfd); -+ return; -+ } -+ -+ tmpnam (tmp_filename); -+ - #elif defined (linux) || defined (__FreeBSD__) || defined (__NetBSD__) \ -+ || defined (__DragonFly__) \ - || defined (__OpenBSD__) || defined(__GLIBC__) - #define MAX_SAFE_PATH 1000 - char *tmpdir = getenv ("TMPDIR"); -@@ -2468,6 +2511,8 @@ - int cores = 1; - - #if defined (linux) || defined (sun) || defined (AIX) \ -+ || defined (__FreeBSD__) || defined (__DragonFly__) \ -+ || defined (__OpenBSD__) || defined (__NetBSD__) \ - || (defined (__alpha__) && defined (_osf_)) || defined (__APPLE__) - cores = (int) sysconf (_SC_NPROCESSORS_ONLN); - -@@ -3530,37 +3575,6 @@ - } - #endif - --#if defined (IS_CROSS) \ -- || (! ((defined (sparc) || defined (i386)) && defined (sun) \ -- && defined (__SVR4)) \ -- && ! (defined (linux) && (defined (i386) || defined (__x86_64__))) \ -- && ! (defined (linux) && defined (__ia64__)) \ -- && ! (defined (linux) && defined (powerpc)) \ -- && ! defined (__FreeBSD__) \ -- && ! defined (__Lynx__) \ -- && ! defined (__hpux__) \ -- && ! defined (__APPLE__) \ -- && ! defined (_AIX) \ -- && ! (defined (__alpha__) && defined (__osf__)) \ -- && ! defined (VMS) \ -- && ! defined (__MINGW32__) \ -- && ! (defined (__mips) && defined (__sgi))) -- --/* Dummy function to satisfy g-trasym.o. See the preprocessor conditional -- just above for a list of native platforms that provide a non-dummy -- version of this procedure in libaddr2line.a. */ -- --void --convert_addresses (const char *file_name ATTRIBUTE_UNUSED, -- void *addrs ATTRIBUTE_UNUSED, -- int n_addr ATTRIBUTE_UNUSED, -- void *buf ATTRIBUTE_UNUSED, -- int *len ATTRIBUTE_UNUSED) --{ -- *len = 0; --} --#endif -- - #if defined (_WIN32) - int __gnat_argument_needs_quote = 1; - #else -@@ -3864,6 +3878,17 @@ - CPU_SET (cpu - 1, set); - } - #endif -+ -+#ifdef __ANDROID__ -+/* No-op, Android doesn't support pthread_rwlockattr_setkind_np, but we want -+ to use the s-taprop-linux.ads without modification */ -+int __gnat_set_threadlock_kind (pthread_rwlockattr_t *attr ATTRIBUTE_UNUSED, -+ int pref ATTRIBUTE_UNUSED) -+{ -+ return 0; -+} -+#endif -+ - #endif - - #ifdef __cplusplus ---- gcc/ada/adaint.h.orig -+++ gcc/ada/adaint.h -@@ -257,6 +257,20 @@ - - #include <sched.h> - -+#ifdef __ANDROID__ -+struct pthread_rwlockattr; -+typedef struct pthread_rwlockattr *pthread_rwlockattr_t; -+typedef struct { -+ unsigned long int __bits[ 1 ]; -+} cpu_set_t; -+# define __CPU_MASK(x) ((unsigned long int)1 << ((x) & 31)) -+# define CPU_ZERO(set_) do { (set_)->__bits[0] = 0; } while(0) -+# define CPU_SET(cpu_,set_) \ -+ do { size_t __cpu = (cpu_); \ -+ if (__cpu < 32) (set_)->__bits[0] |= __CPU_MASK(__cpu); } while (0) -+int __gnat_set_threadlock_kind (pthread_rwlockattr_t *, int); -+#endif -+ - extern cpu_set_t *__gnat_cpu_alloc (size_t); - extern size_t __gnat_cpu_alloc_size (size_t); - extern void __gnat_cpu_free (cpu_set_t *); ---- gcc/ada/cio.c.orig -+++ gcc/ada/cio.c -@@ -46,7 +46,8 @@ - - /* Don't use macros on GNU/Linux since they cause incompatible changes between - glibc 2.0 and 2.1 */ --#ifdef linux -+/* Android is The exception because it uses the BIONIC library */ -+#if defined(linux) && !defined(__ANDROID__) - #undef putchar - #undef getchar - #undef fputc ---- gcc/ada/cstreams.c.orig -+++ gcc/ada/cstreams.c -@@ -54,9 +54,10 @@ - #include <unixlib.h> - #endif - --#ifdef linux -+#if defined(linux) && !defined(__ANDROID__) - /* Don't use macros on GNU/Linux since they cause incompatible changes between - glibc 2.0 and 2.1 */ -+/* Android is The exception because it uses the BIONIC library */ - - #ifdef stderr - # undef stderr -@@ -187,7 +188,10 @@ - *p = '\\'; - } - --#elif defined (sgi) || defined (__FreeBSD__) -+#elif defined (sgi) \ -+ || defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__OpenBSD__) - - /* Use realpath function which resolves links and references to . and .. - on those Unix systems that support it. Note that GNU/Linux provides it but ---- gcc/ada/env.c.orig -+++ gcc/ada/env.c -@@ -188,7 +188,9 @@ - LIB$SIGNAL (status); - } - --#elif (defined (__vxworks) && defined (__RTP__)) || defined (__APPLE__) -+#elif (defined (__vxworks) && defined (__RTP__)) \ -+ || defined (__APPLE__) \ -+ || defined (__OpenBSD__) - setenv (name, value, 1); - - #else -@@ -310,6 +312,7 @@ - } - #elif defined (__MINGW32__) || defined (__FreeBSD__) || defined (__APPLE__) \ - || (defined (__vxworks) && defined (__RTP__)) || defined (__CYGWIN__) \ -+ || defined (__DragonFly__) \ - || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__rtems__) - /* On Windows, FreeBSD and MacOS there is no function to clean all the - environment but there is a "clean" way to unset a variable. So go ---- gcc/ada/errno.c.orig -+++ gcc/ada/errno.c -@@ -39,6 +39,7 @@ - #define _REENTRANT - #define _THREAD_SAFE - #define _SGI_MP_SOURCE -+#define GNAT_SET_ERRNO - - #ifdef MaRTE - -@@ -52,6 +53,17 @@ - - #endif - -+#ifdef __ANDROID__ -+ -+/* The ANDROID errno.h file also defines __set_errno as an external variable -+ for use with syscalls. It should not be referenced directly, but we are -+ going to do it anyway because the alternative solution is to rename all -+ uses of __set_errno in GNAT. */ -+ -+#undef GNAT_SET_ERRNO -+#endif -+ -+ - #include <errno.h> - int - __get_errno(void) -@@ -59,8 +71,10 @@ - return errno; - } - -+#ifdef GNAT_SET_ERRNO - void - __set_errno(int err) - { - errno = err; - } -+#endif ---- gcc/ada/g-comlin.adb.orig -+++ gcc/ada/g-comlin.adb -@@ -514,6 +514,7 @@ - begin - Index_In_Switches := 0; - Switch_Length := 0; -+ Param := Parameter_None; - - -- Remove all leading spaces first to make sure that Index points - -- at the start of the first switch. ---- gcc/ada/g-expect.adb.orig -+++ gcc/ada/g-expect.adb -@@ -1332,15 +1332,20 @@ - - -- The following commands are not executed on Unix systems, and are only - -- required for Windows systems. We are now in the parent process. -+ -- Although the if-statement is redundant, it's here so the compiler -+ -- doesn't complain about uninitialized variables. - -- -- Restore the old descriptors -+ if No_Fork_On_Target then - -- Dup2 (Input, GNAT.OS_Lib.Standin); -- Dup2 (Output, GNAT.OS_Lib.Standout); -- Dup2 (Error, GNAT.OS_Lib.Standerr); -- Close (Input); -- Close (Output); -- Close (Error); -+ -- Restore the old descriptors -+ -+ Dup2 (Input, GNAT.OS_Lib.Standin); -+ Dup2 (Output, GNAT.OS_Lib.Standout); -+ Dup2 (Error, GNAT.OS_Lib.Standerr); -+ Close (Input); -+ Close (Output); -+ Close (Error); -+ end if; - end Set_Up_Child_Communications; - - --------------------------- ---- /dev/null -+++ gcc/ada/g-socthi-bsd.adb -@@ -0,0 +1,376 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT COMPILER COMPONENTS -- -+-- -- -+-- G N A T . S O C K E T S . T H I N -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 2001-2010, AdaCore -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This package provides a target dependent thin interface to the sockets -+-- layer for use by the GNAT.Sockets package (g-socket.ads). This package -+-- should not be directly with'ed by an applications program. -+ -+-- This is the *BSD version which uses fcntl rather than ioctl -+-- The constant SCON.Thread_Blocking_IO is always true (for all platforms, not -+-- just *BSD), so this binding is significantly simpler than the standard -+-- one it replaces. -+ -+with GNAT.OS_Lib; use GNAT.OS_Lib; -+ -+with Interfaces.C; use Interfaces.C; -+ -+package body GNAT.Sockets.Thin is -+ -+ Unknown_System_Error : constant C.Strings.chars_ptr := -+ C.Strings.New_String ("Unknown system error"); -+ -+ function Syscall_Accept -+ (S : C.int; -+ Addr : System.Address; -+ Addrlen : not null access C.int) return C.int; -+ pragma Import (C, Syscall_Accept, "accept"); -+ -- The accept() function accepts a connection on a socket. An incoming -+ -- connection is acknowledged and associated with an immediately created -+ -- socket. The original socket is returned to the listening state. -+ -+ function Syscall_Connect -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int; -+ pragma Import (C, Syscall_Connect, "connect"); -+ -- The connect() system call initiates a connection on a socket. If the -+ -- parameter S is of type SOCK_DGRAM then connect() permanently specifies -+ -- the peer to which datagrams are to be sent. If S is type SOCK_STREAM -+ -- then connect() attempts to make a connection with another socket, which -+ -- is identified by the parameter Name. -+ -+ function Syscall_Recv -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int) return C.int; -+ pragma Import (C, Syscall_Recv, "recv"); -+ -- The recv() function receives a message from a socket. The call can be -+ -- used on a connection mode socket or a bound, connectionless socket. If -+ -- no messages are available at the socket, the recv() call waits for a -+ -- message to arrive unless the socket is non-blocking. If a socket is -+ -- non-blocking, the call returns a -1 and ERRNO is set to EWOULDBLOCK. -+ -+ function Syscall_Recvfrom -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ From : System.Address; -+ Fromlen : not null access C.int) return C.int; -+ pragma Import (C, Syscall_Recvfrom, "recvfrom"); -+ -- The recvfrom() system call receives a message from a socket and captures -+ -- the address from which the data was sent. It can be used to receive -+ -- data on an unconnected socket as well. If no messages are available, -+ -- the call waits for a message to arrive on blocking sockets. For -+ -- non-blocking sockets without messages, -1 is returned and ERRNO is set -+ -- to EAGAIN or EWOULDBLOCK. -+ -+ function Syscall_Recvmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ pragma Import (C, Syscall_Recvmsg, "recvmsg"); -+ -- The recvmsg call receives a message from a socket, and can be used to -+ -- receive data on an unconnected socket as well. If no messages are -+ -- available, the call waits for a message to arrive on blocking sockets. -+ -- For non-blocking sockets without messages, -1 is returned and ERRNO is -+ -- set to EAGAIN or EWOULDBLOCK. -+ -+ function Syscall_Sendmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ pragma Import (C, Syscall_Sendmsg, "sendmsg"); -+ -- The sendmsg() function sends a message to a socket, and can be used with -+ -- unconnected sockets as well (the msg is ignored in this case). The -+ -- function returns the number of bytes sent when successful, otherwise it -+ -- returns -1 and ERRNO is set (many possible values). -+ -+ function Syscall_Sendto -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ To : System.Address; -+ Tolen : C.int) return C.int; -+ pragma Import (C, Syscall_Sendto, "sendto"); -+ -- The sendto() function only works for connected sockets and it initiates -+ -- the transmission of a message. A successful call returns the numbers of -+ -- bytes sent, and a failure returns a -1 and ERRNO is set. -+ -+ function Syscall_Socket -+ (Domain : C.int; -+ Typ : C.int; -+ Protocol : C.int) return C.int; -+ pragma Import (C, Syscall_Socket, "socket"); -+ -- The socket() function is used to create an unbound socket and returns a -+ -- file descriptor that can be used with other socket functions. Upon -+ -- failure, a -1 is returned and ERRNO is set. -+ -+ procedure Disable_SIGPIPE (S : C.int); -+ pragma Import (C, Disable_SIGPIPE, "__gnat_disable_sigpipe"); -+ -+ procedure Disable_All_SIGPIPEs; -+ pragma Import (C, Disable_All_SIGPIPEs, "__gnat_disable_all_sigpipes"); -+ -- Sets the process to ignore all SIGPIPE signals on platforms that -+ -- don't support Disable_SIGPIPE for particular streams. -+ -+ function C_Fcntl -+ (Fd : C.int; -+ Cmd : C.int; -+ Val : C.int) return C.int; -+ pragma Import (C, C_Fcntl, "fcntl"); -+ -- The ioctl of 64-bit DragonFlyBSD, OpenBSD, and NetBSD does not support -+ -- setting a socket in non-blocking mode. fcntl must be used instead. -+ -+ -------------- -+ -- C_Accept -- -+ -------------- -+ -+ function C_Accept -+ (S : C.int; -+ Addr : System.Address; -+ Addrlen : not null access C.int) return C.int -+ is -+ Res : constant C.int := Syscall_Accept (S, Addr, Addrlen); -+ begin -+ -+ Disable_SIGPIPE (Res); -+ return Res; -+ -+ end C_Accept; -+ -+ --------------- -+ -- C_Connect -- -+ --------------- -+ -+ function C_Connect -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Connect (S, Name, Namelen); -+ -+ end C_Connect; -+ -+ ------------------ -+ -- Socket_Ioctl -- -+ ------------------ -+ -+ function Socket_Ioctl -+ (S : C.int; -+ Req : C.int; -+ Arg : access C.int) return C.int -+ is -+ -- Currently all requests are of the FIONBIO type, so always calc flags -+ use Interfaces; -+ flags : constant Unsigned_32 := -+ Unsigned_32 (C_Fcntl (S, SOSC.F_GETFL, 0)); -+ nonblock : constant Unsigned_32 := Unsigned_32 (SOSC.FNDELAY); -+ enabled : constant Boolean := Arg.all = 1; -+ newval : C.int; -+ begin -+ if Req = SOSC.FIONBIO then -+ if enabled then -+ newval := C.int (flags or nonblock); -+ elsif (flags and nonblock) > 0 then -+ newval := C.int (flags - nonblock); -+ else -+ newval := C.int (flags); -+ end if; -+ return C_Fcntl (Fd => S, Cmd => SOSC.F_SETFL, Val => newval); -+ else -+ return C_Ioctl (Fd => S, Req => Req, Arg => Arg); -+ end if; -+ end Socket_Ioctl; -+ -+ ------------ -+ -- C_Recv -- -+ ------------ -+ -+ function C_Recv -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Recv (S, Msg, Len, Flags); -+ -+ end C_Recv; -+ -+ ---------------- -+ -- C_Recvfrom -- -+ ---------------- -+ -+ function C_Recvfrom -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ From : System.Address; -+ Fromlen : not null access C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Recvfrom (S, Msg, Len, Flags, From, Fromlen); -+ -+ end C_Recvfrom; -+ -+ --------------- -+ -- C_Recvmsg -- -+ --------------- -+ -+ function C_Recvmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t -+ is -+ begin -+ -+ return Syscall_Recvmsg (S, Msg, Flags); -+ -+ end C_Recvmsg; -+ -+ --------------- -+ -- C_Sendmsg -- -+ --------------- -+ -+ function C_Sendmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t -+ is -+ begin -+ -+ return Syscall_Sendmsg (S, Msg, Flags); -+ -+ end C_Sendmsg; -+ -+ -------------- -+ -- C_Sendto -- -+ -------------- -+ -+ function C_Sendto -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ To : System.Address; -+ Tolen : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Sendto (S, Msg, Len, Flags, To, Tolen); -+ -+ end C_Sendto; -+ -+ -------------- -+ -- C_Socket -- -+ -------------- -+ -+ function C_Socket -+ (Domain : C.int; -+ Typ : C.int; -+ Protocol : C.int) return C.int -+ is -+ Res : constant C.int := Syscall_Socket (Domain, Typ, Protocol); -+ begin -+ -+ Disable_SIGPIPE (Res); -+ return Res; -+ -+ end C_Socket; -+ -+ -------------- -+ -- Finalize -- -+ -------------- -+ -+ procedure Finalize is -+ begin -+ null; -+ end Finalize; -+ -+ ------------------------- -+ -- Host_Error_Messages -- -+ ------------------------- -+ -+ package body Host_Error_Messages is separate; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ procedure Initialize is -+ begin -+ Disable_All_SIGPIPEs; -+ end Initialize; -+ -+ -------------------- -+ -- Signalling_Fds -- -+ -------------------- -+ -+ package body Signalling_Fds is -+ -+ -- In this default implementation, we use a C version of these -+ -- subprograms provided by socket.c. -+ -+ function C_Create (Fds : not null access Fd_Pair) return C.int; -+ function C_Read (Rsig : C.int) return C.int; -+ function C_Write (Wsig : C.int) return C.int; -+ procedure C_Close (Sig : C.int); -+ -+ pragma Import (C, C_Create, "__gnat_create_signalling_fds"); -+ pragma Import (C, C_Read, "__gnat_read_signalling_fd"); -+ pragma Import (C, C_Write, "__gnat_write_signalling_fd"); -+ pragma Import (C, C_Close, "__gnat_close_signalling_fd"); -+ -+ function Create -+ (Fds : not null access Fd_Pair) return C.int renames C_Create; -+ function Read (Rsig : C.int) return C.int renames C_Read; -+ function Write (Wsig : C.int) return C.int renames C_Write; -+ procedure Close (Sig : C.int) renames C_Close; -+ -+ end Signalling_Fds; -+ -+ -------------------------- -+ -- Socket_Error_Message -- -+ -------------------------- -+ -+ function Socket_Error_Message -+ (Errno : Integer) return C.Strings.chars_ptr -+ is separate; -+ -+end GNAT.Sockets.Thin; ---- /dev/null -+++ gcc/ada/g-socthi-netbsd.adb -@@ -0,0 +1,378 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT COMPILER COMPONENTS -- -+-- -- -+-- G N A T . S O C K E T S . T H I N -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 2001-2010, AdaCore -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This package provides a target dependent thin interface to the sockets -+-- layer for use by the GNAT.Sockets package (g-socket.ads). This package -+-- should not be directly with'ed by an applications program. -+ -+-- This is the NetBSD version which uses fcntl rather than ioctl -+-- The constant SCON.Thread_Blocking_IO is always true (for all platforms, not -+-- just *BSD), so this binding is significantly simpler than the standard -+-- one it replaces. -+-- NetBSD uses binary compatibility functions that are forcing the use of -+-- their own files rather than sharing the *BSD versions. -+ -+with GNAT.OS_Lib; use GNAT.OS_Lib; -+ -+with Interfaces.C; use Interfaces.C; -+ -+package body GNAT.Sockets.Thin is -+ -+ Unknown_System_Error : constant C.Strings.chars_ptr := -+ C.Strings.New_String ("Unknown system error"); -+ -+ function Syscall_Accept -+ (S : C.int; -+ Addr : System.Address; -+ Addrlen : not null access C.int) return C.int; -+ pragma Import (C, Syscall_Accept, "accept"); -+ -- The accept() function accepts a connection on a socket. An incoming -+ -- connection is acknowledged and associated with an immediately created -+ -- socket. The original socket is returned to the listening state. -+ -+ function Syscall_Connect -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int; -+ pragma Import (C, Syscall_Connect, "connect"); -+ -- The connect() system call initiates a connection on a socket. If the -+ -- parameter S is of type SOCK_DGRAM then connect() permanently specifies -+ -- the peer to which datagrams are to be sent. If S is type SOCK_STREAM -+ -- then connect() attempts to make a connection with another socket, which -+ -- is identified by the parameter Name. -+ -+ function Syscall_Recv -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int) return C.int; -+ pragma Import (C, Syscall_Recv, "recv"); -+ -- The recv() function receives a message from a socket. The call can be -+ -- used on a connection mode socket or a bound, connectionless socket. If -+ -- no messages are available at the socket, the recv() call waits for a -+ -- message to arrive unless the socket is non-blocking. If a socket is -+ -- non-blocking, the call returns a -1 and ERRNO is set to EWOULDBLOCK. -+ -+ function Syscall_Recvfrom -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ From : System.Address; -+ Fromlen : not null access C.int) return C.int; -+ pragma Import (C, Syscall_Recvfrom, "recvfrom"); -+ -- The recvfrom() system call receives a message from a socket and captures -+ -- the address from which the data was sent. It can be used to receive -+ -- data on an unconnected socket as well. If no messages are available, -+ -- the call waits for a message to arrive on blocking sockets. For -+ -- non-blocking sockets without messages, -1 is returned and ERRNO is set -+ -- to EAGAIN or EWOULDBLOCK. -+ -+ function Syscall_Recvmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ pragma Import (C, Syscall_Recvmsg, "recvmsg"); -+ -- The recvmsg call receives a message from a socket, and can be used to -+ -- receive data on an unconnected socket as well. If no messages are -+ -- available, the call waits for a message to arrive on blocking sockets. -+ -- For non-blocking sockets without messages, -1 is returned and ERRNO is -+ -- set to EAGAIN or EWOULDBLOCK. -+ -+ function Syscall_Sendmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ pragma Import (C, Syscall_Sendmsg, "sendmsg"); -+ -- The sendmsg() function sends a message to a socket, and can be used with -+ -- unconnected sockets as well (the msg is ignored in this case). The -+ -- function returns the number of bytes sent when successful, otherwise it -+ -- returns -1 and ERRNO is set (many possible values). -+ -+ function Syscall_Sendto -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ To : System.Address; -+ Tolen : C.int) return C.int; -+ pragma Import (C, Syscall_Sendto, "sendto"); -+ -- The sendto() function only works for connected sockets and it initiates -+ -- the transmission of a message. A successful call returns the numbers of -+ -- bytes sent, and a failure returns a -1 and ERRNO is set. -+ -+ function Syscall_Socket -+ (Domain : C.int; -+ Typ : C.int; -+ Protocol : C.int) return C.int; -+ pragma Import (C, Syscall_Socket, "__socket30"); -+ -- The socket() function is used to create an unbound socket and returns a -+ -- file descriptor that can be used with other socket functions. Upon -+ -- failure, a -1 is returned and ERRNO is set. -+ -+ procedure Disable_SIGPIPE (S : C.int); -+ pragma Import (C, Disable_SIGPIPE, "__gnat_disable_sigpipe"); -+ -+ procedure Disable_All_SIGPIPEs; -+ pragma Import (C, Disable_All_SIGPIPEs, "__gnat_disable_all_sigpipes"); -+ -- Sets the process to ignore all SIGPIPE signals on platforms that -+ -- don't support Disable_SIGPIPE for particular streams. -+ -+ function C_Fcntl -+ (Fd : C.int; -+ Cmd : C.int; -+ Val : C.int) return C.int; -+ pragma Import (C, C_Fcntl, "fcntl"); -+ -- The ioctl of 64-bit DragonFlyBSD, OpenBSD, and NetBSD does not support -+ -- setting a socket in non-blocking mode. fcntl must be used instead. -+ -+ -------------- -+ -- C_Accept -- -+ -------------- -+ -+ function C_Accept -+ (S : C.int; -+ Addr : System.Address; -+ Addrlen : not null access C.int) return C.int -+ is -+ Res : constant C.int := Syscall_Accept (S, Addr, Addrlen); -+ begin -+ -+ Disable_SIGPIPE (Res); -+ return Res; -+ -+ end C_Accept; -+ -+ --------------- -+ -- C_Connect -- -+ --------------- -+ -+ function C_Connect -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Connect (S, Name, Namelen); -+ -+ end C_Connect; -+ -+ ------------------ -+ -- Socket_Ioctl -- -+ ------------------ -+ -+ function Socket_Ioctl -+ (S : C.int; -+ Req : C.int; -+ Arg : access C.int) return C.int -+ is -+ -- Currently all requests are of the FIONBIO type, so always calc flags -+ use Interfaces; -+ flags : constant Unsigned_32 := -+ Unsigned_32 (C_Fcntl (S, SOSC.F_GETFL, 0)); -+ nonblock : constant Unsigned_32 := Unsigned_32 (SOSC.FNDELAY); -+ enabled : constant Boolean := Arg.all = 1; -+ newval : C.int; -+ begin -+ if Req = SOSC.FIONBIO then -+ if enabled then -+ newval := C.int (flags or nonblock); -+ elsif (flags and nonblock) > 0 then -+ newval := C.int (flags - nonblock); -+ else -+ newval := C.int (flags); -+ end if; -+ return C_Fcntl (Fd => S, Cmd => SOSC.F_SETFL, Val => newval); -+ else -+ return C_Ioctl (Fd => S, Req => Req, Arg => Arg); -+ end if; -+ end Socket_Ioctl; -+ -+ ------------ -+ -- C_Recv -- -+ ------------ -+ -+ function C_Recv -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Recv (S, Msg, Len, Flags); -+ -+ end C_Recv; -+ -+ ---------------- -+ -- C_Recvfrom -- -+ ---------------- -+ -+ function C_Recvfrom -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ From : System.Address; -+ Fromlen : not null access C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Recvfrom (S, Msg, Len, Flags, From, Fromlen); -+ -+ end C_Recvfrom; -+ -+ --------------- -+ -- C_Recvmsg -- -+ --------------- -+ -+ function C_Recvmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t -+ is -+ begin -+ -+ return Syscall_Recvmsg (S, Msg, Flags); -+ -+ end C_Recvmsg; -+ -+ --------------- -+ -- C_Sendmsg -- -+ --------------- -+ -+ function C_Sendmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t -+ is -+ begin -+ -+ return Syscall_Sendmsg (S, Msg, Flags); -+ -+ end C_Sendmsg; -+ -+ -------------- -+ -- C_Sendto -- -+ -------------- -+ -+ function C_Sendto -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ To : System.Address; -+ Tolen : C.int) return C.int -+ is -+ begin -+ -+ return Syscall_Sendto (S, Msg, Len, Flags, To, Tolen); -+ -+ end C_Sendto; -+ -+ -------------- -+ -- C_Socket -- -+ -------------- -+ -+ function C_Socket -+ (Domain : C.int; -+ Typ : C.int; -+ Protocol : C.int) return C.int -+ is -+ Res : constant C.int := Syscall_Socket (Domain, Typ, Protocol); -+ begin -+ -+ Disable_SIGPIPE (Res); -+ return Res; -+ -+ end C_Socket; -+ -+ -------------- -+ -- Finalize -- -+ -------------- -+ -+ procedure Finalize is -+ begin -+ null; -+ end Finalize; -+ -+ ------------------------- -+ -- Host_Error_Messages -- -+ ------------------------- -+ -+ package body Host_Error_Messages is separate; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ procedure Initialize is -+ begin -+ Disable_All_SIGPIPEs; -+ end Initialize; -+ -+ -------------------- -+ -- Signalling_Fds -- -+ -------------------- -+ -+ package body Signalling_Fds is -+ -+ -- In this default implementation, we use a C version of these -+ -- subprograms provided by socket.c. -+ -+ function C_Create (Fds : not null access Fd_Pair) return C.int; -+ function C_Read (Rsig : C.int) return C.int; -+ function C_Write (Wsig : C.int) return C.int; -+ procedure C_Close (Sig : C.int); -+ -+ pragma Import (C, C_Create, "__gnat_create_signalling_fds"); -+ pragma Import (C, C_Read, "__gnat_read_signalling_fd"); -+ pragma Import (C, C_Write, "__gnat_write_signalling_fd"); -+ pragma Import (C, C_Close, "__gnat_close_signalling_fd"); -+ -+ function Create -+ (Fds : not null access Fd_Pair) return C.int renames C_Create; -+ function Read (Rsig : C.int) return C.int renames C_Read; -+ function Write (Wsig : C.int) return C.int renames C_Write; -+ procedure Close (Sig : C.int) renames C_Close; -+ -+ end Signalling_Fds; -+ -+ -------------------------- -+ -- Socket_Error_Message -- -+ -------------------------- -+ -+ function Socket_Error_Message -+ (Errno : Integer) return C.Strings.chars_ptr -+ is separate; -+ -+end GNAT.Sockets.Thin; ---- /dev/null -+++ gcc/ada/g-socthi-netbsd6.ads -@@ -0,0 +1,260 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT COMPILER COMPONENTS -- -+-- -- -+-- G N A T . S O C K E T S . T H I N -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 2001-2010, AdaCore -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This package provides a target dependent thin interface to the sockets -+-- layer for use by the GNAT.Sockets package (g-socket.ads). This package -+-- should not be directly with'ed by an applications program. -+ -+-- This is the NetBSD 6+ version -+ -+with Interfaces.C.Strings; -+ -+with GNAT.OS_Lib; -+with GNAT.Sockets.Thin_Common; -+ -+with System; -+with System.CRTL; -+ -+package GNAT.Sockets.Thin is -+ -+ -- This package is intended for hosts implementing BSD sockets with a -+ -- standard interface. It will be used as a default for all the platforms -+ -- that do not have a specific version of this file. -+ -+ use Thin_Common; -+ -+ package C renames Interfaces.C; -+ -+ use type System.CRTL.ssize_t; -+ -+ function Socket_Errno return Integer renames GNAT.OS_Lib.Errno; -+ -- Returns last socket error number -+ -+ function Socket_Error_Message (Errno : Integer) return C.Strings.chars_ptr; -+ -- Returns the error message string for the error number Errno. If Errno is -+ -- not known, returns "Unknown system error". -+ -+ function Host_Errno return Integer; -+ pragma Import (C, Host_Errno, "__gnat_get_h_errno"); -+ -- Returns last host error number -+ -+ package Host_Error_Messages is -+ -+ function Host_Error_Message -+ (H_Errno : Integer) return C.Strings.chars_ptr; -+ -- Returns the error message string for the host error number H_Errno. -+ -- If H_Errno is not known, returns "Unknown system error". -+ -+ end Host_Error_Messages; -+ -+ -------------------------------- -+ -- Standard library functions -- -+ -------------------------------- -+ -+ function C_Accept -+ (S : C.int; -+ Addr : System.Address; -+ Addrlen : not null access C.int) return C.int; -+ -+ function C_Bind -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int; -+ -+ function C_Close -+ (Fd : C.int) return C.int; -+ -+ function C_Connect -+ (S : C.int; -+ Name : System.Address; -+ Namelen : C.int) return C.int; -+ -+ function C_Gethostname -+ (Name : System.Address; -+ Namelen : C.int) return C.int; -+ -+ function C_Getpeername -+ (S : C.int; -+ Name : System.Address; -+ Namelen : not null access C.int) return C.int; -+ -+ function C_Getsockname -+ (S : C.int; -+ Name : System.Address; -+ Namelen : not null access C.int) return C.int; -+ -+ function C_Getsockopt -+ (S : C.int; -+ Level : C.int; -+ Optname : C.int; -+ Optval : System.Address; -+ Optlen : not null access C.int) return C.int; -+ -+ function Socket_Ioctl -+ (S : C.int; -+ Req : C.int; -+ Arg : access C.int) return C.int; -+ -+ function C_Listen -+ (S : C.int; -+ Backlog : C.int) return C.int; -+ -+ function C_Recv -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int) return C.int; -+ -+ function C_Recvfrom -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ From : System.Address; -+ Fromlen : not null access C.int) return C.int; -+ -+ function C_Recvmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ -+ function C_Select -+ (Nfds : C.int; -+ Readfds : access Fd_Set; -+ Writefds : access Fd_Set; -+ Exceptfds : access Fd_Set; -+ Timeout : Timeval_Access) return C.int; -+ -+ function C_Sendmsg -+ (S : C.int; -+ Msg : System.Address; -+ Flags : C.int) return System.CRTL.ssize_t; -+ -+ function C_Sendto -+ (S : C.int; -+ Msg : System.Address; -+ Len : C.int; -+ Flags : C.int; -+ To : System.Address; -+ Tolen : C.int) return C.int; -+ -+ function C_Setsockopt -+ (S : C.int; -+ Level : C.int; -+ Optname : C.int; -+ Optval : System.Address; -+ Optlen : C.int) return C.int; -+ -+ function C_Shutdown -+ (S : C.int; -+ How : C.int) return C.int; -+ -+ function C_Socket -+ (Domain : C.int; -+ Typ : C.int; -+ Protocol : C.int) return C.int; -+ -+ function C_System -+ (Command : System.Address) return C.int; -+ -+ ------------------------------------------------------- -+ -- Signalling file descriptors for selector abortion -- -+ ------------------------------------------------------- -+ -+ package Signalling_Fds is -+ -+ function Create (Fds : not null access Fd_Pair) return C.int; -+ pragma Convention (C, Create); -+ -- Create a pair of connected descriptors suitable for use with C_Select -+ -- (used for signalling in Selector objects). -+ -+ function Read (Rsig : C.int) return C.int; -+ pragma Convention (C, Read); -+ -- Read one byte of data from rsig, the read end of a pair of signalling -+ -- fds created by Create_Signalling_Fds. -+ -+ function Write (Wsig : C.int) return C.int; -+ pragma Convention (C, Write); -+ -- Write one byte of data to wsig, the write end of a pair of signalling -+ -- fds created by Create_Signalling_Fds. -+ -+ procedure Close (Sig : C.int); -+ pragma Convention (C, Close); -+ -- Close one end of a pair of signalling fds (ignoring any error) -+ -+ end Signalling_Fds; -+ -+ ------------------------------------------- -+ -- Nonreentrant network databases access -- -+ ------------------------------------------- -+ -+ -- The following are used only on systems that have nonreentrant -+ -- getXXXbyYYY functions, and do NOT have corresponding getXXXbyYYY_ -+ -- functions. Currently, LynxOS is the only such system. -+ -+ function Nonreentrant_Gethostbyname -+ (Name : C.char_array) return Hostent_Access; -+ -+ function Nonreentrant_Gethostbyaddr -+ (Addr : System.Address; -+ Addr_Len : C.int; -+ Addr_Type : C.int) return Hostent_Access; -+ -+ function Nonreentrant_Getservbyname -+ (Name : C.char_array; -+ Proto : C.char_array) return Servent_Access; -+ -+ function Nonreentrant_Getservbyport -+ (Port : C.int; -+ Proto : C.char_array) return Servent_Access; -+ -+ procedure Initialize; -+ procedure Finalize; -+ -+private -+ pragma Import (C, C_Bind, "bind"); -+ pragma Import (C, C_Close, "close"); -+ pragma Import (C, C_Gethostname, "gethostname"); -+ pragma Import (C, C_Getpeername, "getpeername"); -+ pragma Import (C, C_Getsockname, "getsockname"); -+ pragma Import (C, C_Getsockopt, "getsockopt"); -+ pragma Import (C, C_Listen, "listen"); -+ pragma Import (C, C_Select, "__select50"); -+ pragma Import (C, C_Setsockopt, "setsockopt"); -+ pragma Import (C, C_Shutdown, "shutdown"); -+ pragma Import (C, C_System, "system"); -+ -+ pragma Import (C, Nonreentrant_Gethostbyname, "gethostbyname"); -+ pragma Import (C, Nonreentrant_Gethostbyaddr, "gethostbyaddr"); -+ pragma Import (C, Nonreentrant_Getservbyname, "getservbyname"); -+ pragma Import (C, Nonreentrant_Getservbyport, "getservbyport"); -+ -+end GNAT.Sockets.Thin; ---- /dev/null -+++ gcc/ada/g-trasym-bsd.adb -@@ -0,0 +1,150 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- G N A T . T R A C E B A C K . S Y M B O L I C -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1999-2009, AdaCore -- -+-- -- -+-- 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 2, 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. See the GNU General Public License -- -+-- for more details. You should have received a copy of the GNU General -- -+-- Public License distributed with GNAT; see file COPYING. If not, write -- -+-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- -+-- Boston, MA 02110-1301, USA. -- -+-- -- -+-- As a special exception, if other files instantiate generics from this -- -+-- unit, or you link this unit with other files to produce an executable, -- -+-- this unit does not by itself cause the resulting executable to be -- -+-- covered by the GNU General Public License. This exception does not -- -+-- however invalidate any other reasons why the executable file might be -- -+-- covered by the GNU Public License. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- Run-time symbolic traceback support -+-- This file is based on the work by Juergen Pfiefer which is still used -+-- today to provide symbolic traceback support for gnu/kFreeBSD. -+-- Incorporated in GNAT-AUX by John Marino <http://www.dragonlace.net> -+ -+with System.Soft_Links; -+with Ada.Exceptions.Traceback; use Ada.Exceptions.Traceback; -+ -+package body GNAT.Traceback.Symbolic is -+ -+ package TSL renames System.Soft_Links; -+ -+ -- To perform the raw addresses to symbolic form translation we rely on a -+ -- libaddr2line symbolizer which examines debug info from a provided -+ -- executable file name, and an absolute path is needed to ensure the file -+ -- is always found. This is "__gnat_locate_exec_on_path (gnat_argv [0])" -+ -- for our executable file, a fairly heavy operation so we cache the -+ -- result. -+ -+ Exename : System.Address; -+ -- Pointer to the name of the executable file to be used on all -+ -- invocations of the libaddr2line symbolization service. -+ -+ Exename_Resolved : Boolean := False; -+ -- Flag to indicate whether we have performed the executable file name -+ -- resolution already. Relying on a not null Exename for this purpose -+ -- would be potentially inefficient as this is what we will get if the -+ -- resolution attempt fails. -+ -+ ------------------------ -+ -- Symbolic_Traceback -- -+ ------------------------ -+ -+ function Symbolic_Traceback (Traceback : Tracebacks_Array) return String is -+ -+ procedure convert_addresses -+ (filename : System.Address; -+ addrs : System.Address; -+ n_addrs : Integer; -+ buf : System.Address; -+ len : System.Address); -+ pragma Import (C, convert_addresses, "convert_addresses"); -+ -- This is the procedure version of the Ada-aware addr2line. It places -+ -- in BUF a string representing the symbolic translation of the N_ADDRS -+ -- raw addresses provided in ADDRS, looked up in debug information from -+ -- FILENAME. LEN points to an integer which contains the size of the -+ -- BUF buffer at input and the result length at output. -+ -- -+ -- Note that this procedure is *not* thread-safe. -+ -+ type Argv_Array is array (0 .. 0) of System.Address; -+ gnat_argv : access Argv_Array; -+ pragma Import (C, gnat_argv, "gnat_argv"); -+ -+ function locate_exec_on_path -+ (c_exename : System.Address) return System.Address; -+ pragma Import (C, locate_exec_on_path, "__gnat_locate_exec_on_path"); -+ -+ B_Size : constant Integer := 256 * Traceback'Length; -+ Len : Integer := B_Size; -+ Res : String (1 .. B_Size); -+ -+ use type System.Address; -+ -+ begin -+ -- The symbolic translation of an empty set of addresses is an empty -+ -- string. -+ -+ if Traceback'Length = 0 then -+ return ""; -+ end if; -+ -+ -- If our input set of raw addresses is not empty, resort to the -+ -- libaddr2line service to symbolize it all. -+ -+ -- Compute, cache and provide the absolute path to our executable file -+ -- name as the binary file where the relevant debug information is to be -+ -- found. If the executable file name resolution fails, we have no -+ -- sensible basis to invoke the symbolizer at all. -+ -+ -- Protect all this against concurrent accesses explicitly, as the -+ -- underlying services are potentially thread unsafe. -+ -+ TSL.Lock_Task.all; -+ -+ if not Exename_Resolved then -+ Exename := locate_exec_on_path (gnat_argv (0)); -+ Exename_Resolved := True; -+ end if; -+ -+ if Exename /= System.Null_Address then -+ Len := Res'Length; -+ convert_addresses -+ (Exename, Traceback'Address, Traceback'Length, -+ Res (1)'Address, Len'Address); -+ end if; -+ -+ TSL.Unlock_Task.all; -+ -+ -- Return what the addr2line symbolizer has produced if we have called -+ -- it (the executable name resolution succeeded), or an empty string -+ -- otherwise. -+ -+ if Exename /= System.Null_Address then -+ return Res (1 .. Len); -+ else -+ return ""; -+ end if; -+ -+ end Symbolic_Traceback; -+ -+ function Symbolic_Traceback (E : Exception_Occurrence) return String is -+ begin -+ return Symbolic_Traceback (Tracebacks (E)); -+ end Symbolic_Traceback; -+ -+end GNAT.Traceback.Symbolic; ---- gcc/ada/gnatchop.adb.orig -+++ gcc/ada/gnatchop.adb -@@ -45,7 +45,7 @@ - Config_File_Name : constant String_Access := new String'("gnat.adc"); - -- The name of the file holding the GNAT configuration pragmas - -- Gcc : String_Access := new String'("gcc"); -+ Gcc : String_Access := new String'("ada"); - -- May be modified by switch --GCC= - - Gcc_Set : Boolean := False; ---- gcc/ada/gnatlink.adb.orig -+++ gcc/ada/gnatlink.adb -@@ -137,7 +137,7 @@ - -- This table collects the arguments to be passed to compile the binder - -- generated file. - -- Gcc : String_Access := Program_Name ("gcc", "gnatlink"); -+ Gcc : String_Access := Program_Name ("ada", "gnatlink"); - - Read_Mode : constant String := "r" & ASCII.NUL; - ---- gcc/ada/gsocket.h.orig -+++ gcc/ada/gsocket.h -@@ -203,8 +203,19 @@ - #include <netdb.h> - #endif - --#if defined (_AIX) || defined (__FreeBSD__) || defined (__hpux__) || \ -- defined (__osf__) || defined (_WIN32) || defined (__APPLE__) -+#if defined(__ANDROID__) -+#include <sys/select.h> -+#endif -+ -+#if defined (_AIX) \ -+ || defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__NetBSD__) \ -+ || defined (__OpenBSD__) \ -+ || defined (__hpux__) \ -+ || defined (__osf__) \ -+ || defined (_WIN32) \ -+ || defined (__APPLE__) - # define HAVE_THREAD_SAFE_GETxxxBYyyy 1 - - #elif defined (sgi) || defined (linux) || defined (__GLIBC__) || \ -@@ -236,7 +247,13 @@ - # endif - #endif - --#if defined (__FreeBSD__) || defined (__vxworks) || defined(__rtems__) -+#if defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__OpenBSD__) \ -+ || defined (__NetBSD__) \ -+ || defined (__ANDROID__) \ -+ || defined (__vxworks) \ -+ || defined(__rtems__) - # define Has_Sockaddr_Len 1 - #else - # define Has_Sockaddr_Len 0 ---- gcc/ada/init.c.orig -+++ gcc/ada/init.c -@@ -536,7 +536,7 @@ - /* GNU/Linux Section */ - /*********************/ - --#elif defined (linux) -+#elif defined (linux) && !defined(__ANDROID__) - - #include <signal.h> - -@@ -1787,7 +1787,7 @@ - /* FreeBSD Section */ - /*******************/ - --#elif defined (__FreeBSD__) -+#elif defined (__FreeBSD__) || defined (__DragonFly__) - - #include <signal.h> - #include <sys/ucontext.h> -@@ -1832,7 +1832,7 @@ - } - - void --__gnat_install_handler () -+__gnat_install_handler (void) - { - struct sigaction act; - -@@ -1854,6 +1854,77 @@ - } - - /*******************/ -+/* Android Section */ -+/*******************/ -+ -+#elif defined(__ANDROID__) -+ -+#include <signal.h> -+ -+static void -+__gnat_error_handler (int sig, -+ struct siginfo *si ATTRIBUTE_UNUSED, -+ void *ucontext ATTRIBUTE_UNUSED) -+{ -+ struct Exception_Data *exception; -+ const char *msg; -+ -+ switch (sig) -+ { -+ case SIGFPE: -+ exception = &constraint_error; -+ msg = "SIGFPE"; -+ break; -+ -+ case SIGILL: -+ exception = &constraint_error; -+ msg = "SIGILL"; -+ break; -+ -+ case SIGSEGV: -+ exception = &storage_error; -+ msg = "stack overflow or erroneous memory access"; -+ break; -+ -+ case SIGBUS: -+ exception = &constraint_error; -+ msg = "SIGBUS"; -+ break; -+ -+ default: -+ exception = &program_error; -+ msg = "unhandled signal"; -+ } -+ -+ Raise_From_Signal_Handler (exception, msg); -+} -+ -+void -+__gnat_install_handler (void) -+{ -+ struct sigaction act; -+ -+ act.sa_sigaction = __gnat_error_handler; -+ act.sa_flags = SA_NODEFER | SA_RESTART | SA_SIGINFO; -+ sigemptyset (&act.sa_mask); -+ -+ /* Do not install handlers if interrupt state is "System". */ -+ if (__gnat_get_interrupt_state (SIGABRT) != 's') -+ sigaction (SIGABRT, &act, NULL); -+ if (__gnat_get_interrupt_state (SIGFPE) != 's') -+ sigaction (SIGFPE, &act, NULL); -+ if (__gnat_get_interrupt_state (SIGILL) != 's') -+ sigaction (SIGILL, &act, NULL); -+ if (__gnat_get_interrupt_state (SIGBUS) != 's') -+ sigaction (SIGBUS, &act, NULL); -+ if (__gnat_get_interrupt_state (SIGSEGV) != 's') -+ sigaction (SIGSEGV, &act, NULL); -+ -+ __gnat_handler_installed = 1; -+} -+ -+ -+/*******************/ - /* VxWorks Section */ - /*******************/ - -@@ -2450,9 +2521,13 @@ - initialization of the FP processor. This version is used under INTERIX - and WIN32. */ - --#if defined (_WIN32) || defined (__INTERIX) \ -- || defined (__Lynx__) || defined(__NetBSD__) || defined(__FreeBSD__) \ -- || defined (__OpenBSD__) -+#if defined (_WIN32) \ -+ || defined (__INTERIX) \ -+ || defined (__Lynx__) \ -+ || defined (__NetBSD__) \ -+ || defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__OpenBSD__) - - #define HAVE_GNAT_INIT_FLOAT - ---- gcc/ada/initialize.c.orig -+++ gcc/ada/initialize.c -@@ -257,8 +257,11 @@ - /* __gnat_initialize (init_float version) */ - /******************************************/ - --#elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \ -- || defined (__OpenBSD__) -+#elif defined (__Lynx__) \ -+ || defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__NetBSD__) \ -+ || defined (__OpenBSD__) - - extern void __gnat_init_float (void); - ---- gcc/ada/link.c.orig -+++ gcc/ada/link.c -@@ -133,7 +133,10 @@ - unsigned char __gnat_separate_run_path_options = 0; - const char *__gnat_default_libgcc_subdir = "lib"; - --#elif defined (__FreeBSD__) -+#elif defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (__OpenBSD__) \ -+ || defined (__NetBSD__) - const char *__gnat_object_file_option = "-Wl,@"; - const char *__gnat_run_path_option = "-Wl,-rpath,"; - char __gnat_shared_libgnat_default = STATIC; ---- gcc/ada/make.adb.orig -+++ gcc/ada/make.adb -@@ -669,7 +669,7 @@ - -- Compiler, Binder & Linker Data and Subprograms -- - ---------------------------------------------------- - -- Gcc : String_Access := Program_Name ("gcc", "gnatmake"); -+ Gcc : String_Access := Program_Name ("ada", "gnatmake"); - Original_Gcc : constant String_Access := Gcc; - -- Original_Gcc is used to check if Gcc has been modified by a switch - -- --GCC=, so that for VM platforms, it is not modified again, as it can ---- gcc/ada/mlib-prj.adb.orig -+++ gcc/ada/mlib-prj.adb -@@ -339,6 +339,11 @@ - - Foreign_Sources : Boolean; - -+ Rpath_Disabled : Boolean := False; -+ -- If -R is passed through the library options for the linker, it will -+ -- prevent the implemented libraries portion of the rpath switch from -+ -- being built, even if the linker is capable of supporting rpath. -+ - Rpath : String_Access := null; - -- Allocated only if Path Option is supported - -@@ -782,7 +787,7 @@ - Opts.Table (Opts.Last) := - new String'("-L" & Name_Buffer (1 .. Name_Len)); - -- if Path_Option /= null then -+ if not Rpath_Disabled and then Path_Option /= null then - Add_Rpath (Name_Buffer (1 .. Name_Len)); - end if; - -@@ -1323,9 +1328,13 @@ - Get_Name_String (Element.Value); - - if Name_Len /= 0 then -- Opts.Increment_Last; -- Opts.Table (Opts.Last) := -- new String'(Name_Buffer (1 .. Name_Len)); -+ if Name_Buffer (1 .. Name_Len) = "-R" then -+ Rpath_Disabled := True; -+ else -+ Opts.Increment_Last; -+ Opts.Table (Opts.Last) := -+ new String'(Name_Buffer (1 .. Name_Len)); -+ end if; - end if; - - Current := Element.Next; ---- gcc/ada/mlib-utl.adb.orig -+++ gcc/ada/mlib-utl.adb -@@ -433,7 +433,7 @@ - if Driver_Name = No_Name then - if Gcc_Exec = null then - if Gcc_Name = null then -- Gcc_Name := Osint.Program_Name ("gcc", "gnatmake"); -+ Gcc_Name := Osint.Program_Name ("ada", "gnatmake"); - end if; - - Gcc_Exec := Locate_Exec_On_Path (Gcc_Name.all); ---- gcc/ada/prj-makr.adb.orig -+++ gcc/ada/prj-makr.adb -@@ -114,7 +114,7 @@ - - procedure Dup2 (Old_Fd, New_Fd : File_Descriptor); - -- Gcc : constant String := "gcc"; -+ Gcc : constant String := "ada"; - Gcc_Path : String_Access := null; - - Non_Empty_Node : constant Project_Node_Id := 1; ---- gcc/ada/s-fileio.adb.orig -+++ gcc/ada/s-fileio.adb -@@ -231,7 +231,7 @@ - Close_Status : int := 0; - Dup_Strm : Boolean := False; - File : AFCB_Ptr renames File_Ptr.all; -- Errno : Integer; -+ Errno : Integer := 0; - - begin - -- Take a task lock, to protect the global data value Open_Files ---- /dev/null -+++ gcc/ada/s-osinte-android.ads -@@ -0,0 +1,647 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is a GNU/Linux (GNU/LinuxThreads) version of this package -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+with Interfaces.C; -+with System.Linux; -+with System.OS_Constants; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ subtype int is Interfaces.C.int; -+ subtype char is Interfaces.C.char; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function errno return int; -+ pragma Import (C, errno, "__get_errno"); -+ -+ EAGAIN : constant := System.Linux.EAGAIN; -+ EINTR : constant := System.Linux.EINTR; -+ EINVAL : constant := System.Linux.EINVAL; -+ ENOMEM : constant := System.Linux.ENOMEM; -+ EPERM : constant := System.Linux.EPERM; -+ ETIMEDOUT : constant := System.Linux.ETIMEDOUT; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 63; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ SIGHUP : constant := System.Linux.SIGHUP; -+ SIGINT : constant := System.Linux.SIGINT; -+ SIGQUIT : constant := System.Linux.SIGQUIT; -+ SIGILL : constant := System.Linux.SIGILL; -+ SIGTRAP : constant := System.Linux.SIGTRAP; -+ SIGIOT : constant := System.Linux.SIGIOT; -+ SIGABRT : constant := System.Linux.SIGABRT; -+ SIGFPE : constant := System.Linux.SIGFPE; -+ SIGKILL : constant := System.Linux.SIGKILL; -+ SIGBUS : constant := System.Linux.SIGBUS; -+ SIGSEGV : constant := System.Linux.SIGSEGV; -+ SIGPIPE : constant := System.Linux.SIGPIPE; -+ SIGALRM : constant := System.Linux.SIGALRM; -+ SIGTERM : constant := System.Linux.SIGTERM; -+ SIGUSR1 : constant := System.Linux.SIGUSR1; -+ SIGUSR2 : constant := System.Linux.SIGUSR2; -+ SIGCLD : constant := System.Linux.SIGCLD; -+ SIGCHLD : constant := System.Linux.SIGCHLD; -+ SIGPWR : constant := System.Linux.SIGPWR; -+ SIGWINCH : constant := System.Linux.SIGWINCH; -+ SIGURG : constant := System.Linux.SIGURG; -+ SIGPOLL : constant := System.Linux.SIGPOLL; -+ SIGIO : constant := System.Linux.SIGIO; -+ SIGLOST : constant := System.Linux.SIGLOST; -+ SIGSTOP : constant := System.Linux.SIGSTOP; -+ SIGTSTP : constant := System.Linux.SIGTSTP; -+ SIGCONT : constant := System.Linux.SIGCONT; -+ SIGTTIN : constant := System.Linux.SIGTTIN; -+ SIGTTOU : constant := System.Linux.SIGTTOU; -+ SIGVTALRM : constant := System.Linux.SIGVTALRM; -+ SIGPROF : constant := System.Linux.SIGPROF; -+ SIGXCPU : constant := System.Linux.SIGXCPU; -+ 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 -+ -- good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ Unmasked : constant Signal_Set := ( -+ SIGTRAP, -+ -- To enable debugging on multithreaded applications, mark SIGTRAP to -+ -- be kept unmasked. -+ -+ SIGBUS, -+ -+ SIGTTIN, SIGTTOU, SIGTSTP, -+ -- Keep these three signals unmasked so that background processes and IO -+ -- behaves as normal "C" applications -+ -+ SIGPROF, -+ -- To avoid confusing the profiler -+ -+ 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 ??? -+ -+ type sigset_t is private; -+ -+ function sigaddset (set : access sigset_t; sig : Signal) return int; -+ pragma Import (C, sigaddset, "sigaddset"); -+ -+ function sigdelset (set : access sigset_t; sig : Signal) return int; -+ pragma Import (C, sigdelset, "sigdelset"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "sigfillset"); -+ -+ function sigismember (set : access sigset_t; sig : Signal) return int; -+ pragma Import (C, sigismember, "sigismember"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "sigemptyset"); -+ -+ type union_type_3 is new String (1 .. 116); -+ type siginfo_t is record -+ si_signo : int; -+ si_code : int; -+ si_errno : int; -+ X_data : union_type_3; -+ end record; -+ pragma Convention (C, siginfo_t); -+ -+ type struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : Interfaces.C.unsigned_long; -+ sa_restorer : System.Address; -+ end record; -+ pragma Convention (C, struct_sigaction); -+ -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ type Machine_State is record -+ eip : unsigned_long; -+ ebx : unsigned_long; -+ esp : unsigned_long; -+ ebp : unsigned_long; -+ esi : unsigned_long; -+ edi : unsigned_long; -+ end record; -+ type Machine_State_Ptr is access all Machine_State; -+ -+ SA_SIGINFO : constant := System.Linux.SA_SIGINFO; -+ SA_ONSTACK : constant := System.Linux.SA_ONSTACK; -+ -+ SIG_BLOCK : constant := 0; -+ SIG_UNBLOCK : constant := 1; -+ SIG_SETMASK : constant := 2; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "sigaction"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ type timespec is private; -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ function sysconf (name : int) return long; -+ pragma Import (C, sysconf); -+ -+ SC_CLK_TCK : constant := 2; -+ SC_NPROCESSORS_ONLN : constant := 84; -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_OTHER : constant := 0; -+ SCHED_FIFO : constant := 1; -+ SCHED_RR : constant := 2; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is new unsigned_long; -+ subtype Thread_Id is pthread_t; -+ -+ function To_pthread_t is -+ new Ada.Unchecked_Conversion (unsigned_long, pthread_t); -+ -+ type pthread_mutex_t is limited private; -+ type pthread_rwlock_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_rwlockattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_flags : int; -+ ss_size : size_t; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ pragma Import (C, Alternate_Stack, "__gnat_alternate_stack"); -+ -- The alternate signal stack for stack overflows -+ -+ Alternate_Stack_Size : constant := 16 * 1024; -+ -- This must be in keeping with init.c:__gnat_alternate_stack -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- This is a dummy procedure to share some GNULLI files -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ procedure pthread_init; -+ pragma Inline (pthread_init); -+ -- This is a dummy procedure to share some GNULLI files -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait (set : access sigset_t; sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill (thread : pthread_t; sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_rwlockattr_init -+ (attr : access pthread_rwlockattr_t) return int; -+ pragma Import (C, pthread_rwlockattr_init, "pthread_rwlockattr_init"); -+ -+ function pthread_rwlockattr_destroy -+ (attr : access pthread_rwlockattr_t) return int; -+ pragma Import (C, pthread_rwlockattr_destroy, "pthread_rwlockattr_destroy"); -+ -+ PTHREAD_RWLOCK_PREFER_READER_NP : constant := 0; -+ 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, "__gnat_set_threadlock_kind"); -+ -+ function pthread_rwlock_init -+ (mutex : access pthread_rwlock_t; -+ attr : access pthread_rwlockattr_t) return int; -+ pragma Import (C, pthread_rwlock_init, "pthread_rwlock_init"); -+ -+ function pthread_rwlock_destroy -+ (mutex : access pthread_rwlock_t) return int; -+ pragma Import (C, pthread_rwlock_destroy, "pthread_rwlock_destroy"); -+ -+ function pthread_rwlock_rdlock (mutex : access pthread_rwlock_t) return int; -+ pragma Import (C, pthread_rwlock_rdlock, "pthread_rwlock_rdlock"); -+ -+ function pthread_rwlock_wrlock (mutex : access pthread_rwlock_t) return int; -+ pragma Import (C, pthread_rwlock_wrlock, "pthread_rwlock_wrlock"); -+ -+ function pthread_rwlock_unlock (mutex : access pthread_rwlock_t) return int; -+ pragma Import (C, pthread_rwlock_unlock, "pthread_rwlock_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ type struct_sched_param is record -+ sched_priority : int; -- scheduling priority -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import -+ (C, pthread_attr_setschedpolicy, "pthread_attr_setschedpolicy"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "sched_yield"); -+ -+ --------------------------- -+ -- P1003.1c - Section 16 -- -+ --------------------------- -+ -+ function pthread_attr_init -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ function lwp_self return System.Address; -+ pragma Import (C, lwp_self, "__gnat_lwp_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ CPU_SETSIZE : constant := 1_024; -+ -- Size of the cpu_set_t mask on most linux systems (SUSE 11 uses 4_096). -+ -- This is kept for backward compatibility (System.Task_Info uses it), but -+ -- the run-time library does no longer rely on static masks, using -+ -- dynamically allocated masks instead. -+ -+ type bit_field is array (1 .. CPU_SETSIZE) of Boolean; -+ for bit_field'Size use CPU_SETSIZE; -+ pragma Pack (bit_field); -+ pragma Convention (C, bit_field); -+ -+ type cpu_set_t is record -+ bits : bit_field; -+ end record; -+ pragma Convention (C, cpu_set_t); -+ -+ type cpu_set_t_ptr is access all cpu_set_t; -+ -- In the run-time library we use this pointer because the size of type -+ -- cpu_set_t varies depending on the glibc version. Hence, objects of type -+ -- cpu_set_t are allocated dynamically using the number of processors -+ -- available in the target machine (value obtained at execution time). -+ -+ function CPU_ALLOC (count : size_t) return cpu_set_t_ptr; -+ pragma Import (C, CPU_ALLOC, "__gnat_cpu_alloc"); -+ -- Wrapper around the CPU_ALLOC C macro -+ -+ function CPU_ALLOC_SIZE (count : size_t) return size_t; -+ pragma Import (C, CPU_ALLOC_SIZE, "__gnat_cpu_alloc_size"); -+ -- Wrapper around the CPU_ALLOC_SIZE C macro -+ -+ procedure CPU_FREE (cpuset : cpu_set_t_ptr); -+ pragma Import (C, CPU_FREE, "__gnat_cpu_free"); -+ -- Wrapper around the CPU_FREE C macro -+ -+ procedure CPU_ZERO (count : size_t; cpuset : cpu_set_t_ptr); -+ pragma Import (C, CPU_ZERO, "__gnat_cpu_zero"); -+ -- Wrapper around the CPU_ZERO_S C macro -+ -+ procedure CPU_SET (cpu : int; count : size_t; cpuset : cpu_set_t_ptr); -+ pragma Import (C, CPU_SET, "__gnat_cpu_set"); -+ -- Wrapper around the CPU_SET_S C macro -+ -+ function pthread_setaffinity_np -+ (thread : pthread_t; -+ cpusetsize : size_t; -+ cpuset : cpu_set_t_ptr) return int; -+ pragma Import (C, pthread_setaffinity_np, "pthread_setaffinity_np"); -+ pragma Weak_External (pthread_setaffinity_np); -+ -- Use a weak symbol because this function may be available or not, -+ -- depending on the version of the system. -+ -+ function pthread_attr_setaffinity_np -+ (attr : access pthread_attr_t; -+ cpusetsize : size_t; -+ cpuset : cpu_set_t_ptr) return int; -+ pragma Import (C, pthread_attr_setaffinity_np, -+ "pthread_attr_setaffinity_np"); -+ pragma Weak_External (pthread_attr_setaffinity_np); -+ -- Use a weak symbol because this function may be available or not, -+ -- depending on the version of the system. -+ -+private -+ -+ type sigset_t is -+ array (0 .. OS_Constants.SIZEOF_sigset - 1) of unsigned_char; -+ 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; -+ end record; -+ -- We intentionally leave sa_restorer unspecified and let the compiler -+ -- append it after the last field, so disable corresponding warning. -+ pragma Warnings (On); -+ -+ type pid_t is new int; -+ -+ type time_t is new long; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type unsigned_long_long_t is mod 2 ** 64; -+ -- Local type only used to get the alignment of this type below -+ -+ subtype char_array is Interfaces.C.char_array; -+ -+ type pthread_attr_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_ATTR_SIZE); -+ end record; -+ pragma Convention (C, pthread_attr_t); -+ for pthread_attr_t'Alignment use Interfaces.C.unsigned_long'Alignment; -+ -+ type pthread_condattr_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_CONDATTR_SIZE); -+ end record; -+ pragma Convention (C, pthread_condattr_t); -+ for pthread_condattr_t'Alignment use Interfaces.C.int'Alignment; -+ -+ type pthread_mutexattr_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_MUTEXATTR_SIZE); -+ end record; -+ pragma Convention (C, pthread_mutexattr_t); -+ for pthread_mutexattr_t'Alignment use Interfaces.C.int'Alignment; -+ -+ type pthread_mutex_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_MUTEX_SIZE); -+ end record; -+ pragma Convention (C, pthread_mutex_t); -+ for pthread_mutex_t'Alignment use Interfaces.C.unsigned_long'Alignment; -+ -+ type pthread_rwlockattr_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_RWLOCKATTR_SIZE); -+ end record; -+ pragma Convention (C, pthread_rwlockattr_t); -+ for pthread_rwlockattr_t'Alignment use Interfaces.C.unsigned_long'Alignment; -+ -+ type pthread_rwlock_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_RWLOCK_SIZE); -+ end record; -+ pragma Convention (C, pthread_rwlock_t); -+ for pthread_rwlock_t'Alignment use Interfaces.C.unsigned_long'Alignment; -+ -+ type pthread_cond_t is record -+ Data : char_array (1 .. OS_Constants.PTHREAD_COND_SIZE); -+ end record; -+ pragma Convention (C, pthread_cond_t); -+ for pthread_cond_t'Alignment use unsigned_long_long_t'Alignment; -+ -+ type pthread_key_t is new unsigned; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-dragonfly.adb -@@ -0,0 +1,116 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1991-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the DragonFly THREADS version of this package -+ -+with Interfaces.C; use Interfaces.C; -+ -+package body System.OS_Interface is -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int is -+ type int_ptr is access all int; -+ -+ function internal_errno return int_ptr; -+ pragma Import (C, internal_errno, "__get_errno"); -+ -+ begin -+ return (internal_errno.all); -+ end Errno; -+ -+ -------------------- -+ -- Get_Stack_Base -- -+ -------------------- -+ -+ function Get_Stack_Base (thread : pthread_t) return Address is -+ pragma Unreferenced (thread); -+ begin -+ return Null_Address; -+ end Get_Stack_Base; -+ -+ ------------------ -+ -- pthread_init -- -+ ------------------ -+ -+ procedure pthread_init is -+ begin -+ null; -+ end pthread_init; -+ -+ ----------------- -+ -- To_Duration -- -+ ----------------- -+ -+ function To_Duration (TS : timespec) return Duration is -+ begin -+ return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; -+ end To_Duration; -+ -+ ------------------------ -+ -- To_Target_Priority -- -+ ------------------------ -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int -+ is -+ begin -+ return Interfaces.C.int (Prio); -+ end To_Target_Priority; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-dragonfly.ads -@@ -0,0 +1,648 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the DragonFly BSD PTHREADS version of this package -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 31; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. DragonFlyBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- DragonFlyBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "sigaddset"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "sigdelset"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "sigfillset"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "sigismember"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "sigemptyset"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "sigaction"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ type clockid_t is new unsigned_long; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "clock_gettime"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ procedure usleep (useconds : unsigned_long); -+ pragma Import (C, usleep, "usleep"); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on DragonFly. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- DragonFlyBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol"); -+ -+ function pthread_mutexattr_getprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprotocol, "pthread_mutexattr_getprotocol"); -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprioceiling, -+ "pthread_mutexattr_setprioceiling"); -+ -+ function pthread_mutexattr_getprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprioceiling, -+ "pthread_mutexattr_getprioceiling"); -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "pthread_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In DragonFlyBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new long; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is new System.Address; -+ type pthread_mutex_t is new System.Address; -+ type pthread_mutexattr_t is new System.Address; -+ type pthread_cond_t is new System.Address; -+ type pthread_condattr_t is new System.Address; -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- gcc/ada/s-osinte-freebsd.adb.orig -+++ gcc/ada/s-osinte-freebsd.adb -@@ -44,7 +44,7 @@ - type int_ptr is access all int; - - function internal_errno return int_ptr; -- pragma Import (C, internal_errno, "__error"); -+ pragma Import (C, internal_errno, "__get_errno"); - - begin - return (internal_errno.all); -@@ -57,7 +57,7 @@ - function Get_Stack_Base (thread : pthread_t) return Address is - pragma Unreferenced (thread); - begin -- return (0); -+ return Null_Address; - end Get_Stack_Base; - - ------------------ -@@ -75,7 +75,7 @@ - - function To_Duration (TS : timespec) return Duration is - begin -- return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9; -+ return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; - end To_Duration; - - ------------------------ -@@ -108,8 +108,8 @@ - F := F + 1.0; - end if; - -- return timespec'(ts_sec => S, -- ts_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ return timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); - end To_Timespec; - - end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-freebsd32.ads -@@ -0,0 +1,648 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the FreeBSD PTHREADS version of this package -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 31; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. FreeBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- FreeBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "sigaddset"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "sigdelset"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "sigfillset"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "sigismember"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "sigemptyset"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "sigaction"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ type clockid_t is new int; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "clock_gettime"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ procedure usleep (useconds : unsigned_long); -+ pragma Import (C, usleep, "usleep"); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on freebsd. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- FreeBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol"); -+ -+ function pthread_mutexattr_getprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprotocol, "pthread_mutexattr_getprotocol"); -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprioceiling, -+ "pthread_mutexattr_setprioceiling"); -+ -+ function pthread_mutexattr_getprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprioceiling, -+ "pthread_mutexattr_getprioceiling"); -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "pthread_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In FreeBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new int; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is new System.Address; -+ type pthread_mutex_t is new System.Address; -+ type pthread_mutexattr_t is new System.Address; -+ type pthread_cond_t is new System.Address; -+ type pthread_condattr_t is new System.Address; -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-freebsd64.ads -@@ -0,0 +1,649 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the FreeBSD PTHREADS version of this package -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ subtype int64_t is Interfaces.Integer_64; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 31; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. FreeBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- FreeBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "sigaddset"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "sigdelset"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "sigfillset"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "sigismember"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "sigemptyset"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "sigaction"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ type clockid_t is new int; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "clock_gettime"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ procedure usleep (useconds : unsigned_long); -+ pragma Import (C, usleep, "usleep"); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on freebsd. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- FreeBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol"); -+ -+ function pthread_mutexattr_getprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprotocol, "pthread_mutexattr_getprotocol"); -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprioceiling, -+ "pthread_mutexattr_setprioceiling"); -+ -+ function pthread_mutexattr_getprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprioceiling, -+ "pthread_mutexattr_getprioceiling"); -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "pthread_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In FreeBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new int64_t; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is new System.Address; -+ type pthread_mutex_t is new System.Address; -+ type pthread_mutexattr_t is new System.Address; -+ type pthread_cond_t is new System.Address; -+ type pthread_condattr_t is new System.Address; -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-netbsd.adb -@@ -0,0 +1,140 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1991-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the NetBSD THREADS version of this package -+ -+with Interfaces.C; use Interfaces.C; -+ -+package body System.OS_Interface is -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int is -+ type int_ptr is access all int; -+ -+ function internal_errno return int_ptr; -+ pragma Import (C, internal_errno, "__errno"); -+ -+ begin -+ return (internal_errno.all); -+ end Errno; -+ -+ -------------------- -+ -- Get_Stack_Base -- -+ -------------------- -+ -+ function Get_Stack_Base (thread : pthread_t) return Address is -+ pragma Unreferenced (thread); -+ begin -+ return Null_Address; -+ end Get_Stack_Base; -+ -+ ------------------ -+ -- pthread_init -- -+ ------------------ -+ -+ procedure pthread_init is -+ begin -+ null; -+ end pthread_init; -+ -+ ----------------------------------- -+ -- pthread_mutexattr_setprotocol -- -+ ----------------------------------- -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int is -+ pragma Unreferenced (attr, protocol); -+ begin -+ return 0; -+ end pthread_mutexattr_setprotocol; -+ -+ -------------------------------------- -+ -- pthread_mutexattr_setprioceiling -- -+ -------------------------------------- -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int is -+ pragma Unreferenced (attr, prioceiling); -+ begin -+ return 0; -+ end pthread_mutexattr_setprioceiling; -+ -+ ----------------- -+ -- To_Duration -- -+ ----------------- -+ -+ function To_Duration (TS : timespec) return Duration is -+ begin -+ return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; -+ end To_Duration; -+ -+ ------------------------ -+ -- To_Target_Priority -- -+ ------------------------ -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int -+ is -+ begin -+ return Interfaces.C.int (Prio); -+ end To_Target_Priority; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-netbsd.ads -@@ -0,0 +1,674 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the NetBSD PTHREADS version of this package. -+-- It is based off of the FreeBSD PTHREADS as of 4.2.3. -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 63; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ SIGPWR : constant := 32; -- power fail/restart (not reset when caught) -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. NetBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- NetBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "__sigaddset14"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "__sigdelset14"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "__sigfillset14"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "__sigismember14"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "__sigemptyset14"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ SIG_ERR : constant := -1; -+ SIG_HOLD : constant := 3; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "__sigaction14"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ type clockid_t is new int; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "clock_gettime"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on OpenBSD. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- NetBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "sched_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In NetBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new int; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is record -+ Pta_Magic : unsigned; -+ Pta_Flags : int; -+ Pta_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_attr_t); -+ -+ -- PORT NOTE: The size of pthread_spin_t is defined in -+ -- /src/sys/arch/*/include/types.h -+ type pthread_spin_t is new unsigned_char; -+ -+ type pthread_queue_t is record -+ Pthqh_First : pthread_t; -+ Pthqh_Last : System.Address; -+ end record; -+ pragma Convention (C, pthread_queue_t); -+ -+ type pthread_mutex_t is record -+ Ptm_Majic : unsigned; -+ Ptm_Lock : pthread_spin_t; -+ Ptm_Interlock : pthread_spin_t; -+ Ptm_Owner : pthread_t; -+ Ptm_Block : pthread_queue_t; -+ Ptm_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_mutex_t); -+ -+ type pthread_mutexattr_t is record -+ Ptma_Majic : unsigned; -+ Ptma_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_mutexattr_t); -+ -+ type pthread_cond_t is record -+ Ptc_Magic : unsigned; -+ Ptc_Lock : pthread_spin_t; -+ Ptc_Waiters : pthread_queue_t; -+ Ptc_Mutex : pthread_mutex_t; -+ Ptc_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_cond_t); -+ -+ type pthread_condattr_t is record -+ Ptca_Magic : unsigned; -+ Ptca_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_condattr_t); -+ -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-netbsd6.ads -@@ -0,0 +1,675 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the NetBSD 6+ PTHREADS version of this package. -+-- It is based off of the FreeBSD PTHREADS as of 4.2.3. -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ subtype int64_t is Interfaces.Integer_64; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 63; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ SIGPWR : constant := 32; -- power fail/restart (not reset when caught) -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. NetBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- NetBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "__sigaddset14"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "__sigdelset14"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "__sigfillset14"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "__sigismember14"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "__sigemptyset14"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ SIG_ERR : constant := -1; -+ SIG_HOLD : constant := 3; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "__sigaction14"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "__nanosleep50"); -+ -+ type clockid_t is new int; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "__clock_gettime50"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on freebsd. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- NetBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "sched_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In NetBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new int64_t; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is record -+ Pta_Magic : unsigned; -+ Pta_Flags : int; -+ Pta_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_attr_t); -+ -+ -- PORT NOTE: The size of pthread_spin_t is defined in -+ -- /src/sys/arch/*/include/types.h -+ type pthread_spin_t is new unsigned_char; -+ -+ type pthread_queue_t is record -+ Pthqh_First : pthread_t; -+ Pthqh_Last : System.Address; -+ end record; -+ pragma Convention (C, pthread_queue_t); -+ -+ type pthread_mutex_t is record -+ Ptm_Majic : unsigned; -+ Ptm_Lock : pthread_spin_t; -+ Ptm_Interlock : pthread_spin_t; -+ Ptm_Owner : pthread_t; -+ Ptm_Block : pthread_queue_t; -+ Ptm_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_mutex_t); -+ -+ type pthread_mutexattr_t is record -+ Ptma_Majic : unsigned; -+ Ptma_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_mutexattr_t); -+ -+ type pthread_cond_t is record -+ Ptc_Magic : unsigned; -+ Ptc_Lock : pthread_spin_t; -+ Ptc_Waiters : pthread_queue_t; -+ Ptc_Mutex : pthread_mutex_t; -+ Ptc_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_cond_t); -+ -+ type pthread_condattr_t is record -+ Ptca_Magic : unsigned; -+ Ptca_Private : System.Address; -+ end record; -+ pragma Convention (C, pthread_condattr_t); -+ -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-openbsd.adb -@@ -0,0 +1,116 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1991-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the OpenBSD THREADS version of this package -+ -+with Interfaces.C; use Interfaces.C; -+ -+package body System.OS_Interface is -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int is -+ type int_ptr is access all int; -+ -+ function internal_errno return int_ptr; -+ pragma Import (C, internal_errno, "__errno"); -+ -+ begin -+ return (internal_errno.all); -+ end Errno; -+ -+ -------------------- -+ -- Get_Stack_Base -- -+ -------------------- -+ -+ function Get_Stack_Base (thread : pthread_t) return Address is -+ pragma Unreferenced (thread); -+ begin -+ return Null_Address; -+ end Get_Stack_Base; -+ -+ ------------------ -+ -- pthread_init -- -+ ------------------ -+ -+ procedure pthread_init is -+ begin -+ null; -+ end pthread_init; -+ -+ ----------------- -+ -- To_Duration -- -+ ----------------- -+ -+ function To_Duration (TS : timespec) return Duration is -+ begin -+ return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; -+ end To_Duration; -+ -+ ------------------------ -+ -- To_Target_Priority -- -+ ------------------------ -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int -+ is -+ begin -+ return Interfaces.C.int (Prio); -+ end To_Target_Priority; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osinte-openbsd.ads -@@ -0,0 +1,648 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ I N T E R F A C E -- -+-- -- -+-- S p e c -- -+-- -- -+-- Copyright (C) 1991-1994, Florida State University -- -+-- Copyright (C) 1995-2011, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. It is -- -+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- -+-- State University (http://www.gnat.com). -- -+-- -- -+------------------------------------------------------------------------------ -+ -+-- This is the OpenBSD PTHREADS version of this package -+ -+-- This package encapsulates all direct interfaces to OS services -+-- that are needed by the tasking run-time (libgnarl). -+ -+-- 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. -+ -+with Ada.Unchecked_Conversion; -+ -+with Interfaces.C; -+ -+package System.OS_Interface is -+ pragma Preelaborate; -+ -+ pragma Linker_Options ("-pthread"); -+ -+ subtype int is Interfaces.C.int; -+ subtype short is Interfaces.C.short; -+ subtype long is Interfaces.C.long; -+ subtype unsigned is Interfaces.C.unsigned; -+ subtype unsigned_short is Interfaces.C.unsigned_short; -+ subtype unsigned_long is Interfaces.C.unsigned_long; -+ subtype unsigned_char is Interfaces.C.unsigned_char; -+ subtype plain_char is Interfaces.C.plain_char; -+ subtype size_t is Interfaces.C.size_t; -+ -+ ----------- -+ -- Errno -- -+ ----------- -+ -+ function Errno return int; -+ pragma Inline (Errno); -+ -+ EAGAIN : constant := 35; -+ EINTR : constant := 4; -+ EINVAL : constant := 22; -+ ENOMEM : constant := 12; -+ ETIMEDOUT : constant := 60; -+ -+ ------------- -+ -- Signals -- -+ ------------- -+ -+ Max_Interrupt : constant := 31; -+ type Signal is new int range 0 .. Max_Interrupt; -+ for Signal'Size use int'Size; -+ -+ 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 -+ SIGEMT : constant := 7; -- EMT instruction -+ SIGFPE : constant := 8; -- floating point exception -+ SIGKILL : constant := 9; -- kill (cannot be caught or ignored) -+ SIGBUS : constant := 10; -- bus error -+ SIGSEGV : constant := 11; -- segmentation violation -+ SIGSYS : constant := 12; -- bad argument to system call -+ 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 -+ SIGURG : constant := 16; -- urgent condition on IO channel -+ SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) -+ SIGTSTP : constant := 18; -- user stop requested from tty -+ SIGCONT : constant := 19; -- stopped process has been continued -+ SIGCLD : constant := 20; -- alias for SIGCHLD -+ SIGCHLD : constant := 20; -- child status change -+ SIGTTIN : constant := 21; -- background tty read attempted -+ SIGTTOU : constant := 22; -- background tty write attempted -+ SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) -+ SIGXCPU : constant := 24; -- CPU time limit exceeded -+ SIGXFSZ : constant := 25; -- filesize limit exceeded -+ SIGVTALRM : constant := 26; -- virtual timer expired -+ SIGPROF : constant := 27; -- profiling timer expired -+ SIGWINCH : constant := 28; -- window size change -+ SIGINFO : constant := 29; -- information request (BSD) -+ SIGUSR1 : constant := 30; -- user defined signal 1 -+ SIGUSR2 : constant := 31; -- user defined signal 2 -+ -+ SIGADAABORT : constant := SIGABRT; -+ -- Change this if you want to use another signal for task abort. -+ -- SIGTERM might be a good one. -+ -+ type Signal_Set is array (Natural range <>) of Signal; -+ -+ -- Interrupts that must be unmasked at all times. OpenBSD -+ -- pthreads will not allow an application to mask out any -+ -- interrupt needed by the threads library. -+ Unmasked : constant Signal_Set := -+ (SIGTRAP, SIGBUS, SIGTTIN, SIGTTOU, SIGTSTP); -+ -+ -- OpenBSD will uses SIGPROF for timing. Do not allow a -+ -- handler to attach to this signal. -+ Reserved : constant Signal_Set := (0 .. 0 => SIGPROF); -+ -+ type sigset_t is private; -+ -+ function sigaddset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigaddset, "sigaddset"); -+ -+ function sigdelset -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigdelset, "sigdelset"); -+ -+ function sigfillset (set : access sigset_t) return int; -+ pragma Import (C, sigfillset, "sigfillset"); -+ -+ function sigismember -+ (set : access sigset_t; -+ sig : Signal) return int; -+ pragma Import (C, sigismember, "sigismember"); -+ -+ function sigemptyset (set : access sigset_t) return int; -+ pragma Import (C, sigemptyset, "sigemptyset"); -+ -+ -- sigcontext is architecture dependent, so define it private -+ type struct_sigcontext is private; -+ -+ type old_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_mask : sigset_t; -+ sa_flags : int; -+ end record; -+ pragma Convention (C, old_struct_sigaction); -+ -+ type new_struct_sigaction is record -+ sa_handler : System.Address; -+ sa_flags : int; -+ sa_mask : sigset_t; -+ end record; -+ pragma Convention (C, new_struct_sigaction); -+ -+ subtype struct_sigaction is new_struct_sigaction; -+ type struct_sigaction_ptr is access all struct_sigaction; -+ -+ SIG_BLOCK : constant := 1; -+ SIG_UNBLOCK : constant := 2; -+ SIG_SETMASK : constant := 3; -+ -+ SIG_DFL : constant := 0; -+ SIG_IGN : constant := 1; -+ -+ SA_SIGINFO : constant := 16#0040#; -+ SA_ONSTACK : constant := 16#0001#; -+ -+ function sigaction -+ (sig : Signal; -+ act : struct_sigaction_ptr; -+ oact : struct_sigaction_ptr) return int; -+ pragma Import (C, sigaction, "sigaction"); -+ -+ ---------- -+ -- Time -- -+ ---------- -+ -+ Time_Slice_Supported : constant Boolean := True; -+ -- Indicates whether time slicing is supported (i.e SCHED_RR is supported) -+ -+ type timespec is private; -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ type clockid_t is new int; -+ -+ function clock_gettime -+ (clock_id : clockid_t; -+ tp : access timespec) -+ return int; -+ pragma Import (C, clock_gettime, "clock_gettime"); -+ -+ function To_Duration (TS : timespec) return Duration; -+ pragma Inline (To_Duration); -+ -+ function To_Timespec (D : Duration) return timespec; -+ pragma Inline (To_Timespec); -+ -+ type struct_timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, struct_timezone); -+ -+ procedure usleep (useconds : unsigned_long); -+ pragma Import (C, usleep, "usleep"); -+ -+ ------------------------- -+ -- Priority Scheduling -- -+ ------------------------- -+ -+ SCHED_FIFO : constant := 1; -+ SCHED_OTHER : constant := 2; -+ SCHED_RR : constant := 3; -+ -+ function To_Target_Priority -+ (Prio : System.Any_Priority) return Interfaces.C.int; -+ -- Maps System.Any_Priority to a POSIX priority -+ -+ ------------- -+ -- Process -- -+ ------------- -+ -+ type pid_t is private; -+ -+ function kill (pid : pid_t; sig : Signal) return int; -+ pragma Import (C, kill, "kill"); -+ -+ function getpid return pid_t; -+ pragma Import (C, getpid, "getpid"); -+ -+ --------- -+ -- LWP -- -+ --------- -+ -+ function lwp_self return System.Address; -+ -- lwp_self does not exist on this thread library, revert to pthread_self -+ -- which is the closest approximation (with getpid). This function is -+ -- needed to share 7staprop.adb across POSIX-like targets. -+ pragma Import (C, lwp_self, "pthread_self"); -+ -+ ------------- -+ -- Threads -- -+ ------------- -+ -+ type Thread_Body is access -+ function (arg : System.Address) return System.Address; -+ pragma Convention (C, Thread_Body); -+ -+ function Thread_Body_Access is new -+ Ada.Unchecked_Conversion (System.Address, Thread_Body); -+ -+ type pthread_t is private; -+ subtype Thread_Id is pthread_t; -+ -+ type pthread_mutex_t is limited private; -+ type pthread_cond_t is limited private; -+ type pthread_attr_t is limited private; -+ type pthread_mutexattr_t is limited private; -+ type pthread_condattr_t is limited private; -+ type pthread_key_t is private; -+ -+ PTHREAD_CREATE_DETACHED : constant := 1; -+ PTHREAD_CREATE_JOINABLE : constant := 0; -+ -+ PTHREAD_SCOPE_PROCESS : constant := 0; -+ PTHREAD_SCOPE_SYSTEM : constant := 2; -+ -+ -- Read/Write lock not supported on freebsd. To add support both types -+ -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined -+ -- with the associated routines pthread_rwlock_[init/destroy] and -+ -- pthread_rwlock_[rdlock/wrlock/unlock]. -+ -+ subtype pthread_rwlock_t is pthread_mutex_t; -+ subtype pthread_rwlockattr_t is pthread_mutexattr_t; -+ -+ ----------- -+ -- Stack -- -+ ----------- -+ -+ type stack_t is record -+ ss_sp : System.Address; -+ ss_size : size_t; -+ ss_flags : int; -+ end record; -+ pragma Convention (C, stack_t); -+ -+ function sigaltstack -+ (ss : not null access stack_t; -+ oss : access stack_t) return int; -+ pragma Import (C, sigaltstack, "sigaltstack"); -+ -+ Alternate_Stack : aliased System.Address; -+ -- This is a dummy definition, never used (Alternate_Stack_Size is null) -+ -+ Alternate_Stack_Size : constant := 0; -+ -- No alternate signal stack is used on this platform -+ -+ Stack_Base_Available : constant Boolean := False; -+ -- Indicates whether the stack base is available on this target. This -+ -- allows us to share s-osinte.adb between all the FSU run time. Note that -+ -- this value can only be true if pthread_t has a complete definition that -+ -- corresponds exactly to the C header files. -+ -+ function Get_Stack_Base (thread : pthread_t) return Address; -+ pragma Inline (Get_Stack_Base); -+ -- returns the stack base of the specified thread. Only call this function -+ -- when Stack_Base_Available is True. -+ -+ function Get_Page_Size return size_t; -+ function Get_Page_Size return Address; -+ pragma Import (C, Get_Page_Size, "getpagesize"); -+ -- Returns the size of a page -+ -+ PROT_NONE : constant := 0; -+ PROT_READ : constant := 1; -+ PROT_WRITE : constant := 2; -+ PROT_EXEC : constant := 4; -+ PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; -+ PROT_ON : constant := PROT_NONE; -+ PROT_OFF : constant := PROT_ALL; -+ -+ function mprotect (addr : Address; len : size_t; prot : int) return int; -+ pragma Import (C, mprotect); -+ -+ --------------------------------------- -+ -- Nonstandard Thread Initialization -- -+ --------------------------------------- -+ -+ -- FSU_THREADS requires pthread_init, which is nonstandard and this should -+ -- be invoked during the elaboration of s-taprop.adb. -+ -+ -- OpenBSD does not require this so we provide an empty Ada body -+ -+ procedure pthread_init; -+ -+ ------------------------- -+ -- POSIX.1c Section 3 -- -+ ------------------------- -+ -+ function sigwait -+ (set : access sigset_t; -+ sig : access Signal) return int; -+ pragma Import (C, sigwait, "sigwait"); -+ -+ function pthread_kill -+ (thread : pthread_t; -+ sig : Signal) return int; -+ pragma Import (C, pthread_kill, "pthread_kill"); -+ -+ function pthread_sigmask -+ (how : int; -+ set : access sigset_t; -+ oset : access sigset_t) return int; -+ pragma Import (C, pthread_sigmask, "pthread_sigmask"); -+ -+ -------------------------- -+ -- POSIX.1c Section 11 -- -+ -------------------------- -+ -+ function pthread_mutexattr_init -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); -+ -+ function pthread_mutexattr_destroy -+ (attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); -+ -+ function pthread_mutex_init -+ (mutex : access pthread_mutex_t; -+ attr : access pthread_mutexattr_t) return int; -+ pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); -+ -+ function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); -+ -+ function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); -+ -+ function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); -+ -+ function pthread_condattr_init -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); -+ -+ function pthread_condattr_destroy -+ (attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); -+ -+ function pthread_cond_init -+ (cond : access pthread_cond_t; -+ attr : access pthread_condattr_t) return int; -+ pragma Import (C, pthread_cond_init, "pthread_cond_init"); -+ -+ function pthread_cond_destroy (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); -+ -+ function pthread_cond_signal (cond : access pthread_cond_t) return int; -+ pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); -+ -+ function pthread_cond_wait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t) return int; -+ pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); -+ -+ function pthread_cond_timedwait -+ (cond : access pthread_cond_t; -+ mutex : access pthread_mutex_t; -+ abstime : access timespec) return int; -+ pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); -+ -+ Relative_Timed_Wait : constant Boolean := False; -+ -- pthread_cond_timedwait requires an absolute delay time -+ -+ -------------------------- -+ -- POSIX.1c Section 13 -- -+ -------------------------- -+ -+ PTHREAD_PRIO_NONE : constant := 0; -+ PTHREAD_PRIO_PROTECT : constant := 2; -+ PTHREAD_PRIO_INHERIT : constant := 1; -+ -+ function pthread_mutexattr_setprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol"); -+ -+ function pthread_mutexattr_getprotocol -+ (attr : access pthread_mutexattr_t; -+ protocol : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprotocol, "pthread_mutexattr_getprotocol"); -+ -+ function pthread_mutexattr_setprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : int) return int; -+ pragma Import -+ (C, pthread_mutexattr_setprioceiling, -+ "pthread_mutexattr_setprioceiling"); -+ -+ function pthread_mutexattr_getprioceiling -+ (attr : access pthread_mutexattr_t; -+ prioceiling : access int) return int; -+ pragma Import -+ (C, pthread_mutexattr_getprioceiling, -+ "pthread_mutexattr_getprioceiling"); -+ -+ type struct_sched_param is record -+ sched_priority : int; -+ end record; -+ pragma Convention (C, struct_sched_param); -+ -+ function pthread_getschedparam -+ (thread : pthread_t; -+ policy : access int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); -+ -+ function pthread_setschedparam -+ (thread : pthread_t; -+ policy : int; -+ param : access struct_sched_param) return int; -+ pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); -+ -+ function pthread_attr_setscope -+ (attr : access pthread_attr_t; -+ contentionscope : int) return int; -+ pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); -+ -+ function pthread_attr_getscope -+ (attr : access pthread_attr_t; -+ contentionscope : access int) return int; -+ pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); -+ -+ function pthread_attr_setinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : int) return int; -+ pragma Import -+ (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); -+ -+ function pthread_attr_getinheritsched -+ (attr : access pthread_attr_t; -+ inheritsched : access int) return int; -+ pragma Import -+ (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); -+ -+ function pthread_attr_setschedpolicy -+ (attr : access pthread_attr_t; -+ policy : int) return int; -+ pragma Import (C, pthread_attr_setschedpolicy, -+ "pthread_attr_setschedpolicy"); -+ -+ function pthread_attr_getschedpolicy -+ (attr : access pthread_attr_t; -+ policy : access int) return int; -+ pragma Import (C, pthread_attr_getschedpolicy, -+ "pthread_attr_getschedpolicy"); -+ -+ function pthread_attr_setschedparam -+ (attr : access pthread_attr_t; -+ sched_param : int) return int; -+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setschedparam"); -+ -+ function pthread_attr_getschedparam -+ (attr : access pthread_attr_t; -+ sched_param : access int) return int; -+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getschedparam"); -+ -+ function sched_yield return int; -+ pragma Import (C, sched_yield, "pthread_yield"); -+ -+ -------------------------- -+ -- P1003.1c Section 16 -- -+ -------------------------- -+ -+ function pthread_attr_init (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_init, "pthread_attr_init"); -+ -+ function pthread_attr_destroy -+ (attributes : access pthread_attr_t) return int; -+ pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); -+ -+ function pthread_attr_setdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : int) return int; -+ pragma Import -+ (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); -+ -+ function pthread_attr_getdetachstate -+ (attr : access pthread_attr_t; -+ detachstate : access int) return int; -+ pragma Import -+ (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); -+ -+ function pthread_attr_getstacksize -+ (attr : access pthread_attr_t; -+ stacksize : access size_t) return int; -+ pragma Import -+ (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); -+ -+ function pthread_attr_setstacksize -+ (attr : access pthread_attr_t; -+ stacksize : size_t) return int; -+ pragma Import -+ (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); -+ -+ function pthread_create -+ (thread : access pthread_t; -+ attributes : access pthread_attr_t; -+ start_routine : Thread_Body; -+ arg : System.Address) return int; -+ pragma Import (C, pthread_create, "pthread_create"); -+ -+ function pthread_detach (thread : pthread_t) return int; -+ pragma Import (C, pthread_detach, "pthread_detach"); -+ -+ procedure pthread_exit (status : System.Address); -+ pragma Import (C, pthread_exit, "pthread_exit"); -+ -+ function pthread_self return pthread_t; -+ pragma Import (C, pthread_self, "pthread_self"); -+ -+ -------------------------- -+ -- POSIX.1c Section 17 -- -+ -------------------------- -+ -+ function pthread_setspecific -+ (key : pthread_key_t; -+ value : System.Address) return int; -+ pragma Import (C, pthread_setspecific, "pthread_setspecific"); -+ -+ function pthread_getspecific (key : pthread_key_t) return System.Address; -+ pragma Import (C, pthread_getspecific, "pthread_getspecific"); -+ -+ type destructor_pointer is access procedure (arg : System.Address); -+ pragma Convention (C, destructor_pointer); -+ -+ function pthread_key_create -+ (key : access pthread_key_t; -+ destructor : destructor_pointer) return int; -+ pragma Import (C, pthread_key_create, "pthread_key_create"); -+ -+ ------------------------------------ -+ -- Non-portable Pthread Functions -- -+ ------------------------------------ -+ -+ function pthread_set_name_np -+ (thread : pthread_t; -+ name : System.Address) return int; -+ pragma Import (C, pthread_set_name_np, "pthread_set_name_np"); -+ -+private -+ -+ type sigset_t is array (1 .. 4) of unsigned; -+ -+ -- In OpenBSD the component sa_handler turns out to -+ -- be one a union type, and the selector is a macro: -+ -- #define sa_handler __sigaction_u._handler -+ -- #define sa_sigaction __sigaction_u._sigaction -+ -+ -- Should we add a signal_context type here ??? -+ -- How could it be done independent of the CPU architecture ??? -+ -- sigcontext type is opaque, so it is architecturally neutral. -+ -- It is always passed as an access type, so define it as an empty record -+ -- since the contents are not used anywhere. -+ -+ type struct_sigcontext is null record; -+ pragma Convention (C, struct_sigcontext); -+ -+ type pid_t is new int; -+ -+ type time_t is new int; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type pthread_t is new System.Address; -+ type pthread_attr_t is new System.Address; -+ type pthread_mutex_t is new System.Address; -+ type pthread_mutexattr_t is new System.Address; -+ type pthread_cond_t is new System.Address; -+ type pthread_condattr_t is new System.Address; -+ type pthread_key_t is new int; -+ -+end System.OS_Interface; ---- /dev/null -+++ gcc/ada/s-osprim-bsd32.adb -@@ -0,0 +1,186 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ P R I M I T I V E S -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1998-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+-- Copyright (C) 2010, 2011 John Marino <www.dragonlace.net> -- -+------------------------------------------------------------------------------ -+ -+-- This version is for BSD operating systems using 32-bit time types. -+ -+with Interfaces.C; -+ -+package body System.OS_Primitives is -+ -+ -- ??? These definitions are duplicated from System.OS_Interface -+ -- because we don't want to depend on any package. Consider removing -+ -- these declarations in System.OS_Interface and move these ones in -+ -- the spec. -+ -+ subtype int is Interfaces.C.int; -+ subtype long is Interfaces.C.long; -+ -+ type time_t is new int; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, timezone); -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ ----------- -+ -- Clock -- -+ ----------- -+ -+ function Clock return Duration is -+ type timeval is array (1 .. 2) of Long_Integer; -+ tzresult : aliased timezone; -+ -+ procedure timeval_to_duration -+ (T : not null access timeval; -+ sec : not null access Long_Integer; -+ usec : not null access Long_Integer); -+ pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); -+ -+ Micro : constant := 10**6; -+ sec : aliased Long_Integer; -+ usec : aliased Long_Integer; -+ TV : aliased timeval; -+ Result : int; -+ -+ function gettimeofday -+ (Tv : access timeval; -+ Tz : access timezone) return int; -+ pragma Import (C, gettimeofday, "gettimeofday"); -+ -+ pragma Unreferenced (Result); -+ begin -+ -- The return codes for gettimeofday are as follows (from man pages): -+ -- EPERM settimeofday is called by someone other than the superuser -+ -- EINVAL Timezone (or something else) is invalid -+ -- EFAULT One of tv or tz pointed outside accessible address space -+ -+ -- None of these codes signal a potential clock skew, hence the return -+ -- value is never checked. -+ -+ Result := gettimeofday (TV'Access, tzresult'Access); -+ timeval_to_duration (TV'Access, sec'Access, usec'Access); -+ return Duration (sec) + Duration (usec) / Micro; -+ end Clock; -+ -+ --------------------- -+ -- Monotonic_Clock -- -+ --------------------- -+ -+ function Monotonic_Clock return Duration renames Clock; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec; -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return -+ timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+ ----------------- -+ -- Timed_Delay -- -+ ----------------- -+ -+ procedure Timed_Delay -+ (Time : Duration; -+ Mode : Integer) -+ is -+ Request : aliased timespec; -+ Remaind : aliased timespec; -+ Rel_Time : Duration; -+ Abs_Time : Duration; -+ Base_Time : constant Duration := Clock; -+ Check_Time : Duration := Base_Time; -+ -+ Result : int; -+ pragma Unreferenced (Result); -+ -+ begin -+ if Mode = Relative then -+ Rel_Time := Time; -+ Abs_Time := Time + Check_Time; -+ else -+ Rel_Time := Time - Check_Time; -+ Abs_Time := Time; -+ end if; -+ -+ if Rel_Time > 0.0 then -+ loop -+ Request := To_Timespec (Rel_Time); -+ Result := nanosleep (Request'Access, Remaind'Access); -+ Check_Time := Clock; -+ -+ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time; -+ -+ Rel_Time := Abs_Time - Check_Time; -+ end loop; -+ end if; -+ end Timed_Delay; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ procedure Initialize is -+ begin -+ null; -+ end Initialize; -+ -+end System.OS_Primitives; ---- /dev/null -+++ gcc/ada/s-osprim-bsd64.adb -@@ -0,0 +1,192 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ P R I M I T I V E S -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1998-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+-- Copyright (C) 2010, 2011 John Marino <www.dragonlace.net> -- -+------------------------------------------------------------------------------ -+ -+-- This version is for BSD operating systems using 64-bit time types. -+ -+with Interfaces.C; -+ -+package body System.OS_Primitives is -+ -+ -- ??? These definitions are duplicated from System.OS_Interface -+ -- because we don't want to depend on any package. Consider removing -+ -- these declarations in System.OS_Interface and move these ones in -+ -- the spec. -+ -+ subtype int is Interfaces.C.int; -+ subtype long is Interfaces.C.long; -+ subtype int64_t is Interfaces.Integer_64; -+ -+ type time_t is new int64_t; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, timezone); -+ -+ type timeval is record -+ tv_sec : time_t; -+ tv_usec : long; -- Not for NetBSD! FreeBSD/DragonFly -+ end record; -+ pragma Convention (C, timeval); -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "nanosleep"); -+ -+ ----------- -+ -- Clock -- -+ ----------- -+ -+ function Clock return Duration is -+ -+ procedure timeval_to_duration -+ (T : not null access timeval; -+ sec : not null access Long_Integer; -+ usec : not null access Long_Integer); -+ pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); -+ -+ Micro : constant := 10**6; -+ sec : aliased Long_Integer; -+ usec : aliased Long_Integer; -+ TV : aliased timeval; -+ tzresult : aliased timezone; -+ Result : int; -+ -+ function gettimeofday -+ (Tv : access timeval; -+ Tz : access timezone) return int; -+ pragma Import (C, gettimeofday, "gettimeofday"); -+ -+ pragma Unreferenced (Result); -+ begin -+ -- The return codes for gettimeofday are as follows (from man pages): -+ -- EPERM settimeofday is called by someone other than the superuser -+ -- EINVAL Timezone (or something else) is invalid -+ -- EFAULT One of tv or tz pointed outside accessible address space -+ -+ -- None of these codes signal a potential clock skew, hence the return -+ -- value is never checked. -+ -+ Result := gettimeofday (TV'Access, tzresult'Access); -+ timeval_to_duration (TV'Access, sec'Access, usec'Access); -+ return Duration (sec) + Duration (usec) / Micro; -+ end Clock; -+ -+ --------------------- -+ -- Monotonic_Clock -- -+ --------------------- -+ -+ function Monotonic_Clock return Duration renames Clock; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec; -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return -+ timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+ ----------------- -+ -- Timed_Delay -- -+ ----------------- -+ -+ procedure Timed_Delay -+ (Time : Duration; -+ Mode : Integer) -+ is -+ Request : aliased timespec; -+ Remaind : aliased timespec; -+ Rel_Time : Duration; -+ Abs_Time : Duration; -+ Base_Time : constant Duration := Clock; -+ Check_Time : Duration := Base_Time; -+ -+ Result : int; -+ pragma Unreferenced (Result); -+ -+ begin -+ if Mode = Relative then -+ Rel_Time := Time; -+ Abs_Time := Time + Check_Time; -+ else -+ Rel_Time := Time - Check_Time; -+ Abs_Time := Time; -+ end if; -+ -+ if Rel_Time > 0.0 then -+ loop -+ Request := To_Timespec (Rel_Time); -+ Result := nanosleep (Request'Access, Remaind'Access); -+ Check_Time := Clock; -+ -+ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time; -+ -+ Rel_Time := Abs_Time - Check_Time; -+ end loop; -+ end if; -+ end Timed_Delay; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ procedure Initialize is -+ begin -+ null; -+ end Initialize; -+ -+end System.OS_Primitives; ---- /dev/null -+++ gcc/ada/s-osprim-bsdn6.adb -@@ -0,0 +1,193 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- -+-- -- -+-- S Y S T E M . O S _ P R I M I T I V E S -- -+-- -- -+-- B o d y -- -+-- -- -+-- Copyright (C) 1998-2009, 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNARL was developed by the GNARL team at Florida State University. -- -+-- Extensive contributions were provided by Ada Core Technologies, Inc. -- -+-- -- -+-- Copyright (C) 2010, 2011 John Marino <www.dragonlace.net> -- -+------------------------------------------------------------------------------ -+ -+-- This version is for NetBSD 6.0+ -+-- It switches time type to 64 bits and uses compatibility functions -+ -+with Interfaces.C; -+ -+package body System.OS_Primitives is -+ -+ -- ??? These definitions are duplicated from System.OS_Interface -+ -- because we don't want to depend on any package. Consider removing -+ -- these declarations in System.OS_Interface and move these ones in -+ -- the spec. -+ -+ subtype int is Interfaces.C.int; -+ subtype long is Interfaces.C.long; -+ subtype int64_t is Interfaces.Integer_64; -+ -+ type time_t is new int64_t; -+ -+ type timespec is record -+ tv_sec : time_t; -+ tv_nsec : long; -+ end record; -+ pragma Convention (C, timespec); -+ -+ type timezone is record -+ tz_minuteswest : int; -+ tz_dsttime : int; -+ end record; -+ pragma Convention (C, timezone); -+ -+ type timeval is record -+ tv_sec : time_t; -+ tv_usec : int; -+ end record; -+ pragma Convention (C, timeval); -+ -+ function nanosleep (rqtp, rmtp : access timespec) return int; -+ pragma Import (C, nanosleep, "__nanosleep50"); -+ -+ ----------- -+ -- Clock -- -+ ----------- -+ -+ function Clock return Duration is -+ -+ procedure timeval_to_duration -+ (T : not null access timeval; -+ sec : not null access Long_Integer; -+ usec : not null access Long_Integer); -+ pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); -+ -+ Micro : constant := 10**6; -+ sec : aliased Long_Integer; -+ usec : aliased Long_Integer; -+ TV : aliased timeval; -+ tzresult : aliased timezone; -+ Result : int; -+ -+ function gettimeofday -+ (Tv : access timeval; -+ Tz : access timezone) return int; -+ pragma Import (C, gettimeofday, "__gettimeofday50"); -+ -+ pragma Unreferenced (Result); -+ begin -+ -- The return codes for gettimeofday are as follows (from man pages): -+ -- EPERM settimeofday is called by someone other than the superuser -+ -- EINVAL Timezone (or something else) is invalid -+ -- EFAULT One of tv or tz pointed outside accessible address space -+ -+ -- None of these codes signal a potential clock skew, hence the return -+ -- value is never checked. -+ -+ Result := gettimeofday (TV'Access, tzresult'Access); -+ timeval_to_duration (TV'Access, sec'Access, usec'Access); -+ return Duration (sec) + Duration (usec) / Micro; -+ end Clock; -+ -+ --------------------- -+ -- Monotonic_Clock -- -+ --------------------- -+ -+ function Monotonic_Clock return Duration renames Clock; -+ -+ ----------------- -+ -- To_Timespec -- -+ ----------------- -+ -+ function To_Timespec (D : Duration) return timespec; -+ -+ function To_Timespec (D : Duration) return timespec is -+ S : time_t; -+ F : Duration; -+ -+ begin -+ S := time_t (Long_Long_Integer (D)); -+ F := D - Duration (S); -+ -+ -- If F has negative value due to a round-up, adjust for positive F -+ -- value. -+ -+ if F < 0.0 then -+ S := S - 1; -+ F := F + 1.0; -+ end if; -+ -+ return -+ timespec'(tv_sec => S, -+ tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); -+ end To_Timespec; -+ -+ ----------------- -+ -- Timed_Delay -- -+ ----------------- -+ -+ procedure Timed_Delay -+ (Time : Duration; -+ Mode : Integer) -+ is -+ Request : aliased timespec; -+ Remaind : aliased timespec; -+ Rel_Time : Duration; -+ Abs_Time : Duration; -+ Base_Time : constant Duration := Clock; -+ Check_Time : Duration := Base_Time; -+ -+ Result : int; -+ pragma Unreferenced (Result); -+ -+ begin -+ if Mode = Relative then -+ Rel_Time := Time; -+ Abs_Time := Time + Check_Time; -+ else -+ Rel_Time := Time - Check_Time; -+ Abs_Time := Time; -+ end if; -+ -+ if Rel_Time > 0.0 then -+ loop -+ Request := To_Timespec (Rel_Time); -+ Result := nanosleep (Request'Access, Remaind'Access); -+ Check_Time := Clock; -+ -+ exit when Abs_Time <= Check_Time or else Check_Time < Base_Time; -+ -+ Rel_Time := Abs_Time - Check_Time; -+ end loop; -+ end if; -+ end Timed_Delay; -+ -+ ---------------- -+ -- Initialize -- -+ ---------------- -+ -+ procedure Initialize is -+ begin -+ null; -+ end Initialize; -+ -+end System.OS_Primitives; ---- gcc/ada/s-rannum.adb.orig -+++ gcc/ada/s-rannum.adb -@@ -290,7 +290,7 @@ - X : Real; -- Scaled mantissa - R : Unsigned_32; -- Supply of random bits - R_Bits : Natural; -- Number of bits left in R -- K : Bit_Count; -- Next decrement to exponent -+ K : Bit_Count := 0; -- Next decrement to exponent - - begin - Mantissa := Random (Gen) / 2**Extra_Bits; ---- gcc/ada/sem_aggr.adb.orig -+++ gcc/ada/sem_aggr.adb -@@ -1726,6 +1726,9 @@ - Discard : Node_Id; - pragma Warnings (Off, Discard); - -+ Delete_Choice : Boolean; -+ -- Used when replacing a subtype choice with predicate by a list -+ - Aggr_Low : Node_Id := Empty; - Aggr_High : Node_Id := Empty; - -- The actual low and high bounds of this sub-aggregate -@@ -1766,6 +1769,8 @@ - Assoc := First (Component_Associations (N)); - while Present (Assoc) loop - Choice := First (Choices (Assoc)); -+ Delete_Choice := False; -+ - while Present (Choice) loop - if Nkind (Choice) = N_Others_Choice then - Others_Present := True; -@@ -1792,10 +1797,56 @@ - Error_Msg_N - ("(Ada 83) illegal context for OTHERS choice", N); - end if; -+ -+ elsif Is_Entity_Name (Choice) then -+ Analyze (Choice); -+ -+ declare -+ E : constant Entity_Id := Entity (Choice); -+ New_Cs : List_Id; -+ P : Node_Id; -+ C : Node_Id; -+ -+ begin -+ if Is_Type (E) and then Has_Predicates (E) then -+ Freeze_Before (N, E); -+ -+ -- If the subtype has a static predicate, replace the -+ -- original choice with the list of individual values -+ -- covered by the predicate. -+ -+ if Present (Static_Predicate (E)) then -+ Delete_Choice := True; -+ -+ New_Cs := New_List; -+ P := First (Static_Predicate (E)); -+ while Present (P) loop -+ C := New_Copy (P); -+ Set_Sloc (C, Sloc (Choice)); -+ Append_To (New_Cs, C); -+ Next (P); -+ end loop; -+ -+ Insert_List_After (Choice, New_Cs); -+ end if; -+ end if; -+ end; - end if; - - Nb_Choices := Nb_Choices + 1; -- Next (Choice); -+ -+ declare -+ C : constant Node_Id := Choice; -+ -+ begin -+ Next (Choice); -+ -+ if Delete_Choice then -+ Remove (C); -+ Nb_Choices := Nb_Choices - 1; -+ Delete_Choice := False; -+ end if; -+ end; - end loop; - - Next (Assoc); -@@ -1998,6 +2049,7 @@ - Nb_Discrete_Choices := Nb_Discrete_Choices + 1; - Table (Nb_Discrete_Choices).Choice_Lo := Low; - Table (Nb_Discrete_Choices).Choice_Hi := High; -+ Table (Nb_Discrete_Choices).Choice_Node := Choice; - - Next (Choice); - -@@ -2115,7 +2167,7 @@ - then - Error_Msg_N - ("duplicate choice values in array aggregate", -- Table (J).Choice_Hi); -+ Table (J).Choice_Node); - return Failure; - - elsif not Others_Present then ---- /dev/null -+++ gcc/ada/signal_android.c -@@ -0,0 +1,77 @@ -+/* -+ * Copyright (C) 2008 The Android Open Source Project -+ * All rights reserved. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * * Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * * Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in -+ * the documentation and/or other materials provided with the -+ * distribution. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED -+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+#include <limits.h> /* For LONG_BIT */ -+#include <string.h> /* For memset() */ -+ -+typedef unsigned long sigset_t; -+ -+ -+int -+sigismember(sigset_t *set, int signum) -+{ -+ unsigned long *local_set = (unsigned long *)set; -+ signum--; -+ return (int)((local_set[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1); -+} -+ -+ -+int -+sigaddset(sigset_t *set, int signum) -+{ -+ unsigned long *local_set = (unsigned long *)set; -+ signum--; -+ local_set[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT); -+ return 0; -+} -+ -+ -+int -+sigdelset(sigset_t *set, int signum) -+{ -+ unsigned long *local_set = (unsigned long *)set; -+ signum--; -+ local_set[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT)); -+ return 0; -+} -+ -+ -+int -+sigemptyset(sigset_t *set) -+{ -+ memset(set, 0, sizeof *set); -+ return 0; -+} -+ -+ -+int -+sigfillset(sigset_t *set) -+{ -+ memset(set, ~0, sizeof *set); -+ return 0; -+} -+ ---- gcc/ada/sysdep.c.orig -+++ gcc/ada/sysdep.c -@@ -256,6 +256,7 @@ - || defined (__MACHTEN__) || defined (__hpux__) || defined (_AIX) \ - || (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \ - || defined (__CYGWIN__) || defined (__FreeBSD__) || defined (__OpenBSD__) \ -+ || defined (__DragonFly__) \ - || defined (__GLIBC__) || defined (__APPLE__) - - #ifdef __MINGW32__ -@@ -314,6 +315,7 @@ - || defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (__hpux__) \ - || defined (_AIX) || (defined (__svr4__) && defined (i386)) \ - || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \ -+ || defined (__DragonFly__) \ - || defined (__GLIBC__) || defined (__APPLE__) - char c; - int nread; -@@ -334,6 +336,7 @@ - || defined (__osf__) || defined (__MACHTEN__) || defined (__hpux__) \ - || defined (_AIX) || (defined (__svr4__) && defined (i386)) \ - || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \ -+ || defined (__DragonFly__) \ - || defined (__GLIBC__) || defined (__APPLE__) - eof_ch = termios_rec.c_cc[VEOF]; - -@@ -845,8 +848,12 @@ - /* Darwin, Free BSD, Linux, Tru64, where component tm_gmtoff is present in - struct tm */ - --#elif defined (__APPLE__) || defined (__FreeBSD__) || defined (linux) ||\ -- (defined (__alpha__) && defined (__osf__)) || defined (__GLIBC__) -+#elif defined (__APPLE__) \ -+ || defined (__FreeBSD__) \ -+ || defined (__DragonFly__) \ -+ || defined (linux) \ -+ || (defined (__alpha__) && defined (__osf__)) \ -+ || defined (__GLIBC__) - { - localtime_r (timer, &tp); - *off = tp.tm_gmtoff; ---- /dev/null -+++ gcc/ada/system-dragonfly-x86.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (DragonFly BSD/x86 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 32; -+ Memory_Size : constant := 2 ** 32; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := False; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := True; -+ -+end System; ---- /dev/null -+++ gcc/ada/system-dragonfly-x86_64.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (DragonFly BSD/x86_64 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 64; -+ Memory_Size : constant := 2 ** 64; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := False; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := True; -+ -+end System; ---- /dev/null -+++ gcc/ada/system-netbsd-x86.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (NetBSD/x86 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 32; -+ Memory_Size : constant := 2 ** 32; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := False; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := True; -+ -+end System; ---- /dev/null -+++ gcc/ada/system-netbsd-x86_64.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (NetBSD/x86_64 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 64; -+ Memory_Size : constant := 2 ** 64; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := False; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := True; -+ -+end System; ---- /dev/null -+++ gcc/ada/system-openbsd-x86.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (OpenBSD/x86 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 32; -+ Memory_Size : constant := 2 ** 32; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := True; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := False; -+ -+end System; ---- /dev/null -+++ gcc/ada/system-openbsd-x86_64.ads -@@ -0,0 +1,143 @@ -+------------------------------------------------------------------------------ -+-- -- -+-- GNAT RUN-TIME COMPONENTS -- -+-- -- -+-- S Y S T E M -- -+-- -- -+-- S p e c -- -+-- (OpenBSD/x86_64 Version) -- -+-- -- -+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -+-- -- -+-- This specification is derived from the Ada Reference Manual for use with -- -+-- GNAT. The copyright notice above, and the license provisions that follow -- -+-- apply solely to the contents of the part following the private keyword. -- -+-- -- -+-- 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. -- -+-- -- -+-- You should have received a copy of the GNU General Public License and -- -+-- a copy of the GCC Runtime Library Exception along with this program; -- -+-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- -+-- <http://www.gnu.org/licenses/>. -- -+-- -- -+-- GNAT was originally developed by the GNAT team at New York University. -- -+-- Extensive contributions were provided by Ada Core Technologies Inc. -- -+-- -- -+------------------------------------------------------------------------------ -+ -+package System is -+ pragma Pure; -+ -- Note that we take advantage of the implementation permission to make -+ -- this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada -+ -- 2005, this is Pure in any case (AI-362). -+ -+ type Name is (SYSTEM_NAME_GNAT); -+ System_Name : constant Name := SYSTEM_NAME_GNAT; -+ -+ -- System-Dependent Named Numbers -+ -+ Min_Int : constant := Long_Long_Integer'First; -+ Max_Int : constant := Long_Long_Integer'Last; -+ -+ Max_Binary_Modulus : constant := 2 ** Long_Long_Integer'Size; -+ Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1; -+ -+ Max_Base_Digits : constant := Long_Long_Float'Digits; -+ Max_Digits : constant := Long_Long_Float'Digits; -+ -+ Max_Mantissa : constant := 63; -+ Fine_Delta : constant := 2.0 ** (-Max_Mantissa); -+ -+ Tick : constant := 0.000_001; -+ -+ -- Storage-related Declarations -+ -+ type Address is private; -+ pragma Preelaborable_Initialization (Address); -+ Null_Address : constant Address; -+ -+ Storage_Unit : constant := 8; -+ Word_Size : constant := 64; -+ Memory_Size : constant := 2 ** 64; -+ -+ -- Address comparison -+ -+ function "<" (Left, Right : Address) return Boolean; -+ function "<=" (Left, Right : Address) return Boolean; -+ function ">" (Left, Right : Address) return Boolean; -+ function ">=" (Left, Right : Address) return Boolean; -+ function "=" (Left, Right : Address) return Boolean; -+ -+ pragma Import (Intrinsic, "<"); -+ pragma Import (Intrinsic, "<="); -+ pragma Import (Intrinsic, ">"); -+ pragma Import (Intrinsic, ">="); -+ pragma Import (Intrinsic, "="); -+ -+ -- Other System-Dependent Declarations -+ -+ type Bit_Order is (High_Order_First, Low_Order_First); -+ Default_Bit_Order : constant Bit_Order := Low_Order_First; -+ pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning -+ -+ -- Priority-related Declarations (RM D.1) -+ -+ Max_Priority : constant Positive := 30; -+ Max_Interrupt_Priority : constant Positive := 31; -+ -+ subtype Any_Priority is Integer range 0 .. 31; -+ subtype Priority is Any_Priority range 0 .. 30; -+ subtype Interrupt_Priority is Any_Priority range 31 .. 31; -+ -+ Default_Priority : constant Priority := 15; -+ -+private -+ -+ type Address is mod Memory_Size; -+ Null_Address : constant Address := 0; -+ -+ -------------------------------------- -+ -- System Implementation Parameters -- -+ -------------------------------------- -+ -+ -- These parameters provide information about the target that is used -+ -- by the compiler. They are in the private part of System, where they -+ -- can be accessed using the special circuitry in the Targparm unit -+ -- whose source should be consulted for more detailed descriptions -+ -- of the individual switch values. -+ -+ Backend_Divide_Checks : constant Boolean := False; -+ Backend_Overflow_Checks : constant Boolean := True; -+ Command_Line_Args : constant Boolean := True; -+ Configurable_Run_Time : constant Boolean := False; -+ Denorm : constant Boolean := True; -+ Duration_32_Bits : constant Boolean := False; -+ Exit_Status_Supported : constant Boolean := True; -+ Fractional_Fixed_Ops : constant Boolean := False; -+ Frontend_Layout : constant Boolean := False; -+ Machine_Overflows : constant Boolean := False; -+ Machine_Rounds : constant Boolean := True; -+ Preallocated_Stacks : constant Boolean := False; -+ Signed_Zeros : constant Boolean := True; -+ Stack_Check_Default : constant Boolean := False; -+ Stack_Check_Probes : constant Boolean := True; -+ Stack_Check_Limits : constant Boolean := False; -+ Support_Aggregates : constant Boolean := True; -+ Support_Composite_Assign : constant Boolean := True; -+ Support_Composite_Compare : constant Boolean := True; -+ Support_Long_Shifts : constant Boolean := True; -+ Always_Compatible_Rep : constant Boolean := True; -+ Suppress_Standard_Library : constant Boolean := False; -+ Use_Ada_Main_Program_Name : constant Boolean := False; -+ ZCX_By_Default : constant Boolean := False; -+ -+end System; ---- gcc/ada/terminals.c.orig -+++ gcc/ada/terminals.c -@@ -1015,7 +1015,11 @@ - # include <sys/stropts.h> - #endif - -+#ifdef __ANDROID__ -+#define CDISABLE _PC_VDISABLE -+#else - #define CDISABLE _POSIX_VDISABLE -+#endif - - /* On HP-UX and Sun system, there is a bzero function but with a different - signature. Use memset instead */ ---- /dev/null -+++ gcc/ada/traceback_symbolic.c -@@ -0,0 +1,201 @@ -+/* -+ Copyright (C) 1999 by Juergen Pfeifer <juergen.pfeifer@gmx.net> -+ Ada for Linux Team (ALT) -+ Heavily modified by John Marino <http://www.dragonlace.net> -+ -+ Permission is hereby granted, free of charge, to any person obtaining a -+ copy of this software and associated documentation files (the -+ "Software"), to deal in the Software without restriction, including -+ without limitation the rights to use, copy, modify, merge, publish, -+ distribute, distribute with modifications, sublicense, and/or sell -+ copies of the Software, and to permit persons to whom the Software is -+ furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice shall be included -+ in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -+ IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -+ THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ -+ Except as contained in this notice, the name(s) of the above copyright -+ holders shall not be used in advertising or otherwise to promote the -+ sale, use or other dealings in this Software without prior written -+ authorization. -+*/ -+ -+#ifdef IS_CROSS -+ -+ -+/* -+ * Running addr2line doesn't make sense for cross-compiled objects. -+ * Create a dummy function to satisfy g-trasym.o -+ */ -+ -+void -+convert_addresses (const char *file_name ATTRIBUTE_UNUSED, -+ void *addrs ATTRIBUTE_UNUSED, -+ int n_addr ATTRIBUTE_UNUSED, -+ void *buf ATTRIBUTE_UNUSED, -+ int *len ATTRIBUTE_UNUSED) -+{ -+ *len = 0; -+} -+ -+#else -+ -+ -+/* -+ * use the external program /usr/bin/addr2line to convert addresses -+ * into file names and line numbers -+ */ -+ -+#include <sys/types.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <signal.h> -+ -+#define CLOSE_SENDPIPE close(sendpipe[0]); close(sendpipe[1]) -+#define CLOSE_READPIPE close(readpipe[0]); close(readpipe[1]) -+#define DUP2CLOSE(oldfd, newfd) dup2(oldfd, newfd); close(oldfd); -+#define RESTSIG sigaction(SIGPIPE,&oact,NULL) -+ -+#define MAX_LINE 1024 -+#define PARENT_READ readpipe[0] -+#define CHILD_WRITE readpipe[1] -+#define CHILD_READ sendpipe[0] -+#define PARENT_WRITE sendpipe[1] -+ -+#if defined (__sun__) -+#define ADDR2LINE_PROG "/usr/gnu/bin/addr2line" -+#else -+#define ADDR2LINE_PROG "/usr/bin/addr2line" -+#endif -+ -+void -+convert_addresses (const char *file_name, -+ void *addrs, -+ int n_addr, -+ void *buf, -+ int *len) -+{ -+ int max_len = *len; -+ pid_t childpid; -+ -+ struct sigaction act, oact; -+ -+ int sendpipe[2] = {-1,-1}, /* parent -> child */ -+ readpipe[2] = {-1,-1}; /* parent <- child */ -+ -+ *len = 0; -+ act.sa_handler = SIG_IGN; -+ sigemptyset(&act.sa_mask); -+ act.sa_flags = 0; -+ if (sigaction(SIGPIPE,&act,&oact) < 0) -+ return; -+ -+ if (pipe(sendpipe) < 0) { RESTSIG; return; } -+ if (pipe(readpipe) < 0) { CLOSE_SENDPIPE; RESTSIG; return; } -+ if ((childpid = fork()) < 0) { -+ CLOSE_READPIPE; -+ CLOSE_SENDPIPE; -+ RESTSIG; -+ return; -+ } -+ -+ if (childpid == 0) { /* child process */ -+ close(PARENT_WRITE); -+ close(PARENT_READ); -+ if ((CHILD_READ != STDIN_FILENO) && (CHILD_WRITE != STDOUT_FILENO)) { -+ if ((CHILD_READ == STDOUT_FILENO) && (CHILD_WRITE == STDIN_FILENO)) { -+ const int temp_fd = dup(CHILD_WRITE); -+ close (CHILD_WRITE); -+ DUP2CLOSE (CHILD_READ, STDIN_FILENO); -+ DUP2CLOSE (temp_fd, STDOUT_FILENO); -+ } -+ else if ((CHILD_READ == STDIN_FILENO) && (CHILD_WRITE > 1)) { -+ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO); -+ } -+ else if ((CHILD_READ > 1) && (CHILD_WRITE == STDOUT_FILENO)) { -+ DUP2CLOSE (CHILD_READ, STDIN_FILENO); -+ } -+ else if ((CHILD_READ > 1) && (CHILD_WRITE == STDIN_FILENO)) { -+ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO); -+ DUP2CLOSE (CHILD_READ, STDIN_FILENO); -+ } -+ else { -+ /* CHILD_READ >= 1 and CHILD_WRITE > 1 */ -+ DUP2CLOSE (CHILD_READ, STDIN_FILENO); -+ DUP2CLOSE (CHILD_WRITE, STDOUT_FILENO); -+ } -+ } -+ /* As pointed out by Florian Weimer to JP, it is a security threat to call -+ the script with a user defined environment and using the path. That -+ would be Trojans pleasure. Therefore the absolute path to addr2line -+ and an empty environment is used. That should be safe. -+ */ -+ char *const argv[] = { "addr2line", -+ "-e", file_name, -+ "--demangle=gnat", -+ "--functions", -+ "--basenames", -+ NULL }; -+ char *const envp[] = { NULL }; -+ if (execve(ADDR2LINE_PROG, argv, envp) < 0) { -+ close (CHILD_WRITE); -+ close (CHILD_READ); -+ RESTSIG; -+ exit (1); -+ } -+ } -+ -+ /* Below this line is parent process */ -+ int i, n; -+ char hex[16]; -+ char line[MAX_LINE + 1]; -+ char *p; -+ char *s = buf; -+ long *trace_address = addrs; -+ -+ close(CHILD_WRITE); -+ close(CHILD_READ); -+ -+ for(i=0; i < n_addr; i++) { -+ snprintf(hex,sizeof(hex),"%#lx\n",*trace_address); -+ write(PARENT_WRITE,hex,strlen(hex)); -+ n = read(PARENT_READ,line,MAX_LINE); -+ if (n<=0) -+ break; -+ -+ line[n]=0; -+ /* We have approx. 16 additional chars for "%#lx in " clause. -+ We use this info to prevent a buffer overrun. */ -+ if (n + 16 + (*len) > max_len) -+ break; -+ -+ p = strchr(line,'\n'); -+ if (p) { -+ if (*(p+1)) { -+ *p = 0; -+ *len += snprintf(s, (max_len - (*len)), "%#lx in %s at %s", -+ *trace_address, line, p+1); -+ } -+ else { -+ *len += snprintf(s, (max_len - (*len)), "%#lx at %s", -+ *trace_address, line); -+ } -+ s = buf + (*len); -+ } -+ trace_address += 1; -+ } -+ close (PARENT_WRITE); -+ close (PARENT_READ); -+ RESTSIG; -+} -+ -+#endif ---- gcc/ada/tracebak.c.orig -+++ gcc/ada/tracebak.c -@@ -217,6 +217,23 @@ - #error Unhandled darwin architecture. - #endif - -+/*---------------------------- x86 *BSD --------------------------------*/ -+ -+#elif defined (__i386__) && \ -+ ( defined (__NetBSD__) \ -+ || defined (__FreeBSD__) \ -+ || defined (__OpenBSD__) \ -+ || defined (__DragonFly__) ) -+ -+#define USE_GCC_UNWINDER -+/* The generic unwinder is not used for this target because the default -+ implementation doesn't unwind on the BSD platforms. AMD64 targets use the -+ gcc unwinder for all platforms, so let's keep i386 consistent with that. -+*/ -+ -+#define PC_ADJUST -2 -+/* The minimum size of call instructions on this architecture is 2 bytes */ -+ - /*------------------------ PPC AIX/Older Darwin -------------------------*/ - #elif ((defined (_POWER) && defined (_AIX)) || \ - (defined (__ppc__) && defined (__APPLE__))) ---- gcc/ada/gcc-interface/Makefile.in.orig -+++ gcc/ada/gcc-interface/Makefile.in -@@ -1037,6 +1037,7 @@ - ifeq ($(strip $(filter-out %86 %x86_64 solaris2%,$(arch) $(osys))),) - LIBGNAT_TARGET_PAIRS_COMMON = \ - a-intnam.ads<a-intnam-solaris.ads \ -+ g-trasym.adb<g-trasym-bsd.adb \ - s-inmaop.adb<s-inmaop-posix.adb \ - s-intman.adb<s-intman-solaris.adb \ - s-mudido.adb<s-mudido-affinity.adb \ -@@ -1080,6 +1081,8 @@ - TOOLS_TARGET_PAIRS=mlib-tgt-specific.adb<mlib-tgt-specific-solaris.adb - - EH_MECHANISM=-gcc -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o - THREADSLIB = -lposix4 -lthread - MISCLIB = -lposix4 -lnsl -lsocket - SO_OPTS = -Wl,-h, -@@ -1205,14 +1208,21 @@ - LIBRARY_VERSION := $(LIB_VERSION) - endif - -+ -+# FREEBSD i386 - ifeq ($(strip $(filter-out %86 freebsd%,$(arch) $(osys))),) - LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ - a-intnam.ads<a-intnam-freebsd.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ - s-inmaop.adb<s-inmaop-posix.adb \ - s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ - s-osinte.adb<s-osinte-freebsd.adb \ -- s-osinte.ads<s-osinte-freebsd.ads \ -- s-osprim.adb<s-osprim-posix.adb \ -+ s-osinte.ads<s-osinte-freebsd32.ads \ -+ s-osprim.adb<s-osprim-bsd32.adb \ - s-taprop.adb<s-taprop-posix.adb \ - s-taspri.ads<s-taspri-posix.ads \ - s-tpopsp.adb<s-tpopsp-posix.adb \ -@@ -1220,10 +1230,13 @@ - $(X86_TARGET_PAIRS) \ - system.ads<system-freebsd-x86.ads - -- TOOLS_TARGET_PAIRS = \ -- mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb - GNATLIB_SHARED = gnatlib-shared-dual - -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ - EH_MECHANISM=-gcc - THREADSLIB= -lpthread - GMEM_LIB = gmemlib -@@ -1231,14 +1244,21 @@ - MISCLIB = -lutil - endif - -+ -+# FREEBSD AMD64 - ifeq ($(strip $(filter-out %86_64 freebsd%,$(arch) $(osys))),) - LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ - a-intnam.ads<a-intnam-freebsd.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ - s-inmaop.adb<s-inmaop-posix.adb \ - s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ - s-osinte.adb<s-osinte-freebsd.adb \ -- s-osinte.ads<s-osinte-freebsd.ads \ -- s-osprim.adb<s-osprim-posix.adb \ -+ s-osinte.ads<s-osinte-freebsd64.ads \ -+ s-osprim.adb<s-osprim-bsd64.adb \ - s-taprop.adb<s-taprop-posix.adb \ - s-taspri.ads<s-taspri-posix.ads \ - s-tpopsp.adb<s-tpopsp-posix.adb \ -@@ -1246,10 +1266,13 @@ - $(X86_64_TARGET_PAIRS) \ - system.ads<system-freebsd-x86_64.ads - -- TOOLS_TARGET_PAIRS = \ -- mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb - GNATLIB_SHARED = gnatlib-shared-dual - -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ - EH_MECHANISM=-gcc - THREADSLIB= -lpthread - GMEM_LIB = gmemlib -@@ -1257,6 +1280,278 @@ - MISCLIB = -lutil - endif - -+ -+# DRAGONFLY i386 -+ifeq ($(strip $(filter-out %86 dragonfly%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-dragonfly.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-dragonfly.adb \ -+ s-osinte.ads<s-osinte-dragonfly.ads \ -+ s-osprim.adb<s-osprim-posix.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_TARGET_PAIRS) \ -+ system.ads<system-dragonfly-x86.ads -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM=-gcc -+ THREADSLIB= -lpthread -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# DRAGONFLY AMD64 -+ifeq ($(strip $(filter-out x86_64 dragonfly%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-dragonfly.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-dragonfly.adb \ -+ s-osinte.ads<s-osinte-dragonfly.ads \ -+ s-osprim.adb<s-osprim-posix.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_64_TARGET_PAIRS) \ -+ system.ads<system-dragonfly-x86_64.ads -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM=-gcc -+ THREADSLIB= -lpthread -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# OPENBSD i386 -+ifeq ($(strip $(filter-out %86 openbsd%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-openbsd.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-openbsd.adb \ -+ s-osinte.ads<s-osinte-openbsd.ads \ -+ s-osprim.adb<s-osprim-bsd32.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_TARGET_PAIRS) \ -+ system.ads<system-openbsd-x86.ads -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM= -+ THREADSLIB= -lpthread -+ GMEM_LIB = -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# OPENBSD AMD64 -+ifeq ($(strip $(filter-out x86_64 openbsd%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-openbsd.ads \ -+ g-socthi.adb<g-socthi-bsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-openbsd.adb \ -+ s-osinte.ads<s-osinte-openbsd.ads \ -+ s-osprim.adb<s-osprim-bsd32.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_64_TARGET_PAIRS) \ -+ system.ads<system-openbsd-x86_64.ads -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM=-gcc -+ THREADSLIB= -lpthread -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# NETBSD i386 (5+ only) -+ifeq ($(strip $(filter-out %86 netbsd%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-netbsd.ads \ -+ g-socthi.adb<g-socthi-netbsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-netbsd.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_TARGET_PAIRS) \ -+ system.ads<system-netbsd-x86.ads -+ -+ ifeq ($(strip $(filter-out %86 netbsdelf5%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS+= \ -+ s-osinte.ads<s-osinte-netbsd.ads \ -+ s-osprim.adb<s-osprim-bsd32.adb -+ else -+ LIBGNAT_TARGET_PAIRS+= \ -+ g-socthi.ads<g-socthi-netbsd6.ads \ -+ s-osinte.ads<s-osinte-netbsd6.ads \ -+ s-osprim.adb<s-osprim-bsdn6.adb -+ endif -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM=-gcc -+ THREADSLIB= -lpthread -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# NETBSD AMD64 (5+ only) -+ifeq ($(strip $(filter-out x86_64 netbsd%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-exetim.adb<a-exetim-posix.adb \ -+ a-exetim.ads<a-exetim-default.ads \ -+ a-intnam.ads<a-intnam-netbsd.ads \ -+ g-socthi.adb<g-socthi-netbsd.adb \ -+ g-trasym.adb<g-trasym-bsd.adb \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.adb<s-osinte-netbsd.adb \ -+ s-taprop.adb<s-taprop-posix.adb \ -+ s-taspri.ads<s-taspri-posix.ads \ -+ s-tpopsp.adb<s-tpopsp-posix.adb \ -+ $(ATOMICS_TARGET_PAIRS) \ -+ $(X86_64_TARGET_PAIRS) \ -+ system.ads<system-netbsd-x86_64.ads -+ -+ ifeq ($(strip $(filter-out x86_64 netbsd5%,$(arch) $(osys))),) -+ LIBGNAT_TARGET_PAIRS+= \ -+ s-osinte.ads<s-osinte-netbsd.ads \ -+ s-osprim.adb<s-osprim-bsd32.adb -+ else -+ LIBGNAT_TARGET_PAIRS+= \ -+ g-socthi.ads<g-socthi-netbsd6.ads \ -+ s-osinte.ads<s-osinte-netbsd6.ads \ -+ s-osprim.adb<s-osprim-bsdn6.adb -+ endif -+ -+ GNATLIB_SHARED = gnatlib-shared-dual -+ -+ EXTRA_LIBGNAT_SRCS+= traceback_symbolic.c -+ EXTRA_LIBGNAT_OBJS+= traceback_symbolic.o -+ EXTRA_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o -+ EXTRA_GNATRTL_TASKING_OBJS=a-exetim.o -+ -+ EH_MECHANISM=-gcc -+ THREADSLIB= -lpthread -+ GMEM_LIB = gmemlib -+ LIBRARY_VERSION := $(LIB_VERSION) -+ MISCLIB = -lutil -+endif -+ -+ -+# ANDROID (ARM) -+ifeq ($(strip $(filter-out arm% android eabi,$(targ))),) -+ LIBGNAT_TARGET_PAIRS = \ -+ a-intnam.ads<a-intnam-linux.ads \ -+ s-inmaop.adb<s-inmaop-posix.adb \ -+ s-intman.adb<s-intman-posix.adb \ -+ s-linux.ads<s-linux.ads \ -+ s-osinte.adb<s-osinte-posix.adb \ -+ s-mudido.adb<s-mudido-affinity.adb \ -+ s-osinte.ads<s-osinte-android.ads \ -+ s-osprim.adb<s-osprim-posix.adb \ -+ s-taprop.adb<s-taprop-linux.adb \ -+ s-tasinf.ads<s-tasinf-linux.ads \ -+ s-tasinf.adb<s-tasinf-linux.adb \ -+ s-taspri.ads<s-taspri-posix-noaltstack.ads \ -+ s-tpopsp.adb<s-tpopsp-posix-foreign.adb -+ -+ ifeq ($(strip $(filter-out arm%b,$(arch))),) -+ LIBGNAT_TARGET_PAIRS += \ -+ system.ads<system-linux-armeb.ads -+ else -+ LIBGNAT_TARGET_PAIRS += \ -+ system.ads<system-linux-armel.ads -+ endif -+ -+ EXTRA_LIBGNAT_SRCS+= signal_android.c -+ EXTRA_LIBGNAT_OBJS+= signal_android.o -+ EXTRA_GNATRTL_TASKING_OBJS= s-linux.o -+ EH_MECHANISM= -+ THREADSLIB= -+ MISCLIB= -+ GNATLIB_SHARED= gnatlib-shared-dual -+ GMEM_LIB= gmemlib -+ LIBRARY_VERSION:= $(LIB_VERSION) -+endif -+ -+ - ifeq ($(strip $(filter-out s390% linux%,$(arch) $(osys))),) - LIBGNAT_TARGET_PAIRS_COMMON = \ - a-intnam.ads<a-intnam-linux.ads \ ---- gnattools/configure.orig -+++ gnattools/configure -@@ -2058,7 +2058,27 @@ - s390*-*-linux*) - TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb" - ;; -- *86-*-freebsd*) -+ *86-*-freebsd* | x86_64-*-freebsd*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ *86-*-dragonfly* | x86_64-*-dragonfly*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ *86-*-openbsd* | x86_64-*-openbsd*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ *86-*-netbsdelf* | x86_64-*-netbsd*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ arm*-android-eabi) - TOOLS_TARGET_PAIRS="\ - mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ - indepsw.adb<indepsw-gnu.adb" ---- gnattools/configure.ac.orig -+++ gnattools/configure.ac -@@ -98,11 +98,31 @@ - s390*-*-linux*) - TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb" - ;; -- *86-*-freebsd*) -+ *86-*-freebsd* | x86_64-*-freebsd*) - TOOLS_TARGET_PAIRS="\ - mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ - indepsw.adb<indepsw-gnu.adb" - ;; -+ *86-*-dragonfly* | x86_64-*-dragonfly*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ *86-*-openbsd* | x86_64-*-openbsd*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ *86-*-netbsdelf* | x86_64-*-netbsd*) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; -+ arm*-android-eabi) -+ TOOLS_TARGET_PAIRS="\ -+ mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \ -+ indepsw.adb<indepsw-gnu.adb" -+ ;; - mips-sgi-irix*) - TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb<mlib-tgt-specific-irix.adb" - ;; ---- gcc/ada/gcc-interface/Make-lang.in.orig -+++ gcc/ada/gcc-interface/Make-lang.in -@@ -541,7 +541,7 @@ - ada/widechar.o - - # Language-independent object files. --ADA_BACKEND = $(BACKEND) attribs.o -+ADA_BACKEND = $(BACKEND2) attribs.o - - # List of target dependent sources, overridden below as necessary - TARGET_ADA_SRCS = |
