public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch] Implement Ada support for DragonFly, improve it for FreeBSD
@ 2015-05-29 23:36 John Marino
  2015-06-03  7:30 ` Eric Botcazou
  0 siblings, 1 reply; 12+ messages in thread
From: John Marino @ 2015-05-29 23:36 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2435 bytes --]

This patch set is a subset of the GNAT patches I've maintained
separately for a few years.  I have limited it adding support for
x86-64-*-dragonfly* and improving support for i[34567]86-*-freebsd and
x86_64-*-freebsd*.

In some cases of pre-processor macros, they may contain additions for
NetBSD and OpenBSD.  GNAT does not officially support these platforms,
so technically they are no-ops.  However, GNAT is buildable in OpenBSD
ports, and in NetBSD's pkgsrc.  Since I'm modifying the lines anyway and
I already know they are required for NetBSD and OpenBSD, I'm adding them
at the same time to reduce diffs elsewhere.  I am only doing this when I
touch the line for other reasons involving FreeBSD and DragonFly BSD.

I've added the attached patch to the gcc trunk as it was on May 29,
built GNAT and ran the testsuite.  The results are linked here:

1. http://leaf.dragonflybsd.org/~marino/freebsd/dfly64.concise.log.txt
2. http://leaf.dragonflybsd.org/~marino/freebsd/fbsd64.concise.log.txt
3. http://leaf.dragonflybsd.org/~marino/freebsd/fbsd32.concise.log.txt

There is one regression in the gnat.dg tests on all platforms, but I
believe this is caused by recent commits to GNAT and not by these patches.

Note 1)  All TOOL_TARGET_PAIRS in gcc/ada/gcc-interface/Makefile.in
should be removed for most (if not all) platforms as they were moved to
gnattools/configure and are now no-ops.  However, for this patch set I
only removed them for FreeBSD.

Note 2) I removed reference to FreeBSD 6 and earlier.  These platforms
have been EOL for years (FreeBSD 8 is EOL in 4 weeks)

Note 3) FreeBSD should have switched to use errno years ago, this patch
does that now.

Note 4) For all BSD except DragonFly (which doesn't support i386
anymore), the GCC_UNWINDER is specified for i386 platforms.  It wasn't
specified before.

Note 5) All the ce/cxa/cxg tests that failed on i386-FreeBSD are related
to the 53-bit float mantissa issue on FreeBSD.  This is resolved by my
GNAT-AUX repository changes so the tests pass without compromising other
compilers, but those patches are out of scope of this set.

copy of patch:
http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff
copy of suggested commit message:
http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt
(both attached to this email)

Also, my FSF copyright assignment is in order and on file at FSF.
Thank you for reviewing this!

John


[-- Attachment #2: gnat-dragonfly-support.msg.txt --]
[-- Type: text/plain, Size: 812 bytes --]

gnattools/ChangeLog:

2015-06-XX  John Marino <gnugcc@marino.st>

	* configure.ac (*-*-dragonfly*): Add
	* configure: Regenerate

gcc/ada/ChangeLog:

2015-06-XX  John Marino <gnugcc@marino.st>

	* a-intnam-dragonfly.ads: New
	* s-osinte-dragonfly.adb: New
	* s-osinte-dragonfly.ads: New
	* system-dragonfly-x86_64.ads: New
	* adaint.c: Add BSD macros
	* cstreams.c: ditto
	* gsocket.h: ditto
	* link.c: ditto
	* socket.c: ditto
	* env.c: Add __DragonFly__, remove __FreeBSD__
	* init.c: Add __DragonFly__, change __gnat_install_handler
	prototype from empty to void
	* initialize.c: Add __DragonFly__
	* sysdep.c: ditto.
	* s-osinte-freebsd.adb: Use __get_errno instead of __error
	* tracebak.c: Set unwinder for i386 BSD
	* gcc-interface/Makefile.in: Add x86_64 DragonFly, tweak
	x86_64 FreeBSD and x86 FreeBSD

[-- Attachment #3: gnat-dragonfly-support.diff --]
[-- Type: text/plain, Size: 58232 bytes --]

--- gnattools/configure.orig
+++ gnattools/configure
@@ -2039,6 +2039,11 @@
     mlib-tgt-specific.adb<mlib-tgt-specific-darwin.adb \
     indepsw.adb<indepsw-darwin.adb"
     ;;
+  *-*-dragonfly*)
+    TOOLS_TARGET_PAIRS="\
+    mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+    indepsw.adb<indepsw-gnu.adb"
+    ;;
   *-*-freebsd*)
     TOOLS_TARGET_PAIRS="\
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
--- gnattools/configure.ac.orig
+++ gnattools/configure.ac
@@ -79,6 +79,11 @@
     mlib-tgt-specific.adb<mlib-tgt-specific-darwin.adb \
     indepsw.adb<indepsw-darwin.adb"
     ;;
+  *-*-dragonfly*)
+    TOOLS_TARGET_PAIRS="\
+    mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
+    indepsw.adb<indepsw-gnu.adb"
+    ;;
   *-*-freebsd*)
     TOOLS_TARGET_PAIRS="\
     mlib-tgt-specific.adb<mlib-tgt-specific-linux.adb \
--- /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-2015, 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;
--- gcc/ada/adaint.c.orig
+++ gcc/ada/adaint.c
@@ -744,7 +744,7 @@
 }
 
 #if defined (_WIN32) || defined (linux) || defined (sun) \
-  || defined (__FreeBSD__)
+  || defined (__FreeBSD__) || defined(__DragonFly__)
 #define HAS_TARGET_WCHAR_T
 #endif
 
@@ -982,7 +982,8 @@
   strcpy (path, "GNAT-XXXXXX");
 
 #if (defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) \
-  || defined (linux) || defined(__GLIBC__)) && !defined (__vxworks)
+  || defined (linux) || defined(__GLIBC__)) && !defined (__vxworks) \
+  || defined (__DragonFly__)
   return mkstemp (path);
 #elif defined (__Lynx__)
   mktemp (path);
@@ -1154,7 +1155,8 @@
   }
 
 #elif defined (linux) || defined (__FreeBSD__) || defined (__NetBSD__) \
-  || defined (__OpenBSD__) || defined(__GLIBC__) || defined (__ANDROID__)
+  || defined (__OpenBSD__) || defined(__GLIBC__) || defined (__ANDROID__) \
+  || defined (__DragonFly__)
 #define MAX_SAFE_PATH 1000
   char *tmpdir = getenv ("TMPDIR");
 
@@ -2267,7 +2269,9 @@
 {
   int cores = 1;
 
-#if defined (linux) || defined (sun) || defined (AIX) || defined (__APPLE__)
+#if defined (linux) || defined (sun) || defined (AIX) || defined (__APPLE__) \
+ || defined (__FreeBSD__) || defined (__DragonFly__) || defined (__NetBSD__) \
+ || defined (__OpenBSD__)
   cores = (int) sysconf (_SC_NPROCESSORS_ONLN);
 
 #elif defined (__hpux__)
--- gcc/ada/cstreams.c.orig
+++ gcc/ada/cstreams.c
@@ -6,7 +6,7 @@
  *                                                                          *
  *              Auxiliary C functions for Interfaces.C.Streams              *
  *                                                                          *
- *          Copyright (C) 1992-2014, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2015, 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- *
@@ -192,7 +192,7 @@
 	  *p = '\\';
     }
 
-#elif defined (__FreeBSD__)
+#elif 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
@@ -192,12 +192,9 @@
 
   sprintf (expression, "%s=%s", name, value);
   putenv (expression);
-#if (defined (__FreeBSD__) && (__FreeBSD__ < 7)) \
-   || defined (__MINGW32__) \
-   ||(defined (__vxworks) && ! defined (__RTP__))
-  /* On some systems like FreeBSD 6.x and earlier, MacOS X and Windows,
-     putenv is making a copy of the expression string so we can free
-     it after the call to putenv */
+#if defined (__MINGW32__) || (defined (__vxworks) && ! defined (__RTP__))
+  /* On some systems like MacOS X and Windows, putenv is making a copy of the
+     expression string so we can free it after the call to putenv */
   free (expression);
 #endif
 #endif
@@ -304,7 +301,8 @@
   }
 #elif defined (__MINGW32__) || defined (__FreeBSD__) || defined (__APPLE__) \
    || (defined (__vxworks) && defined (__RTP__)) || defined (__CYGWIN__) \
-   || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__rtems__)
+   || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__rtems__) \
+   || defined (__DragonFly__)
   /* 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
      through the environ table and call __gnat_unsetenv on all entries */
--- gcc/ada/gsocket.h.orig
+++ gcc/ada/gsocket.h
@@ -209,7 +209,8 @@
 #endif
 
 #if defined (_AIX) || defined (__FreeBSD__) || defined (__hpux__) || \
-    defined (_WIN32) || defined (__APPLE__) || defined (__ANDROID__)
+    defined (_WIN32) || defined (__APPLE__) || defined (__ANDROID__) || \
+    defined (__DragonFly__) || defined (__NetBSD__) || defined (__OpenBSD__)
 # define HAVE_THREAD_SAFE_GETxxxBYyyy 1
 
 #elif defined (linux) || defined (__GLIBC__) || \
@@ -241,7 +242,8 @@
 # endif
 #endif
 
-#if defined (__FreeBSD__) || defined (__vxworks) || defined(__rtems__)
+#if defined (__FreeBSD__) || defined (__vxworks) || defined(__rtems__) \
+ || defined (__DragonFly__) || defined (__NetBSD__) || defined (__OpenBSD__)
 # define Has_Sockaddr_Len 1
 #else
 # define Has_Sockaddr_Len 0
--- gcc/ada/init.c.orig
+++ gcc/ada/init.c
@@ -1628,7 +1628,7 @@
 /* FreeBSD Section */
 /*******************/
 
-#elif defined (__FreeBSD__)
+#elif defined (__FreeBSD__) || defined (__DragonFly__)
 
 #include <signal.h>
 #include <sys/ucontext.h>
@@ -1673,7 +1673,7 @@
 }
 
 void
-__gnat_install_handler ()
+__gnat_install_handler (void)
 {
   struct sigaction act;
 
@@ -2523,7 +2523,7 @@
 
 #if defined (_WIN32) || defined (__INTERIX) \
   || defined (__Lynx__) || defined(__NetBSD__) || defined(__FreeBSD__) \
-  || defined (__OpenBSD__)
+  || defined (__OpenBSD__) || defined (__DragonFly__)
 
 #define HAVE_GNAT_INIT_FLOAT
 
--- gcc/ada/initialize.c.orig
+++ gcc/ada/initialize.c
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *          Copyright (C) 1992-2014, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2015, 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- *
@@ -86,7 +86,7 @@
 /******************************************/
 
 #elif defined (__Lynx__) || defined (__FreeBSD__) || defined(__NetBSD__) \
-  || defined (__OpenBSD__)
+  || defined (__OpenBSD__) || defined (__DragonFly__)
 
 void
 __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
--- gcc/ada/link.c.orig
+++ gcc/ada/link.c
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *          Copyright (C) 1992-2014, Free Software Foundation, Inc.         *
+ *          Copyright (C) 1992-2015, 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- *
@@ -103,7 +103,8 @@
 unsigned char __gnat_separate_run_path_options = 0;
 const char *__gnat_default_libgcc_subdir = "lib";
 
-#elif defined (__FreeBSD__)
+#elif defined (__FreeBSD__) || defined (__DragonFly__) \
+   || defined (__NetBSD__) || defined (__OpenBSD__)
 const char *__gnat_object_file_option = "-Wl,@";
 const char *__gnat_run_path_option = "-Wl,-rpath,";
 char __gnat_shared_libgnat_default = STATIC;
--- /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-2015, 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.ts_sec) + Duration (TS.ts_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'(ts_sec => S,
+                       ts_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,653 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                  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-2015, 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_getres
+     (clock_id : clockid_t;
+      res      : access timespec) return int;
+   pragma Import (C, clock_getres, "clock_getres");
+
+   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
+      ts_sec  : time_t;
+      ts_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
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                   B o d y                                --
 --                                                                          --
---          Copyright (C) 1991-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 1991-2015, 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- --
@@ -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;
 
    ------------------
--- gcc/ada/socket.c.orig
+++ gcc/ada/socket.c
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *          Copyright (C) 2003-2014, Free Software Foundation, Inc.         *
+ *          Copyright (C) 2003-2015, 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- *
@@ -37,7 +37,8 @@
 
 #include "gsocket.h"
 
-#if defined(__FreeBSD__)
+#if defined (__FreeBSD__) || defined (__DragonFly__) \
+ || defined (__NetBSD__) || defined (__OpenBSD__)
 typedef unsigned int IOCTL_Req_T;
 #else
 typedef int IOCTL_Req_T;
--- gcc/ada/sysdep.c.orig
+++ gcc/ada/sysdep.c
@@ -287,7 +287,7 @@
   || defined (__MACHTEN__) || defined (__hpux__) || defined (_AIX) \
   || (defined (__svr4__) && defined (i386)) || defined (__Lynx__) \
   || defined (__CYGWIN__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
-  || defined (__GLIBC__) || defined (__APPLE__)
+  || defined (__GLIBC__) || defined (__APPLE__) || defined (__DragonFly__)
 
 # ifdef __MINGW32__
 #  if OLD_MINGW
@@ -339,7 +339,7 @@
     || defined (__CYGWIN32__) || defined (__MACHTEN__) || defined (__hpux__) \
     || defined (_AIX) || (defined (__svr4__) && defined (i386)) \
     || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
-    || defined (__GLIBC__) || defined (__APPLE__)
+    || defined (__GLIBC__) || defined (__APPLE__) || defined (__DragonFly__)
   char c;
   int nread;
   int good_one = 0;
@@ -359,7 +359,7 @@
     || defined (__MACHTEN__) || defined (__hpux__) \
     || defined (_AIX) || (defined (__svr4__) && defined (i386)) \
     || defined (__Lynx__) || defined (__FreeBSD__) || defined (__OpenBSD__) \
-    || defined (__GLIBC__) || defined (__APPLE__)
+    || defined (__GLIBC__) || defined (__APPLE__) || defined (__DragonFly__)
       eof_ch = termios_rec.c_cc[VEOF];
 
       /* If waiting (i.e. Get_Immediate (Char)), set MIN = 1 and wait for
@@ -820,7 +820,7 @@
    struct tm */
 
 #elif defined (__APPLE__) || defined (__FreeBSD__) || defined (linux) \
-  || defined (__GLIBC__)
+  || defined (__GLIBC__) || defined (__DragonFly__) || defined (__OpenBSD__)
 {
   localtime_r (timer, &tp);
   *off = tp.tm_gmtoff;
--- /dev/null
+++ gcc/ada/system-dragonfly-x86_64.ads
@@ -0,0 +1,147 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                        GNAT RUN-TIME COMPONENTS                          --
+--                                                                          --
+--                               S Y S T E M                                --
+--                                                                          --
+--                                 S p e c                                  --
+--                      (DragonFly BSD/x86_64 Version)                      --
+--                                                                          --
+--          Copyright (C) 1992-2015, 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).
+
+   pragma No_Elaboration_Code_All;
+   --  Allow the use of that restriction in units that WITH this unit
+
+   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_Atomic_Primitives : 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;
--- gcc/ada/tracebak.c.orig
+++ gcc/ada/tracebak.c
@@ -6,7 +6,7 @@
  *                                                                          *
  *                          C Implementation File                           *
  *                                                                          *
- *            Copyright (C) 2000-2014, Free Software Foundation, Inc.       *
+ *            Copyright (C) 2000-2015, 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- *
@@ -278,6 +278,20 @@
 #error Unhandled darwin architecture.
 #endif
 
+/*---------------------------- x86 *BSD --------------------------------*/
+
+#elif defined (__i386__) &&   \
+    ( defined (__NetBSD__) || defined (__FreeBSD__) || defined (__OpenBSD__) )
+
+#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/PPC Lynx 178/Older Darwin ------------------*/
 #elif ((defined (_POWER) && defined (_AIX)) || \
        (defined (__powerpc__) && defined (__Lynx__) && !defined(__ELF__)) || \
--- gcc/ada/gcc-interface/Makefile.in.orig
+++ gcc/ada/gcc-interface/Makefile.in
@@ -1,5 +1,5 @@
 # Makefile for GNU Ada Compiler (GNAT).
-#   Copyright (C) 1994-2014 Free Software Foundation, Inc.
+#   Copyright (C) 1994-2015 Free Software Foundation, Inc.
 
 #This file is part of GCC.
 
@@ -1425,6 +1425,7 @@
   a-intnam.ads<a-intnam-freebsd.ads \
   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 \
@@ -1435,8 +1436,6 @@
   $(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_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
@@ -1454,6 +1453,7 @@
   a-intnam.ads<a-intnam-freebsd.ads \
   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 \
@@ -1464,8 +1464,34 @@
   $(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_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o
+
+  EH_MECHANISM=-gcc
+  THREADSLIB= -lpthread
+  GMEM_LIB = gmemlib
+  LIBRARY_VERSION := $(LIB_VERSION)
+  MISCLIB = -lutil
+endif
+
+# x86-64 DragonFly
+ifeq ($(strip $(filter-out %86_64 dragonfly%,$(target_cpu) $(target_os))),)
+  LIBGNAT_TARGET_PAIRS = \
+  a-intnam.ads<a-intnam-dragonfly.ads \
+  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_GNATRTL_NONTASKING_OBJS=g-sse.o g-ssvety.o

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-05-29 23:36 [patch] Implement Ada support for DragonFly, improve it for FreeBSD John Marino
@ 2015-06-03  7:30 ` Eric Botcazou
  2015-06-03  7:33   ` Arnaud Charlet
  2015-06-03  9:41   ` Thomas Quinot
  0 siblings, 2 replies; 12+ messages in thread
From: Eric Botcazou @ 2015-06-03  7:30 UTC (permalink / raw)
  To: John Marino; +Cc: gcc-patches, Thomas Quinot

> This patch set is a subset of the GNAT patches I've maintained
> separately for a few years.  I have limited it adding support for
> x86-64-*-dragonfly* and improving support for i[34567]86-*-freebsd and
> x86_64-*-freebsd*.

Thanks for posting it.

> I've added the attached patch to the gcc trunk as it was on May 29,
> built GNAT and ran the testsuite.  The results are linked here:
> 
> 1. http://leaf.dragonflybsd.org/~marino/freebsd/dfly64.concise.log.txt
> 2. http://leaf.dragonflybsd.org/~marino/freebsd/fbsd64.concise.log.txt
> 3. http://leaf.dragonflybsd.org/~marino/freebsd/fbsd32.concise.log.txt
> 
> There is one regression in the gnat.dg tests on all platforms, but I
> believe this is caused by recent commits to GNAT and not by these patches.

Right.

> Note 1)  All TOOL_TARGET_PAIRS in gcc/ada/gcc-interface/Makefile.in
> should be removed for most (if not all) platforms as they were moved to
> gnattools/configure and are now no-ops.  However, for this patch set I
> only removed them for FreeBSD.

They are actually used if you configure with --disable-libada so should be 
preserved.  You don't need to add new ones though.

> Note 2) I removed reference to FreeBSD 6 and earlier.  These platforms
> have been EOL for years (FreeBSD 8 is EOL in 4 weeks)
> 
> Note 3) FreeBSD should have switched to use errno years ago, this patch
> does that now.
> 
> Note 4) For all BSD except DragonFly (which doesn't support i386
> anymore), the GCC_UNWINDER is specified for i386 platforms.  It wasn't
> specified before.
> 
> Note 5) All the ce/cxa/cxg tests that failed on i386-FreeBSD are related
> to the 53-bit float mantissa issue on FreeBSD.  This is resolved by my
> GNAT-AUX repository changes so the tests pass without compromising other
> compilers, but those patches are out of scope of this set.

I'm not a specialist of FreeBSD so Thomas is Cced.  The original message is:
  https://gcc.gnu.org/ml/gcc-patches/2015-05/msg02830.html

> copy of patch:
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff
> copy of suggested commit message:
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt
> (both attached to this email)

This looks good to me modulo the TOOL_TARGET_PAIRS thing.  But ChangeLog lines 
must all start with a capital letter and end with a period.

Please leave a couple of more days for Thomas or Arno to comment though.

-- 
Eric Botcazou

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  7:30 ` Eric Botcazou
@ 2015-06-03  7:33   ` Arnaud Charlet
  2015-06-03  8:25     ` John Marino
  2015-06-03  9:41   ` Thomas Quinot
  1 sibling, 1 reply; 12+ messages in thread
From: Arnaud Charlet @ 2015-06-03  7:33 UTC (permalink / raw)
  To: Eric Botcazou; +Cc: John Marino, gcc-patches, Thomas Quinot

> > Note 1)  All TOOL_TARGET_PAIRS in gcc/ada/gcc-interface/Makefile.in
> > should be removed for most (if not all) platforms as they were moved to
> > gnattools/configure and are now no-ops.  However, for this patch set I
> > only removed them for FreeBSD.
> 
> They are actually used if you configure with --disable-libada so should be
> preserved.

Right.

> > copy of patch:
> > http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff
> > 
> > copy of suggested commit message:
> > http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt
> > 
> > (both attached to this email)
> 
> This looks good to me modulo the TOOL_TARGET_PAIRS thing.  But ChangeLog
> lines
> must all start with a capital letter and end with a period.
> 
> Please leave a couple of more days for Thomas or Arno to comment though.

My main question is: who will maintain these files after they are in
(e.g. regularly test this configuration and post patches to fix any breakage)?

Arno

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  7:33   ` Arnaud Charlet
@ 2015-06-03  8:25     ` John Marino
  2015-06-03  9:14       ` Arnaud Charlet
  0 siblings, 1 reply; 12+ messages in thread
From: John Marino @ 2015-06-03  8:25 UTC (permalink / raw)
  To: Arnaud Charlet, Eric Botcazou; +Cc: gcc-patches, Thomas Quinot

On 6/3/2015 09:30, Arnaud Charlet wrote:
>>> Note 1)  All TOOL_TARGET_PAIRS in gcc/ada/gcc-interface/Makefile.in
>>> should be removed for most (if not all) platforms as they were moved to
>>> gnattools/configure and are now no-ops.  However, for this patch set I
>>> only removed them for FreeBSD.
>>
>> They are actually used if you configure with --disable-libada so should be
>> preserved.
> 
> Right.

Okay, so that means the Makefile.in patch needs changing in two ways:
1.  Don't remove TOOL_TARGET_PAIRS lines from two FreeBSD targets
2.  Add TOOL_TARGET_PAIRS line to new DragonFly target.

Is a new submission necessary or can this be handled by committer?
A new submission will take me a few days because I'm traveling ATM.



>>
>> This looks good to me modulo the TOOL_TARGET_PAIRS thing.  But ChangeLog
>> lines
>> must all start with a capital letter and end with a period.
>>
>> Please leave a couple of more days for Thomas or Arno to comment though.
> 
> My main question is: who will maintain these files after they are in
> (e.g. regularly test this configuration and post patches to fix any breakage)?

Well, both FreeBSD and DragonFly are officially supported platforms.
They both utilize FreeBSD ports which supports the last 5 releases and
the development release of GCC.  Additionally it features 2-3 versions
that specifically build GNAT.  So it is built continuously and breakage
will be found.

In all likelihood, I would be the first to discover the breakage and
also the most likely to submit the patch.  This covers all three targets
(both FreeBSD and the one DragonFly).

By the way, I am not aware of "official" build testing on the two
existing FreeBSD configurations, so in any case there is no regression.

Jonathan Wakely told me about gcc build farms -- I'd like to get a
continuous, automated DragonFly test build going as well.

John

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  8:25     ` John Marino
@ 2015-06-03  9:14       ` Arnaud Charlet
  2015-06-04 18:24         ` John Marino
  0 siblings, 1 reply; 12+ messages in thread
