[multiple changes]

2013-04-24  Eric Botcazou  <ebotcazou@adacore.com>

	* fe.h (Machine_Overflows_On_Target): New macro and declaration.
	(Signed_Zeros_On_Target): Likewise.

2013-04-24  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch6.adb: Add with and use clause for Sem_Prag.
	(Freeze_Subprogram): Analyze all delayed aspects for a null
	procedure so that they are available when analyzing the
	internally-generated _Postconditions routine.
	* exp_ch13.adb: Remove with and use clause for Sem_Prag.
	(Expand_N_Freeze_Entity): Move the code that analyzes delayed
	aspects of null procedures to exp_ch6.Freeze_Subprogram.
	* sem_prag.adb (Analyze_Abstract_State): Update the check on
	volatile requirements.

2013-04-24  Bob Duff  <duff@adacore.com>

	* ali-util.ads (Source_Record): New component Stamp_File
	to record from whence the Stamp came.
	* ali-util.adb (Set_Source_Table): Set Stamp_File component.
	* bcheck.adb (Check_Consistency): Print additional information in
	Verbose_Mode.
	* gnatbind.adb (Gnatbind): Print additional information in
	Verbose_Mode.

From-SVN: r198224
This commit is contained in:
Arnaud Charlet 2013-04-24 15:08:31 +02:00
parent dba44dbef9
commit b546e2a732
9 changed files with 178 additions and 91 deletions

View File

@ -1,3 +1,30 @@
2013-04-24 Eric Botcazou <ebotcazou@adacore.com>
* fe.h (Machine_Overflows_On_Target): New macro and declaration.
(Signed_Zeros_On_Target): Likewise.
2013-04-24 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch6.adb: Add with and use clause for Sem_Prag.
(Freeze_Subprogram): Analyze all delayed aspects for a null
procedure so that they are available when analyzing the
internally-generated _Postconditions routine.
* exp_ch13.adb: Remove with and use clause for Sem_Prag.
(Expand_N_Freeze_Entity): Move the code that analyzes delayed
aspects of null procedures to exp_ch6.Freeze_Subprogram.
* sem_prag.adb (Analyze_Abstract_State): Update the check on
volatile requirements.
2013-04-24 Bob Duff <duff@adacore.com>
* ali-util.ads (Source_Record): New component Stamp_File
to record from whence the Stamp came.
* ali-util.adb (Set_Source_Table): Set Stamp_File component.
* bcheck.adb (Check_Consistency): Print additional information in
Verbose_Mode.
* gnatbind.adb (Gnatbind): Print additional information in
Verbose_Mode.
2013-04-24 Robert Dewar <dewar@adacore.com>
* exp_ch13.adb, sem_prag.adb: Update comments.

View File

@ -35,6 +35,8 @@ with Snames; use Snames;
with Stringt;
with Styleg;
with System.OS_Lib; use System.OS_Lib;
package body ALI.Util is
-- Empty procedures needed to instantiate Scng. Error procedures are
@ -359,6 +361,7 @@ package body ALI.Util is
if Stamp (Stamp'First) /= ' ' then
Source.Table (S).Stamp := Stamp;
Source.Table (S).Source_Found := True;
Source.Table (S).Stamp_File := F;
-- If we could not find the file, then the stamp is set
-- from the dependency table entry (to be possibly reset
@ -367,6 +370,7 @@ package body ALI.Util is
else
Source.Table (S).Stamp := Sdep.Table (D).Stamp;
Source.Table (S).Source_Found := False;
Source.Table (S).Stamp_File := ALIs.Table (A).Afile;
-- In All_Sources mode, flag error of file not found
@ -380,8 +384,9 @@ package body ALI.Util is
-- is off, so simply initialize the stamp from the Sdep entry
else
Source.Table (S).Source_Found := False;
Source.Table (S).Stamp := Sdep.Table (D).Stamp;
Source.Table (S).Source_Found := False;
Source.Table (S).Stamp_File := ALIs.Table (A).Afile;
end if;
-- Here if this is not the first time for this source file,
@ -407,13 +412,19 @@ package body ALI.Util is
-- source file even if Check_Source_Files is false, since
-- if we find it, then we can use it to resolve which of the
-- two timestamps in the ALI files is likely to be correct.
-- We only look in the current directory, because when
-- Check_Source_Files is false, other search directories are
-- likely to be incorrect.
if not Check_Source_Files then
if not Check_Source_Files
and then Is_Regular_File (Get_Name_String (F))
then
Stamp := Source_File_Stamp (F);
if Stamp (Stamp'First) /= ' ' then
Source.Table (S).Stamp := Stamp;
Source.Table (S).Source_Found := True;
Source.Table (S).Stamp_File := F;
end if;
end if;
@ -432,6 +443,7 @@ package body ALI.Util is
else
if Sdep.Table (D).Stamp > Source.Table (S).Stamp then
Source.Table (S).Stamp := Sdep.Table (D).Stamp;
Source.Table (S).Stamp_File := ALIs.Table (A).Afile;
end if;
end if;
end if;

View File

@ -6,7 +6,7 @@
-- --
-- S p e c --
-- --
-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -57,6 +57,13 @@ package ALI.Util is
-- located and the Stamp value was set from the actual source file.
-- It is always false if Check_Source_Files is not set.
Stamp_File : File_Name_Type;
-- File that Stamp came from. If Source_Found is True, then Stamp is the
-- timestamp of the source file, and this is the name of the source
-- file. If Source_Found is False, then Stamp comes from a dependency
-- line in an ALI file, this is the name of that ALI file. Used only in
-- verbose mode, for messages.
All_Timestamps_Match : Boolean;
-- This flag is set only if all files referencing this source file
-- have a matching time stamp, and also, if Source_Found is True,

View File

@ -218,16 +218,27 @@ package body Bcheck is
end if;
if (not Tolerate_Consistency_Errors) and Verbose_Mode then
Error_Msg_File_1 := Sdep.Table (D).Sfile;
Error_Msg_File_1 := Source.Table (Src).Stamp_File;
if Source.Table (Src).Source_Found then
Error_Msg_File_1 :=
Osint.Full_Source_Name (Error_Msg_File_1);
else
Error_Msg_File_1 :=
Osint.Full_Lib_File_Name (Error_Msg_File_1);
end if;
Error_Msg
("{ time stamp " & String (Source.Table (Src).Stamp));
("time stamp from { " & String (Source.Table (Src).Stamp));
Error_Msg_File_1 := Sdep.Table (D).Sfile;
-- Something wrong here, should be different file ???
Error_Msg
(" conflicts with { timestamp " &
String (Sdep.Table (D).Stamp));
Error_Msg_File_1 :=
Osint.Full_Lib_File_Name (ALIs.Table (A).Afile);
Error_Msg (" from {");
end if;
-- Exit from the loop through Sdep entries once we find one

View File

@ -43,7 +43,6 @@ with Sem_Aux; use Sem_Aux;
with Sem_Ch7; use Sem_Ch7;
with Sem_Ch8; use Sem_Ch8;
with Sem_Eval; use Sem_Eval;
with Sem_Prag; use Sem_Prag;
with Sem_Util; use Sem_Util;
with Sinfo; use Sinfo;
with Snames; use Snames;
@ -553,48 +552,9 @@ package body Exp_Ch13 is
Force_Validity_Checks := Save_Force;
end;
-- All other freezing actions
else
-- If the action is the generated body of a null subprogram,
-- analyze the expressions in its delayed aspects, because we
-- may not have reached the end of the declarative list when
-- delayed aspects are normally analyzed. This ensures that
-- dispatching calls are properly rewritten when the inner
-- postcondition procedure is analyzed.
if Is_Subprogram (E)
and then Nkind (Parent (E)) = N_Procedure_Specification
and then Null_Present (Parent (E))
then
declare
Prag : Node_Id;
begin
-- Comment this loop ???
Prag := Pre_Post_Conditions (Contract (E));
while Present (Prag) loop
Analyze_PPC_In_Decl_Part (Prag, E);
Prag := Next_Pragma (Prag);
end loop;
-- Why don't we do the same for Contract_Test_Cases ???
-- Comment this loop?
Prag := Classifications (Contract (E));
while Present (Prag) loop
if Pragma_Name (Prag) = Name_Depends then
Analyze_Depends_In_Decl_Part (Prag);
else
pragma Assert (Pragma_Name (Prag) = Name_Global);
Analyze_Global_In_Decl_Part (Prag);
end if;
Prag := Next_Pragma (Prag);
end loop;
end;
end if;
Analyze (Decl, Suppress => All_Checks);
end if;

View File

@ -67,6 +67,7 @@ with Sem_Disp; use Sem_Disp;
with Sem_Dist; use Sem_Dist;
with Sem_Eval; use Sem_Eval;
with Sem_Mech; use Sem_Mech;
with Sem_Prag; use Sem_Prag;
with Sem_Res; use Sem_Res;
with Sem_SCIL; use Sem_SCIL;
with Sem_Util; use Sem_Util;
@ -8293,6 +8294,42 @@ package body Exp_Ch6 is
Set_Returns_By_Ref (Subp);
end if;
end;
-- Wnen freezing a null procedure, analyze its delayed aspects now
-- because we may not have reached the end of the declarative list when
-- delayed aspects are normally analyzed. This ensures that dispatching
-- calls are properly rewritten when the generated _Postcondition
-- procedure is analyzed in the null procedure body.
if Nkind (Parent (Subp)) = N_Procedure_Specification
and then Null_Present (Parent (Subp))
then
declare
Prag : Node_Id;
begin
-- Analyze all pre- and post-conditions
Prag := Pre_Post_Conditions (Contract (Subp));
while Present (Prag) loop
Analyze_PPC_In_Decl_Part (Prag, Subp);
Prag := Next_Pragma (Prag);
end loop;
-- Analyze classification aspects Depends and Global
Prag := Classifications (Contract (Subp));
while Present (Prag) loop
if Pragma_Name (Prag) = Name_Depends then
Analyze_Depends_In_Decl_Part (Prag);
else
Analyze_Global_In_Decl_Part (Prag);
end if;
Prag := Next_Pragma (Prag);
end loop;
end;
end if;
end Freeze_Subprogram;
-----------------------

View File

@ -6,7 +6,7 @@
* *
* C Header File *
* *
* Copyright (C) 1992-2012, Free Software Foundation, Inc. *
* Copyright (C) 1992-2013, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@ -263,10 +263,14 @@ extern void Set_Has_No_Elaboration_Code (Node_Id, Boolean);
/* targparm: */
#define Backend_Overflow_Checks_On_Target targparm__backend_overflow_checks_on_target
#define Machine_Overflows_On_Target targparm__machine_overflows_on_target
#define Signed_Zeros_On_Target targparm__signed_zeros_on_target
#define Stack_Check_Probes_On_Target targparm__stack_check_probes_on_target
#define Stack_Check_Limits_On_Target targparm__stack_check_limits_on_target
extern Boolean Backend_Overflow_Checks_On_Target;
extern Boolean Machine_Overflows_On_Target;
extern Boolean Signed_Zeros_On_Target;
extern Boolean Stack_Check_Probes_On_Target;
extern Boolean Stack_Check_Limits_On_Target;

View File

@ -73,7 +73,6 @@ procedure Gnatbind is
-- Standard library
Text : Text_Buffer_Ptr;
Next_Arg : Positive;
Output_File_Name_Seen : Boolean := False;
Output_File_Name : String_Ptr := new String'("");
@ -104,6 +103,15 @@ procedure Gnatbind is
-- All the one character arguments are still handled by Switch. This
-- routine handles -aO -aI and -I-. The lower bound of Argv must be 1.
generic
with procedure Action (Argv : String);
procedure Generic_Scan_Bind_Args;
-- Iterate through the args calling Action on each one, taking care of
-- response files.
procedure Write_Arg (S : String);
-- Passed to Generic_Scan_Bind_Args to print args
function Is_Cross_Compiler return Boolean;
-- Returns True iff this is a cross-compiler
@ -480,12 +488,64 @@ procedure Gnatbind is
end if;
end Scan_Bind_Arg;
----------------------------
-- Generic_Scan_Bind_Args --
----------------------------
procedure Generic_Scan_Bind_Args is
Next_Arg : Positive := 1;
begin
-- Use low level argument routines to avoid dragging in the secondary
-- stack
while Next_Arg < Arg_Count loop
declare
Next_Argv : String (1 .. Len_Arg (Next_Arg));
begin
Fill_Arg (Next_Argv'Address, Next_Arg);
if Next_Argv'Length > 0 then
if Next_Argv (1) = '@' then
if Next_Argv'Length > 1 then
declare
Arguments : constant Argument_List :=
Response_File.Arguments_From
(Response_File_Name =>
Next_Argv (2 .. Next_Argv'Last),
Recursive => True,
Ignore_Non_Existing_Files => True);
begin
for J in Arguments'Range loop
Action (Arguments (J).all);
end loop;
end;
end if;
else
Action (Next_Argv);
end if;
end if;
end;
Next_Arg := Next_Arg + 1;
end loop;
end Generic_Scan_Bind_Args;
procedure Write_Arg (S : String) is
begin
Write_Str (" " & S);
end Write_Arg;
procedure Scan_Bind_Args is new Generic_Scan_Bind_Args (Scan_Bind_Arg);
procedure Put_Bind_Args is new Generic_Scan_Bind_Args (Write_Arg);
procedure Check_Version_And_Help is
new Check_Version_And_Help_G (Bindusg.Display);
-- Start of processing for Gnatbind
begin
-- Set default for Shared_Libgnat option
declare
@ -510,40 +570,16 @@ begin
Check_Version_And_Help ("GNATBIND", "1995");
-- Use low level argument routines to avoid dragging in the secondary stack
-- We need to Scan_Bind_Args first, to set Verbose_Mode, so we know whether
-- to Put_Bind_Args.
Next_Arg := 1;
Scan_Args : while Next_Arg < Arg_Count loop
declare
Next_Argv : String (1 .. Len_Arg (Next_Arg));
begin
Fill_Arg (Next_Argv'Address, Next_Arg);
Scan_Bind_Args;
if Next_Argv'Length > 0 then
if Next_Argv (1) = '@' then
if Next_Argv'Length > 1 then
declare
Arguments : constant Argument_List :=
Response_File.Arguments_From
(Response_File_Name =>
Next_Argv (2 .. Next_Argv'Last),
Recursive => True,
Ignore_Non_Existing_Files => True);
begin
for J in Arguments'Range loop
Scan_Bind_Arg (Arguments (J).all);
end loop;
end;
end if;
else
Scan_Bind_Arg (Next_Argv);
end if;
end if;
end;
Next_Arg := Next_Arg + 1;
end loop Scan_Args;
if Verbose_Mode then
Write_Str (Command_Name);
Put_Bind_Args;
Write_Eol;
end if;
if Use_Pragma_Linker_Constructor then
if Bind_Main_Program then

View File

@ -8353,14 +8353,7 @@ package body Sem_Prag is
-- Volatile requires exactly one Input or Output
-- Isn't this just Input_Seen = Output_Seen ???
if Volatile_Seen
and then
((Input_Seen and Output_Seen) -- both
or else
(not Input_Seen and not Output_Seen)) -- none
then
if Volatile_Seen and then Input_Seen = Output_Seen then
Error_Msg_N
("property Volatile requires exactly one Input or "
& "Output", State);