Commit 6c1e24d3 by Arnaud Charlet

[multiple changes]

2003-11-24  Jose Ruiz  <ruiz@act-europe.fr>

	* Makefile.in:
	Use 5zintman.ads for VxWorks targets. This file avoid confusion between
	signals and interrupts.

	* 5zintman.ads: New File.

	* 5zintman.adb: Replace Exception_Interrupts by Exception_Signals, and
	add exception signals to the set of unmasked signals.

	* 5ztaprop.adb:
	Use Abort_Task_Signal instead of Abort_Task_Interrupt to avoid confusion
	between signals and interrupts.
	Add to Unblocked_Signal_Mask the set of signals that are in
	Keep_Unmasked.

	* 7sinmaop.adb:
	Adding a check to see whether the Interrupt_ID we want to unmask is in
	the range of Keep_Unmasked (in procedure Interrupt_Self_Process). The
	reason is that the index type of the Keep_Unmasked array is not always
	Interrupt_ID; it may be a subtype of Interrupt_ID.

2003-11-24  Gary Dismukes  <dismukes@gnat.com>

	* exp_util.adb:
	(Remove_Side_Effects): Condition constantness of object created for a
	 an unchecked type conversion on the constantness of the expression
	 to ensure the correct value for 'Constrained when passing components
	 of view-converted class-wide objects.

2003-11-24  Robert Dewar  <dewar@gnat.com>

	* par-load.adb (Load): Improve handling of misspelled and missing units
	Removes several cases of compilation abandoned messages

	* lib.adb: (Remove_Unit): New procedure

	* lib.ads: (Remove_Unit): New procedure

	* lib-load.adb: Minor reformatting

2003-11-24  Vincent Celier  <celier@gnat.com>

	* make.adb:
	(Gnatmake, Initialize): Call Usage instead of Makeusg directly
	(Marking_Label): Label to mark processed source files. Incremented for
	each executable.
	(Gnatmake): Increase Marking_Labet for each executable
	(Is_Marked): Compare against marking label
	(Mark): Mark with marking label

2003-11-24  Jerome Guitton  <guitton@act-europe.fr>

	* s-thread.ads:
	Move the declaration of the TSD for System.Threads to System.Soft_Links.
	Add some comments.

	* Makefile.in: Added target pair for s-thread.adb for cert runtime.
	(rts-cert): build a single relocatable object for the run-time lib.
	Fix perms.

2003-11-24  Vasiliy Fofanov  <fofanov@act-europe.fr>

	* Make-lang.in:
	Use gnatls rather than gcc to obtain the location of GNAT RTL for
	crosstools build.

2003-11-24  Sergey Rybin  <rybin@act-europe.fr>

	* opt.adb (Tree_Write): Gnat_Version_String is now a function, so we
	can not use it as before (that is, as a variable) when dumping it into
	the tree file. Add a local variable to store the result of this
	function and to be used as the string to be written into the tree.

	* scn.adb (Initialize_Scanner): Add comments explaining the recent
	changes.

	* sinput.adb (Source_First, Source_Last): In case of
	Internal_Source_File, replace returning attributes of
	Internal_Source_Ptr (which is wrong) with returning attributes of
	Internal_Source.

2003-11-24  Ed Schonberg  <schonberg@gnat.com>

	* sem_ch3.adb:
	(New_Concatenation_Op): Proper name for New_Binary_Operator, only
	used for implicit concatenation operators.
	Code cleanup.

	* sem_elab.adb:
	(Check_Elab_Call): Set No_Elaboration_Check appropriately on calls in
	task bodies that are in the scope of a Suppress pragma.
	(Check_A Call): Use the flag to prevent spurious elaboration checks.

	* sinfo.ads, sinfo.adb:
	New flag No_Elaboration_Check on function/procedure calls, to properly
	suppress checks on calls in task bodies that are within a local suppress
	pragma.

	* exp_ch4.adb:
	(Expand_Concatenate_Other): Use the proper integer type for the
	expression for the upper bound, to avoid universal_integer computations
	when possible.

