aboutsummaryrefslogtreecommitdiff
path: root/lang/gnat/files
diff options
context:
space:
mode:
authorSatoshi Asami <asami@FreeBSD.org>1997-09-25 08:48:00 +0000
committerSatoshi Asami <asami@FreeBSD.org>1997-09-25 08:48:00 +0000
commit31f08be6a309375d03f730cefdbae2a6ad49d1d5 (patch)
treefaa7a768db1892a98dce84bf352d0c9665f6c2d1 /lang/gnat/files
parent9b7d271eca2966603e8c37ea1edcc17a3635f35c (diff)
Notes
Diffstat (limited to 'lang/gnat/files')
-rw-r--r--lang/gnat/files/4fintnam.ads154
-rw-r--r--lang/gnat/files/5fintman.adb234
-rw-r--r--lang/gnat/files/5fosinte.adb139
-rw-r--r--lang/gnat/files/5fosinte.ads742
-rw-r--r--lang/gnat/files/5ftaprop.adb779
-rw-r--r--lang/gnat/files/5ftaspri.ads138
-rw-r--r--lang/gnat/files/patch-aa141
-rw-r--r--lang/gnat/files/patch-ab36
-rw-r--r--lang/gnat/files/patch-ac20
-rw-r--r--lang/gnat/files/patch-ad46
-rw-r--r--lang/gnat/files/patch-ae36
-rw-r--r--lang/gnat/files/patch-af19
12 files changed, 2484 insertions, 0 deletions
diff --git a/lang/gnat/files/4fintnam.ads b/lang/gnat/files/4fintnam.ads
new file mode 100644
index 000000000000..29f53e62ae96
--- /dev/null
+++ b/lang/gnat/files/4fintnam.ads
@@ -0,0 +1,154 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME 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 --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.1 $ --
+-- --
+-- Copyright (C) 1991,92,93,94,95,1996 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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 THREADS version of this package
+
+-- This is only a first approximation.
+-- It should be autogenerated by the m4 macro processor.
+-- Contributed by Daniel Eischen (deischen@iworks.InterWorks.org)
+
+with System.OS_Interface;
+-- used for names of interrupts
+
+package Ada.Interrupts.Names is
+
+
+ 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
+
+ SIGEMT : constant Interrupt_ID :=
+ System.OS_Interface.SIGEMT; -- EMT instruction
+
+ 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
+
+ SIGSYS : constant Interrupt_ID :=
+ System.OS_Interface.SIGSYS; -- bad argument to system call
+
+ 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
+
+ SIGINFO : constant Interrupt_ID := -- information request
+ System.OS_Interface.SIGINFO; -- (NetBSD/FreeBSD)
+
+ SIGUSR1 : constant Interrupt_ID :=
+ System.OS_Interface.SIGUSR1; -- user defined signal 1
+
+ SIGUSR2 : constant Interrupt_ID :=
+ System.OS_Interface.SIGUSR2; -- user defined signal 2
+
+ -- 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.
+
+end Ada.Interrupts.Names;
diff --git a/lang/gnat/files/5fintman.adb b/lang/gnat/files/5fintman.adb
new file mode 100644
index 000000000000..10e3db9af325
--- /dev/null
+++ b/lang/gnat/files/5fintman.adb
@@ -0,0 +1,234 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . I N T E R R U P T _ M A N A G E M E N T --
+-- --
+-- B o d y --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.3 $ --
+-- --
+-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University --
+-- --
+-- 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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 is only a first approximation.
+-- It should be autogenerated by the m4 macro processor.
+-- Contributed by Peter Burwood (gnat@arcangel.dircon.co.uk).
+
+-- This file performs the system-dependent translation between machine
+-- exceptions and the Ada exceptions, if any, that should be raised when
+-- they occur. This version works for FreeBSD. Contributed by
+-- Daniel M. Eischen (deischen@iworks.InterWorks.org).
+
+-- PLEASE DO NOT add any dependences on other packages.
+-- This package is designed to work with or without tasking support.
+
+-- See the other warnings in the package specification before making
+-- any modifications to this file.
+
+-- Make a careful study of all signals available under the OS,
+-- to see which need to be reserved, kept always unmasked,
+-- or kept always unmasked.
+-- Be on the lookout for special signals that
+-- may be used by the thread library.
+
+with Interfaces.C;
+-- used for int and other types
+
+with System.Error_Reporting;
+-- used for Shutdown
+
+with System.OS_Interface;
+-- used for various Constants, Signal and types
+
+package body System.Interrupt_Management is
+
+ use Interfaces.C;
+ use System.Error_Reporting;
+ use System.OS_Interface;
+
+ type Interrupt_List is array (Interrupt_ID range <>) of Interrupt_ID;
+ Exception_Interrupts : constant Interrupt_List :=
+ (SIGFPE, SIGILL, SIGSEGV, SIGBUS);
+
+
+ ----------------------
+ -- Notify_Exception --
+ ----------------------
+
+ -- This function identifies the Ada exception to be raised using
+ -- the information when the system received a synchronous signal.
+ -- Since this function is machine and OS dependent, different code
+ -- has to be provided for different target.
+
+ -- Language specs say signal handlers take exactly one arg, even
+ -- though FreeBSD actually supplies three. Ugh!
+
+ procedure Notify_Exception
+ (signo : Signal;
+ code : Interfaces.C.int;
+ context : access struct_sigcontext);
+
+ procedure Notify_Exception
+ (signo : Signal;
+ code : Interfaces.C.int;
+ context : access struct_sigcontext) is
+ begin
+
+ -- As long as we are using a longjmp to return control to the
+ -- exception handler on the runtime stack, we are safe. The original
+ -- signal mask (the one we had before coming into this signal catching
+ -- function) will be restored by the longjmp. Therefore, raising
+ -- an exception in this handler should be a safe operation.
+
+ -- Check that treatment of exception propagation here
+ -- is consistent with treatment of the abort signal in
+ -- System.Task_Primitives.Operations.
+
+ -- ?????
+ -- The code below is first approximation.
+ -- It would be nice to figure out more
+ -- precisely what exception has occurred.
+ -- One also should arrange to use an alternate stack for
+ -- recovery from stack overflow.
+ -- I don't understand the Linux kernel code well
+ -- enough to figure out how to do this yet.
+ -- I hope someone will look at this. --Ted Baker
+
+ -- How can SIGSEGV be split into constraint and storage errors ?
+ -- What should SIGILL really raise ? Some implemenations have
+ -- codes for different types of SIGILL and some raise Storage_Error.
+ -- What causes SIGBUS and should it be caught ?
+ -- Peter Burwood
+
+ case signo is
+ when SIGFPE =>
+ raise Constraint_Error;
+ when SIGILL =>
+ raise Constraint_Error;
+ when SIGSEGV =>
+ raise Storage_Error;
+ when SIGBUS =>
+ raise Storage_Error;
+ when others =>
+ pragma Assert (Shutdown ("Unexpected signal"));
+ null;
+ end case;
+ end Notify_Exception;
+
+ ----------------
+ -- Initialize --
+ ----------------
+
+ procedure Initialize is
+ act : aliased struct_sigaction;
+ old_act : aliased struct_sigaction;
+ mask : aliased sigset_t;
+ Result : Interfaces.C.int;
+
+ begin
+
+ Abort_Task_Interrupt := SIGABRT;
+ -- Change this if you want to use another signal for task abort.
+ -- SIGTERM might be a good one.
+
+ act.sa_handler := Notify_Exception'Address;
+
+ act.sa_flags := 16#010#;
+ -- Set sa_flags to SA_NODEFER so that during the handler execution
+ -- we do not change the Signal_Mask to be masked for the Signal.
+ -- This is a temporary fix to the problem that the Signal_Mask is
+ -- not restored after the exception (longjmp) from the handler.
+ -- The right fix should be made in sigsetjmp so that we save
+ -- the Signal_Set and restore it after a longjmp.
+ -- In that case, this field should be changed back to 0. ??? (Dong-Ik)
+
+ Result := sigemptyset (mask'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---sigemptyset"));
+
+ for I in Exception_Interrupts'Range loop
+ Result := sigaddset (mask'Access, Signal (Exception_Interrupts (I)));
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---sigaddset"));
+ end loop;
+
+ act.sa_mask := mask;
+
+ for I in Exception_Interrupts'Range loop
+ Keep_Unmasked (Exception_Interrupts (I)) := True;
+ Result :=
+ sigaction
+ (Signal (Exception_Interrupts (I)), act'Access, old_act'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---sigaction"));
+ end loop;
+
+ Keep_Unmasked (Abort_Task_Interrupt) := true;
+-- Keep_Unmasked (SIGBUS) := true;
+
+ Keep_Unmasked (SIGSTOP) := true;
+ Keep_Unmasked (SIGKILL) := true;
+ Keep_Unmasked (SIGINT) := true;
+
+ -- Keep_Unmasked (SIGEMT) := true;
+ -- Keep_Unmasked (SIGCHLD) := true;
+ -- Keep_Unmasked (SIGALRM) := true;
+ -- ???? The above signals have been found to need to be
+ -- kept unmasked on some systems, per Dong-Ik Oh.
+ -- I don't know whether the MIT/Provenzano threads
+ -- need these or any other signals unmasked at the thread level.
+ -- I hope somebody will take
+ -- the time to look it up. -- Ted Baker
+
+ -- FreeBSD uses SIGINFO to dump thread status to stdout. If
+ -- the user really wants to attach his own handler, let him.
+
+ -- FreeBSD pthreads uses setitimer/getitimer for thread scheduling.
+ -- It's not clear, but it looks as if it only needs SIGVTALRM
+ -- in order to handle the setitimer/getitimer operations. We
+ -- could probably allow SIGALARM, but we'll leave it as unmasked
+ -- for now. FreeBSD pthreads also needs SIGCHLD.
+ Keep_Unmasked (SIGCHLD) := true;
+ Keep_Unmasked (SIGALRM) := true;
+ Keep_Unmasked (SIGVTALRM) := true;
+
+ Reserve := Reserve or Keep_Unmasked or Keep_Masked;
+
+ Reserve (0) := true;
+ -- We do not have Signal 0 in reality. We just use this value
+ -- to identify non-existent signals (see s-intnam.ads). Therefore,
+ -- Signal 0 should not be used in all signal related operations hence
+ -- mark it as reserved.
+
+ end Initialize;
+
+begin
+ Initialize;
+end System.Interrupt_Management;
diff --git a/lang/gnat/files/5fosinte.adb b/lang/gnat/files/5fosinte.adb
new file mode 100644
index 000000000000..33d4bcfd2b89
--- /dev/null
+++ b/lang/gnat/files/5fosinte.adb
@@ -0,0 +1,139 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . O S _ I N T E R F A C E --
+-- --
+-- B o d y --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.2 $ --
+-- --
+-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University --
+-- --
+-- 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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 THREADS version of this package
+
+-- This is only a first approximation.
+-- It should be autogenerated by the m4 macro processor.
+-- Contributed by Daniel M. Eischen (deischen@iworks.InterWorks.org)
+
+-- DO NOT EDIT this file.
+-- It was automatically generated from another file by the m4 macro processor.
+-- The name of the file you should edit is the same as this one, but with
+-- ".ads" replaced by ".sm4", or
+-- ".adb" replaced by ".bm4", or
+-- ".c" replaced by ".cm4", or
+-- ".dat" replaced by ".tm4"
+
+-- Local options selected:
+-- __TARGET = i386-unknown-freebsd
+-- __ARCH = I386
+-- __OS = FREEBSD
+-- __HAS_SIGCONTEXT = 1
+-- __HAS_UCONTEXT = 0
+-- __THREADS = POSIX_THREADS
+-- __THREAD_VARIANT = ??
+-- __HAS_TIMESPEC = 1
+-- __HAS_NANOSLEEP = 1
+-- __HAS_CLOCK_GETTIME = 0
+-- __HAS_GETTIMEOFDAY = 1
+-- __POSIX_THREAD_PRIO_PROTECT = 0
+-- __POSIX_THREAD_PRIO_INHERIT = 0
+-- __POSIX_THREAD_ATTR_STACKADDR = 1
+-- __POSIX_THREAD_ATTR_STACKSIZE = 1
+-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0
+
+-- This package encapsulates all direct interfaces to OS services
+-- that are needed by children of System.
+
+-- This version is for POSIX-like operating systems
+-- The original file "s-osinte.ads_m4" contains conditional
+-- macro calls that allow selection of various options.
+
+with Interfaces.C; use Interfaces.C;
+package body System.OS_Interface is
+
+ -----------------
+ -- To_Duration --
+ -----------------
+
+ function To_Duration (TS : timespec) return Duration is
+ begin
+ return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
+ end To_Duration;
+
+ -----------------
+ -- 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' (ts_sec => S,
+ ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
+ end To_Timespec;
+
+
+ function To_Duration (TV : struct_timeval) return Duration is
+ begin
+ return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
+ end To_Duration;
+
+ function To_Timeval (D : Duration) return struct_timeval is
+ S : long;
+ F : Duration;
+ begin
+ S := long (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 struct_timeval' (tv_sec => S,
+ tv_usec => long (Long_Long_Integer (F * 10#1#E6)));
+ end To_Timeval;
+
+ -- FreeBSD Pthreads has pthread_yield and it is imported as
+ -- sched_yield in 5fosinte.ads. The FreeBSD pthread_yield does
+ -- not have any parameters, so the import may be used directly
+ -- without the need for a wrapper as shown below.
+-- function sched_yield return int is
+-- procedure sched_yield_base (arg : System.Address);
+-- pragma Import (C, sched_yield_base, "pthread_yield");
+-- begin
+-- sched_yield_base (System.Null_Address);
+-- return 0;
+-- end sched_yield;
+
+end System.OS_Interface;
diff --git a/lang/gnat/files/5fosinte.ads b/lang/gnat/files/5fosinte.ads
new file mode 100644
index 000000000000..14450cce307a
--- /dev/null
+++ b/lang/gnat/files/5fosinte.ads
@@ -0,0 +1,742 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . O S _ I N T E R F A C E --
+-- --
+-- S p e c --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.5 $ --
+-- --
+-- Copyright (C) 1991,92,93,94,95,1996 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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 is only a first approximation.
+-- It should be autogenerated by the m4 macro processor.
+-- Contributed by Daniel Eischen (deischen@iworks.InterWorks.org)
+
+-- DO NOT EDIT this file.
+-- It was automatically generated from another file by the m4 macro processor.
+-- The name of the file you should edit is the same as this one, but with
+-- ".ads" replaced by ".sm4", or
+-- ".adb" replaced by ".bm4", or
+-- ".c" replaced by ".cm4", or
+-- ".dat" replaced by ".tm4"
+
+-- Local options selected:
+-- __TARGET = i386-unknown-freebsd
+-- __ARCH = I386
+-- __OS = FREEBSD
+-- __HAS_SIGCONTEXT = 1
+-- __HAS_UCONTEXT = 0
+-- __THREADS = POSIX_THREADS
+-- __THREAD_VARIANT = ??
+-- __HAS_TIMESPEC = 1
+-- __HAS_NANOSLEEP = 1
+-- __HAS_CLOCK_GETTIME = 0
+-- __HAS_GETTIMEOFDAY = 1
+-- __POSIX_THREAD_PRIO_PROTECT = 0
+-- __POSIX_THREAD_PRIO_INHERIT = 0
+-- __POSIX_THREAD_ATTR_STACKADDR = 1
+-- __POSIX_THREAD_ATTR_STACKSIZE = 1
+-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0
+
+-- This package encapsulates all direct interfaces to OS services
+-- that are needed by children of System.
+
+-- PLEASE DO NOT add any with-clauses to this package
+-- or remove the pragma Elaborate_Body.
+-- It is designed to be a bottom-level (leaf) package.
+
+-- This version is for POSIX-like operating systems
+-- The original file "s-osinte.sm4" contains conditional
+-- macro calls that allow selection of various options.
+-- The options selected for this expansion were:
+
+-- When adding new signals to s-osinte.sm4, don't forget to update
+-- cconst.dat (m4 macro definition data-file) and the files
+-- s-intnam.ads (package Ada.Interrupt_Names) for the various ports.
+
+with Interfaces.C;
+package System.OS_Interface is
+ pragma Preelaborate;
+
+ pragma Linker_Options ("-lc_r");
+
+ 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 Import (C, errno, "__get_errno");
+
+ -- NAMEs not used are commented-out
+ -- NAMEs not supported on this system have __NAME for value
+
+ -- E2BIG : constant := 7;
+ -- EACCES : constant := 13;
+ EAGAIN : constant := 35;
+ -- EBADF : constant := 9;
+ -- EBUSY : constant := 16;
+ -- ECHILD : constant := 10;
+ -- EDEADLK : constant := 11;
+ -- EDOM : constant := 33;
+ -- EEXIST : constant := 17;
+ -- EFAULT : constant := 14;
+ -- EFBIG : constant := 27;
+ EINTR : constant := 4;
+ EINVAL : constant := 22;
+ -- EIO : constant := 5;
+ -- EISDIR : constant := 21;
+ -- EMFILE : constant := 24;
+ -- EMLINK : constant := 31;
+ -- ENAMETOOLONG : constant := 63;
+ -- ENFILE : constant := 23;
+ -- ENODEV : constant := 19;
+ -- ENOENT : constant := 2;
+ -- ENOEXEC : constant := 8;
+ -- ENOLCK : constant := 37;
+ ENOMEM : constant := 12;
+ -- ENOSPC : constant := 28;
+ -- ENOSYS : constant := 78;
+ -- ENOTDIR : constant := 20;
+ -- ENOTEMPTY : constant := 66;
+ -- ENOTTY : constant := 25;
+ -- ENXIO : constant := 6;
+ -- EPERM : constant := 1;
+ -- EPIPE : constant := 32;
+ -- ERANGE : constant := 34;
+ -- EROFS : constant := 30;
+ -- ESPIPE : constant := 29;
+ -- ESRCH : constant := 3;
+ ETIMEDOUT : constant := 60;
+ -- EXDEV : constant := 18;
+
+ -------------
+ -- Signals --
+ -------------
+
+ NSIG : constant := 32;
+ type Signal is new int range 0 .. Interfaces.C."-" (NSIG, 1);
+
+ -- NAMEs not used are commented-out
+ -- NAMEs not supported on this system have __NAME for value
+
+ 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 (NetBSD/FreeBSD)
+ SIGUSR1 : constant := 30; -- user defined signal 1
+ SIGUSR2 : constant := 31; -- user defined signal 2
+
+ 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 struct_sigaction is record
+ sa_handler : System.Address;
+ sa_mask : sigset_t;
+ sa_flags : int;
+ end record;
+ pragma Convention (C, struct_sigaction);
+
+
+ SIG_BLOCK : constant := 1;
+ SIG_UNBLOCK : constant := 2;
+ SIG_SETMASK : constant := 3;
+
+ -- SA_NOCLDSTOP : constant := 8;
+ -- not used
+ -- SA_SIGINFO : constant := __SA_SIGINFO;
+ -- not used
+
+ SIG_DFL : constant := 0;
+ SIG_IGN : constant := 1;
+ -- SIG_ERR : constatn := -1;
+ -- not used
+
+ function sigaction
+ (sig : Signal;
+ act : access struct_sigaction;
+ oact : access struct_sigaction)
+ return int;
+ pragma Import (C, sigaction, "sigaction");
+
+ ----------
+ -- Time --
+ ----------
+
+ type timespec is private;
+
+ function nanosleep (rqtp, rmtp : access timespec) return int;
+ pragma Import (C, nanosleep, "nanosleep");
+
+ 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);
+ type struct_timeval is private;
+ -- This is needed on systems that do not have clock_gettime()
+ -- but do have gettimeofday().
+
+ function To_Duration (TV : struct_timeval) return Duration;
+ pragma Inline (To_Duration);
+
+ function To_Timeval (D : Duration) return struct_timeval;
+ pragma Inline (To_Timeval);
+
+ function gettimeofday
+ (tv : access struct_timeval;
+ tz : access struct_timezone) return int;
+ pragma Import (C, gettimeofday, "gettimeofday");
+
+ procedure usleep (useconds : unsigned_long);
+ pragma Import (C, usleep, "usleep");
+
+ -- add a hook to locate the Epoch, for use with Calendar????
+
+ -------------------------
+ -- Priority Scheduling --
+ -------------------------
+
+ MIN_PRIO : constant := 0;
+ MAX_PRIO : constant := 126;
+
+ SCHED_RR : constant := 0;
+ SCHED_IO : constant := 1;
+ SCHED_FIFO : constant := 2;
+ SCHED_OTHER : constant := 3;
+
+ -------------
+ -- 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;
+
+
+ type pthread_t is private;
+ 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;
+
+ ---------------------------
+ -- 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");
+
+ ----------------------------
+ -- POSIX.1c Section 13 --
+ ----------------------------
+
+ -- FreeBSD pthreads does not support these yet.
+-- PTHREAD_PRIO_NONE : constant := 0;
+-- PTHREAD_PRIO_PROTECT : constant := 2;
+-- PTHREAD_PRIO_INHERIT : constant := 1;
+
+ -- FreeBSD doesn't have pthread_getschedparam or pthread_setschedparam
+ -- yet. It has pthread_getprio and pthread_setprio, so we use these
+ -- instead.
+
+-- type struct_sched_param is record
+-- prio : int;
+-- no_data : System.Address;
+-- 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_getschedparam
+ (thread : pthread_t)
+ return int;
+ pragma Import (C, pthread_getschedparam, "pthread_getprio");
+
+ function pthread_setschedparam
+ (thread : pthread_t;
+ priority : int)
+ return int;
+ pragma Import (C, pthread_setschedparam, "pthread_setprio");
+
+ 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");
+
+ -- FreeBSD doesn't have pthread_attr_setschedparm and
+ -- pthread_attr_getschedparm yet. It has pthread_attr_setprio and
+ -- pthread_attr_getprio instead. It seems we don't need either one
+ -- of these, though.
+
+-- function pthread_attr_setschedparam
+-- (attr : access pthread_attr_t;
+-- sched_param : access struct_sched_param)
+-- return int;
+-- pragma Import (C, pthread_attr_setschedparam,
+-- "pthread_attr_setschedparam");
+--
+-- function pthread_attr_getschedparam
+-- (attr : access pthread_attr_t;
+-- sched_param : access struct_sched_param)
+-- return int;
+-- pragma Import (C, pthread_attr_getschedparam,
+-- "pthread_attr_getschedparam");
+ function pthread_attr_setschedparam
+ (attr : access pthread_attr_t;
+ priority : int)
+ return int;
+ pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setprio");
+
+ function pthread_attr_getschedparam
+ (attr : access pthread_attr_t)
+ return int;
+ pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getprio");
+
+ 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");
+
+ function pthread_equal (t1 : pthread_t; t2 : pthread_t)
+ return int;
+ -- be careful not to use "=" on thread_t!
+ pragma Import (C, pthread_equal, "pthread_equal");
+
+ ----------------------------
+ -- 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);
+
+ function pthread_key_create
+ (key : access pthread_key_t;
+ destructor : destructor_pointer)
+ return int;
+ pragma Import (C, pthread_key_create, "pthread_key_create");
+
+
+private
+
+ type sigset_t is new unsigned_long;
+
+ -- 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);
+
+ -- In Solaris 2.4 the component sa_handler turns out to
+ -- be one a union type, and the selector is a macro:
+ -- #define sa_handler __funcptr._handler
+ -- #define sa_sigaction __funcptr._sigaction
+
+ type pid_t is new int;
+
+ type time_t is new long;
+
+ type timespec is record
+ ts_sec : time_t;
+ ts_nsec : long;
+ end record;
+ pragma Convention (C, timespec);
+
+ type struct_timeval is record
+ tv_sec : long;
+ tv_usec : long;
+ end record;
+ pragma Convention (C, struct_timeval);
+
+
+ type enumeral_type_3 is new int;
+ type pthread_attr_t is record
+ schedparam_policy : enumeral_type_3;
+ prio : int;
+ suspend : int;
+ flags : int;
+ arg_attr : System.Address;
+ cleanup_attr : System.Address;
+ stackaddr_attr : System.Address;
+ stacksize_attr : size_t;
+ end record;
+ pragma Convention (C, pthread_attr_t);
+
+ type enumeral_type_2 is new int;
+ type pthread_condattr_t is record
+ c_type : enumeral_type_2;
+ c_flags : long;
+ end record;
+ pragma Convention (C, pthread_condattr_t);
+
+ type enumeral_type_1 is new int;
+ type pthread_mutexattr_t is record
+ m_type : enumeral_type_1;
+ m_flags : long;
+ end record;
+ pragma Convention (C, pthread_mutexattr_t);
+
+ type record_type_3 is null record;
+ pragma Convention (C, record_type_3);
+ type pthread_t is access record_type_3;
+
+ type enumeral_type_4 is new int;
+ type pthread_queue_t is record
+ q_next : System.Address;
+ q_last : System.Address;
+ q_data : System.Address;
+ end record;
+ pragma Convention (C, pthread_queue_t);
+ type union_type_1 is new int;
+ type pthread_mutex_t is record
+ m_type : enumeral_type_4;
+ m_queue : pthread_queue_t;
+ m_owner : System.Address;
+-- m_lock : long;
+ m_data : union_type_1;
+ m_flags : long;
+ end record;
+ pragma Convention (C, pthread_mutex_t);
+
+ type enumeral_type_5 is new int;
+ type pthread_cond_t is record
+ c_type : enumeral_type_5;
+ c_queue : pthread_queue_t;
+-- c_lock : long;
+ c_data : System.Address;
+ c_flags : long;
+ end record;
+ pragma Convention (C, pthread_cond_t);
+
+ type pthread_key_t is new int;
+
+end System.OS_Interface;
diff --git a/lang/gnat/files/5ftaprop.adb b/lang/gnat/files/5ftaprop.adb
new file mode 100644
index 000000000000..33d96dd5d81d
--- /dev/null
+++ b/lang/gnat/files/5ftaprop.adb
@@ -0,0 +1,779 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . T A S K _ P R I M I T I V E S . O P E R A T I O N S --
+-- --
+-- B o d y --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.4 $ --
+-- --
+-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University --
+-- --
+-- 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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. Contributed
+-- by Daniel M. Eischen (deischen@iworks.InterWorks.org).
+
+with Interfaces.C;
+-- used for int
+-- size_t
+
+with System.Error_Reporting;
+-- used for Shutdown
+
+with System.Interrupt_Management;
+-- used for Keep_Unmasked
+-- Abort_Task_Interrupt
+-- Interrupt_ID
+
+with System.OS_Interface;
+-- used for various type, constant, and operations
+
+with System.Parameters;
+-- used for Size_Type
+
+with System.Storage_Elements;
+-- used for To_Address
+-- Integer_Address
+
+with System.Tasking;
+-- used for Ada_Task_Control_Block
+-- Task_ID
+
+with System.Time_Operations;
+-- used for Clock
+-- Clock_Delay_Correction
+
+with Unchecked_Conversion;
+with Unchecked_Deallocation;
+
+package body System.Task_Primitives.Operations is
+
+ use System.Tasking;
+ use Interfaces.C;
+ use System.Error_Reporting;
+ use System.OS_Interface;
+ use System.Parameters;
+ use System.Time_Operations;
+
+ pragma Linker_Options ("-lc_r");
+
+ ------------------
+ -- Local Data --
+ ------------------
+
+ -- The followings are logically constants, but need to be initialized
+ -- at run time.
+
+ ATCB_Key : aliased pthread_key_t;
+ -- Key used to find the Ada Task_ID associated with a thread
+
+ All_Signal_Mask,
+ -- The set of all signals
+
+ Unblocked_Signal_Mask : aliased sigset_t;
+ -- The set of signals that should unblocked in all tasks
+
+ -----------------------
+ -- Local Subprograms --
+ -----------------------
+
+ procedure Abort_Handler
+ (signo : Signal;
+ code : Interfaces.C.int;
+ context : access struct_sigcontext);
+
+ function To_Task_ID is new Unchecked_Conversion (System.Address, Task_ID);
+
+ function To_Address is new Unchecked_Conversion (Task_ID, System.Address);
+
+ -------------------
+ -- Abort_Handler --
+ -------------------
+
+ -- Target-dependent binding of inter-thread Abort signal to
+ -- the raising of the Abort_Signal exception.
+
+ -- The technical issues and alternatives here are essentially
+ -- the same as for raising exceptions in response to other
+ -- signals (e.g. Storage_Error). See code and comments in
+ -- the package body System.Interrupt_Management.
+
+ -- Some implementations may not allow an exception to be propagated
+ -- out of a handler, and others might leave the signal or
+ -- interrupt that invoked this handler masked after the exceptional
+ -- return to the application code.
+
+ -- GNAT exceptions are originally implemented using setjmp()/longjmp().
+ -- On most UNIX systems, this will allow transfer out of a signal handler,
+ -- which is usually the only mechanism available for implementing
+ -- asynchronous handlers of this kind. However, some
+ -- systems do not restore the signal mask on longjmp(), leaving the
+ -- abort signal masked.
+
+ -- Alternative solutions include:
+
+ -- 1. Change the PC saved in the system-dependent Context
+ -- parameter to point to code that raises the exception.
+ -- Normal return from this handler will then raise
+ -- the exception after the mask and other system state has
+ -- been restored (see example below).
+ -- 2. Use siglongjmp()/sigsetjmp() to implement exceptions.
+ -- 3. Unmask the signal in the Abortion_Signal exception handler
+ -- (in the RTS).
+
+ -- The following procedure would be needed if we can't lonjmp out of
+ -- a signal handler. (See below.)
+ -- procedure Raise_Abort_Signal is
+ -- begin
+ -- raise Standard'Abort_Signal;
+ -- end if;
+
+ procedure Abort_Handler
+ (signo : Signal;
+ code : Interfaces.C.int;
+ context : access struct_sigcontext) is
+
+ T : Task_ID := Self;
+
+ begin
+ -- Assuming it is safe to longjmp out of a signal handler, the
+ -- following code can be used:
+
+ if T.Deferral_Level = 0
+ and then T.Pending_ATC_Level < T.ATC_Nesting_Level then
+ raise Standard'Abort_Signal;
+ end if;
+
+ -- Otherwise, something like this is required:
+ -- if not Abort_Is_Deferred.all then
+ -- -- Overwrite the return PC address with the address of the
+ -- -- special raise routine, and "return" to that routine's
+ -- -- starting address.
+ -- Context.PC := Raise_Abort_Signal'Address;
+ -- return;
+ -- end if;
+
+ end Abort_Handler;
+
+ ----------
+ -- Self --
+ ----------
+
+ function Self return Task_ID is
+ Result : System.Address;
+
+ begin
+ Result := pthread_getspecific (ATCB_Key);
+ pragma Assert (Result /= System.Null_Address
+ or else Shutdown ("GNULLI failure---pthread_getspecific"));
+ return To_Task_ID (Result);
+ end Self;
+
+ ---------------------
+ -- Initialize_Lock --
+ ---------------------
+
+ -- Note: mutexes and cond_variables needed per-task basis are
+ -- initialized in Intialize_TCB and the Storage_Error is
+ -- handled. Other mutexes (such as All_Tasks_Lock, Memory_Lock...)
+ -- used in RTS is initialized before any status change of RTS.
+ -- Therefore rasing Storage_Error in the following routines
+ -- should be able to be handled safely.
+
+ procedure Initialize_Lock
+ (Prio : System.Any_Priority;
+ L : access Lock)
+ is
+ Attributes : aliased pthread_mutexattr_t;
+ Result : Interfaces.C.int;
+ begin
+ Result := pthread_mutexattr_init (Attributes'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutexattr_init"));
+
+ if Result = ENOMEM then
+ raise STORAGE_ERROR;
+ end if;
+
+ Result := pthread_mutex_init (L, Attributes'Access);
+
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutex_init"));
+
+ if Result = ENOMEM then
+ raise STORAGE_ERROR;
+ end if;
+
+ end Initialize_Lock;
+
+ procedure Initialize_Lock (L : access RTS_Lock) is
+ Attributes : aliased pthread_mutexattr_t;
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutexattr_init (Attributes'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutexattr_init"));
+
+ if Result = ENOMEM then
+ raise STORAGE_ERROR;
+ end if;
+
+ Result := pthread_mutex_init (L, Attributes'Access);
+
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutex_init"));
+
+ if Result = ENOMEM then
+ raise STORAGE_ERROR;
+ end if;
+
+ end Initialize_Lock;
+
+ -------------------
+ -- Finalize_Lock --
+ -------------------
+
+ procedure Finalize_Lock (L : access Lock) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_destroy (L);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_destroy"));
+ end Finalize_Lock;
+
+ procedure Finalize_Lock (L : access RTS_Lock) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_destroy (L);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_destroy"));
+ end Finalize_Lock;
+
+ ----------------
+ -- Write_Lock --
+ ----------------
+
+ procedure Write_Lock (L : access Lock; Ceiling_Violation : out Boolean) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_lock (L);
+ Ceiling_Violation := Result = EINVAL;
+ -- assumes the cause of EINVAL is a priority ceiling violation
+ pragma Assert (Result = 0 or else Result = EINVAL
+ or else Shutdown ("GNULLI failure---pthread_mutex_lock"));
+ end Write_Lock;
+
+ procedure Write_Lock (L : access RTS_Lock) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_lock (L);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_lock"));
+ end Write_Lock;
+
+ procedure Write_Lock (T : Task_ID) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_lock (T.LL.L'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_lock"));
+ end Write_Lock;
+
+ ---------------
+ -- Read_Lock --
+ ---------------
+
+ procedure Read_Lock (L : access Lock; Ceiling_Violation : out Boolean) is
+ begin
+ Write_Lock (L, Ceiling_Violation);
+ end Read_Lock;
+
+ ------------
+ -- Unlock --
+ ------------
+
+ procedure Unlock (L : access Lock) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_unlock (L);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_unlock"));
+ end Unlock;
+
+ procedure Unlock (L : access RTS_Lock) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_unlock (L);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_unlock"));
+ end Unlock;
+
+ procedure Unlock (T : Task_ID) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_mutex_unlock (T.LL.L'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_unlock"));
+ end Unlock;
+
+ -------------
+ -- Sleep --
+ -------------
+
+ procedure Sleep (Self_ID : Task_ID) is
+ Result : Interfaces.C.int;
+
+ begin
+ pragma Assert (Self_ID = Self
+ or else Shutdown ("GNULLI failure---Self in Sleep"));
+ Result := pthread_cond_wait (Self_ID.LL.CV'Access, Self_ID.LL.L'Access);
+ -- EINTR is not considered a failure.
+ pragma Assert (Result = 0 or else Result = EINTR
+ or else Shutdown ("GNULLI failure---Sleep"));
+ end Sleep;
+
+ ---------------
+ -- Sleep_For --
+ ---------------
+
+ procedure Sleep_For (Self_ID : Task_ID; Rel_Time : Duration) is
+ Result : Interfaces.C.Int;
+ Request : aliased timespec;
+
+ begin
+ pragma Assert (Self_ID = Self
+ or else Shutdown ("GNULLI failure---Self in Sleep_For"));
+ Request := To_Timespec (Rel_Time + Clock + Clock_Delay_Correction);
+ Result := pthread_cond_timedwait
+ (Self_ID.LL.CV'Access, Self_ID.LL.L'Access, Request'Access);
+ pragma Assert
+ (Result = 0
+ or else (Clock >= To_Duration (Request) - Clock_Delay_Correction)
+ or else Shutdown ("GNULLI failure---Sleep_For"));
+ end Sleep_For;
+
+ -----------------
+ -- Sleep_Until --
+ -----------------
+
+ procedure Sleep_Until (Self_ID : Task_ID; Abs_Time : Duration) is
+ Result : Interfaces.C.Int;
+ Request : aliased timespec;
+
+ begin
+ pragma Assert (Self_ID = Self
+ or else Shutdown ("GNULLI failure---Self in Sleep_Until"));
+ Request := To_Timespec (Abs_Time + Clock_Delay_Correction);
+ Result := pthread_cond_timedwait
+ (Self_ID.LL.CV'Access, Self_ID.LL.L'Access, Request'Access);
+ pragma Assert
+ (Result = 0 or else Clock >= Abs_Time
+ or else Shutdown ("GNULLI failure---Sleep_Until (early)"));
+ end Sleep_Until;
+
+ ------------
+ -- Wakeup --
+ ------------
+
+ procedure Wakeup (T : Task_ID) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_cond_signal (T.LL.CV'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Wakeup"));
+ end Wakeup;
+
+ -----------
+ -- Yield --
+ -----------
+
+ procedure Yield is
+ Result : Interfaces.C.int;
+ begin
+ Result := sched_yield;
+ end Yield;
+
+ ------------------
+ -- Set_Priority --
+ ------------------
+
+ -- FreeBSD doesn't have the correct pthread_setschedparam routine
+ -- yet. Instead, pthread_setschedparam is imported from pthread_setprio
+ -- which only takes a pthread_t and integer as arguments.
+-- procedure Set_Priority (T : Task_ID; Prio : System.Any_Priority) is
+-- Result : Interfaces.C.int;
+-- Param : aliased struct_sched_param;
+-- begin
+-- T.LL.Current_Priority := Interfaces.C.int (Prio);
+-- Param.prio := Interfaces.C.int (Prio);
+--
+-- Result := pthread_setschedparam (T.LL.Thread, SCHED_FIFO,
+-- Param'Access);
+-- pragma Assert (Result = 0
+-- or else Shutdown ("GNULLI failure---Set_Priority"));
+--
+-- end Set_Priority;
+ procedure Set_Priority (T : Task_ID; Prio : System.Any_Priority) is
+ Result : Interfaces.C.int;
+ begin
+ T.LL.Current_Priority := Interfaces.C.int (Prio);
+
+ Result := pthread_setschedparam (T.LL.Thread, Interfaces.C.int (Prio));
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Set_Priority"));
+
+ end Set_Priority;
+
+ ------------------
+ -- Get_Priority --
+ ------------------
+
+ function Get_Priority (T : Task_ID) return System.Any_Priority is
+ begin
+ return System.Any_Priority (T.LL.Current_Priority);
+ end Get_Priority;
+
+ ----------------
+ -- Enter_Task --
+ ----------------
+
+ procedure Enter_Task (Self_ID : Task_ID) is
+ Result : Interfaces.C.int;
+ Old_Set : aliased sigset_t;
+
+ begin
+
+ Self_ID.LL.Thread := pthread_self;
+
+ -- It is not safe for the new task accept signals until it
+ -- has bound its TCB pointer to the thread with pthread_setspecific (),
+ -- since the handler wrappers use the TCB pointer
+ -- to restore the stack limit.
+
+ Result := pthread_setspecific (ATCB_Key, To_Address (Self_ID));
+ pragma Assert (Result = 0 or else
+ Shutdown ("GNULLI failure---Enter_Task (pthread_setspecific)"));
+
+ -- Must wait until the above operation is done to unmask signals,
+ -- since signal handler for abort will try to access the ATCB to
+ -- check whether abort is deferred, and exception propagation will
+ -- try to use task-specific data as mentioned above.
+
+ Result := pthread_sigmask
+ (SIG_UNBLOCK, Unblocked_Signal_Mask'Access, Old_Set'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Enter_Task (pthread_sigmask)"));
+
+ end Enter_Task;
+
+ ----------------------
+ -- Initialize_TCB --
+ ----------------------
+
+ procedure Initialize_TCB (Self_ID : Task_ID; Succeeded : out Boolean) is
+ Mutex_Attr : aliased pthread_mutexattr_t;
+ Result : Interfaces.C.int;
+ Cond_Attr : aliased pthread_condattr_t;
+
+ begin
+ Result := pthread_mutexattr_init (Mutex_Attr'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutexattr_init"));
+
+ if Result /= 0 then
+ Succeeded := False;
+ return;
+ end if;
+
+ Result := pthread_mutex_init (Self_ID.LL.L'Access, Mutex_Attr'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_mutex_init"));
+
+ if Result /= 0 then
+ Succeeded := False;
+ return;
+ end if;
+
+ Result := pthread_condattr_init (Cond_Attr'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_condattr_init"));
+
+ if Result /= 0 then
+ Result := pthread_mutex_destroy (Self_ID.LL.L'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_destory"));
+ Succeeded := False;
+ return;
+ end if;
+
+ Result := pthread_cond_init (Self_ID.LL.CV'Access, Cond_Attr'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_cond_init"));
+
+ if Result /= 0 then
+ Result := pthread_mutex_destroy (Self_ID.LL.L'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_mutex_destory"));
+ Succeeded := False;
+ return;
+ end if;
+
+ Succeeded := True;
+
+ end Initialize_TCB;
+
+ -----------------
+ -- Create_Task --
+ -----------------
+
+ procedure Create_Task
+ (T : Task_ID;
+ Wrapper : System.Address;
+ Stack_Size : System.Parameters.Size_Type;
+ Priority : System.Any_Priority;
+ Succeeded : out Boolean)
+ is
+ Attributes : aliased pthread_attr_t;
+ Adjusted_Stack_Size : Interfaces.C.size_t;
+ Result : Interfaces.C.int;
+ Old_Set : aliased sigset_t;
+
+ function Thread_Body_Access is new
+ Unchecked_Conversion (System.Address, Thread_Body);
+
+ begin
+ if Stack_Size = System.Parameters.Unspecified_Size then
+ Adjusted_Stack_Size := Interfaces.C.size_t (2 * Default_Stack_Size);
+ -- Let's change the s-parame.adb to give a larger Stack_Size ?????
+ else
+ if Stack_Size < Size_Type (Minimum_Stack_Size) then
+ Adjusted_Stack_Size :=
+ Interfaces.C.size_t (Stack_Size + Minimum_Stack_Size);
+
+ -- sum, instead of max: may be overkill, but should be safe
+ -- thr_min_stack is a function call.
+
+ -- Actually, we want to get the Default_Stack_Size and
+ -- Minimum_Stack_Size from the file System.Parameters.
+ -- Right now the package is not made target specific.
+ -- We use our own local definitions for now ???
+
+ else
+ Adjusted_Stack_Size := Interfaces.C.size_t (Stack_Size);
+ end if;
+
+ -- Ask for 4 extra bytes of stack space so that the ATCB
+ -- pointer can be stored below the stack limit, plus extra
+ -- space for the frame of Task_Wrapper. This is so the user
+ -- gets the amount of stack requested exclusive of the needs
+ -- of the runtime.
+
+ end if;
+
+ Adjusted_Stack_Size := Adjusted_Stack_Size + 4;
+
+ -- Since the initial signal mask of a thread is inherited from the
+ -- creator, we need to set our local signal mask mask all signals
+ -- during the creation operation, to make sure the new thread is
+ -- not disturbed by signals before it has set its own Task_ID.
+
+ Result := pthread_attr_init (Attributes'Access);
+ pragma Assert (Result = 0 or else Result = ENOMEM
+ or else Shutdown ("GNULLI failure---pthread_attr_init"));
+
+ if Result /= 0 then
+ Succeeded := False;
+ return;
+ end if;
+
+ -- Create threads detached following email to report@gnat.com
+ -- confirming this is correct (should be fixed for GNAT after 3.09).
+ -- (Peter Burwood)
+ Result := pthread_attr_setdetachstate
+ (Attributes'Access, PTHREAD_CREATE_DETACHED);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_setdetachstate"));
+
+ Result := pthread_attr_setstacksize
+ (Attributes'Access, Interfaces.C.size_t (Adjusted_Stack_Size));
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---pthread_attr_setstacksize"));
+
+ Result := pthread_sigmask
+ (SIG_SETMASK, All_Signal_Mask'Access, Old_Set'Access);
+ pragma Assert (Result = 0 or else
+ Shutdown ("GNULLI failure---Create_Task (pthread_sigmask)"));
+
+ Result := pthread_create
+ (T.LL.Thread'Access,
+ Attributes'Access,
+ Thread_Body_Access (Wrapper),
+ To_Address (T));
+ pragma Assert (Result = 0 or else Result = EAGAIN
+ or else Shutdown ("GNULLI failure---Create_Task (pthread_create)"));
+
+ Succeeded := Result = 0;
+
+ Result := pthread_sigmask
+ (SIG_SETMASK, Old_Set'Unchecked_Access, null);
+ pragma Assert (Result = 0 or else
+ Shutdown ("GNULLI failure---Create_Task (pthread_sigmask)"));
+
+ Set_Priority (T, Priority);
+
+ end Create_Task;
+
+ ------------------
+ -- Finalize_TCB --
+ ------------------
+
+ procedure Finalize_TCB (T : Task_ID) is
+ Result : Interfaces.C.int;
+ Tmp : Task_ID := T;
+
+ procedure Free is new Unchecked_Deallocation
+ (Ada_Task_Control_Block, Task_ID);
+
+ begin
+ Result := pthread_mutex_destroy (T.LL.L'Access);
+ pragma Assert (Result = 0 or else
+ Shutdown ("GNULLI failure---Finalize_TCB (pthread_mutex_destroy)"));
+ Result := pthread_cond_destroy (T.LL.CV'Access);
+ pragma Assert (Result = 0 or else
+ Shutdown ("GNULLI failure---Finalize_TCB (pthread_cond_destroy)"));
+
+ -- Following report to report@gnat.com regarding ATCB memory leak
+ -- this Free is now called. The answer back from ACT didn't give
+ -- the source for a fix, but I calling this Free is sufficient.
+ -- (Peter Burwood)
+ Free (Tmp);
+ end Finalize_TCB;
+
+ ---------------
+ -- Exit_Task --
+ ---------------
+
+ procedure Exit_Task is
+ begin
+ pthread_exit (System.Null_Address);
+ end Exit_Task;
+
+ ----------------
+ -- Abort_Task --
+ ----------------
+
+ procedure Abort_Task (T : Task_ID) is
+ Result : Interfaces.C.int;
+
+ begin
+ Result := pthread_kill (T.LL.Thread,
+ Signal (System.Interrupt_Management.Abort_Task_Interrupt));
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Abort_Task"));
+ end Abort_Task;
+
+ ----------------
+ -- Initialize --
+ ----------------
+
+ procedure Initialize (Environment_Task : Task_ID) is
+ act : aliased struct_sigaction;
+ old_act : aliased struct_sigaction;
+ Tmp_Set : aliased sigset_t;
+ Result : Interfaces.C.int;
+
+ begin
+
+ Enter_Task (Environment_Task);
+
+ -- Install the abort-signal handler
+
+ act.sa_flags := 0;
+ act.sa_handler := Abort_Handler'Address;
+
+ Result := sigemptyset (Tmp_Set'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (sigemptyset)"));
+ act.sa_mask := Tmp_Set;
+
+ Result :=
+ sigaction (
+ Signal (System.Interrupt_Management.Abort_Task_Interrupt),
+ act'Access,
+ old_act'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (sigaction)"));
+
+ end Initialize;
+
+begin
+ declare
+ Result : Interfaces.C.int;
+ begin
+
+ -- pthread_init;
+ -- This call is needed for MIT thread library. We wish
+ -- we could move this to s-osinte.adb and be executed during
+ -- the package elaboration. However, in doing so we get an
+ -- elaboration problem.
+
+ -- It doesn't appear necessary to call it because pthread_init is
+ -- called before any Ada elaboration occurs.
+
+ Result := sigfillset (All_Signal_Mask'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (sigfillset)"));
+
+ Result := sigemptyset (Unblocked_Signal_Mask'Access);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (sigemptyset)"));
+
+ for J in Interrupt_Management.Interrupt_ID loop
+ if System.Interrupt_Management.Keep_Unmasked (J) then
+ Result := sigaddset (Unblocked_Signal_Mask'Access, Signal (J));
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (sigaddset)"));
+ end if;
+ end loop;
+
+ Result := pthread_key_create (ATCB_Key'Access, null);
+ pragma Assert (Result = 0
+ or else Shutdown ("GNULLI failure---Initialize (pthread_keycreate)"));
+ end;
+
+end System.Task_Primitives.Operations;
diff --git a/lang/gnat/files/5ftaspri.ads b/lang/gnat/files/5ftaspri.ads
new file mode 100644
index 000000000000..9cd6b64d989b
--- /dev/null
+++ b/lang/gnat/files/5ftaspri.ads
@@ -0,0 +1,138 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . T A S K _ P R I M I T I V E S --
+-- --
+-- S p e c --
+-- (Version for new GNARL) --
+-- --
+-- $Revision: 1.1 $ --
+-- --
+-- Copyright (C) 1991,92,93,94,95,1996 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 2, or (at your option) any later ver- --
+-- sion. GNARL 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 GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, 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. --
+-- --
+-- 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. Contributed
+-- by Daniel M. Eischen (deischen@iworks.InterWorks.org).
+
+-- DO NOT EDIT this file.
+-- It was automatically generated from another file by the m4 macro processor.
+-- The name of the file you should edit is the same as this one, but with
+-- ".ads" replaced by ".sm4", or
+-- ".adb" replaced by ".bm4", or
+-- ".c" replaced by ".cm4", or
+-- ".dat" replaced by ".tm4"
+
+-- Local options selected:
+-- __TARGET = i386-unknown-freebsd
+-- __ARCH = I386
+-- __OS = FREEBSD
+-- __HAS_SIGCONTEXT = 1
+-- __HAS_UCONTEXT = 0
+-- __THREADS = POSIX_THREADS
+-- __THREAD_VARIANT = ??
+-- __HAS_TIMESPEC = 1
+-- __HAS_NANOSLEEP = 1
+-- __HAS_CLOCK_GETTIME = 0
+-- __HAS_GETTIMEOFDAY = 1
+-- __POSIX_THREAD_PRIO_PROTECT = 0
+-- __POSIX_THREAD_PRIO_INHERIT = 0
+-- __POSIX_THREAD_ATTR_STACKADDR = 1
+-- __POSIX_THREAD_ATTR_STACKSIZE = 1
+-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0
+
+-- This package provides low-level support for most tasking features.
+
+with Interfaces.C;
+-- used for int
+-- size_t
+
+with System.OS_Interface;
+-- used for pthread_mutex_t
+-- pthread_cond_t
+-- pthread_t
+
+package System.Task_Primitives is
+
+ type Lock is limited private;
+ -- Should be used for implementation of protected objects.
+
+ type RTS_Lock is limited private;
+ -- Should be used inside the runtime system.
+ -- The difference between Lock and the RTS_Lock is that the later
+ -- one serves only as a semaphore so that do not check for
+ -- ceiling violations.
+
+ type Task_Body_Access is access procedure;
+ -- Pointer to the task body's entry point (or possibly a wrapper
+ -- declared local to the GNARL).
+
+ type Private_Data is limited private;
+ -- Any information that the GNULLI needs maintained on a per-task
+ -- basis. A component of this type is guaranteed to be included
+ -- in the Ada_Task_Control_Block.
+
+private
+
+ type Lock is new System.OS_Interface.pthread_mutex_t;
+ type RTS_Lock is new System.OS_Interface.pthread_mutex_t;
+ type Private_Data is record
+ Thread : aliased System.OS_Interface.pthread_t;
+ pragma Atomic (Thread);
+ -- Thread field may be updated by two different threads of control.
+ -- (See, Enter_Task and Create_Task in s-taprop.adb).
+ -- They put the same value (thr_self value). We do not want to
+ -- use lock on those operations and the only thing we have to
+ -- make sure is that they are updated in atomic fashion.
+ CV : aliased System.OS_Interface.pthread_cond_t;
+ L : aliased RTS_Lock;
+ -- protection for all components is lock L
+ Current_Priority : Interfaces.C.int := 0;
+ -- Active priority, except that the effects of protected object
+ -- priority ceilings are not reflected. This only reflects explicit
+ -- priority changes and priority inherited through task activation
+ -- and rendezvous.
+ -- Ada 95 notes: In Ada 95, this field will be transferred to the
+ -- Priority field of an Entry_Calls component when an entry call
+ -- is initiated. The Priority of the Entry_Calls component will not
+ -- change for the duration of the call. The accepting task can
+ -- use it to boost its own priority without fear of its changing in
+ -- the meantime.
+ -- This can safely be used in the priority ordering
+ -- of entry queues. Once a call is queued, its priority does not
+ -- change.
+ -- Since an entry call cannot be made while executing
+ -- a protected action, the priority of a task will never reflect a
+ -- priority ceiling change at the point of an entry call.
+ -- Protection: Only written by Self, and only accessed when Acceptor
+ -- accepts an entry or when Created activates, at which points Self is
+ -- suspended.
+ Stack_Size : Interfaces.c.size_t;
+ -- Requested stack size.
+ -- Protection: Only used by Self.
+ end record;
+
+end System.Task_Primitives;
diff --git a/lang/gnat/files/patch-aa b/lang/gnat/files/patch-aa
new file mode 100644
index 000000000000..eb8cd4588e4a
--- /dev/null
+++ b/lang/gnat/files/patch-aa
@@ -0,0 +1,141 @@
+diff -c orig/Makefile.in gcc/Makefile.in
+*** orig/Makefile.in Thu Mar 27 17:32:15 1997
+--- gcc-2.7.2.1/Makefile.in Fri Apr 4 19:55:09 1997
+***************
+*** 189,200 ****
+ local_prefix = /usr/local
+ # Directory in which to put host dependent programs and libraries
+ exec_prefix = $(prefix)
+ # Directory in which to put the executable for the command `gcc'
+ bindir = $(exec_prefix)/bin
+ # Directory in which to put the directories used by the compiler.
+ libdir = $(exec_prefix)/lib
+ # Directory in which the compiler finds executables, libraries, etc.
+! libsubdir = $(libdir)/gcc-lib/$(target)/$(version)
+ # Directory in which the compiler finds g++ includes.
+ gxx_include_dir= $(libdir)/g++-include
+ # Directory to search for site-specific includes.
+--- 189,202 ----
+ local_prefix = /usr/local
+ # Directory in which to put host dependent programs and libraries
+ exec_prefix = $(prefix)
++ # directory to hold compilers
++ compdir = $(prefix)/libexec/ada
+ # Directory in which to put the executable for the command `gcc'
+ bindir = $(exec_prefix)/bin
+ # Directory in which to put the directories used by the compiler.
+ libdir = $(exec_prefix)/lib
+ # Directory in which the compiler finds executables, libraries, etc.
+! libsubdir = $(libdir)
+ # Directory in which the compiler finds g++ includes.
+ gxx_include_dir= $(libdir)/g++-include
+ # Directory to search for site-specific includes.
+***************
+*** 213,219 ****
+ mandir = $(prefix)/man/man1
+ # Directory in which to find other cross-compilation tools and headers.
+ # Used in install-cross.
+! tooldir = $(exec_prefix)/$(target)
+ # Dir for temp files.
+ tmpdir = /tmp
+
+--- 215,221 ----
+ mandir = $(prefix)/man/man1
+ # Directory in which to find other cross-compilation tools and headers.
+ # Used in install-cross.
+! tooldir = $(exec_prefix)
+ # Dir for temp files.
+ tmpdir = /tmp
+
+***************
+*** 1141,1148 ****
+
+ gcc.o: gcc.c $(CONFIG_H) multilib.h config.status $(lang_specs_files)
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+ -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \
+! -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \
+ -DDEFAULT_TARGET_VERSION=\"$(version)\" \
+ -DDEFAULT_TARGET_MACHINE=\"$(target)\" \
+ -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\" \
+--- 1143,1152 ----
+
+ gcc.o: gcc.c $(CONFIG_H) multilib.h config.status $(lang_specs_files)
+ $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
++ -DFREEBSD_NATIVE \
++ -DFREEBSD_PREFIX=\"$(prefix)\" \
+ -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \
+! -DSTANDARD_EXEC_PREFIX=\"$(libdir)/\" \
+ -DDEFAULT_TARGET_VERSION=\"$(version)\" \
+ -DDEFAULT_TARGET_MACHINE=\"$(target)\" \
+ -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\" \
+***************
+*** 2055,2069 ****
+ # Create the installation directory.
+ install-dir:
+ -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; chmod a+rx $(libdir) ; fi
+- -if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib ; chmod a+rx $(libdir)/gcc-lib ; fi
+ # This dir isn't currently searched by cpp.
+ # -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; chmod a+rx $(libdir)/gcc-lib/include ; fi
+! -if [ -d $(libdir)/gcc-lib/$(target) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target) ; chmod a+rx $(libdir)/gcc-lib/$(target) ; fi
+! -if [ -d $(libdir)/gcc-lib/$(target)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version) ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version) ; fi
+! -if [ -d $(libdir)/gcc-lib/$(target)/$(version)/include ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version)/include ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version)/include ; fi
+ -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; chmod a+rx $(bindir) ; fi
+ -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; chmod a+rx $(includedir) ; fi
+ -if [ -d $(tooldir) ] ; then true ; else mkdir $(tooldir) ; chmod a+rx $(tooldir) ; fi
+ -if [ -d $(assertdir) ] ; then true ; else mkdir $(assertdir) ; chmod a+rx $(assertdir) ; fi
+ -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; chmod a+rx $(infodir) ; fi
+ # We don't use mkdir -p to create the parents of mandir,
+--- 2059,2073 ----
+ # Create the installation directory.
+ install-dir:
+ -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; chmod a+rx $(libdir) ; fi
+ # This dir isn't currently searched by cpp.
+ # -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; chmod a+rx $(libdir)/gcc-lib/include ; fi
+! # -if [ -d $(libdir)/gcc-lib/$(target) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target) ; chmod a+rx $(libdir)/gcc-lib/$(target) ; fi
+! # -if [ -d $(libdir)/gcc-lib/$(target)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version) ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version) ; fi
+! # -if [ -d $(libdir)/gcc-lib/$(target)/$(version)/include ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version)/include ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version)/include ; fi
+ -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; chmod a+rx $(bindir) ; fi
+ -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; chmod a+rx $(includedir) ; fi
+ -if [ -d $(tooldir) ] ; then true ; else mkdir $(tooldir) ; chmod a+rx $(tooldir) ; fi
++ -if [ -d $(compdir) ] ; then true ; else mkdir $(compdir) ; chmod a+rx $(compdir) ; fi
+ -if [ -d $(assertdir) ] ; then true ; else mkdir $(assertdir) ; chmod a+rx $(assertdir) ; fi
+ -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; chmod a+rx $(infodir) ; fi
+ # We don't use mkdir -p to create the parents of mandir,
+***************
+*** 2077,2084 ****
+ install-common: native install-dir $(EXTRA_PARTS) lang.install-common
+ for file in $(COMPILERS); do \
+ if [ -f $$file ] ; then \
+! rm -f $(libsubdir)/$$file; \
+! $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \
+ else true; \
+ fi; \
+ done
+--- 2081,2088 ----
+ install-common: native install-dir $(EXTRA_PARTS) lang.install-common
+ for file in $(COMPILERS); do \
+ if [ -f $$file ] ; then \
+! rm -f $(compdir)/$$file; \
+! $(INSTALL_PROGRAM) $$file $(compdir)/$$file; \
+ else true; \
+ fi; \
+ done
+***************
+*** 2110,2117 ****
+ $(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \
+ chmod a-x $(libsubdir)/SYSCALLS.c.X; \
+ fi
+! -rm -f $(libsubdir)/cpp$(exeext)
+! $(INSTALL_PROGRAM) cpp$(exeext) $(libsubdir)/cpp$(exeext)
+
+ # Install the driver program as $(target)-gcc
+ # and also as either gcc (if native) or $(tooldir)/bin/gcc.
+--- 2114,2121 ----
+ $(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \
+ chmod a-x $(libsubdir)/SYSCALLS.c.X; \
+ fi
+! -rm -f $(compdir)/cpp$(exeext)
+! $(INSTALL_PROGRAM) cpp$(exeext) $(compdir)/cpp$(exeext)
+
+ # Install the driver program as $(target)-gcc
+ # and also as either gcc (if native) or $(tooldir)/bin/gcc.
diff --git a/lang/gnat/files/patch-ab b/lang/gnat/files/patch-ab
new file mode 100644
index 000000000000..baf5ebdeec18
--- /dev/null
+++ b/lang/gnat/files/patch-ab
@@ -0,0 +1,36 @@
+diff -c orig/gcc.c gcc/gcc.c
+*** orig/gcc.c Thu Apr 3 08:37:06 1997
+--- gcc-2.7.2.1/gcc.c Fri Apr 4 23:21:00 1997
+***************
+*** 1354,1362 ****
+ #undef MD_STARTFILE_PREFIX_1
+ #endif
+
+! #ifndef STANDARD_EXEC_PREFIX
+! #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/"
+! #endif /* !defined STANDARD_EXEC_PREFIX */
+
+ static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
+ static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
+--- 1354,1360 ----
+ #undef MD_STARTFILE_PREFIX_1
+ #endif
+
+! #define STANDARD_EXEC_PREFIX FREEBSD_PREFIX "/libexec/"
+
+ static char *standard_exec_prefix = STANDARD_EXEC_PREFIX;
+ static char *standard_exec_prefix_1 = "/usr/lib/gcc/";
+***************
+*** 2708,2715 ****
+--- 2706,2716 ----
+ /* Use 2 as fourth arg meaning try just the machine as a suffix,
+ as well as trying the machine and the version. */
+ #ifdef FREEBSD_NATIVE
++ add_prefix (&exec_prefixes, FREEBSD_PREFIX "/libexec/ada/", 0, 0, NULL_PTR);
++ add_prefix (&exec_prefixes, FREEBSD_PREFIX "/libexec/", 0, 0, NULL_PTR);
+ add_prefix (&exec_prefixes, "/usr/libexec/", 0, 0, NULL_PTR);
+ add_prefix (&exec_prefixes, "/usr/bin/", 0, 0, NULL_PTR);
++ add_prefix (&startfile_prefixes, FREEBSD_PREFIX "/lib/", 0, 0, NULL_PTR);
+ add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", 0, 0, NULL_PTR);
+ #else /* not FREEBSD_NATIVE */
+ #ifndef OS2
diff --git a/lang/gnat/files/patch-ac b/lang/gnat/files/patch-ac
new file mode 100644
index 000000000000..e2e24ca4b439
--- /dev/null
+++ b/lang/gnat/files/patch-ac
@@ -0,0 +1,20 @@
+diff -c orig/ada/Makefile.in gcc/ada/Makefile.in
+*** orig/ada/Makefile.in Thu Apr 3 12:40:23 1997
+--- gcc-2.7.2.1/ada/Makefile.in Thu Apr 3 12:41:49 1997
+***************
+*** 956,962 ****
+ $(srcdir)/../move-if-change tmp-ttypef.ads ttypef.ads
+ touch stamp-ttypef
+
+! ADA_INCLUDE_DIR = $(prefix)/adainclude
+ ADA_RTL_OBJ_DIR = $(libsubdir)/adalib
+
+ # Note: the strings below do not make sense for Ada strings in the OS/2
+--- 956,962 ----
+ $(srcdir)/../move-if-change tmp-ttypef.ads ttypef.ads
+ touch stamp-ttypef
+
+! ADA_INCLUDE_DIR = $(prefix)/include/adainclude
+ ADA_RTL_OBJ_DIR = $(libsubdir)/adalib
+
+ # Note: the strings below do not make sense for Ada strings in the OS/2
diff --git a/lang/gnat/files/patch-ad b/lang/gnat/files/patch-ad
new file mode 100644
index 000000000000..b1a4ed1dd153
--- /dev/null
+++ b/lang/gnat/files/patch-ad
@@ -0,0 +1,46 @@
+diff -c orig/ada/Makefile.in gcc/ada/Makefile.in
+*** orig/ada/Makefile.in Tue Jan 21 00:01:54 1997
+--- gcc-2.7.2.1/ada/Makefile.in Sat May 10 22:42:27 1997
+***************
+*** 189,193 ****
+ $(CC) -c $(ALL_ADAFLAGS) $<
+ .ads.o:
+! $(CC) -c $(ALL_ADAFLAGS) $<
+
+ # This tells GNU make version 3 not to export all the variables
+--- 189,199 ----
+ $(CC) -c $(ALL_ADAFLAGS) $<
+ .ads.o:
+! @if [ -f $*.adb ]; then \
+! echo "$(CC) -c $(ALL_ADAFLAGS) $*.adb"; \
+! $(CC) -c $(ALL_ADAFLAGS) $*.adb; \
+! else \
+! echo "$(CC) -c $(ALL_ADAFLAGS) $*.ads"; \
+! $(CC) -c $(ALL_ADAFLAGS) $*.ads; \
+! fi
+
+ # This tells GNU make version 3 not to export all the variables
+***************
+*** 738,741 ****
+--- 744,748 ----
+ sparc-sun-sunos5*) letter=s ;;\
+ *86*-linux*) letter=l ;;\
++ *86*-freebsd*) letter=f ;;\
+ mips-sgi-irix*) letter=g ;;\
+ hppa*-hp-hpux*) letter=h ;;\
+***************
+*** 779,782 ****
+--- 786,790 ----
+ *-go32-msdos | *-go32 |\
+ *86*-linux* |\
++ *86*-freebsd* |\
+ *) \
+ \
+***************
+*** 845,848 ****
+--- 853,857 ----
+ *-go32-msdos | *-go32 |\
+ *86*-linux* |\
++ *86*-freebsd* |\
+ *) \
+ \
diff --git a/lang/gnat/files/patch-ae b/lang/gnat/files/patch-ae
new file mode 100644
index 000000000000..85b50c157c15
--- /dev/null
+++ b/lang/gnat/files/patch-ae
@@ -0,0 +1,36 @@
+*** gcc/ada/make.adb.orig Thu Jun 5 08:37:34 1997
+--- gcc-2.7.2.1/ada/make.adb Thu Jun 5 11:30:57 1997
+***************
+*** 191,197 ****
+ -- Compiler, Binder & Linker Data and Subprograms --
+ ----------------------------------------------------
+
+! Gcc : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gcc");
+ Gnatbind : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatbind");
+ Gnatlink : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatlink");
+
+--- 191,197 ----
+ -- Compiler, Binder & Linker Data and Subprograms --
+ ----------------------------------------------------
+
+! Gcc : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("adagcc");
+ Gnatbind : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatbind");
+ Gnatlink : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatlink");
+
+***************
+*** 778,784 ****
+ Comp_Last := Comp_Last + 1;
+ Comp_Args (Comp_Last) := new String'(Name_Buffer (1 .. Name_Len));
+
+! Display ("gcc", Comp_Args (Args'First .. Comp_Last));
+
+ return
+ GNAT.OS_Lib.Non_Blocking_Spawn
+--- 778,784 ----
+ Comp_Last := Comp_Last + 1;
+ Comp_Args (Comp_Last) := new String'(Name_Buffer (1 .. Name_Len));
+
+! Display ("adagcc", Comp_Args (Args'First .. Comp_Last));
+
+ return
+ GNAT.OS_Lib.Non_Blocking_Spawn
diff --git a/lang/gnat/files/patch-af b/lang/gnat/files/patch-af
new file mode 100644
index 000000000000..ed40cbcf144f
--- /dev/null
+++ b/lang/gnat/files/patch-af
@@ -0,0 +1,19 @@
+*** gcc/ada/gnatcmd.adb.orig Wed Jun 4 17:47:51 1997
+--- gcc-2.7.2.1/ada/gnatcmd.adb Wed Jun 4 17:48:17 1997
+***************
+*** 899,905 ****
+
+ (Cname => new S'("COMPILE"),
+ Usage => new S'("GNAT COMPILE file file .. file /qualifiers"),
+! Unixcmd => new S'("gcc -c"),
+ Switches => GCC_Switches'Access,
+ Minfile => 1,
+ Maxfile => 0,
+--- 899,905 ----
+
+ (Cname => new S'("COMPILE"),
+ Usage => new S'("GNAT COMPILE file file .. file /qualifiers"),
+! Unixcmd => new S'("adagcc -c"),
+ Switches => GCC_Switches'Access,
+ Minfile => 1,
+ Maxfile => 0,