From: Arnaud Charlet @ 2015-06-03  9:14 UTC (permalink / raw)
  To: John Marino; +Cc: Eric Botcazou, gcc-patches, Thomas Quinot

> Okay, so that means the Makefile.in patch needs changing in two ways:
> 1.  Don't remove TOOL_TARGET_PAIRS lines from two FreeBSD targets
> 2.  Add TOOL_TARGET_PAIRS line to new DragonFly target.

Right.

> Is a new submission necessary or can this be handled by committer?

Preferably yes.

> A new submission will take me a few days because I'm traveling ATM.

No problem.

> In all likelihood, I would be the first to discover the breakage and
> also the most likely to submit the patch.  This covers all three targets
> (both FreeBSD and the one DragonFly).

OK, as long as this happens and the files do not bitrot, that's fine with me.
What I want to avoid is a one time submit and no follow ups afterwards, and
files which no longer work after some time, with nobody bothering fixing
them.

Arno

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  7:30 ` Eric Botcazou
  2015-06-03  7:33   ` Arnaud Charlet
@ 2015-06-03  9:41   ` Thomas Quinot
  2015-06-03 10:46     ` John Marino
  1 sibling, 1 reply; 12+ messages in thread
From: Thomas Quinot @ 2015-06-03  9:41 UTC (permalink / raw)
  To: Eric Botcazou, Arnaud Charlet; +Cc: John Marino, gcc-patches