From-SVN: r73874
parent 8653a1ed
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2002 Free Software Foundation, Inc. -- -- Copyright (C) 1992-2003 Free Software Foundation, Inc. --
-- -- -- --
-- GNARL is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -62,22 +62,27 @@ package body System.Interrupt_Management is ...@@ -62,22 +62,27 @@ package body System.Interrupt_Management is
use System.OS_Interface; use System.OS_Interface;
use type Interfaces.C.int; use type Interfaces.C.int;
type Interrupt_List is array (Interrupt_ID range <>) of Interrupt_ID; type Signal_List is array (Signal_ID range <>) of Signal_ID;
Exception_Interrupts : constant Interrupt_List (1 .. 4) := Exception_Signals : constant Signal_List (1 .. 4) :=
(SIGFPE, SIGILL, SIGSEGV, SIGBUS); (SIGFPE, SIGILL, SIGSEGV, SIGBUS);
-- Keep these variables global so that they are initialized only once. -- Keep these variables global so that they are initialized only once
-- What are "these variables" ???, I see only one
Exception_Action : aliased struct_sigaction; Exception_Action : aliased struct_sigaction;
---------------------- -----------------------
-- Notify_Exception -- -- Local Subprograms --
---------------------- -----------------------
procedure Notify_Exception (signo : Signal); procedure Notify_Exception (signo : Signal);
-- Identify the Ada exception to be raised using -- Identify the Ada exception to be raised using
-- the information when the system received a synchronous signal. -- the information when the system received a synchronous signal.
----------------------
-- Notify_Exception --
----------------------
procedure Notify_Exception (signo : Signal) is procedure Notify_Exception (signo : Signal) is
Mask : aliased sigset_t; Mask : aliased sigset_t;
Result : int; Result : int;
...@@ -126,10 +131,10 @@ package body System.Interrupt_Management is ...@@ -126,10 +131,10 @@ package body System.Interrupt_Management is
old_act : aliased struct_sigaction; old_act : aliased struct_sigaction;
begin begin
for J in Exception_Interrupts'Range loop for J in Exception_Signals'Range loop
Result := Result :=
sigaction sigaction
(Signal (Exception_Interrupts (J)), Exception_Action'Access, (Signal (Exception_Signals (J)), Exception_Action'Access,
old_act'Unchecked_Access); old_act'Unchecked_Access);
pragma Assert (Result = 0); pragma Assert (Result = 0);
end loop; end loop;
...@@ -160,15 +165,15 @@ begin ...@@ -160,15 +165,15 @@ begin
-- Change this if you want to use another signal for task abort. -- Change this if you want to use another signal for task abort.
-- SIGTERM might be a good one. -- SIGTERM might be a good one.
Abort_Task_Interrupt := SIGABRT; Abort_Task_Signal := SIGABRT;
Exception_Action.sa_handler := Notify_Exception'Address; Exception_Action.sa_handler := Notify_Exception'Address;
Exception_Action.sa_flags := SA_ONSTACK; Exception_Action.sa_flags := SA_ONSTACK;
Result := sigemptyset (mask'Access); Result := sigemptyset (mask'Access);
pragma Assert (Result = 0); pragma Assert (Result = 0);
for J in Exception_Interrupts'Range loop for J in Exception_Signals'Range loop
Result := sigaddset (mask'Access, Signal (Exception_Interrupts (J))); Result := sigaddset (mask'Access, Signal (Exception_Signals (J)));
pragma Assert (Result = 0); pragma Assert (Result = 0);
end loop; end loop;
...@@ -185,5 +190,15 @@ begin ...@@ -185,5 +190,15 @@ begin
Reserve (J) := True; Reserve (J) := True;
end if; end if;
end loop; 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_Signal) := True;
end; end;
end System.Interrupt_Management; end System.Interrupt_Management;
------------------------------------------------------------------------------
-- --
-- GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS --
-- --
-- S Y S T E M . I N T E R R U P T _ M A N A G E M E N T --
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2003 Free Software Foundation, Inc. --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 2, or (at your option) any later ver- --
-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNARL; see file COPYING. If not, write --
-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
-- MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- GNARL was developed by the GNARL team at Florida State University. --
-- Extensive contributions were provided by Ada Core Technologies, Inc. --
-- --
------------------------------------------------------------------------------
-- This is the VxWorks version of this package.
-- This package encapsulates and centralizes information about all
-- uses of interrupts (or signals), including the target-dependent
-- mapping of interrupts (or signals) to exceptions.
-- Unlike the original design, System.Interrupt_Management can only
-- be used for tasking systems.
-- PLEASE DO NOT remove the Elaborate_Body pragma from this package.
-- Elaboration of this package should happen early, as most other
-- initializations depend on it. Forcing immediate elaboration of
-- the body also helps to enforce the design assumption that this
-- is a second-level package, just one level above System.OS_Interface
-- with no cross-dependencies.
-- PLEASE DO NOT put any subprogram declarations with arguments of
-- type Interrupt_ID into the visible part of this package. The type
-- Interrupt_ID is used to derive the type in Ada.Interrupts, and
-- adding more operations to that type would be illegal according
-- to the Ada Reference Manual. This is the reason why the signals
-- sets are implemeneted using visible arrays rather than functions.
with System.OS_Interface;
-- used for sigset_t
with Interfaces.C;
-- used for int
package System.Interrupt_Management is
pragma Elaborate_Body;
type Interrupt_Mask is limited private;
type Interrupt_ID is new Interfaces.C.int
range 0 .. System.OS_Interface.Max_Interrupt;
type Interrupt_Set is array (Interrupt_ID) of Boolean;
subtype Signal_ID is Interrupt_ID
range 0 .. Interfaces.C."-" (System.OS_Interface.NSIG, 1);
type Signal_Set is array (Signal_ID) of Boolean;
-- The following objects serve as constants, but are initialized
-- in the body to aid portability. This permits us to use more
-- portable names for interrupts, where distinct names may map to
-- the same interrupt ID value.
--
-- For example, suppose SIGRARE is a signal that is not defined on
-- all systems, but is always reserved when it is defined. If we
-- have the convention that ID zero is not used for any "real"
-- signals, and SIGRARE = 0 when SIGRARE is not one of the locally
-- supported signals, we can write
-- Reserved (SIGRARE) := true;
-- and the initialization code will be portable.
Abort_Task_Signal : Signal_ID;
-- The signal that is used to implement task abortion 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 example, it may be mapped to an exception used to
-- implement task abortion, or used to implement time delays.
procedure Initialize_Interrupts;
-- On systems where there is no signal inheritance between tasks (e.g
-- VxWorks, GNU/LinuxThreads), this procedure is used to initialize
-- interrupts handling in each task. Otherwise this function should
-- only be called by initialize in this package body.
private
type Interrupt_Mask is new System.OS_Interface.sigset_t;
-- In some implementation Interrupt_Mask can be represented
-- as a linked list.
end System.Interrupt_Management;
...@@ -45,8 +45,8 @@ with System.Tasking.Debug; ...@@ -45,8 +45,8 @@ with System.Tasking.Debug;
with System.Interrupt_Management; with System.Interrupt_Management;
-- used for Keep_Unmasked -- used for Keep_Unmasked
-- Abort_Task_Interrupt -- Abort_Task_Signal
-- Interrupt_ID -- Signal_ID
-- Initialize_Interrupts -- Initialize_Interrupts
with System.Soft_Links; with System.Soft_Links;
...@@ -262,7 +262,7 @@ package body System.Task_Primitives.Operations is ...@@ -262,7 +262,7 @@ package body System.Task_Primitives.Operations is
Result := Result :=
sigaction sigaction
(Signal (Interrupt_Management.Abort_Task_Interrupt), (Signal (Interrupt_Management.Abort_Task_Signal),
act'Unchecked_Access, act'Unchecked_Access,
old_act'Unchecked_Access); old_act'Unchecked_Access);
pragma Assert (Result = 0); pragma Assert (Result = 0);
...@@ -1008,7 +1008,7 @@ package body System.Task_Primitives.Operations is ...@@ -1008,7 +1008,7 @@ package body System.Task_Primitives.Operations is
begin begin
Result := kill (T.Common.LL.Thread, Result := kill (T.Common.LL.Thread,
Signal (Interrupt_Management.Abort_Task_Interrupt)); Signal (Interrupt_Management.Abort_Task_Signal));
pragma Assert (Result = 0); pragma Assert (Result = 0);
end Abort_Task; end Abort_Task;
...@@ -1126,6 +1126,13 @@ package body System.Task_Primitives.Operations is ...@@ -1126,6 +1126,13 @@ package body System.Task_Primitives.Operations is
Result := sigemptyset (Unblocked_Signal_Mask'Access); Result := sigemptyset (Unblocked_Signal_Mask'Access);
pragma Assert (Result = 0); 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;
Environment_Task_ID := Environment_Task; Environment_Task_ID := Environment_Task;
-- Initialize the lock used to synchronize chain of all ATCBs. -- Initialize the lock used to synchronize chain of all ATCBs.
......
...@@ -325,11 +325,16 @@ begin ...@@ -325,11 +325,16 @@ begin
Storage_Elements.To_Address Storage_Elements.To_Address
(Storage_Elements.Integer_Address (SIG_IGN)); (Storage_Elements.Integer_Address (SIG_IGN));
for I in Interrupt_ID loop for J in Interrupt_ID loop
if Keep_Unmasked (I) then
Result := sigaddset (mask'Access, Signal (I)); -- We need to check whether J is in Keep_Unmasked because
-- the index type of the Keep_Unmasked array is not always
-- Interrupt_ID; it may be a subtype of Interrupt_ID.
if J in Keep_Unmasked'Range and then Keep_Unmasked (J) then
Result := sigaddset (mask'Access, Signal (J));
pragma Assert (Result = 0); pragma Assert (Result = 0);
Result := sigdelset (allmask'Access, Signal (I)); Result := sigdelset (allmask'Access, Signal (J));
pragma Assert (Result = 0); pragma Assert (Result = 0);
end if; end if;
end loop; end loop;
......
2003-11-24 Jose Ruiz <ruiz@act-europe.fr>
* Makefile.in:
Use 5zintman.ads for VxWorks targets. This file avoid confusion between
signals and interrupts.
* 5zintman.ads: New File.
* 5zintman.adb: Replace Exception_Interrupts by Exception_Signals, and
add exception signals to the set of unmasked signals.
* 5ztaprop.adb:
Use Abort_Task_Signal instead of Abort_Task_Interrupt to avoid confusion
between signals and interrupts.
Add to Unblocked_Signal_Mask the set of signals that are in
Keep_Unmasked.
* 7sinmaop.adb:
Adding a check to see whether the Interrupt_ID we want to unmask is in
the range of Keep_Unmasked (in procedure Interrupt_Self_Process). The
reason is that the index type of the Keep_Unmasked array is not always
Interrupt_ID; it may be a subtype of Interrupt_ID.
2003-11-24 Gary Dismukes <dismukes@gnat.com>
* exp_util.adb:
(Remove_Side_Effects): Condition constantness of object created for a
an unchecked type conversion on the constantness of the expression
to ensure the correct value for 'Constrained when passing components
of view-converted class-wide objects.
2003-11-24 Robert Dewar <dewar@gnat.com>
* par-load.adb (Load): Improve handling of misspelled and missing units
Removes several cases of compilation abandoned messages
* lib.adb: (Remove_Unit): New procedure
* lib.ads: (Remove_Unit): New procedure
* lib-load.adb: Minor reformatting
2003-11-24 Vincent Celier <celier@gnat.com>
* make.adb:
(Gnatmake, Initialize): Call Usage instead of Makeusg directly
(Marking_Label): Label to mark processed source files. Incremented for
each executable.
(Gnatmake): Increase Marking_Labet for each executable
(Is_Marked): Compare against marking label
(Mark): Mark with marking label
2003-11-24 Jerome Guitton <guitton@act-europe.fr>
* s-thread.ads:
Move the declaration of the TSD for System.Threads to System.Soft_Links.
Add some comments.
* Makefile.in: Added target pair for s-thread.adb for cert runtime.
(rts-cert): build a single relocatable object for the run-time lib.
Fix perms.
2003-11-24 Vasiliy Fofanov <fofanov@act-europe.fr>
* Make-lang.in:
Use gnatls rather than gcc to obtain the location of GNAT RTL for
crosstools build.
2003-11-24 Sergey Rybin <rybin@act-europe.fr>
* opt.adb (Tree_Write): Gnat_Version_String is now a function, so we
can not use it as before (that is, as a variable) when dumping it into
the tree file. Add a local variable to store the result of this
function and to be used as the string to be written into the tree.
* scn.adb (Initialize_Scanner): Add comments explaining the recent
changes.
* sinput.adb (Source_First, Source_Last): In case of
Internal_Source_File, replace returning attributes of
Internal_Source_Ptr (which is wrong) with returning attributes of
Internal_Source.
2003-11-24 Ed Schonberg <schonberg@gnat.com>
* sem_ch3.adb:
(New_Concatenation_Op): Proper name for New_Binary_Operator, only
used for implicit concatenation operators.
Code cleanup.
* sem_elab.adb:
(Check_Elab_Call): Set No_Elaboration_Check appropriately on calls in
task bodies that are in the scope of a Suppress pragma.
(Check_A Call): Use the flag to prevent spurious elaboration checks.
* sinfo.ads, sinfo.adb:
New flag No_Elaboration_Check on function/procedure calls, to properly
suppress checks on calls in task bodies that are within a local suppress
pragma.
* exp_ch4.adb:
(Expand_Concatenate_Other): Use the proper integer type for the
expression for the upper bound, to avoid universal_integer computations
when possible.
2003-11-21 Kelley Cook <kcook@gcc.gnu.org> 2003-11-21 Kelley Cook <kcook@gcc.gnu.org>
* .cvsignore: Delete. * .cvsignore: Delete.
......
...@@ -290,10 +290,10 @@ regnattools: ...@@ -290,10 +290,10 @@ regnattools:
# use host-gcc host-gnatmake host-gnatbind host-gnatlink # use host-gcc host-gnatmake host-gnatbind host-gnatlink
# put the host RTS dir first in the PATH to hide the default runtime # put the host RTS dir first in the PATH to hide the default runtime
# files that are among the sources # files that are among the sources
RTS_DIR:=$(dir $(subst \,/,$(shell $(CC) -print-libgcc-file-name))) RTS_DIR:=$(strip $(subst \,/,$(shell gnatls -v | grep adalib )))
cross-gnattools: force cross-gnattools: force
$(MAKE) -C ada $(FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS)\ $(MAKE) -C ada $(FLAGS_TO_PASS) $(ADA_FLAGS_TO_PASS)\
ADA_INCLUDES="-I$(RTS_DIR)adainclude -I$(RTS_DIR)adalib" \ ADA_INCLUDES="-I$(RTS_DIR)../adainclude -I$(RTS_DIR)" \
GNATMAKE="gnatmake" \ GNATMAKE="gnatmake" \
GNATBIND="gnatbind" \ GNATBIND="gnatbind" \
GNATLINK="gnatlink" \ GNATLINK="gnatlink" \
......
...@@ -461,6 +461,7 @@ ifeq ($(strip $(filter-out alpha% dec vx%,$(targ))),) ...@@ -461,6 +461,7 @@ ifeq ($(strip $(filter-out alpha% dec vx%,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -487,6 +488,7 @@ ifeq ($(strip $(filter-out m68k% wrs vx%,$(targ))),) ...@@ -487,6 +488,7 @@ ifeq ($(strip $(filter-out m68k% wrs vx%,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -524,6 +526,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),) ...@@ -524,6 +526,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -593,6 +596,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),) ...@@ -593,6 +596,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),)
s-soflin.ads<2ssoflin.ads \ s-soflin.ads<2ssoflin.ads \
s-stalib.adb<1sstalib.adb \ s-stalib.adb<1sstalib.adb \
s-stalib.ads<1sstalib.ads \ s-stalib.ads<1sstalib.ads \
s-thread.adb<5zthread.adb \
s-thrini.ads<2sthrini.ads \ s-thrini.ads<2sthrini.ads \
s-thrini.adb<5zthrini.adb \ s-thrini.adb<5zthrini.adb \
s-tiitho.adb<5ztiitho.adb \ s-tiitho.adb<5ztiitho.adb \
...@@ -619,6 +623,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworksae,$(targ))),) ...@@ -619,6 +623,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworksae,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -692,7 +697,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworksae,$(targ))),) ...@@ -692,7 +697,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworksae,$(targ))),)
s-soflin.ads<2ssoflin.ads \ s-soflin.ads<2ssoflin.ads \
s-stalib.adb<1sstalib.adb \ s-stalib.adb<1sstalib.adb \
s-stalib.ads<1sstalib.ads \ s-stalib.ads<1sstalib.ads \
s-thrini.adb<5zthrini.adb \ s-thread.adb<5zthread.adb \
s-thrini.ads<2sthrini.ads \ s-thrini.ads<2sthrini.ads \
s-thrini.adb<5zthrini.adb \ s-thrini.adb<5zthrini.adb \
s-tiitho.adb<5ytiitho.adb \ s-tiitho.adb<5ytiitho.adb \
...@@ -736,6 +741,7 @@ ifeq ($(strip $(filter-out sparc% wrs vx%,$(targ))),) ...@@ -736,6 +741,7 @@ ifeq ($(strip $(filter-out sparc% wrs vx%,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -764,6 +770,7 @@ ifeq ($(strip $(filter-out xscale% coff wrs vx%,$(targ))),) ...@@ -764,6 +770,7 @@ ifeq ($(strip $(filter-out xscale% coff wrs vx%,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -792,6 +799,7 @@ ifeq ($(strip $(filter-out mips% wrs vx%,$(targ))),) ...@@ -792,6 +799,7 @@ ifeq ($(strip $(filter-out mips% wrs vx%,$(targ))),)
a-numaux.ads<4znumaux.ads \ a-numaux.ads<4znumaux.ads \
s-inmaop.adb<7sinmaop.adb \ s-inmaop.adb<7sinmaop.adb \
s-interr.adb<5zinterr.adb \ s-interr.adb<5zinterr.adb \
s-intman.ads<5zintman.ads \
s-intman.adb<5zintman.adb \ s-intman.adb<5zintman.adb \
s-osinte.adb<5zosinte.adb \ s-osinte.adb<5zosinte.adb \
s-osinte.ads<5zosinte.ads \ s-osinte.ads<5zosinte.ads \
...@@ -2055,8 +2063,10 @@ rts-cert: force ...@@ -2055,8 +2063,10 @@ rts-cert: force
../../../$(GCC_FOR_TARGET) -B../../../ $(TARGET_LIBGCC2_CFLAGS) \ ../../../$(GCC_FOR_TARGET) -B../../../ $(TARGET_LIBGCC2_CFLAGS) \
$(ALL_CFLAGS) $(GNATLIBCFLAGS_FOR_C) -c ../adainclude/$(f).c \ $(ALL_CFLAGS) $(GNATLIBCFLAGS_FOR_C) -c ../adainclude/$(f).c \
-I../adainclude $(INCLUDES_FOR_SUBDIR) -I../../../ ;) \ -I../adainclude $(INCLUDES_FOR_SUBDIR) -I../../../ ;) \
$(AR) $(AR_FLAGS) libgnat$(arext) \ ../../../xgcc -B../../../ *.o -o libgnat ; \
$(addsuffix .o,$(CERT_LEVEL_B_C_FILES)) $(CHMOD) a-wx *.ali ; \
$(RM) *.o ; \
$(MV) libgnat libgnat.o
rts-none: force rts-none: force
$(MAKE) $(FLAGS_TO_PASS) prepare-rts \ $(MAKE) $(FLAGS_TO_PASS) prepare-rts \
......
...@@ -1472,7 +1472,7 @@ package body Exp_Ch4 is ...@@ -1472,7 +1472,7 @@ package body Exp_Ch4 is
-- their base type, Ind_Typ their index type, and Arr_Typ the original -- their base type, Ind_Typ their index type, and Arr_Typ the original
-- array type to which the concatenantion operator applies, then the -- array type to which the concatenantion operator applies, then the
-- following subprogram is constructed: -- following subprogram is constructed:
--
-- [function Cnn (S1 : Base_Typ; ...; Sn : Base_Typ) return Base_Typ is -- [function Cnn (S1 : Base_Typ; ...; Sn : Base_Typ) return Base_Typ is
-- L : Ind_Typ; -- L : Ind_Typ;
-- begin -- begin
...@@ -1489,7 +1489,7 @@ package body Exp_Ch4 is ...@@ -1489,7 +1489,7 @@ package body Exp_Ch4 is
-- else -- else
-- return Sn; -- return Sn;
-- end if; -- end if;
--
-- declare -- declare
-- P : Ind_Typ; -- P : Ind_Typ;
-- H : Ind_Typ := -- H : Ind_Typ :=
...@@ -1516,9 +1516,9 @@ package body Exp_Ch4 is ...@@ -1516,9 +1516,9 @@ package body Exp_Ch4 is
-- P := Ind_Typ'Succ (P); -- P := Ind_Typ'Succ (P);
-- end loop; -- end loop;
-- end if; -- end if;
--
-- ... -- ...
--
-- if Sn'Length /= 0 then -- if Sn'Length /= 0 then
-- P := Sn'First; -- P := Sn'First;
-- loop -- loop
...@@ -1528,7 +1528,7 @@ package body Exp_Ch4 is ...@@ -1528,7 +1528,7 @@ package body Exp_Ch4 is
-- P := Ind_Typ'Succ (P); -- P := Ind_Typ'Succ (P);
-- end loop; -- end loop;
-- end if; -- end if;
--
-- return R; -- return R;
-- end; -- end;
-- end Cnn;] -- end Cnn;]
...@@ -1598,7 +1598,9 @@ package body Exp_Ch4 is ...@@ -1598,7 +1598,9 @@ package body Exp_Ch4 is
-- Builds reference to identifier L. -- Builds reference to identifier L.
function L_Pos return Node_Id; function L_Pos return Node_Id;
-- Builds expression Ind_Typ'Pos (L). -- Builds expression Integer_Type'(Ind_Typ'Pos (L)).
-- We qualify the expression to avoid universal_integer computations
-- whenever possible, in the expression for the upper bound H.
function L_Succ return Node_Id; function L_Succ return Node_Id;
-- Builds expression Ind_Typ'Succ (L). -- Builds expression Ind_Typ'Succ (L).
...@@ -1743,12 +1745,31 @@ package body Exp_Ch4 is ...@@ -1743,12 +1745,31 @@ package body Exp_Ch4 is
----------- -----------
function L_Pos return Node_Id is function L_Pos return Node_Id is
Target_Type : Entity_Id;
begin begin
-- If the index type is an enumeration type, the computation
-- can be done in standard integer. Otherwise, choose a large
-- enough integer type.
if Is_Enumeration_Type (Ind_Typ)
or else Root_Type (Ind_Typ) = Standard_Integer
or else Root_Type (Ind_Typ) = Standard_Short_Integer
or else Root_Type (Ind_Typ) = Standard_Short_Short_Integer
then
Target_Type := Standard_Integer;
else
Target_Type := Root_Type (Ind_Typ);
end if;
return return
Make_Qualified_Expression (Loc,
Subtype_Mark => New_Reference_To (Target_Type, Loc),
Expression =>
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,
Prefix => New_Reference_To (Ind_Typ, Loc), Prefix => New_Reference_To (Ind_Typ, Loc),
Attribute_Name => Name_Pos, Attribute_Name => Name_Pos,
Expressions => New_List (L)); Expressions => New_List (L)));
end L_Pos; end L_Pos;
------------ ------------
......
...@@ -3510,7 +3510,7 @@ package body Exp_Util is ...@@ -3510,7 +3510,7 @@ package body Exp_Util is
Make_Object_Declaration (Loc, Make_Object_Declaration (Loc,
Defining_Identifier => Def_Id, Defining_Identifier => Def_Id,
Object_Definition => New_Reference_To (Exp_Type, Loc), Object_Definition => New_Reference_To (Exp_Type, Loc),
Constant_Present => True, Constant_Present => not Is_Variable (Exp),
Expression => Relocate_Node (Exp)); Expression => Relocate_Node (Exp));
Set_Assignment_OK (E); Set_Assignment_OK (E);
......
...@@ -688,14 +688,11 @@ package body Lib.Load is ...@@ -688,14 +688,11 @@ package body Lib.Load is
procedure Make_Instance_Unit (N : Node_Id) is procedure Make_Instance_Unit (N : Node_Id) is
Sind : constant Source_File_Index := Source_Index (Main_Unit); Sind : constant Source_File_Index := Source_Index (Main_Unit);
begin begin
Units.Increment_Last; Units.Increment_Last;
Units.Table (Units.Last) := Units.Table (Main_Unit); Units.Table (Units.Last) := Units.Table (Main_Unit);
Units.Table (Units.Last).Cunit := Library_Unit (N); Units.Table (Units.Last).Cunit := Library_Unit (N);
Units.Table (Units.Last).Generate_Code := True; Units.Table (Units.Last).Generate_Code := True;
Units.Table (Main_Unit).Cunit := N; Units.Table (Main_Unit).Cunit := N;
Units.Table (Main_Unit).Unit_Name := Units.Table (Main_Unit).Unit_Name :=
Get_Body_Name (Unit_Name (Get_Cunit_Unit_Number (Library_Unit (N)))); Get_Body_Name (Unit_Name (Get_Cunit_Unit_Number (Library_Unit (N))));
...@@ -713,7 +710,6 @@ package body Lib.Load is ...@@ -713,7 +710,6 @@ package body Lib.Load is
is is
Sunit : constant Node_Id := Cunit (Spec_Unit); Sunit : constant Node_Id := Cunit (Spec_Unit);
Bunit : constant Node_Id := Cunit (Body_Unit); Bunit : constant Node_Id := Cunit (Body_Unit);
begin begin
-- The spec is irrelevant if the body is a subprogram body, and the -- The spec is irrelevant if the body is a subprogram body, and the
-- spec is other than a subprogram spec or generic subprogram spec. -- spec is other than a subprogram spec or generic subprogram spec.
...@@ -725,7 +721,6 @@ package body Lib.Load is ...@@ -725,7 +721,6 @@ package body Lib.Load is
Nkind (Unit (Bunit)) = N_Subprogram_Body Nkind (Unit (Bunit)) = N_Subprogram_Body
and then Nkind (Unit (Sunit)) /= N_Subprogram_Declaration and then Nkind (Unit (Sunit)) /= N_Subprogram_Declaration
and then Nkind (Unit (Sunit)) /= N_Generic_Subprogram_Declaration; and then Nkind (Unit (Sunit)) /= N_Generic_Subprogram_Declaration;
end Spec_Is_Irrelevant; end Spec_Is_Irrelevant;
-------------------- --------------------
...@@ -735,9 +730,7 @@ package body Lib.Load is ...@@ -735,9 +730,7 @@ package body Lib.Load is
procedure Version_Update (U : Node_Id; From : Node_Id) is procedure Version_Update (U : Node_Id; From : Node_Id) is
Unum : constant Unit_Number_Type := Get_Cunit_Unit_Number (U); Unum : constant Unit_Number_Type := Get_Cunit_Unit_Number (U);
Fnum : constant Unit_Number_Type := Get_Cunit_Unit_Number (From); Fnum : constant Unit_Number_Type := Get_Cunit_Unit_Number (From);
begin begin
if Source_Index (Fnum) /= No_Source_File then if Source_Index (Fnum) /= No_Source_File then
Units.Table (Unum).Version := Units.Table (Unum).Version :=
Units.Table (Unum).Version Units.Table (Unum).Version
......
...@@ -870,6 +870,17 @@ package body Lib is ...@@ -870,6 +870,17 @@ package body Lib is
return Int (Units.Last) - Int (Main_Unit) + 1; return Int (Units.Last) - Int (Main_Unit) + 1;
end Num_Units; end Num_Units;
-----------------
-- Remove_Unit --
-----------------
procedure Remove_Unit (U : Unit_Number_Type) is
begin
if U = Units.Last then
Units.Decrement_Last;
end if;
end Remove_Unit;
---------------------------------- ----------------------------------
-- Replace_Linker_Option_String -- -- Replace_Linker_Option_String --
---------------------------------- ----------------------------------
......
...@@ -417,6 +417,10 @@ package Lib is ...@@ -417,6 +417,10 @@ package Lib is
function Num_Units return Nat; function Num_Units return Nat;
-- Number of units currently in unit table -- Number of units currently in unit table
procedure Remove_Unit (U : Unit_Number_Type);
-- Remove unit U from unit table. Currently this is effective only
-- if U is the last unit currently stored in the unit table.
function Entity_Is_In_Main_Unit (E : Entity_Id) return Boolean; function Entity_Is_In_Main_Unit (E : Entity_Id) return Boolean;
-- Returns True if the entity E is declared in the main unit, or, in -- Returns True if the entity E is declared in the main unit, or, in
-- its corresponding spec, or one of its subunits. Entities declared -- its corresponding spec, or one of its subunits. Entities declared
......
...@@ -24,12 +24,6 @@ ...@@ -24,12 +24,6 @@
-- -- -- --
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Command_Line; use Ada.Command_Line;
with GNAT.Directory_Operations; use GNAT.Directory_Operations;
with GNAT.Case_Util; use GNAT.Case_Util;
with ALI; use ALI; with ALI; use ALI;
with ALI.Util; use ALI.Util; with ALI.Util; use ALI.Util;
with Csets; with Csets;
...@@ -65,6 +59,12 @@ with System.HTable; ...@@ -65,6 +59,12 @@ with System.HTable;
with Targparm; with Targparm;
with Tempdir; with Tempdir;
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Command_Line; use Ada.Command_Line;
with GNAT.Directory_Operations; use GNAT.Directory_Operations;
with GNAT.Case_Util; use GNAT.Case_Util;
package body Make is package body Make is
use ASCII; use ASCII;
...@@ -480,6 +480,9 @@ package body Make is ...@@ -480,6 +480,9 @@ package body Make is
-- Marking Routines -- -- Marking Routines --
---------------------- ----------------------
Marking_Label : Byte := 1;
-- Value to mark the source files
procedure Mark (Source_File : File_Name_Type); procedure Mark (Source_File : File_Name_Type);
-- Mark Source_File. Marking is used to signal that Source_File has -- Mark Source_File. Marking is used to signal that Source_File has
-- already been inserted in the Q. -- already been inserted in the Q.
...@@ -2233,7 +2236,9 @@ package body Make is ...@@ -2233,7 +2236,9 @@ package body Make is
------------- -------------
function Compile function Compile
(S : Name_Id; L : Name_Id; Args : Argument_List) return Process_Id (S : Name_Id;
L : Name_Id;
Args : Argument_List) return Process_Id
is is
Comp_Args : Argument_List (Args'First .. Args'Last + 8); Comp_Args : Argument_List (Args'First .. Args'Last + 8);
Comp_Next : Integer := Args'First; Comp_Next : Integer := Args'First;
...@@ -3692,7 +3697,7 @@ package body Make is ...@@ -3692,7 +3697,7 @@ package body Make is
else else
-- Output usage information if no files to compile -- Output usage information if no files to compile
Makeusg; Usage;
Exit_Program (E_Fatal); Exit_Program (E_Fatal);
end if; end if;
end if; end if;
...@@ -4228,6 +4233,18 @@ package body Make is ...@@ -4228,6 +4233,18 @@ package body Make is
Multiple_Main_Loop : for N_File in 1 .. Osint.Number_Of_Files loop Multiple_Main_Loop : for N_File in 1 .. Osint.Number_Of_Files loop
-- Increase the marking label to be sure to check sources
-- for all executables.
Marking_Label := Marking_Label + 1;
-- Make sure it is not 0, which is the default value for
-- a file that has never been marked.
if Marking_Label = 0 then
Marking_Label := 1;
end if;
-- First, find the executable name and path -- First, find the executable name and path
Executable := No_File; Executable := No_File;
...@@ -5573,7 +5590,7 @@ package body Make is ...@@ -5573,7 +5590,7 @@ package body Make is
end loop Scan_Args; end loop Scan_Args;
if Usage_Requested then if Usage_Requested then
Makeusg; Usage;
end if; end if;
-- Test for trailing -P switch -- Test for trailing -P switch
...@@ -5695,6 +5712,10 @@ package body Make is ...@@ -5695,6 +5712,10 @@ package body Make is
Make_Failed (Exception_Message (Err)); Make_Failed (Exception_Message (Err));
end; end;
end if; end if;
-- Set the marking label to a value that is not zero
Marking_Label := 1;
end Initialize; end Initialize;
----------------------------------- -----------------------------------
...@@ -5709,6 +5730,7 @@ package body Make is ...@@ -5709,6 +5730,7 @@ package body Make is
Put_In_Q : Boolean := Into_Q; Put_In_Q : Boolean := Into_Q;
Unit : Com.Unit_Data; Unit : Com.Unit_Data;
Sfile : Name_Id; Sfile : Name_Id;
Extending : constant Boolean := Extending : constant Boolean :=
Projects.Table (The_Project).Extends /= No_Project; Projects.Table (The_Project).Extends /= No_Project;
...@@ -6044,7 +6066,7 @@ package body Make is ...@@ -6044,7 +6066,7 @@ package body Make is
function Is_Marked (Source_File : File_Name_Type) return Boolean is function Is_Marked (Source_File : File_Name_Type) return Boolean is
begin begin
return Get_Name_Table_Byte (Source_File) /= 0; return Get_Name_Table_Byte (Source_File) = Marking_Label;
end Is_Marked; end Is_Marked;
---------- ----------
...@@ -6228,7 +6250,7 @@ package body Make is ...@@ -6228,7 +6250,7 @@ package body Make is
procedure Mark (Source_File : File_Name_Type) is procedure Mark (Source_File : File_Name_Type) is
begin begin
Set_Name_Table_Byte (Source_File, 1); Set_Name_Table_Byte (Source_File, Marking_Label);
end Mark; end Mark;
-------------------- --------------------
......
...@@ -186,6 +186,7 @@ package body Opt is ...@@ -186,6 +186,7 @@ package body Opt is
---------------- ----------------
procedure Tree_Write is procedure Tree_Write is
Version_String : String := Gnat_Version_String;
begin begin
Tree_Write_Int (ASIS_Version_Number); Tree_Write_Int (ASIS_Version_Number);
Tree_Write_Bool (Brief_Output); Tree_Write_Bool (Brief_Output);
...@@ -202,9 +203,9 @@ package body Opt is ...@@ -202,9 +203,9 @@ package body Opt is
Tree_Write_Bool (Assertions_Enabled); Tree_Write_Bool (Assertions_Enabled);
Tree_Write_Bool (Enable_Overflow_Checks); Tree_Write_Bool (Enable_Overflow_Checks);
Tree_Write_Bool (Full_List); Tree_Write_Bool (Full_List);
Tree_Write_Int (Int (Gnat_Version_String'Length)); Tree_Write_Int (Int (Version_String'Length));
Tree_Write_Data (Gnat_Version_String'Address, Tree_Write_Data (Version_String'Address,
Gnat_Version_String'Length); Version_String'Length);
Tree_Write_Data (Distribution_Stub_Mode'Address, Tree_Write_Data (Distribution_Stub_Mode'Address,
Distribution_Stub_Mode_Type'Object_Size / Storage_Unit); Distribution_Stub_Mode_Type'Object_Size / Storage_Unit);
Tree_Write_Bool (Immediate_Errors); Tree_Write_Bool (Immediate_Errors);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2002 Free Software Foundation, Inc. -- -- Copyright (C) 1992-2003 Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -42,6 +42,8 @@ with Sinput.L; use Sinput.L; ...@@ -42,6 +42,8 @@ with Sinput.L; use Sinput.L;
with Stylesw; use Stylesw; with Stylesw; use Stylesw;
with Validsw; use Validsw; with Validsw; use Validsw;
with GNAT.Spelling_Checker; use GNAT.Spelling_Checker;
separate (Par) separate (Par)
procedure Load is procedure Load is
...@@ -188,26 +190,45 @@ begin ...@@ -188,26 +190,45 @@ begin
or else or else
Name_Buffer (1) = 'g') Name_Buffer (1) = 'g')
then then
-- In the predefined file case, we know the user did not construct declare
-- their own package, but we got the wrong one. This means that the Expect_Name : constant Name_Id := Expected_Unit (Cur_Unum);
-- name supplied by the user crunched to something we recognized, Actual_Name : constant Name_Id := Unit_Name (Cur_Unum);
-- but then the file did not contain the unit expected. Most likely
-- this is due to a misspelling, e.g. begin
Error_Msg_Name_1 := Expect_Name;
Error_Msg ("% is not a predefined library unit!", Loc);
-- In the predefined file case, we know the user did not
-- construct their own package, but we got the wrong one.
-- This means that the name supplied by the user crunched
-- to something we recognized, but then the file did not
-- contain the unit expected. Most likely this is due to
-- a misspelling, e.g.
-- with Ada.Calender; -- with Ada.Calender;
-- This crunches to a-calend, which indeed contains the unit -- This crunches to a-calend, which indeed contains the unit
-- Ada.Calendar, and we can diagnose the misspelling. This is -- Ada.Calendar, and we can diagnose the misspelling. This
-- a simple heuristic, but it catches many common cases of -- is a simple heuristic, but it catches many common cases
-- misspelling of predefined unit names without needing a full -- of misspelling of predefined unit names without needing
-- list of them. -- a full list of them.
Error_Msg_Name_1 := Expected_Unit (Cur_Unum); -- Before actually issinying the message, we will check that the
Error_Msg ("% is not a predefined library unit!", Loc); -- unit name is indeed a plausible misspelling of the one we got.
Error_Msg_Name_1 := Unit_Name (Cur_Unum);
if Is_Bad_Spelling_Of
(Found => Get_Name_String (Expect_Name),
Expect => Get_Name_String (Actual_Name))
then
Error_Msg_Name_1 := Actual_Name;
Error_Msg ("possible misspelling of %!", Loc); Error_Msg ("possible misspelling of %!", Loc);
end if;
end;
-- Non-predefined file name case -- Non-predefined file name case. In this case we generate a message
-- and then we quit, because we are in big trouble, and if we try
-- to continue compilation, we get into some nasty situations
-- (for example in some subunit cases).
else else
Error_Msg ("file { does not contain expected unit!", Loc); Error_Msg ("file { does not contain expected unit!", Loc);
...@@ -217,7 +238,10 @@ begin ...@@ -217,7 +238,10 @@ begin
Error_Msg ("found unit $!", Loc); Error_Msg ("found unit $!", Loc);
end if; end if;
raise Unrecoverable_Error; -- In both cases, remove the unit if it is the last unit (which it
-- normally (always?) will be) so that it is out of the way later.
Remove_Unit (Cur_Unum);
end if; end if;
-- If current unit is a body, load its corresponding spec -- If current unit is a body, load its corresponding spec
......
...@@ -38,6 +38,10 @@ ...@@ -38,6 +38,10 @@
-- VxWorks AE653 with the restricted / cert runtime -- VxWorks AE653 with the restricted / cert runtime
with Ada.Exceptions; with Ada.Exceptions;
-- used for Exception_Occurrence
with System.Soft_Links;
-- used for TSD
package System.Threads is package System.Threads is
...@@ -137,27 +141,6 @@ package System.Threads is ...@@ -137,27 +141,6 @@ package System.Threads is
private private
------------------------ type ATSD is new System.Soft_Links.TSD;
-- Task Specific Data --
------------------------
type ATSD is limited record
Jmpbuf_Address : Address := Null_Address;
-- Address of jump buffer used to store the address of the
-- current longjmp/setjmp buffer for exception management.
-- These buffers are threaded into a stack, and the address
-- here is the top of the stack. A null address means that
-- no exception handler is currently active.
Sec_Stack_Addr : Address := Null_Address;
-- Address of currently allocated secondary stack
Current_Excep : aliased EO;
-- Exception occurrence that contains the information for the
-- current exception. Note that any exception in the same task
-- destroys this information, so the data in this variable must
-- be copied out before another exception can occur.
end record;
end System.Threads; end System.Threads;
...@@ -261,7 +261,9 @@ package body Scn is ...@@ -261,7 +261,9 @@ package body Scn is
begin begin
Scanner.Initialize_Scanner (Unit, Index); Scanner.Initialize_Scanner (Unit, Index);
-- Set default for Comes_From_Source. All nodes built now until we -- Set default for Comes_From_Source (except if we are going to process
-- an artificial string internally created within the compiler and
-- placed into internal source duffer). All nodes built now until we
-- reenter the analyzer will have Comes_From_Source set to True -- reenter the analyzer will have Comes_From_Source set to True
if Index /= Internal_Source_File then if Index /= Internal_Source_File then
...@@ -280,6 +282,16 @@ package body Scn is ...@@ -280,6 +282,16 @@ package body Scn is
-- call Scan. Scan initial token (note this initializes Prev_Token, -- call Scan. Scan initial token (note this initializes Prev_Token,
-- Prev_Token_Ptr). -- Prev_Token_Ptr).
-- There are two reasons not to do the Scan step in case if we
-- initialize the scanner for the internal source buffer:
-- - The artificial string may not be created by the compiler in this
-- buffer when we call Initialize_Scanner
-- - For these artificial strings a special way of scanning is used, so
-- the standard step of the scanner may just break the algorithm of
-- processing these strings.
if Index /= Internal_Source_File then if Index /= Internal_Source_File then
Scan; Scan;
end if; end if;
......
...@@ -548,9 +548,9 @@ package body Sem_Ch3 is ...@@ -548,9 +548,9 @@ package body Sem_Ch3 is
-- Create new modular type. Verify that modulus is in bounds and is -- Create new modular type. Verify that modulus is in bounds and is
-- a power of two (implementation restriction). -- a power of two (implementation restriction).
procedure New_Binary_Operator (Op_Name : Name_Id; Typ : Entity_Id); procedure New_Concatenation_Op (Typ : Entity_Id);
-- Create an abbreviated declaration for an operator in order to -- Create an abbreviated declaration for an operator in order to
-- materialize minimally operators on derived types. -- materialize concatenation on array types.
procedure Ordinary_Fixed_Point_Type_Declaration procedure Ordinary_Fixed_Point_Type_Declaration
(T : Entity_Id; (T : Entity_Id;
...@@ -2865,7 +2865,7 @@ package body Sem_Ch3 is ...@@ -2865,7 +2865,7 @@ package body Sem_Ch3 is
if Number_Dimensions (T) = 1 if Number_Dimensions (T) = 1
and then not Is_Packed_Array_Type (T) and then not Is_Packed_Array_Type (T)
then then
New_Binary_Operator (Name_Op_Concat, T); New_Concatenation_Op (T);
end if; end if;
-- In the case of an unconstrained array the parser has already -- In the case of an unconstrained array the parser has already
...@@ -3068,7 +3068,7 @@ package body Sem_Ch3 is ...@@ -3068,7 +3068,7 @@ package body Sem_Ch3 is
and then not Is_Derived_Type (Parent_Type) and then not Is_Derived_Type (Parent_Type)
and then not Is_Package (Scope (Base_Type (Parent_Type))) and then not Is_Package (Scope (Base_Type (Parent_Type)))
then then
New_Binary_Operator (Name_Op_Concat, Derived_Type); New_Concatenation_Op (Derived_Type);
end if; end if;
end Build_Derived_Array_Type; end Build_Derived_Array_Type;
...@@ -10945,11 +10945,11 @@ package body Sem_Ch3 is ...@@ -10945,11 +10945,11 @@ package body Sem_Ch3 is
end Modular_Type_Declaration; end Modular_Type_Declaration;
------------------------- --------------------------
-- New_Binary_Operator -- -- New_Concatenation_Op --
------------------------- --------------------------
procedure New_Binary_Operator (Op_Name : Name_Id; Typ : Entity_Id) is procedure New_Concatenation_Op (Typ : Entity_Id) is
Loc : constant Source_Ptr := Sloc (Typ); Loc : constant Source_Ptr := Sloc (Typ);
Op : Entity_Id; Op : Entity_Id;
...@@ -10971,26 +10971,26 @@ package body Sem_Ch3 is ...@@ -10971,26 +10971,26 @@ package body Sem_Ch3 is
return Formal; return Formal;
end Make_Op_Formal; end Make_Op_Formal;
-- Start of processing for New_Binary_Operator -- Start of processing for New_Concatenation_Op
begin begin
Op := Make_Defining_Operator_Symbol (Loc, Op_Name); Op := Make_Defining_Operator_Symbol (Loc, Name_Op_Concat);
Set_Ekind (Op, E_Operator); Set_Ekind (Op, E_Operator);
Set_Scope (Op, Current_Scope); Set_Scope (Op, Current_Scope);
Set_Etype (Op, Typ); Set_Etype (Op, Typ);
Set_Homonym (Op, Get_Name_Entity_Id (Op_Name)); Set_Homonym (Op, Get_Name_Entity_Id (Name_Op_Concat));
Set_Is_Immediately_Visible (Op); Set_Is_Immediately_Visible (Op);
Set_Is_Intrinsic_Subprogram (Op); Set_Is_Intrinsic_Subprogram (Op);
Set_Has_Completion (Op); Set_Has_Completion (Op);
Append_Entity (Op, Current_Scope); Append_Entity (Op, Current_Scope);
Set_Name_Entity_Id (Op_Name, Op); Set_Name_Entity_Id (Name_Op_Concat, Op);
Append_Entity (Make_Op_Formal (Typ, Op), Op); Append_Entity (Make_Op_Formal (Typ, Op), Op);
Append_Entity (Make_Op_Formal (Typ, Op), Op); Append_Entity (Make_Op_Formal (Typ, Op), Op);
end New_Binary_Operator; end New_Concatenation_Op;
------------------------------------------- -------------------------------------------
-- Ordinary_Fixed_Point_Type_Declaration -- -- Ordinary_Fixed_Point_Type_Declaration --
......
...@@ -325,6 +325,16 @@ package body Sem_Elab is ...@@ -325,6 +325,16 @@ package body Sem_Elab is
-- we ignore this flag. -- we ignore this flag.
begin begin
-- If the call is known to be within a local Suppress Elaboration
-- pragma, nothing to check. This can happen in task bodies.
if (Nkind (N) = N_Function_Call
or else Nkind (N) = N_Procedure_Call_Statement)
and then No_Elaboration_Check (N)
then
return;
end if;
-- Go to parent for derived subprogram, or to original subprogram -- Go to parent for derived subprogram, or to original subprogram
-- in the case of a renaming (Alias covers both these cases) -- in the case of a renaming (Alias covers both these cases)
...@@ -826,10 +836,41 @@ package body Sem_Elab is ...@@ -826,10 +836,41 @@ package body Sem_Elab is
(N : Node_Id; (N : Node_Id;
Outer_Scope : Entity_Id := Empty) Outer_Scope : Entity_Id := Empty)
is is
Nam : Node_Id;
Ent : Entity_Id; Ent : Entity_Id;
P : Node_Id; P : Node_Id;
function Get_Called_Ent return Entity_Id;
-- Retrieve called entity. If this is a call to a protected subprogram,
-- entity is a selected component. The callable entity may be absent,
-- in which case there is no check to perform. This happens with
-- non-analyzed calls in nested generics.
--------------------
-- Get_Called_Ent --
--------------------
function Get_Called_Ent return Entity_Id is
Nam : Node_Id;
begin
Nam := Name (N);
if No (Nam) then
return Empty;
elsif Nkind (Nam) = N_Selected_Component then
return Entity (Selector_Name (Nam));
elsif not Is_Entity_Name (Nam) then
return Empty;
else
return Entity (Nam);
end if;
end Get_Called_Ent;
-- Start of processing for Check_Elab_Call
begin begin
-- For an entry call, check relevant restriction -- For an entry call, check relevant restriction
...@@ -1014,6 +1055,26 @@ package body Sem_Elab is ...@@ -1014,6 +1055,26 @@ package body Sem_Elab is
exit; exit;
elsif Nkind (P) = N_Task_Body then
-- The check is deferred until Check_Task_Activation
-- but we need to capture local suppress pragmas
-- that may inhibit checks on this call.
Ent := Get_Called_Ent;
if No (Ent) then
return;
elsif Elaboration_Checks_Suppressed (Current_Scope)
or else Elaboration_Checks_Suppressed (Ent)
or else Elaboration_Checks_Suppressed (Scope (Ent))
then
Set_No_Elaboration_Check (N);
end if;
return;
-- Static model, call is not in elaboration code, we -- Static model, call is not in elaboration code, we
-- never need to worry, because in the static model -- never need to worry, because in the static model
-- the top level caller always takes care of things. -- the top level caller always takes care of things.
...@@ -1027,25 +1088,7 @@ package body Sem_Elab is ...@@ -1027,25 +1088,7 @@ package body Sem_Elab is
end if; end if;
end if; end if;
-- Retrieve called entity. If this is a call to a protected subprogram, Ent := Get_Called_Ent;
-- the entity is a selected component.
-- The callable entity may be absent, in which case there is nothing
-- to do. This happens with non-analyzed calls in nested generics.
Nam := Name (N);
if No (Nam) then
return;
elsif Nkind (Nam) = N_Selected_Component then
Ent := Entity (Selector_Name (Nam));
elsif not Is_Entity_Name (Nam) then
return;
else
Ent := Entity (Nam);
end if;
if No (Ent) then if No (Ent) then
return; return;
......
...@@ -1764,6 +1764,15 @@ package body Sinfo is ...@@ -1764,6 +1764,15 @@ package body Sinfo is
return Flag7 (N); return Flag7 (N);
end No_Ctrl_Actions; end No_Ctrl_Actions;
function No_Elaboration_Check
(N : Node_Id) return Boolean is
begin
pragma Assert (False
or else NT (N).Nkind = N_Function_Call
or else NT (N).Nkind = N_Procedure_Call_Statement);
return Flag14 (N);
end No_Elaboration_Check;
function No_Entities_Ref_In_Spec function No_Entities_Ref_In_Spec
(N : Node_Id) return Boolean is (N : Node_Id) return Boolean is
begin begin
...@@ -4187,6 +4196,15 @@ package body Sinfo is ...@@ -4187,6 +4196,15 @@ package body Sinfo is
Set_Flag7 (N, Val); Set_Flag7 (N, Val);
end Set_No_Ctrl_Actions; end Set_No_Ctrl_Actions;
procedure Set_No_Elaboration_Check
(N : Node_Id; Val : Boolean := True) is
begin
pragma Assert (False
or else NT (N).Nkind = N_Function_Call
or else NT (N).Nkind = N_Procedure_Call_Statement);
Set_Flag14 (N, Val);
end Set_No_Elaboration_Check;
procedure Set_No_Entities_Ref_In_Spec procedure Set_No_Entities_Ref_In_Spec
(N : Node_Id; Val : Boolean := True) is (N : Node_Id; Val : Boolean := True) is
begin begin
......
...@@ -1266,6 +1266,13 @@ package Sinfo is ...@@ -1266,6 +1266,13 @@ package Sinfo is
-- where the generated assignments are more initialisations than real -- where the generated assignments are more initialisations than real
-- assignments. -- assignments.
-- No_Elaboration_Check (Flag14-Sem)
-- Present in N_Function_Call and N_Procedure_Call_Statement. Indicates
-- that no elaboration check is needed on the call, because it appears
-- in the context of a local Suppress pragma. This is used on calls
-- within task bodies, where the actual elaboration checks are applied
-- after analysis, when the local scope stack is not present.
-- No_Entities_Ref_In_Spec (Flag8-Sem) -- No_Entities_Ref_In_Spec (Flag8-Sem)
-- Present in N_With_Clause nodes. Set if the with clause is on the -- Present in N_With_Clause nodes. Set if the with clause is on the
-- package or subprogram spec where the main unit is the corresponding -- package or subprogram spec where the main unit is the corresponding
...@@ -4043,6 +4050,7 @@ package Sinfo is ...@@ -4043,6 +4050,7 @@ package Sinfo is
-- First_Named_Actual (Node4-Sem) -- First_Named_Actual (Node4-Sem)
-- Controlling_Argument (Node1-Sem) (set to Empty if not dispatching) -- Controlling_Argument (Node1-Sem) (set to Empty if not dispatching)
-- Do_Tag_Check (Flag13-Sem) -- Do_Tag_Check (Flag13-Sem)
-- No_Elaboration_Check (Flag14-Sem)
-- Parameter_List_Truncated (Flag17-Sem) -- Parameter_List_Truncated (Flag17-Sem)
-- ABE_Is_Certain (Flag18-Sem) -- ABE_Is_Certain (Flag18-Sem)
-- plus fields for expression -- plus fields for expression
...@@ -4073,6 +4081,7 @@ package Sinfo is ...@@ -4073,6 +4081,7 @@ package Sinfo is
-- First_Named_Actual (Node4-Sem) -- First_Named_Actual (Node4-Sem)
-- Controlling_Argument (Node1-Sem) (set to Empty if not dispatching) -- Controlling_Argument (Node1-Sem) (set to Empty if not dispatching)
-- Do_Tag_Check (Flag13-Sem) -- Do_Tag_Check (Flag13-Sem)
-- No_Elaboration_Check (Flag14-Sem)
-- Parameter_List_Truncated (Flag17-Sem) -- Parameter_List_Truncated (Flag17-Sem)
-- ABE_Is_Certain (Flag18-Sem) -- ABE_Is_Certain (Flag18-Sem)
-- plus fields for expression -- plus fields for expression
...@@ -7391,6 +7400,9 @@ package Sinfo is ...@@ -7391,6 +7400,9 @@ package Sinfo is
function No_Ctrl_Actions function No_Ctrl_Actions
(N : Node_Id) return Boolean; -- Flag7 (N : Node_Id) return Boolean; -- Flag7
function No_Elaboration_Check
(N : Node_Id) return Boolean; -- Flag14
function No_Entities_Ref_In_Spec function No_Entities_Ref_In_Spec
(N : Node_Id) return Boolean; -- Flag8 (N : Node_Id) return Boolean; -- Flag8
...@@ -8165,6 +8177,9 @@ package Sinfo is ...@@ -8165,6 +8177,9 @@ package Sinfo is
procedure Set_No_Ctrl_Actions procedure Set_No_Ctrl_Actions
(N : Node_Id; Val : Boolean := True); -- Flag7 (N : Node_Id; Val : Boolean := True); -- Flag7
procedure Set_No_Elaboration_Check
(N : Node_Id; Val : Boolean := True); -- Flag14
procedure Set_No_Entities_Ref_In_Spec procedure Set_No_Entities_Ref_In_Spec
(N : Node_Id; Val : Boolean := True); -- Flag8 (N : Node_Id; Val : Boolean := True); -- Flag8
...@@ -8600,6 +8615,7 @@ package Sinfo is ...@@ -8600,6 +8615,7 @@ package Sinfo is
pragma Inline (Next_Rep_Item); pragma Inline (Next_Rep_Item);
pragma Inline (Next_Use_Clause); pragma Inline (Next_Use_Clause);
pragma Inline (No_Ctrl_Actions); pragma Inline (No_Ctrl_Actions);
pragma Inline (No_Elaboration_Check);
pragma Inline (No_Entities_Ref_In_Spec); pragma Inline (No_Entities_Ref_In_Spec);
pragma Inline (No_Initialization); pragma Inline (No_Initialization);
pragma Inline (No_Truncation); pragma Inline (No_Truncation);
...@@ -8854,6 +8870,7 @@ package Sinfo is ...@@ -8854,6 +8870,7 @@ package Sinfo is
pragma Inline (Set_Next_Named_Actual); pragma Inline (Set_Next_Named_Actual);
pragma Inline (Set_Next_Use_Clause); pragma Inline (Set_Next_Use_Clause);
pragma Inline (Set_No_Ctrl_Actions); pragma Inline (Set_No_Ctrl_Actions);
pragma Inline (Set_No_Elaboration_Check);
pragma Inline (Set_No_Entities_Ref_In_Spec); pragma Inline (Set_No_Entities_Ref_In_Spec);
pragma Inline (Set_No_Initialization); pragma Inline (Set_No_Initialization);
pragma Inline (Set_No_Truncation); pragma Inline (Set_No_Truncation);
......
...@@ -1111,7 +1111,7 @@ package body Sinput is ...@@ -1111,7 +1111,7 @@ package body Sinput is
function Source_First (S : SFI) return Source_Ptr is function Source_First (S : SFI) return Source_Ptr is
begin begin
if S = Internal_Source_File then if S = Internal_Source_File then
return Internal_Source_Ptr'First; return Internal_Source'First;
else else
return Source_File.Table (S).Source_First; return Source_File.Table (S).Source_First;
end if; end if;
...@@ -1120,7 +1120,7 @@ package body Sinput is ...@@ -1120,7 +1120,7 @@ package body Sinput is
function Source_Last (S : SFI) return Source_Ptr is function Source_Last (S : SFI) return Source_Ptr is
begin begin
if S = Internal_Source_File then if S = Internal_Source_File then
return Internal_Source_Ptr'Last; return Internal_Source'Last;
else else
return Source_File.Table (S).Source_Last; return Source_File.Table (S).Source_Last;
end if; end if;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment