Makefile.rtl: Add s-multip.
authorVincent Celier <celier@adacore.com>
Mon, 11 Oct 2010 07:14:08 +0000 (07:14 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 11 Oct 2010 07:14:08 +0000 (09:14 +0200)
2010-10-11  Vincent Celier  <celier@adacore.com>

* Makefile.rtl: Add s-multip.
* adaint.c: New function __gnat_number_of_cpus, implemented for Linux,
defaulting to 1 for other platforms.
* adaint.h: New function __gnat_number_of_cpus.
* impunit.adb (Non_Imp_File_Names_12): New file list for Ada 2012,
with a single component "s-multip".
* impunit.ads (Kind_Of_Unit): New enumerated value Ada_12_Unit for Ada
2012.
* rtsfind.ads (RTU_Id): New enumerated value System_Multiprocessors
* s-multip.ads, s-multip.adb: New Ada 2012 package.
* sem_ch10.adb (Analyze_With_Clause): Check also Ada 2012 units.

From-SVN: r165274

gcc/ada/ChangeLog
gcc/ada/Makefile.rtl
gcc/ada/adaint.c
gcc/ada/adaint.h
gcc/ada/impunit.adb
gcc/ada/impunit.ads
gcc/ada/rtsfind.ads
gcc/ada/s-multip.adb [new file with mode: 0644]
gcc/ada/s-multip.ads [new file with mode: 0644]
gcc/ada/sem_ch10.adb

index 0959150..8629995 100644 (file)
@@ -1,3 +1,17 @@
+2010-10-11  Vincent Celier  <celier@adacore.com>
+
+       * Makefile.rtl: Add s-multip.
+       * adaint.c: New function __gnat_number_of_cpus, implemented for Linux,
+       defaulting to 1 for other platforms.
+       * adaint.h: New function __gnat_number_of_cpus.
+       * impunit.adb (Non_Imp_File_Names_12): New file list for Ada 2012,
+       with a single component "s-multip".
+       * impunit.ads (Kind_Of_Unit): New enumerated value Ada_12_Unit for Ada
+       2012.
+       * rtsfind.ads (RTU_Id): New enumerated value System_Multiprocessors
+       * s-multip.ads, s-multip.adb: New Ada 2012 package.
+       * sem_ch10.adb (Analyze_With_Clause): Check also Ada 2012 units.
+
 2010-10-11  Javier Miranda  <miranda@adacore.com>
 
        * a-textio.adb: Move new implementation of Get_Line to a subunit.
index b913d2f..856dd49 100644 (file)
@@ -504,6 +504,7 @@ GNATRTL_NONTASKING_OBJS= \
   s-mastop$(objext) \
   s-memcop$(objext) \
   s-memory$(objext) \
+  s-multip$(objext) \
   s-os_lib$(objext) \
   s-osprim$(objext) \
   s-pack03$(objext) \
index bfb58e0..a012ab6 100644 (file)
@@ -2358,6 +2358,18 @@ __gnat_dup2 (int oldfd, int newfd)
 #endif
 }
 
+int
+__gnat_number_of_cpus (void)
+{
+  int cores = 1;
+
+#if defined (linux)
+  cores = (int)sysconf(_SC_NPROCESSORS_ONLN);
+#endif
+
+  return cores;
+}
+
 /* WIN32 code to implement a wait call that wait for any child process.  */
 
 #if defined (_WIN32) && !defined (RTX)
index a43f9b2..999c024 100644 (file)
@@ -235,6 +235,8 @@ extern int    __gnat_set_close_on_exec                 (int, int);
 extern int    __gnat_dup                          (int);
 extern int    __gnat_dup2                         (int, int);
 
+extern int    __gnat_number_of_cpus                (void);
+
 extern void   __gnat_os_filename                   (char *, char *, char *,
                                                    int *, char *, int *);
 #if defined (linux)
index 2b6f319..6b427f0 100644 (file)
@@ -497,6 +497,15 @@ package body Impunit is
      "g-zspche",    -- GNAT.Wide_Wide_Spelling_Checker
      "g-zstspl");   -- GNAT.Wide_Wide_String_Split
 
+   --------------------
+   -- Ada 2012 Units --
+   --------------------
+
+   --  The following units should be used only in Ada 05 mode
+
+   Non_Imp_File_Names_12 : constant File_List := (
+     0 => "s-multip");   -- System.Mutiprocessors
+
    -----------------------
    -- Alternative Units --
    -----------------------
@@ -596,7 +605,7 @@ package body Impunit is
          end if;
       end loop;
 