* Eric Botcazou, 2015-06-03 :

> > Note 2) I removed reference to FreeBSD 6 and earlier.  These platforms
> > have been EOL for years (FreeBSD 8 is EOL in 4 weeks)
> > 
> > Note 3) FreeBSD should have switched to use errno years ago, this patch
> > does that now.
> > 
> > Note 4) For all BSD except DragonFly (which doesn't support i386
> > anymore), the GCC_UNWINDER is specified for i386 platforms.  It wasn't
> > specified before.
> > 
> > Note 5) All the ce/cxa/cxg tests that failed on i386-FreeBSD are related
> > to the 53-bit float mantissa issue on FreeBSD.  This is resolved by my
> > GNAT-AUX repository changes so the tests pass without compromising other
> > compilers, but those patches are out of scope of this set.
> 
> I'm not a specialist of FreeBSD so Thomas is Cced.  The original message is:
>   https://gcc.gnu.org/ml/gcc-patches/2015-05/msg02830.html

Patch looks good to me. The story with floats is that on FreeBSD, the
i386 FPU is set to 53-bit floats, but the GNAT runtime library always
issues a "finit" instruction to reset it to full precision, so we need
to reset TARGET_96_ROUND_53_LONG_DOUBLE to 0.
 
* Arnaud Charlet, 2015-06-03 :

