[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 Aug 2011 08:13:21 +0000 (10:13 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 2 Aug 2011 08:13:21 +0000 (10:13 +0200)
2011-08-02  Javier Miranda  <miranda@adacore.com>

* sem_ch6.adb (Can_Override_Operator): New function.
(Verify_Overriding_Indicator): Add missing code to check overriding
indicator in operators. Fixes regression.
(Check_Overriding_Indicator): Minor reformating after replacing the
code that evaluates if the subprogram can override an operator by
invocations to the above new function.
* einfo.adb
(Write_Field26_Name): Add missing code to ensure that, following
the documentation in einfo.ads, this field is not shown as attribute
"Static_Initialization" on non-dispatching functions.

2011-08-02  Jose Ruiz  <ruiz@adacore.com>

* sem_res.adb (Resolve_Call): A call to
Ada.Real_Time.Timing_Events.Set_Handler violates restriction
No_Relative_Delay (AI-0211) only when it sets a relative timing event,
i.e., when the second parameter is of type Time_Span.

2011-08-02  Vincent Celier  <celier@adacore.com>

* make.adb (Gnatmake): use <library dir>/lib<library name>.a to link
with an archive instead of -L<library dir> -l<library name>.

2011-08-02  Ed Schonberg  <schonberg@adacore.com>

* sem_ch8.adb (Analyze_Use_Type): If the clause is being re-analyzed,
mark the base types In_Use in addition to making the operations
use_visible.

2011-08-02  Ed Falis  <falis@adacore.com>

* init.c: add and setup __gnat_signal_mask for the exception signals
* s-inmaop-vxworks.adb: new file.
* s-intman-vxworks.adb: remove unnecessary initializations and
simplify remaining
* s-intman-vxworks.ads: remove unnecessary variable
* s-taprop-vxworks.adb: simplify signal initialization

From-SVN: r177092

gcc/ada/ChangeLog
gcc/ada/einfo.adb
gcc/ada/init.c
gcc/ada/make.adb
gcc/ada/s-inmaop-vxworks.adb [new file with mode: 0755]
gcc/ada/s-intman-vxworks.adb
gcc/ada/s-intman-vxworks.ads
gcc/ada/s-taprop-vxworks.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_ch8.adb
gcc/ada/sem_res.adb

index ae47e20e5a1cfe97d9fd50c7cb6b28119b72fae6..5155a79c3bf28ef8e42187511ddeb51a2451bc12 100644 (file)
@@ -1,3 +1,43 @@
+2011-08-02  Javier Miranda  <miranda@adacore.com>
+
+       * sem_ch6.adb (Can_Override_Operator): New function.
+       (Verify_Overriding_Indicator): Add missing code to check overriding
+       indicator in operators. Fixes regression.
+       (Check_Overriding_Indicator): Minor reformating after replacing the
+       code that evaluates if the subprogram can override an operator by
+       invocations to the above new function.
+       * einfo.adb
+       (Write_Field26_Name): Add missing code to ensure that, following
+       the documentation in einfo.ads, this field is not shown as attribute
+       "Static_Initialization" on non-dispatching functions.
+
+2011-08-02  Jose Ruiz  <ruiz@adacore.com>
+
+       * sem_res.adb (Resolve_Call): A call to
+       Ada.Real_Time.Timing_Events.Set_Handler violates restriction
+       No_Relative_Delay (AI-0211) only when it sets a relative timing event,
+       i.e., when the second parameter is of type Time_Span.
+
+2011-08-02  Vincent Celier  <celier@adacore.com>
+
+       * make.adb (Gnatmake): use <library dir>/lib<library name>.a to link
+       with an archive instead of -L<library dir> -l<library name>.
+
+2011-08-02  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch8.adb (Analyze_Use_Type): If the clause is being re-analyzed,
+       mark the base types In_Use in addition to making the operations
+       use_visible.
+
+2011-08-02  Ed Falis  <falis@adacore.com>
+
+       * init.c: add and setup __gnat_signal_mask for the exception signals
+       * s-inmaop-vxworks.adb: new file.
+       * s-intman-vxworks.adb: remove unnecessary initializations and
+       simplify remaining
+       * s-intman-vxworks.ads: remove unnecessary variable
+       * s-taprop-vxworks.adb: simplify signal initialization
+
 2011-08-02  Robert Dewar  <dewar@adacore.com>
 
        * sem_ch8.adb: Minor code reorganization, comment updates.
index 8d65e9e751399e5950e41700394d2159e8628db4..499db134ec8be74ec1ac6180791dcdeab38ab17e 100644 (file)
@@ -8497,10 +8497,12 @@ package body Einfo is
 
          when E_Procedure                                  |
               E_Function                                   =>
-            if Is_Dispatching_Operation (Id) then
-               Write_Str ("Overridden_Operation");
-            else
+            if Ekind (Id) = E_Procedure
+              and then not Is_Dispatching_Operation (Id)
+            then
                Write_Str ("Static_Initialization");
+            else
+               Write_Str ("Overridden_Operation");
             end if;
 
          when E_Record_Type                                |
index 52d775586d2aa3073a91210eb59992f1e2218f0e..53d72d9dbe9c97674e666ed6b722b54d3da9b945 100644 (file)
@@ -1975,20 +1975,23 @@ __gnat_map_signal (int sig)
 /* Tasking and Non-tasking signal handler.  Map SIGnal to Ada exception
    propagation after the required low level adjustments.  */
 
+sigset_t __gnat_signal_mask;
+
+  /* VxWorks will always mask out the signal during the signal handler and
+     will reenable it on a longjmp.  GNAT does not generate a longjmp to
+     return from a signal handler so exception signals will still be masked
+     unless we unmask it. __gnat_signal mask tells sigaction to block the
+     exception signals and sigprocmask to unblock them. */
+
 void
 __gnat_error_handler (int sig,
                      void *si ATTRIBUTE_UNUSED,
                      struct sigcontext *sc ATTRIBUTE_UNUSED)
 {
-  sigset_t mask;
 
-  /* VxWorks will always mask out the signal during the signal handler and
-     will reenable it on a longjmp.  GNAT does not generate a longjmp to
-     return from a signal handler so the signal will still be masked unless
-     we unmask it.  */
-  sigprocmask (SIG_SETMASK, NULL, &mask);
-  sigdelset (&mask, sig);
-  sigprocmask (SIG_SETMASK, &mask, NULL);
+  /* This routine handles the exception signals for all tasks */
+
+  sigprocmask (SIG_UNBLOCK, &__gnat_signal_mask, NULL);
 
   __gnat_map_signal (sig);
 }
@@ -2000,14 +2003,24 @@ __gnat_install_handler (void)
 
   /* Setup signal handler to map synchronous signals to appropriate
      exceptions.  Make sure that the handler isn't interrupted by another
-     signal that might cause a scheduling event!  */
+     signal that might cause a scheduling event! This routine is called
+     only once, for the environment task. Other tasks are set up in the
+     System.Interrupt_Manager package. */
+
+  sigemptyset (&__gnat_signal_mask);
+  sigaddset (SIGBUS, &__gnat_signal_mask);
+  sigaddset (SIGFPE, &__gnat_signal_mask);
+  sigaddset (SIGILL, &__gnat_signal_mask);
+  sigaddset (SIGSEGV, &__gnat_signal_mask);
 
   act.sa_handler = __gnat_error_handler;
   act.sa_flags = SA_SIGINFO | SA_ONSTACK;
-  sigemptyset (&act.sa_mask);
+  act.sa_mask = __gnat_signal_mask;
+
+  /* For VxWorks, unconditionally install the exception signal handlers, since
+     pragma Interrupt_State applies to vectored hardware interrupts, not
+     signals.  */
 
-  /* For VxWorks, install all signal handlers, since pragma Interrupt_State
-     applies to vectored hardware interrupts, not signals.  */
   sigaction (SIGFPE,  &act, NULL);
   sigaction (SIGILL,  &act, NULL);
   sigaction (SIGSEGV, &act, NULL);
@@ -2027,6 +2040,7 @@ __gnat_init_float (void)
      below have no effect.  */
 #if defined (_ARCH_PPC) && !defined (_SOFT_FLOAT) && !defined (VTHREADS)
 #if defined (__SPE__)
+  /* VxWorks 6 */
   {
      const unsigned long spefscr_mask = 0xfffffff3;
      unsigned long spefscr;
@@ -2035,6 +2049,7 @@ __gnat_init_float (void)
      asm ("mtspr 512, %0\n\tisync" : : "r" (spefscr));
   }
 #else
+  /* all except VxWorks 653 and MILS */
   asm ("mtfsb0 25");
   asm ("mtfsb0 26");
 #endif
@@ -2042,7 +2057,7 @@ __gnat_init_float (void)
 
 #if (defined (__i386__) || defined (i386)) && !defined (VTHREADS)
   /* This is used to properly initialize the FPU on an x86 for each
-     process thread.  */
+     process thread. For all except VxWorks 653 */
   asm ("finit");
 #endif
 
index cc8cb36a921a9cb287a2cdc39bf9ed290b04f454..6051c794d0ee9c65d05491a9f4a39306472c7b7c 100644 (file)
@@ -6066,24 +6066,41 @@ package body Make is
                      end loop;
 
                      for Index in 1 .. Library_Projs.Last loop
+                        if
+                          Library_Projs.Table (Index).Library_Kind = Static
+                        then
+                           Linker_Switches.Increment_Last;
+                           Linker_Switches.Table (Linker_Switches.Last) :=
+                             new String'
+                               (Get_Name_String
+                                    (Library_Projs.Table (Index).
+                                       Library_Dir.Display_Name) &
+                                Directory_Separator &
+                                "lib" &
+                                Get_Name_String
+                                    (Library_Projs.Table (Index).
+                                     Library_Name) &
+                                ".a");
 
-                        --  Add the -L switch
-
-                        Linker_Switches.Increment_Last;
-                        Linker_Switches.Table (Linker_Switches.Last) :=
-                          new String'("-L" &
-                                      Get_Name_String
-                                        (Library_Projs.Table (Index).
-                                            Library_Dir.Display_Name));
-
-                        --  Add the -l switch
-
-                        Linker_Switches.Increment_Last;
-                        Linker_Switches.Table (Linker_Switches.Last) :=
-                          new String'("-l" &
-                                      Get_Name_String
-                                        (Library_Projs.Table (Index).
-                                           Library_Name));
+                        else
+                           --  Add the -L switch
+
+                           Linker_Switches.Increment_Last;
+                           Linker_Switches.Table (Linker_Switches.Last) :=
+                             new String'("-L" &
+                               Get_Name_String
+                                 (Library_Projs.Table (Index).
+                                    Library_Dir.Display_Name));
+
+                           --  Add the -l switch
+
+                           Linker_Switches.Increment_Last;
+                           Linker_Switches.Table (Linker_Switches.Last) :=
+                             new String'("-l" &
+                               Get_Name_String
+                                 (Library_Projs.Table (Index).
+                                    Library_Name));
+                        end if;
                      end loop;
                   end if;
 
diff --git a/gcc/ada/s-inmaop-vxworks.adb b/gcc/ada/s-inmaop-vxworks.adb
new file mode 100755 (executable)
index 0000000..fe3b741
--- /dev/null
@@ -0,0 +1,255 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                  GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS                --
+--                                                                          --
+--                  SYSTEM.INTERRUPT_MANAGEMENT.OPERATIONS                  --
+--                                                                          --
+--                                  B o d y                                 --
+--                                                                          --
+--             Copyright (C) 1991-1994, Florida State University            --
+--                     Copyright (C) 1995-2010, AdaCore                     --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNARL was developed by the GNARL team at Florida State University.       --
+-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is a VxWorks version of this package. Many operations are null as this
+--  package supports the use of Ada interrupt handling facilities for signals,
+--  while those facilities are used for hardware interrupts on these targets.
+
+with Ada.Exceptions;
+
+with Interfaces.C;
+
+with System.OS_Interface;
+
+package body System.Interrupt_Management.Operations is
+
+   use Ada.Exceptions;
+   use Interfaces.C;
+   use System.OS_Interface;
+
+   ----------------------------
+   -- Thread_Block_Interrupt --
+   ----------------------------
+
+   procedure Thread_Block_Interrupt
+     (Interrupt : Interrupt_ID)
+   is
+      pragma Unreferenced (Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Thread_Block_Interrupt unimplemented");
+   end Thread_Block_Interrupt;
+
+   ------------------------------
+   -- Thread_Unblock_Interrupt --
+   ------------------------------
+
+   procedure Thread_Unblock_Interrupt
+     (Interrupt : Interrupt_ID)
+   is
+      pragma Unreferenced (Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Thread_Unblock_Interrupt unimplemented");
+   end Thread_Unblock_Interrupt;
+
+   ------------------------
+   -- Set_Interrupt_Mask --
+   ------------------------
+
+   procedure Set_Interrupt_Mask (Mask : access Interrupt_Mask) is
+      pragma Unreferenced (Mask);
+   begin
+      null;
+   end Set_Interrupt_Mask;
+
+   procedure Set_Interrupt_Mask
+     (Mask  : access Interrupt_Mask;
+      OMask : access Interrupt_Mask)
+   is
+      pragma Unreferenced (Mask, OMask);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Set_Interrupt_Mask unimplemented");
+   end Set_Interrupt_Mask;
+
+   ------------------------
+   -- Get_Interrupt_Mask --
+   ------------------------
+
+   procedure Get_Interrupt_Mask (Mask : access Interrupt_Mask) is
+      pragma Unreferenced (Mask);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Get_Interrupt_Mask unimplemented");
+   end Get_Interrupt_Mask;
+
+   --------------------
+   -- Interrupt_Wait --
+   --------------------
+
+   function Interrupt_Wait
+     (Mask : access Interrupt_Mask) return Interrupt_ID
+   is
+      pragma Unreferenced (Mask);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Interrupt_Wait unimplemented");
+      return 0;
+   end Interrupt_Wait;
+
+   ----------------------------
+   -- Install_Default_Action --
+   ----------------------------
+
+   procedure Install_Default_Action (Interrupt : Interrupt_ID) is
+      pragma Unreferenced (Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Install_Default_Action unimplemented");
+   end Install_Default_Action;
+
+   ---------------------------
+   -- Install_Ignore_Action --
+   ---------------------------
+
+   procedure Install_Ignore_Action (Interrupt : Interrupt_ID) is
+      pragma Unreferenced (Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Install_Ignore_Action unimplemented");
+   end Install_Ignore_Action;
+
+   -------------------------
+   -- Fill_Interrupt_Mask --
+   -------------------------
+
+   procedure Fill_Interrupt_Mask (Mask : access Interrupt_Mask) is
+      pragma Unreferenced (Mask);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Fill_Interrupt_Mask unimplemented");
+   end Fill_Interrupt_Mask;
+
+   --------------------------
+   -- Empty_Interrupt_Mask --
+   --------------------------
+
+   procedure Empty_Interrupt_Mask (Mask : access Interrupt_Mask) is
+      pragma Unreferenced (Mask);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Empty_Interrupt_Mask unimplemented");
+   end Empty_Interrupt_Mask;
+
+   ---------------------------
+   -- Add_To_Interrupt_Mask --
+   ---------------------------
+
+   procedure Add_To_Interrupt_Mask
+     (Mask      : access Interrupt_Mask;
+      Interrupt : Interrupt_ID)
+   is
+      pragma Unreferenced (Mask, Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Add_To_Interrupt_Mask unimplemented");
+   end Add_To_Interrupt_Mask;
+
+   --------------------------------
+   -- Delete_From_Interrupt_Mask --
+   --------------------------------
+
+   procedure Delete_From_Interrupt_Mask
+     (Mask      : access Interrupt_Mask;
+      Interrupt : Interrupt_ID)
+   is
+      pragma Unreferenced (Mask, Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Delete_From_Interrupt_Mask unimplemented");
+   end Delete_From_Interrupt_Mask;
+
+   ---------------
+   -- Is_Member --
+   ---------------
+
+   function Is_Member
+     (Mask      : access Interrupt_Mask;
+      Interrupt : Interrupt_ID) return Boolean
+   is
+      pragma Unreferenced (Mask, Interrupt);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Is_Member unimplemented");
+      return False;
+   end Is_Member;
+
+   -------------------------
+   -- Copy_Interrupt_Mask --
+   -------------------------
+
+   procedure Copy_Interrupt_Mask
+     (X : out Interrupt_Mask;
+      Y : Interrupt_Mask) is
+      pragma Unreferenced (X, Y);
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Copy_Interrupt_Mask unimplemented");
+   end Copy_Interrupt_Mask;
+
+   ----------------------------
+   -- Interrupt_Self_Process --
+   ----------------------------
+
+   procedure Interrupt_Self_Process (Interrupt : Interrupt_ID) is
+      Result : Interfaces.C.int;
+   begin
+      Result := kill (getpid, Signal (Interrupt));
+      pragma Assert (Result = 0);
+   end Interrupt_Self_Process;
+
+   --------------------------
+   -- Setup_Interrupt_Mask --
+   --------------------------
+
+   procedure Setup_Interrupt_Mask is
+   begin
+      Raise_Exception
+        (Program_Error'Identity,
+         "Setup_Interrupt_Mask unimplemented");
+   end Setup_Interrupt_Mask;
+
+end System.Interrupt_Management.Operations;
index dacc418f05ceda6b483096de6e085d421c93b761..853d746d137dc027e74ac79e88e284a12a7c1551 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                  B o d y                                 --
 --                                                                          --
---          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-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- --
@@ -31,9 +31,8 @@
 
 --  This is the VxWorks version of this package
 
---  Make a careful study of all signals available under the OS, to see which
---  need to be reserved, kept always unmasked, or kept always unmasked. Be on
---  the lookout for special signals that may be used by the thread library.
+--  It is simpler than other versions because the Ada interrupt handling
+--  mechanisms are used for hardware interrupts rather than signals.
 
 package body System.Interrupt_Management is
 
@@ -45,15 +44,21 @@ package body System.Interrupt_Management is
                          (SIGFPE, SIGILL, SIGSEGV, SIGBUS);
 
    Exception_Action : aliased struct_sigaction;
-   --  Keep this variable global so that it is initialized only once
+   --  Keep this a variable global so that it is initialized only once
+
+   Signal_Mask : aliased sigset_t;
+   pragma Import (C, Signal_Mask, "__gnat_signal_mask");
+   --  Mask indicating that all exception signals are to be masked
+   --  when a signal is propagated.
 
    procedure Notify_Exception
      (signo      : Signal;
       siginfo    : System.Address;
       sigcontext : System.Address);
    pragma Import (C, Notify_Exception, "__gnat_error_handler");
-   --  Map signal to Ada exception and raise it.  Different versions
-   --  of VxWorks need different mappings.
+   --  Map a signal to Ada exception and raise it.  Different versions
+   --  of VxWorks need different mappings. This is addressed in init.c in
+   --  __gnat_map_signal.
 
    -----------------------
    -- Local Subprograms --
@@ -62,7 +67,7 @@ package body System.Interrupt_Management is
    function State (Int : Interrupt_ID) return Character;
    pragma Import (C, State, "__gnat_get_interrupt_state");
    --  Get interrupt state. Defined in init.c The input argument is the
-   --  interrupt number, and the result is one of the following:
+   --  hardware interrupt number, and the result is one of the following:
 
    Runtime : constant Character := 'r';
    Default : constant Character := 's';
@@ -100,8 +105,6 @@ package body System.Interrupt_Management is
    --  Set to True once Initialize is called, further calls have no effect
 
    procedure Initialize is
-      mask   : aliased sigset_t;
-      Result : int;
 
    begin
       if Initialized then
@@ -115,17 +118,11 @@ package body System.Interrupt_Management is
 
       Abort_Task_Interrupt := SIGABRT;
 
+      --  Signal_Mask was initialized in __gnat_install_handler
+
       Exception_Action.sa_handler := Notify_Exception'Address;
       Exception_Action.sa_flags := SA_ONSTACK + SA_SIGINFO;
-      Result := sigemptyset (mask'Access);
-      pragma Assert (Result = 0);
-
-      for J in Exception_Signals'Range loop
-         Result := sigaddset (mask'Access, Signal (Exception_Signals (J)));
-         pragma Assert (Result = 0);
-      end loop;
-
-      Exception_Action.sa_mask := mask;
+      Exception_Action.sa_mask := Signal_Mask;
 
       --  Initialize hardware interrupt handling
 
@@ -139,15 +136,6 @@ package body System.Interrupt_Management is
          end if;
       end loop;
 
-      --  Add exception signals to the set of unmasked signals
-
-      for J in Exception_Signals'Range loop
-         Keep_Unmasked (Exception_Signals (J)) := True;
-      end loop;
-
-      --  The abort signal must also be unmasked
-
-      Keep_Unmasked (Abort_Task_Interrupt) := True;
    end Initialize;
 
 end System.Interrupt_Management;
index 5614553c77b935a76880c3f8766c36f002ede407..c86410a8695d590565912f9a7dce622ba6523075 100644 (file)
@@ -80,14 +80,6 @@ package System.Interrupt_Management is
    --  The signal that is used to implement task abort if an interrupt is used
    --  for that purpose. This is one of the reserved signals.
 
-   Keep_Unmasked : Signal_Set := (others => False);
-   --  Keep_Unmasked (I) is true iff the signal I is one that must that must
-   --  be kept unmasked at all times, except (perhaps) for short critical
-   --  sections. This includes signals that are mapped to exceptions, but may
-   --  also include interrupts (e.g. timer) that need to be kept unmasked for
-   --  other reasons. Where signal masking is per-task, the signal should be
-   --  unmasked in ALL TASKS.
-
    Reserve : Interrupt_Set := (others => False);
    --  Reserve (I) is true iff the interrupt I is one that cannot be permitted
    --  to be attached to a user handler. The possible reasons are many. For
index 3186f6fb9622aff992168fd36ff14df82bb95137..207b465c5792d5380feab418b5aaa34c6c67131c 100644 (file)
@@ -78,40 +78,34 @@ package body System.Task_Primitives.Operations is
    --  The followings are logically constants, but need to be initialized at
    --  run time.
 
-   Single_RTS_Lock : aliased RTS_Lock;
-   --  This is a lock to allow only one thread of control in the RTS at a
-   --  time; it is used to execute in mutual exclusion from all other tasks.
-   --  Used mainly in Single_Lock mode, but also to protect All_Tasks_List
-
    Environment_Task_Id : Task_Id;
    --  A variable to hold Task_Id for the environment task
 
-   Unblocked_Signal_Mask : aliased sigset_t;
-   --  The set of signals that should unblocked in all tasks
-
    --  The followings are internal configuration constants needed
 
-   Time_Slice_Val : Integer;
-   pragma Import (C, Time_Slice_Val, "__gl_time_slice_val");
+   Dispatching_Policy : Character;
+   pragma Import (C, Dispatching_Policy, "__gl_task_dispatching_policy");
+
+   Foreign_Task_Elaborated : aliased Boolean := True;
+   --  Used to identified fake tasks (i.e., non-Ada Threads)
 
    Locking_Policy : Character;
    pragma Import (C, Locking_Policy, "__gl_locking_policy");
 
-   Dispatching_Policy : Character;
-   pragma Import (C, Dispatching_Policy, "__gl_task_dispatching_policy");
-
    Mutex_Protocol : Priority_Type;
 
-   Foreign_Task_Elaborated : aliased Boolean := True;
-   --  Used to identified fake tasks (i.e., non-Ada Threads)
+   Signal_Mask : aliased sigset_t;
+   pragma Import (C, Signal_Mask, "__gnat_signal_mask");
+   --  Mask indicating that all exception signals are to be masked
+   --  when a signal is propagated.
 
-   type Set_Stack_Limit_Proc_Acc is access procedure;
-   pragma Convention (C, Set_Stack_Limit_Proc_Acc);
+   Single_RTS_Lock : aliased RTS_Lock;
+   --  This is a lock to allow only one thread of control in the RTS at a
+   --  time; it is used to execute in mutual exclusion from all other tasks.
+   --  Used mainly in Single_Lock mode, but also to protect All_Tasks_List
 
-   Set_Stack_Limit_Hook : Set_Stack_Limit_Proc_Acc;
-   pragma Import (C, Set_Stack_Limit_Hook, "__gnat_set_stack_limit_hook");
-   --  Procedure to be called when a task is created to set stack
-   --  limit.
+   Time_Slice_Val : Integer;
+   pragma Import (C, Time_Slice_Val, "__gl_time_slice_val");
 
    --------------------
    -- Local Packages --
@@ -168,6 +162,14 @@ package body System.Task_Primitives.Operations is
    --  This function returns True if the current execution is in the context
    --  of a task, and False if it is an interrupt context.
 
+   type Set_Stack_Limit_Proc_Acc is access procedure;
+   pragma Convention (C, Set_Stack_Limit_Proc_Acc);
+
+   Set_Stack_Limit_Hook : Set_Stack_Limit_Proc_Acc;
+   pragma Import (C, Set_Stack_Limit_Hook, "__gnat_set_stack_limit_hook");
+   --  Procedure to be called when a task is created to set stack
+   --  limit. Used only for VxWorks 5 and VxWorks MILS guest OS.
+
    function To_Address is
      new Ada.Unchecked_Conversion (Task_Id, System.Address);
 
@@ -180,7 +182,6 @@ package body System.Task_Primitives.Operations is
 
       Self_ID : constant Task_Id := Self;
       Old_Set : aliased sigset_t;
-
       Result : int;
       pragma Warnings (Off, Result);
 
@@ -198,12 +199,12 @@ package body System.Task_Primitives.Operations is
       then
          Self_ID.Aborting := True;
 
-         --  Make sure signals used for RTS internal purpose are unmasked
+         --  Make sure signals used for RTS internal purposes are unmasked
 
          Result :=
            pthread_sigmask
              (SIG_UNBLOCK,
-              Unblocked_Signal_Mask'Access,
+              Signal_Mask'Access,
               Old_Set'Access);
          pragma Assert (Result = 0);
 
@@ -1380,16 +1381,6 @@ package body System.Task_Primitives.Operations is
 
       end if;
 
-      Result := sigemptyset (Unblocked_Signal_Mask'Access);
-      pragma Assert (Result = 0);
-
-      for J in Interrupt_Management.Signal_ID loop
-         if System.Interrupt_Management.Keep_Unmasked (J) then
-            Result := sigaddset (Unblocked_Signal_Mask'Access, Signal (J));
-            pragma Assert (Result = 0);
-         end if;
-      end loop;
-
       --  Initialize the lock used to synchronize chain of all ATCBs
 
       Initialize_Lock (Single_RTS_Lock'Access, RTS_Lock_Level);
index af20ffaa40f772381cfd4b6f6505221818f32b75..3dc7ee8dd85a045fae83709087e42f424ce5be75 100644 (file)
@@ -128,6 +128,9 @@ package body Sem_Ch6 is
    --  If proper warnings are enabled and the subprogram contains a construct
    --  that cannot be inlined, the offending construct is flagged accordingly.
 
+   function Can_Override_Operator (Subp : Entity_Id) return Boolean;
+   --  Returns true if Subp can override a predefined operator.
+
    procedure Check_Conformance
      (New_Id                   : Entity_Id;
       Old_Id                   : Entity_Id;
@@ -2099,11 +2102,19 @@ package body Sem_Ch6 is
                   Body_Spec);
             end if;
 
-         elsif Style_Check --  ??? incorrect use of Style_Check!
+         elsif Style_Check
            and then Present (Overridden_Operation (Spec_Id))
          then
             pragma Assert (Unit_Declaration_Node (Body_Id) = N);
             Style.Missing_Overriding (N, Body_Id);
+
+         elsif Style_Check
+           and then Can_Override_Operator (Spec_Id)
+           and then not Is_Predefined_File_Name
+                          (Unit_File_Name (Get_Source_Unit (Spec_Id)))
+         then
+            pragma Assert (Unit_Declaration_Node (Body_Id) = N);
+            Style.Missing_Overriding (N, Body_Id);
          end if;
       end Verify_Overriding_Indicator;
 
@@ -4854,61 +4865,50 @@ package body Sem_Ch6 is
       --  explicit overridden operation.
 
       elsif Nkind (Subp) = N_Defining_Operator_Symbol then
-         declare
-            Typ : constant Entity_Id :=
-                    Base_Type (Etype (First_Formal (Subp)));
-
-            Can_Override : constant Boolean :=
-                             Operator_Matches_Spec (Subp, Subp)
-                               and then Scope (Subp) = Scope (Typ)
-                               and then not Is_Class_Wide_Type (Typ);
+         if Must_Not_Override (Spec) then
 
-         begin
-            if Must_Not_Override (Spec) then
+            --  If this is not a primitive or a protected subprogram, then
+            --  "not overriding" is illegal.
 
-               --  If this is not a primitive or a protected subprogram, then
-               --  "not overriding" is illegal.
+            if not Is_Primitive
+              and then Ekind (Scope (Subp)) /= E_Protected_Type
+            then
+               Error_Msg_N
+                 ("overriding indicator only allowed "
+                  & "if subprogram is primitive", Subp);
 
-               if not Is_Primitive
-                 and then Ekind (Scope (Subp)) /= E_Protected_Type
-               then
-                  Error_Msg_N
-                    ("overriding indicator only allowed "
-                     & "if subprogram is primitive", Subp);
+            elsif Can_Override_Operator (Subp) then
+               Error_Msg_NE
+                 ("subprogram& overrides predefined operator ", Spec, Subp);
+            end if;
 
-               elsif Can_Override then
-                  Error_Msg_NE
-                    ("subprogram& overrides predefined operator ", Spec, Subp);
-               end if;
+         elsif Must_Override (Spec) then
+            if No (Overridden_Operation (Subp))
+              and then not Can_Override_Operator (Subp)
+            then
+               Error_Msg_NE ("subprogram & is not overriding", Spec, Subp);
+            end if;
 
-            elsif Must_Override (Spec) then
-               if No (Overridden_Operation (Subp))
-                 and then not Can_Override
-               then
-                  Error_Msg_NE ("subprogram & is not overriding", Spec, Subp);
-               end if;
+         elsif not Error_Posted (Subp)
+           and then Style_Check
+           and then Can_Override_Operator (Subp)
+           and then
+             not Is_Predefined_File_Name
+                   (Unit_File_Name (Get_Source_Unit (Subp)))
+         then
+            --  If style checks are enabled, indicate that the indicator is
+            --  missing. However, at the point of declaration, the type of
+            --  which this is a primitive operation may be private, in which
+            --  case the indicator would be premature.
 
-            elsif not Error_Posted (Subp)
-              and then Style_Check
-              and then Can_Override
-              and then
-                not Is_Predefined_File_Name
-                      (Unit_File_Name (Get_Source_Unit (Subp)))
+            if Has_Private_Declaration (Etype (Subp))
+              or else Has_Private_Declaration (Etype (First_Formal (Subp)))
             then
-               --  If style checks are enabled, indicate that the indicator is
-               --  missing. However, at the point of declaration, the type of
-               --  which this is a primitive operation may be private, in which
-               --  case the indicator would be premature.
-
-               if Has_Private_Declaration (Etype (Subp))
-                 or else Has_Private_Declaration (Etype (First_Formal (Subp)))
-               then
-                  null;
-               else
-                  Style.Missing_Overriding (Decl, Subp);
-               end if;
+               null;
+            else
+               Style.Missing_Overriding (Decl, Subp);
             end if;
-         end;
+         end if;
 
       elsif Must_Override (Spec) then
          if Ekind (Subp) = E_Entry then
@@ -5442,6 +5442,25 @@ package body Sem_Ch6 is
         (New_Id, Old_Id, Type_Conformant, True, Result, Err_Loc);
    end Check_Type_Conformant;
 
+   ---------------------------
+   -- Can_Override_Operator --
+   ---------------------------
+
+   function Can_Override_Operator (Subp : Entity_Id) return Boolean is
+      Typ : Entity_Id;
+   begin
+      if Nkind (Subp) /= N_Defining_Operator_Symbol then
+         return False;
+
+      else
+         Typ := Base_Type (Etype (First_Formal (Subp)));
+
+         return Operator_Matches_Spec (Subp, Subp)
+           and then Scope (Subp) = Scope (Typ)
+           and then not Is_Class_Wide_Type (Typ);
+      end if;
+   end Can_Override_Operator;
+
    ----------------------
    -- Conforming_Types --
    ----------------------
index 7f4e4b166ffa48b7d63f750246f379e5a59a3cab..32d4002034355b8bae8b72e3d83a4da945c5e4b8 100644 (file)
@@ -2683,12 +2683,24 @@ package body Sem_Ch8 is
       --  been analyzed previously, and it is begin reinstalled, for example
       --  when the clause appears in a package spec and we are compiling the
       --  corresponding package body. In that case, make the entities on the
-      --  existing list use-visible.
+      --  existing list use_visible, and mark the corresponding types In_Use.
 
       if Present (Used_Operations (N)) then
          declare
+            Mark : Node_Id;
             Elmt : Elmt_Id;
+
          begin
+            Mark := First (Subtype_Marks (N));
+            while Present (Mark) loop
+               if not In_Use (Entity (Mark))
+                 and then not Is_Potentially_Use_Visible (Entity (Mark))
+               then
+                  Set_In_Use (Base_Type (Entity (Mark)));
+               end if;
+               Next (Mark);
+            end loop;
+
             Elmt := First_Elmt (Used_Operations (N));
             while Present (Elmt) loop
                Set_Is_Potentially_Use_Visible (Node (Elmt));
index 7f71d1bfff1a88d371ea2e877bf6373522d85c3e..d40ad9b2b6e29ce02868846147389328423bbb80 100644 (file)
@@ -5648,10 +5648,14 @@ package body Sem_Res is
          Check_Potentially_Blocking_Operation (N);
       end if;
 
-      --  A call to Ada.Real_Time.Timing_Events.Set_Handler violates
-      --  restriction No_Relative_Delay (AI-0211).
+      --  A call to Ada.Real_Time.Timing_Events.Set_Handler to set a relative
+      --  timing event violates restriction No_Relative_Delay (AI-0211). We
+      --  need to check the second argument to determine whether it is an
+      --  absolute or relative timing event.
 
-      if Is_RTE (Nam, RE_Set_Handler) then
+      if Is_RTE (Nam, RE_Set_Handler)
+        and then Is_RTE (Etype (Next_Actual (First_Actual (N))), RE_Time_Span)
+      then
          Check_Restriction (No_Relative_Delay, N);
       end if;