-      --  See if name is in 05 list
+      --  See if name is in 2005 list
 
       for J in Non_Imp_File_Names_05'Range loop
          if Name_Buffer (1 .. 8) = Non_Imp_File_Names_05 (J) then
@@ -604,6 +613,14 @@ package body Impunit is
          end if;
       end loop;
 
+      --  See if name is in 2012 list
+
+      for J in Non_Imp_File_Names_12'Range loop
+         if Name_Buffer (1 .. 8) = Non_Imp_File_Names_12 (J) then
+            return Ada_12_Unit;
+         end if;
+      end loop;
+
       --  Only remaining special possibilities are children of System.RPC and
       --  System.Garlic and special files of the form System.Aux...
 
index f342b79..5eb66e9 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 2000-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 2000-2010, 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- --
@@ -48,10 +48,15 @@ package Impunit is
       --  in both Ada 95 mode and Ada 05 mode. Note that in Ada 83 mode, no
       --  child units are allowed, so you can't even name such a unit.
 
-      Ada_05_Unit);
-   --  This unit is defined in the Ada 05 RM. Withing this unit from a
-   --  Ada 95 mode program will generate a warning (again, strictly speaking
-   --  this should be an error, but that seems over-strenuous).
+      Ada_05_Unit,
+      --  This unit is defined in the Ada 2005 RM. Withing this unit from a
+      --  Ada 95 mode program will generate a warning (again, strictly speaking
+      --  this should be an error, but that seems over-strenuous).
+
+      Ada_12_Unit);
+      --  This unit is defined in the Ada 2012 RM. Withing this unit from a Ada
+      --  95 mode or Ada 2005 program will generate a warning (again, strictly
+      --  speaking this should be an error, but that seems over-strenuous).
 
    function Get_Kind_Of_Unit (U : Unit_Number_Type) return Kind_Of_Unit;
    --  Given the unit number of a unit, this function determines the type
index ca61bd1..33621f5 100644 (file)
@@ -265,6 +265,7 @@ package Rtsfind is
       System_Machine_Code,
       System_Mantissa,
       System_Memcop,
+      System_Multiprocessors,
       System_Pack_03,
       System_Pack_05,
       System_Pack_06,
diff --git a/gcc/ada/s-multip.adb b/gcc/ada/s-multip.adb
new file mode 100644 (file)
index 0000000..ce6c9dc
--- /dev/null
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--               S Y S T E M . M U L T I P R O C E S S O R S                --
+--                                                                          --
+--                                  B o d y                                 --
+--                                                                          --
+--           Copyright (C) 2010, 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/>.                                          --
+--                                                                          --
+------------------------------------------------------------------------------
+
+with Interfaces.C; use Interfaces.C;
+
+package body System.Multiprocessors is
+   function Gnat_Number_Of_CPUs return int;
+   pragma Import (C, Gnat_Number_Of_CPUs, "__gnat_number_of_cpus");
+
+   --------------------
+   -- Number_Of_CPUs --
+   --------------------
+
+   function Number_Of_CPUs return CPU is
+   begin
+      return CPU (Gnat_Number_Of_CPUs);
+   end Number_Of_CPUs;
+
+end System.Multiprocessors;
diff --git a/gcc/ada/s-multip.ads b/gcc/ada/s-multip.ads
new file mode 100644 (file)
index 0000000..33cb01b
--- /dev/null
@@ -0,0 +1,44 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--               S Y S T E M . M U L T I P R O C E S S O R S                --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--           Copyright (C) 2010, 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/>.                                          --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This unit may be used directly from an application program by providing
+--  an appropriate WITH, and the interface can be expected to remain stable.
+
+package System.Multiprocessors is
+   pragma Preelaborate (Multiprocessors);
+
+   type CPU_Range is range 0 .. 2 ** 16 - 1;
+
+   subtype CPU is CPU_Range range 1 .. CPU_Range'Last;
+
+   Not_A_Specific_CPU : constant CPU_Range := 0;
+
+   function Number_Of_CPUs return CPU;
+   --  Number of available CPUs
+
+end System.Multiprocessors;
index 50bbcc5..804bbf3 100644 (file)
@@ -2457,6 +2457,12 @@ package body Sem_Ch10 is
                  and then Warn_On_Ada_2005_Compatibility
                then
                   Error_Msg_N ("& is an Ada 2005 unit?", Name (N));
+
+               elsif U_Kind = Ada_12_Unit
+                 and then Ada_Version < Ada_12
+                 and then Warn_On_Ada_2012_Compatibility
+               then
+                  Error_Msg_N ("& is an Ada 2012 unit?", Name (N));
                end if;
             end;
          end if;