> > In all likelihood, I would be the first to discover the breakage and
> > also the most likely to submit the patch.  This covers all three targets
> > (both FreeBSD and the one DragonFly).
> 
> OK, as long as this happens and the files do not bitrot, that's fine with me.
> What I want to avoid is a one time submit and no follow ups afterwards, and
> files which no longer work after some time, with nobody bothering fixing
> them.

John has been actively maintaining these changes for the past few years,
so I'm confident these files won't bitrot.

-- 
Thomas Quinot, Ph.D. ** quinot@adacore.com ** Senior Software Engineer
               AdaCore -- Paris, France -- New York, USA

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  9:41   ` Thomas Quinot
@ 2015-06-03 10:46     ` John Marino
  2015-06-03 11:17       ` Thomas Quinot
  0 siblings, 1 reply; 12+ messages in thread
From: John Marino @ 2015-06-03 10:46 UTC (permalink / raw)
  To: Thomas Quinot, Eric Botcazou, Arnaud Charlet; +Cc: gcc-patches

On 6/3/2015 11:39, Thomas Quinot wrote:
> Patch looks good to me. The story with floats is that on FreeBSD, the
> i386 FPU is set to 53-bit floats, but the GNAT runtime library always
> issues a "finit" instruction to reset it to full precision, so we need
> to reset TARGET_96_ROUND_53_LONG_DOUBLE to 0.

I have this fixed in an interesting way on gnat-aux.  I found that
setting TARGET_96_ROUND_53_LONG_DOUBLE affects other front ends, so you
have to choose which one you want to be correct, GNAT or the C (or
whatever, can't remember which ones were affected now)

My solution was to create two common backends, one for gnat and one for
the others.  An example of the main patch is here:

https://raw.githubusercontent.com/jrmarino/draco/master/misc/flux5/patch-gcc_Makefile.in

(note the new s-modes-ada target)

and then this patch is needed:

https://raw.githubusercontent.com/jrmarino/draco/master/misc/flux5/patch-gcc_ada_gcc-interface_Make-lang.in


With those modifications, all the ACATS tests pass on i386 and the other
front ends work as expected.

I don't know if such a modification would ever be considered for GCC but
I've been running it for a couple of years with no reported problems.

John

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03 10:46     ` John Marino
@ 2015-06-03 11:17       ` Thomas Quinot
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Quinot @ 2015-06-03 11:17 UTC (permalink / raw)
  To: John Marino; +Cc: Eric Botcazou, Arnaud Charlet, gcc-patches

* John Marino, 2015-06-03 :

> I have this fixed in an interesting way on gnat-aux.  I found that
> setting TARGET_96_ROUND_53_LONG_DOUBLE affects other front ends, so you
> have to choose which one you want to be correct, GNAT or the C (or
> whatever, can't remember which ones were affected now)

Right.

> My solution was to create two common backends, one for gnat and one for
> the others.  An example of the main patch is here:
> 
> https://raw.githubusercontent.com/jrmarino/draco/master/misc/flux5/patch-gcc_Makefile.in
> 
> (note the new s-modes-ada target)
> 
> and then this patch is needed:
> 
> https://raw.githubusercontent.com/jrmarino/draco/master/misc/flux5/patch-gcc_ada_gcc-interface_Make-lang.in
> 
> 
> With those modifications, all the ACATS tests pass on i386 and the other
> front ends work as expected.

Interesting approach. However if we aim for integration in GCC, then
maybe a more straightforward approach (replacing the macro with a
variable that would be initialized by some back-end-specific startup
routine?) is in order.

-- 
Thomas Quinot, Ph.D. ** quinot@adacore.com ** Senior Software Engineer
               AdaCore -- Paris, France -- New York, USA

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-03  9:14       ` Arnaud Charlet
@ 2015-06-04 18:24         ` John Marino
  2015-06-04 21:04           ` Arnaud Charlet
  2015-06-05 13:08           ` Arnaud Charlet
  0 siblings, 2 replies; 12+ messages in thread
From: John Marino @ 2015-06-04 18:24 UTC (permalink / raw)
  To: Arnaud Charlet; +Cc: Eric Botcazou, gcc-patches, Thomas Quinot

On 6/3/2015 11:03, Arnaud Charlet wrote:
>> Is a new submission necessary or can this be handled by committer? 
> Preferably yes. 
>> A new submission will take me a few days because I'm traveling ATM.

There was a significant amount of bitrot.  Apparently right after I
submitted the patch, many macros were adjusted by Adacore hitting the
same files and copyrights as I did.  I updated the patch set by hand and
tested it against the 31 may snapshot.  I also fixed the
TOOLS_TARGET_PAIRS issue of course.  same URL:

http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff

I also updated the suggested commit message as Eric suggested:

http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt

Hopefully this patch isn't already bitrotted!

John

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-04 18:24         ` John Marino
@ 2015-06-04 21:04           ` Arnaud Charlet
       [not found]             ` <5570AE5B.9090804@marino.st>
  2015-06-05 13:08           ` Arnaud Charlet
  1 sibling, 1 reply; 12+ messages in thread
From: Arnaud Charlet @ 2015-06-04 21:04 UTC (permalink / raw)
  To: John Marino; +Cc: Eric Botcazou, gcc-patches, Thomas Quinot

> There was a significant amount of bitrot.  Apparently right after I
> submitted the patch, many macros were adjusted by Adacore hitting the
> same files and copyrights as I did.  I updated the patch set by hand and
> tested it against the 31 may snapshot.  I also fixed the
> TOOLS_TARGET_PAIRS issue of course.  same URL:
> 
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff
> 
> I also updated the suggested commit message as Eric suggested:
> 
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt
> 
> Hopefully this patch isn't already bitrotted!

It would help the review if you could attach your patch and changelog
in your email.

Arno

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
  2015-06-04 18:24         ` John Marino
  2015-06-04 21:04           ` Arnaud Charlet
@ 2015-06-05 13:08           ` Arnaud Charlet
  1 sibling, 0 replies; 12+ messages in thread
From: Arnaud Charlet @ 2015-06-05 13:08 UTC (permalink / raw)
  To: John Marino; +Cc: Eric Botcazou, gcc-patches, Thomas Quinot

Patch is OK.

Arno

>>> Is a new submission necessary or can this be handled by committer?
>> Preferably yes. 
>>> A new submission will take me a few days because I'm traveling ATM.
> 
> There was a significant amount of bitrot.  Apparently right after I
> submitted the patch, many macros were adjusted by Adacore hitting the
> same files and copyrights as I did.  I updated the patch set by hand and
> tested it against the 31 may snapshot.  I also fixed the
> TOOLS_TARGET_PAIRS issue of course.  same URL:
> 
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.diff
> 
> I also updated the suggested commit message as Eric suggested:
> 
> http://leaf.dragonflybsd.org/~marino/freebsd/gnat-dragonfly-support.msg.txt
> 
> Hopefully this patch isn't already bitrotted!
> 
> John
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [patch] Implement Ada support for DragonFly, improve it for FreeBSD
       [not found]             ` <5570AE5B.9090804@marino.st>
@ 2015-06-08  7:31               ` Eric Botcazou
  0 siblings, 0 replies; 12+ messages in thread
From: Eric Botcazou @ 2015-06-08  7:31 UTC (permalink / raw)
  To: John Marino; +Cc: gcc-patches, Arnaud Charlet, Thomas Quinot

> Okay, I've attached them.  I hope it helps!

Thanks.  The patch has been installed on the mainline.

-- 
Eric Botcazou

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-06-08  7:29 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-29 23:36 [patch] Implement Ada support for DragonFly, improve it for FreeBSD John Marino
2015-06-03  7:30 ` Eric Botcazou
2015-06-03  7:33   ` Arnaud Charlet
2015-06-03  8:25     ` John Marino
2015-06-03  9:14       ` Arnaud Charlet
2015-06-04 18:24         ` John Marino
2015-06-04 21:04           ` Arnaud Charlet
     [not found]             ` <5570AE5B.9090804@marino.st>
2015-06-08  7:31               ` Eric Botcazou
2015-06-05 13:08           ` Arnaud Charlet
2015-06-03  9:41   ` Thomas Quinot
2015-06-03 10:46     ` John Marino
2015-06-03 11:17       ` Thomas Quinot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).