[multiple changes]
2010-06-22 Robert Dewar <dewar@adacore.com> * freeze.adb: Minor reformatting Minor code reorganization (use Nkind_In and Ekind_In). 2010-06-22 Bob Duff <duff@adacore.com> * gnat1drv.adb (Gnat1drv): Remove the messages that recommend using -gnatc when a file is compiled that we cannot generate code for, not helpful and confusing. 2010-06-22 Vincent Celier <celier@adacore.com> * switch-m.adb (Normalize_Compiler_Switches): Process correctly switches -gnatknn. 2010-06-22 Paul Hilfinger <hilfinger@adacore.com> * s-rannum.adb: Replace constants with commented symbols. * s-rannum.ads: Explain significance of the initial value of the data structure. 2010-06-22 Ed Schonberg <schonberg@adacore.com> * a-ngcoty.adb: Clarify comment. 2010-06-22 Gary Dismukes <dismukes@adacore.com> * exp_pakd.adb (Expand_Bit_Packed_Element_Set): Return without expansion for indexing packed arrays with small power-of-2 component sizes when the target is AAMP. (Expand_Packed_Element_Reference): Return without expansion for indexing packed arrays with small power-of-2 component sizes when the target is AAMP. 2010-06-22 Geert Bosch <bosch@adacore.com> * exp_ch4.adb (Expand_N_In): Do not substitute a valid check for X in Float'Range. 2010-06-22 Robert Dewar <dewar@adacore.com> * g-mbdira.adb, g-mbflra.adb, a-nuflra.adb, a-nudira.adb: Minor comment updates. From-SVN: r161213
This commit is contained in:
parent
879e23f058
commit
545cb5be91
@ -1,3 +1,48 @@
|
||||
2010-06-22 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* freeze.adb: Minor reformatting
|
||||
Minor code reorganization (use Nkind_In and Ekind_In).
|
||||
|
||||
2010-06-22 Bob Duff <duff@adacore.com>
|
||||
|
||||
* gnat1drv.adb (Gnat1drv): Remove the messages that recommend using
|
||||
-gnatc when a file is compiled that we cannot generate code for, not
|
||||
helpful and confusing.
|
||||
|
||||
2010-06-22 Vincent Celier <celier@adacore.com>
|
||||
|
||||
* switch-m.adb (Normalize_Compiler_Switches): Process correctly
|
||||
switches -gnatknn.
|
||||
|
||||
2010-06-22 Paul Hilfinger <hilfinger@adacore.com>
|
||||
|
||||
* s-rannum.adb: Replace constants with commented symbols.
|
||||
* s-rannum.ads: Explain significance of the initial value of the data
|
||||
structure.
|
||||
|
||||
2010-06-22 Ed Schonberg <schonberg@adacore.com>
|
||||
|
||||
* a-ngcoty.adb: Clarify comment.
|
||||
|
||||
2010-06-22 Gary Dismukes <dismukes@adacore.com>
|
||||
|
||||
* exp_pakd.adb (Expand_Bit_Packed_Element_Set): Return without
|
||||
expansion for indexing packed arrays with small power-of-2 component
|
||||
sizes when the target is AAMP.
|
||||
(Expand_Packed_Element_Reference): Return without expansion for
|
||||
indexing packed arrays with small power-of-2 component sizes when the
|
||||
target is AAMP.
|
||||
|
||||
2010-06-22 Geert Bosch <bosch@adacore.com>
|
||||
|
||||
* exp_ch4.adb (Expand_N_In): Do not substitute a valid check for X in
|
||||
Float'Range.
|
||||
|
||||
2010-06-22 Robert Dewar <dewar@adacore.com>
|
||||
|
||||
* g-mbdira.adb, g-mbflra.adb, a-nuflra.adb, a-nudira.adb: Minor comment
|
||||
updates.
|
||||
|
||||
2010-06-22 Doug Rupp <rupp@adacore.com>
|
||||
|
||||
* system-vms.ads, system-vms-zcx.ads: Remove old unused VMS system
|
||||
|
@ -60,15 +60,16 @@ package body Ada.Numerics.Generic_Complex_Types is
|
||||
|
||||
if not Standard'Fast_Math then
|
||||
|
||||
-- ??? the test below is weird, it needs a comment, otherwise I or
|
||||
-- someone else will change it back to R'Last > abs (X) ???
|
||||
-- Note that the test below is written as a negation. This is to
|
||||
-- account for the fact that X and Y may be NaNs, because both of
|
||||
-- their operands could overflow. Given that all operations on NaNs
|
||||
-- return false, the test can only be written thus.
|
||||
|
||||
if not (abs (X) <= R'Last) then
|
||||
X := Scale**2 * ((Left.Re / Scale) * (Right.Re / Scale) -
|
||||
(Left.Im / Scale) * (Right.Im / Scale));
|
||||
end if;
|
||||
|
||||
-- ??? same weird test ???
|
||||
if not (abs (Y) <= R'Last) then
|
||||
Y := Scale**2 * ((Left.Re / Scale) * (Right.Im / Scale)
|
||||
+ (Left.Im / Scale) * (Right.Re / Scale));
|
||||
|
@ -37,13 +37,14 @@ package body Ada.Numerics.Discrete_Random is
|
||||
-- Implementation Note --
|
||||
-------------------------
|
||||
|
||||
-- The design of this spec is very awkward, as a result of Ada 95 not
|
||||
-- The design of this spec is a bit awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally
|
||||
-- Generator values would be passed this way). In pure Ada 95, the only
|
||||
-- solution is to use the heap and pointers, and, to avoid memory leaks,
|
||||
-- controlled types.
|
||||
-- solution would be to add a self-referential component to the generator
|
||||
-- allowing access to the generator object from inside the function. This
|
||||
-- would work because the generator is limited, which prevents any copy.
|
||||
|
||||
-- This is awfully heavy, so what we do is to use Unrestricted_Access to
|
||||
-- This is a bit heavy, so what we do is to use Unrestricted_Access to
|
||||
-- get a pointer to the state in the passed Generator. This works because
|
||||
-- Generator is a limited type and will thus always be passed by reference.
|
||||
|
||||
|
@ -39,13 +39,14 @@ package body Ada.Numerics.Float_Random is
|
||||
-- Implementation Note --
|
||||
-------------------------
|
||||
|
||||
-- The design of this spec is very awkward, as a result of Ada 95 not
|
||||
-- The design of this spec is a bit awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally
|
||||
-- Generator values would be passed this way). In pure Ada 95, the only
|
||||
-- solution is to use the heap and pointers, and, to avoid memory leaks,
|
||||
-- controlled types.
|
||||
-- solution would be to add a self-referential component to the generator
|
||||
-- allowing access to the generator object from inside the function. This
|
||||
-- would work because the generator is limited, which prevents any copy.
|
||||
|
||||
-- This is awfully heavy, so what we do is to use Unrestricted_Access to
|
||||
-- This is a bit heavy, so what we do is to use Unrestricted_Access to
|
||||
-- get a pointer to the state in the passed Generator. This works because
|
||||
-- Generator is a limited type and will thus always be passed by reference.
|
||||
|
||||
|
@ -4378,9 +4378,12 @@ package body Exp_Ch4 is
|
||||
|
||||
-- Check case of explicit test for an expression in range of its
|
||||
-- subtype. This is suspicious usage and we replace it with a 'Valid
|
||||
-- test and give a warning.
|
||||
-- test and give a warning. For floating point types however, this
|
||||
-- is a standard way to check for finite numbers, and using 'Valid
|
||||
-- would typically be a pessimization
|
||||
|
||||
if Is_Scalar_Type (Etype (Lop))
|
||||
and then not Is_Floating_Point_Type (Etype (Lop))
|
||||
and then Nkind (Rop) in N_Has_Entity
|
||||
and then Etype (Lop) = Entity (Rop)
|
||||
and then Comes_From_Source (N)
|
||||
|
@ -1381,6 +1381,19 @@ package body Exp_Pakd is
|
||||
Analyze_And_Resolve (Rhs, Ctyp);
|
||||
end if;
|
||||
|
||||
-- For the AAMP target, indexing of certain packed array is passed
|
||||
-- through to the back end without expansion, because the expansion
|
||||
-- results in very inefficient code on that target. This allows the
|
||||
-- GNAAMP back end to generate specialized macros that support more
|
||||
-- efficient indexing of packed arrays with components having sizes
|
||||
-- that are small powers of two.
|
||||
|
||||
if AAMP_On_Target
|
||||
and then (Csiz = 1 or else Csiz = 2 or else Csiz = 4)
|
||||
then
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- Case of component size 1,2,4 or any component size for the modular
|
||||
-- case. These are the cases for which we can inline the code.
|
||||
|
||||
@ -1933,6 +1946,19 @@ package body Exp_Pakd is
|
||||
Ctyp := Component_Type (Atyp);
|
||||
Csiz := UI_To_Int (Component_Size (Atyp));
|
||||
|
||||
-- For the AAMP target, indexing of certain packed array is passed
|
||||
-- through to the back end without expansion, because the expansion
|
||||
-- results in very inefficient code on that target. This allows the
|
||||
-- GNAAMP back end to generate specialized macros that support more
|
||||
-- efficient indexing of packed arrays with components having sizes
|
||||
-- that are small powers of two.
|
||||
|
||||
if AAMP_On_Target
|
||||
and then (Csiz = 1 or else Csiz = 2 or else Csiz = 4)
|
||||
then
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- Case of component size 1,2,4 or any component size for the modular
|
||||
-- case. These are the cases for which we can inline the code.
|
||||
|
||||
|
@ -210,7 +210,6 @@ package body Freeze is
|
||||
Renamed_Subp : Entity_Id;
|
||||
|
||||
begin
|
||||
|
||||
-- If the renamed subprogram is intrinsic, there is no need for a
|
||||
-- wrapper body: we set the alias that will be called and expanded which
|
||||
-- completes the declaration. This transformation is only legal if the
|
||||
@ -221,7 +220,7 @@ package body Freeze is
|
||||
-- is frozen. See RM 8.5.4 (5).
|
||||
|
||||
if Nkind (Body_Decl) = N_Subprogram_Renaming_Declaration
|
||||
and then Is_Entity_Name (Name (Body_Decl))
|
||||
and then Is_Entity_Name (Name (Body_Decl))
|
||||
then
|
||||
Renamed_Subp := Entity (Name (Body_Decl));
|
||||
else
|
||||
@ -233,20 +232,20 @@ package body Freeze is
|
||||
and then
|
||||
(not In_Same_Source_Unit (Renamed_Subp, Ent)
|
||||
or else Sloc (Renamed_Subp) < Sloc (Ent))
|
||||
and then
|
||||
|
||||
-- We can make the renaming entity intrisic if the renamed function
|
||||
-- has an interface name, or it is one of the shift/rotate operations
|
||||
-- known to the compiler.
|
||||
-- We can make the renaming entity intrisic if the renamed function
|
||||
-- has an interface name, or if it is one of the shift/rotate
|
||||
-- operations known to the compiler.
|
||||
|
||||
(Present (Interface_Name (Renamed_Subp))
|
||||
or else Chars (Renamed_Subp) = Name_Rotate_Left
|
||||
or else Chars (Renamed_Subp) = Name_Rotate_Right
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Left
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Right
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Right_Arithmetic)
|
||||
and then (Present (Interface_Name (Renamed_Subp))
|
||||
or else Chars (Renamed_Subp) = Name_Rotate_Left
|
||||
or else Chars (Renamed_Subp) = Name_Rotate_Right
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Left
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Right
|
||||
or else Chars (Renamed_Subp) = Name_Shift_Right_Arithmetic)
|
||||
then
|
||||
Set_Interface_Name (Ent, Interface_Name (Renamed_Subp));
|
||||
|
||||
if Present (Alias (Renamed_Subp)) then
|
||||
Set_Alias (Ent, Alias (Renamed_Subp));
|
||||
else
|
||||
@ -274,12 +273,12 @@ package body Freeze is
|
||||
New_S : Entity_Id) return Node_Id
|
||||
is
|
||||
Loc : constant Source_Ptr := Sloc (New_S);
|
||||
-- We use for the source location of the renamed body, the location
|
||||
-- of the spec entity. It might seem more natural to use the location
|
||||
-- of the renaming declaration itself, but that would be wrong, since
|
||||
-- then the body we create would look as though it was created far
|
||||
-- too late, and this could cause problems with elaboration order
|
||||
-- analysis, particularly in connection with instantiations.
|
||||
-- We use for the source location of the renamed body, the location of
|
||||
-- the spec entity. It might seem more natural to use the location of
|
||||
-- the renaming declaration itself, but that would be wrong, since then
|
||||
-- the body we create would look as though it was created far too late,
|
||||
-- and this could cause problems with elaboration order analysis,
|
||||
-- particularly in connection with instantiations.
|
||||
|
||||
N : constant Node_Id := Unit_Declaration_Node (New_S);
|
||||
Nam : constant Node_Id := Name (N);
|
||||
@ -355,8 +354,7 @@ package body Freeze is
|
||||
Call_Name := New_Copy (Name (N));
|
||||
end if;
|
||||
|
||||
-- The original name may have been overloaded, but
|
||||
-- is fully resolved now.
|
||||
-- Original name may have been overloaded, but is fully resolved now
|
||||
|
||||
Set_Is_Overloaded (Call_Name, False);
|
||||
end if;
|
||||
@ -365,8 +363,7 @@ package body Freeze is
|
||||
-- calls to the renamed entity. The body must be generated in any case
|
||||
-- for calls that may appear elsewhere.
|
||||
|
||||
if (Ekind (Old_S) = E_Function
|
||||
or else Ekind (Old_S) = E_Procedure)
|
||||
if Ekind_In (Old_S, E_Function, E_Procedure)
|
||||
and then Nkind (Decl) = N_Subprogram_Declaration
|
||||
then
|
||||
Set_Body_To_Inline (Decl, Old_S);
|
||||
@ -385,7 +382,6 @@ package body Freeze is
|
||||
Form_Type : constant Entity_Id := Etype (First_Formal (Old_S));
|
||||
|
||||
begin
|
||||
|
||||
-- The controlling formal may be an access parameter, or the
|
||||
-- actual may be an access value, so adjust accordingly.
|
||||
|
||||
@ -434,10 +430,8 @@ package body Freeze is
|
||||
if Present (Formal) then
|
||||
O_Formal := First_Formal (Old_S);
|
||||
Param_Spec := First (Parameter_Specifications (Spec));
|
||||
|
||||
while Present (Formal) loop
|
||||
if Is_Entry (Old_S) then
|
||||
|
||||
if Nkind (Parameter_Type (Param_Spec)) /=
|
||||
N_Access_Definition
|
||||
then
|
||||
@ -500,7 +494,6 @@ package body Freeze is
|
||||
Make_Defining_Identifier (Loc, Chars => Chars (New_S)));
|
||||
|
||||
Param_Spec := First (Parameter_Specifications (Spec));
|
||||
|
||||
while Present (Param_Spec) loop
|
||||
Set_Defining_Identifier (Param_Spec,
|
||||
Make_Defining_Identifier (Loc,
|
||||
@ -569,27 +562,20 @@ package body Freeze is
|
||||
|
||||
if (No (Expression (Decl))
|
||||
and then not Needs_Finalization (Typ)
|
||||
and then
|
||||
(not Has_Non_Null_Base_Init_Proc (Typ)
|
||||
or else Is_Imported (E)))
|
||||
|
||||
or else
|
||||
(Present (Expression (Decl))
|
||||
and then Is_Scalar_Type (Typ))
|
||||
|
||||
or else
|
||||
Is_Access_Type (Typ)
|
||||
|
||||
and then (not Has_Non_Null_Base_Init_Proc (Typ)
|
||||
or else Is_Imported (E)))
|
||||
or else (Present (Expression (Decl)) and then Is_Scalar_Type (Typ))
|
||||
or else Is_Access_Type (Typ)
|
||||
or else
|
||||
(Is_Bit_Packed_Array (Typ)
|
||||
and then
|
||||
Is_Modular_Integer_Type (Packed_Array_Type (Typ)))
|
||||
and then Is_Modular_Integer_Type (Packed_Array_Type (Typ)))
|
||||
then
|
||||
null;
|
||||
|
||||
-- Otherwise, we require the address clause to be constant because
|
||||
-- the call to the initialization procedure (or the attach code) has
|
||||
-- to happen at the point of the declaration.
|
||||
|
||||
-- Actually the IP call has been moved to the freeze actions
|
||||
-- anyway, so maybe we can relax this restriction???
|
||||
|
||||
@ -843,7 +829,7 @@ package body Freeze is
|
||||
and then Present (Parent (T))
|
||||
and then Nkind (Parent (T)) = N_Full_Type_Declaration
|
||||
and then Nkind (Type_Definition (Parent (T))) =
|
||||
N_Record_Definition
|
||||
N_Record_Definition
|
||||
and then not Null_Present (Type_Definition (Parent (T)))
|
||||
and then Present (Variant_Part
|
||||
(Component_List (Type_Definition (Parent (T)))))
|
||||
@ -855,8 +841,7 @@ package body Freeze is
|
||||
|
||||
if not Is_Constrained (T)
|
||||
and then
|
||||
No (Discriminant_Default_Value
|
||||
(First_Discriminant (T)))
|
||||
No (Discriminant_Default_Value (First_Discriminant (T)))
|
||||
and then Unknown_Esize (T)
|
||||
then
|
||||
return False;
|
||||
@ -1242,10 +1227,7 @@ package body Freeze is
|
||||
-- Freeze_All_Ent --
|
||||
--------------------
|
||||
|
||||
procedure Freeze_All_Ent
|
||||
(From : Entity_Id;
|
||||
After : in out Node_Id)
|
||||
is
|
||||
procedure Freeze_All_Ent (From : Entity_Id; After : in out Node_Id) is
|
||||
E : Entity_Id;
|
||||
Flist : List_Id;
|
||||
Lastn : Node_Id;
|
||||
@ -1328,7 +1310,6 @@ package body Freeze is
|
||||
|
||||
begin
|
||||
Prim := First_Elmt (Prim_List);
|
||||
|
||||
while Present (Prim) loop
|
||||
Subp := Node (Prim);
|
||||
|
||||
@ -1363,11 +1344,11 @@ package body Freeze is
|
||||
Bod : constant Node_Id := Next (After);
|
||||
|
||||
begin
|
||||
if (Nkind (Bod) = N_Subprogram_Body
|
||||
or else Nkind (Bod) = N_Entry_Body
|
||||
or else Nkind (Bod) = N_Package_Body
|
||||
or else Nkind (Bod) = N_Protected_Body
|
||||
or else Nkind (Bod) = N_Task_Body
|
||||
if (Nkind_In (Bod, N_Subprogram_Body,
|
||||
N_Entry_Body,
|
||||
N_Package_Body,
|
||||
N_Protected_Body,
|
||||
N_Task_Body)
|
||||
or else Nkind (Bod) in N_Body_Stub)
|
||||
and then
|
||||
List_Containing (After) = List_Containing (Parent (E))
|
||||
@ -1437,11 +1418,10 @@ package body Freeze is
|
||||
then
|
||||
declare
|
||||
Ent : Entity_Id;
|
||||
|
||||
begin
|
||||
Ent := First_Entity (E);
|
||||
|
||||
while Present (Ent) loop
|
||||
|
||||
if Is_Entry (Ent)
|
||||
and then not Default_Expressions_Processed (Ent)
|
||||
then
|
||||
@ -1919,12 +1899,12 @@ package body Freeze is
|
||||
|
||||
-- If the component is an Itype with Delayed_Freeze and is either
|
||||
-- a record or array subtype and its base type has not yet been
|
||||
-- frozen, we must remove this from the entity list of this
|
||||
-- record and put it on the entity list of the scope of its base
|
||||
-- type. Note that we know that this is not the type of a
|
||||
-- component since we cleared Has_Delayed_Freeze for it in the
|
||||
-- previous loop. Thus this must be the Designated_Type of an
|
||||
-- access type, which is the type of a component.
|
||||
-- frozen, we must remove this from the entity list of this record
|
||||
-- and put it on the entity list of the scope of its base type.
|
||||
-- Note that we know that this is not the type of a component
|
||||
-- since we cleared Has_Delayed_Freeze for it in the previous
|
||||
-- loop. Thus this must be the Designated_Type of an access type,
|
||||
-- which is the type of a component.
|
||||
|
||||
if Is_Itype (Comp)
|
||||
and then Is_Type (Scope (Comp))
|
||||
@ -2347,6 +2327,7 @@ package body Freeze is
|
||||
S : Entity_Id := Current_Scope;
|
||||
|
||||
begin
|
||||
|
||||
while Present (S) loop
|
||||
if Is_Overloadable (S) then
|
||||
if Comes_From_Source (S)
|
||||
@ -2408,8 +2389,8 @@ package body Freeze is
|
||||
-- Skip this if the entity is stubbed, since we don't need a name
|
||||
-- for any stubbed routine. For the case on intrinsics, if no
|
||||
-- external name is specified, then calls will be handled in
|
||||
-- Exp_Intr.Expand_Intrinsic_Call, and no name is needed; if
|
||||
-- an external name is provided, then Expand_Intrinsic_Call leaves
|
||||
-- Exp_Intr.Expand_Intrinsic_Call, and no name is needed. If an
|
||||
-- external name is provided, then Expand_Intrinsic_Call leaves
|
||||
-- calls in place for expansion by GIGI.
|
||||
|
||||
if (Is_Imported (E) or else Is_Exported (E))
|
||||
|
@ -39,13 +39,14 @@ package body GNAT.MBBS_Discrete_Random is
|
||||
-- Implementation Note --
|
||||
-------------------------
|
||||
|
||||
-- The design of this spec is very awkward, as a result of Ada 95 not
|
||||
-- The design of this spec is a bit awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally
|
||||
-- Generator values would be passed this way). In pure Ada 95, the only
|
||||
-- solution is to use the heap and pointers, and, to avoid memory leaks,
|
||||
-- controlled types.
|
||||
-- solution would be to add a self-referential component to the generator
|
||||
-- allowing access to the generator object from inside the function. This
|
||||
-- would work because the generator is limited, which prevents any copy.
|
||||
|
||||
-- This is awfully heavy, so what we do is to use Unrestricted_Access to
|
||||
-- This is a bit heavy, so what we do is to use Unrestricted_Access to
|
||||
-- get a pointer to the state in the passed Generator. This works because
|
||||
-- Generator is a limited type and will thus always be passed by reference.
|
||||
|
||||
|
@ -37,13 +37,14 @@ package body GNAT.MBBS_Float_Random is
|
||||
-- Implementation Note --
|
||||
-------------------------
|
||||
|
||||
-- The design of this spec is very awkward, as a result of Ada 95 not
|
||||
-- The design of this spec is a bit awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally
|
||||
-- Generator values would be passed this way). In pure Ada 95, the only
|
||||
-- solution is to use the heap and pointers, and, to avoid memory leaks,
|
||||
-- controlled types.
|
||||
-- solution would be to add a self-referential component to the generator
|
||||
-- allowing access to the generator object from inside the function. This
|
||||
-- would work because the generator is limited, which prevents any copy.
|
||||
|
||||
-- This is awfully heavy, so what we do is to use Unrestricted_Access to
|
||||
-- This is a bit heavy, so what we do is to use Unrestricted_Access to
|
||||
-- get a pointer to the state in the passed Generator. This works because
|
||||
-- Generator is a limited type and will thus always be passed by reference.
|
||||
|
||||
|
@ -861,42 +861,28 @@ begin
|
||||
if Subunits_Missing then
|
||||
Write_Str (" (missing subunits)");
|
||||
Write_Eol;
|
||||
Write_Str ("to check parent unit");
|
||||
|
||||
elsif Main_Kind = N_Subunit then
|
||||
Write_Str (" (subunit)");
|
||||
Write_Eol;
|
||||
Write_Str ("to check subunit");
|
||||
|
||||
elsif Main_Kind = N_Subprogram_Declaration then
|
||||
Write_Str (" (subprogram spec)");
|
||||
Write_Eol;
|
||||
Write_Str ("to check subprogram spec");
|
||||
|
||||
-- Generic package body in GNAT implementation mode
|
||||
|
||||
elsif Main_Kind = N_Package_Body and then GNAT_Mode then
|
||||
Write_Str (" (predefined generic)");
|
||||
Write_Eol;
|
||||
Write_Str ("to check predefined generic");
|
||||
|
||||
-- Only other case is a package spec
|
||||
|
||||
else
|
||||
Write_Str (" (package spec)");
|
||||
Write_Eol;
|
||||
Write_Str ("to check package spec");
|
||||
end if;
|
||||
|
||||
Write_Str (" for errors, use ");
|
||||
|
||||
if Hostparm.OpenVMS then
|
||||
Write_Str ("/NOLOAD");
|
||||
else
|
||||
Write_Str ("-gnatc");
|
||||
end if;
|
||||
|
||||
Write_Eol;
|
||||
Set_Standard_Output;
|
||||
|
||||
Sem_Ch13.Validate_Unchecked_Conversions;
|
||||
|
@ -99,30 +99,71 @@ package body System.Random_Numbers is
|
||||
-- Implementation Note --
|
||||
-------------------------
|
||||
|
||||
-- The design of this spec is very awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally,
|
||||
-- The design of this spec is a bit awkward, as a result of Ada 95 not
|
||||
-- permitting in-out parameters for function formals (most naturally
|
||||
-- Generator values would be passed this way). In pure Ada 95, the only
|
||||
-- solution is to use the heap and pointers, and, to avoid memory leaks,
|
||||
-- controlled types.
|
||||
-- solution would be to add a self-referential component to the generator
|
||||
-- allowing access to the generator object from inside the function. This
|
||||
-- would work because the generator is limited, which prevents any copy.
|
||||
|
||||
-- This is awfully heavy, so what we do is to use Unrestricted_Access to
|
||||
-- This is a bit heavy, so what we do is to use Unrestricted_Access to
|
||||
-- get a pointer to the state in the passed Generator. This works because
|
||||
-- Generator is a limited type and will thus always be passed by reference.
|
||||
|
||||
Low31_Mask : constant := 2**31-1;
|
||||
Bit31_Mask : constant := 2**31;
|
||||
|
||||
Matrix_A_X : constant array (State_Val range 0 .. 1) of State_Val :=
|
||||
(0, 16#9908b0df#);
|
||||
|
||||
Y2K : constant Calendar.Time :=
|
||||
Calendar.Time_Of
|
||||
(Year => 2000, Month => 1, Day => 1, Seconds => 0.0);
|
||||
-- First Year 2000 day
|
||||
-- First day of Year 2000 (what is this for???)
|
||||
|
||||
Image_Numeral_Length : constant := Max_Image_Width / N;
|
||||
subtype Image_String is String (1 .. Max_Image_Width);
|
||||
|
||||
----------------------------
|
||||
-- Algorithmic Parameters --
|
||||
----------------------------
|
||||
|
||||
Lower_Mask : constant := 2**31-1;
|
||||
Upper_Mask : constant := 2**31;
|
||||
|
||||
Matrix_A : constant array (State_Val range 0 .. 1) of State_Val
|
||||
:= (0, 16#9908b0df#);
|
||||
-- The twist transformation is represented by a matrix of the form
|
||||
--
|
||||
-- [ 0 I(31) ]
|
||||
-- [ _a ]
|
||||
--
|
||||
-- where 0 is a 31x31 block of 0s, I(31) is the 31x31 identity matrix and
|
||||
-- _a is a particular bit row-vector, represented here by a 32-bit integer.
|
||||
-- If integer x represents a row vector of bits (with x(0), the units bit,
|
||||
-- last), then
|
||||
-- x * A = [0 x(31..1)] xor Matrix_A(x(0)).
|
||||
|
||||
U : constant := 11;
|
||||
S : constant := 7;
|
||||
B_Mask : constant := 16#9d2c5680#;
|
||||
T : constant := 15;
|
||||
C_Mask : constant := 16#efc60000#;
|
||||
L : constant := 18;
|
||||
-- The tempering shifts and bit masks, in the order applied
|
||||
|
||||
Seed0 : constant := 5489;
|
||||
-- Default seed, used to initialize the state vector when Reset not called
|
||||
|
||||
Seed1 : constant := 19650218;
|
||||
-- Seed used to initialize the state vector when calling Reset with an
|
||||
-- initialization vector.
|
||||
|
||||
Mult0 : constant := 1812433253;
|
||||
-- Multiplier for a modified linear congruential generator used to
|
||||
-- initialize the state vector when calling Reset with a single integer
|
||||
-- seed.
|
||||
|
||||
Mult1 : constant := 1664525;
|
||||
Mult2 : constant := 1566083941;
|
||||
-- Multipliers for two modified linear congruential generators used to
|
||||
-- initialize the state vector when calling Reset with an initialization
|
||||
-- vector.
|
||||
|
||||
-----------------------
|
||||
-- Local Subprograms --
|
||||
-----------------------
|
||||
@ -153,40 +194,40 @@ package body System.Random_Numbers is
|
||||
function Random (Gen : Generator) return Unsigned_32 is
|
||||
G : Generator renames Gen'Unrestricted_Access.all;
|
||||
Y : State_Val;
|
||||
I : Integer;
|
||||
I : Integer; -- should avoid use of identifier I ???
|
||||
|
||||
begin
|
||||
I := G.I;
|
||||
|
||||
if I < N - M then
|
||||
Y := (G.S (I) and Bit31_Mask) or (G.S (I + 1) and Low31_Mask);
|
||||
Y := G.S (I + M) xor Shift_Right (Y, 1) xor Matrix_A_X (Y and 1);
|
||||
Y := (G.S (I) and Upper_Mask) or (G.S (I + 1) and Lower_Mask);
|
||||
Y := G.S (I + M) xor Shift_Right (Y, 1) xor Matrix_A (Y and 1);
|
||||
I := I + 1;
|
||||
|
||||
elsif I < N - 1 then
|
||||
Y := (G.S (I) and Bit31_Mask) or (G.S (I + 1) and Low31_Mask);
|
||||
Y := (G.S (I) and Upper_Mask) or (G.S (I + 1) and Lower_Mask);
|
||||
Y := G.S (I + (M - N))
|
||||
xor Shift_Right (Y, 1)
|
||||
xor Matrix_A_X (Y and 1);
|
||||
xor Matrix_A (Y and 1);
|
||||
I := I + 1;
|
||||
|
||||
elsif I = N - 1 then
|
||||
Y := (G.S (I) and Bit31_Mask) or (G.S (0) and Low31_Mask);
|
||||
Y := G.S (M - 1) xor Shift_Right (Y, 1) xor Matrix_A_X (Y and 1);
|
||||
Y := (G.S (I) and Upper_Mask) or (G.S (0) and Lower_Mask);
|
||||
Y := G.S (M - 1) xor Shift_Right (Y, 1) xor Matrix_A (Y and 1);
|
||||
I := 0;
|
||||
|
||||
else
|
||||
Init (G, 5489);
|
||||
Init (G, Seed0);
|
||||
return Random (Gen);
|
||||
end if;
|
||||
|
||||
G.S (G.I) := Y;
|
||||
G.I := I;
|
||||
|
||||
Y := Y xor Shift_Right (Y, 11);
|
||||
Y := Y xor (Shift_Left (Y, 7) and 16#9d2c5680#);
|
||||
Y := Y xor (Shift_Left (Y, 15) and 16#efc60000#);
|
||||
Y := Y xor Shift_Right (Y, 18);
|
||||
Y := Y xor Shift_Right (Y, U);
|
||||
Y := Y xor (Shift_Left (Y, S) and B_Mask);
|
||||
Y := Y xor (Shift_Left (Y, T) and C_Mask);
|
||||
Y := Y xor Shift_Right (Y, L);
|
||||
|
||||
return Y;
|
||||
end Random;
|
||||
@ -265,17 +306,10 @@ package body System.Random_Numbers is
|
||||
|
||||
Mantissa : Unsigned;
|
||||
|
||||
X : Real;
|
||||
-- Scaled mantissa
|
||||
|
||||
R : Unsigned_32;
|
||||
-- Supply of random bits
|
||||
|
||||
R_Bits : Natural;
|
||||
-- Number of bits left in R
|
||||
|
||||
K : Bit_Count;
|
||||
-- Next decrement to exponent
|
||||
X : Real; -- Scaled mantissa
|
||||
R : Unsigned_32; -- Supply of random bits
|
||||
R_Bits : Natural; -- Number of bits left in R
|
||||
K : Bit_Count; -- Next decrement to exponent
|
||||
|
||||
begin
|
||||
Mantissa := Random (Gen) / 2**Extra_Bits;
|
||||
@ -388,7 +422,7 @@ package body System.Random_Numbers is
|
||||
declare
|
||||
-- In the 64-bit case, we have to be careful, since not all 64-bit
|
||||
-- unsigned values are representable in GNAT's root_integer type.
|
||||
-- Ignore different-size warnings here; since GNAT's handling
|
||||
-- Ignore different-size warnings here since GNAT's handling
|
||||
-- is correct.
|
||||
|
||||
pragma Warnings ("Z"); -- better to use msg string! ???
|
||||
@ -482,7 +516,7 @@ package body System.Random_Numbers is
|
||||
|
||||
procedure Reset (Gen : out Generator; Initiator : Integer) is
|
||||
begin
|
||||
pragma Warnings ("C");
|
||||
pragma Warnings (Off, "condition is always *");
|
||||
-- This is probably an unnecessary precaution against future change, but
|
||||
-- since the test is a static expression, no extra code is involved.
|
||||
|
||||
@ -502,14 +536,14 @@ package body System.Random_Numbers is
|
||||
end;
|
||||
end if;
|
||||
|
||||
pragma Warnings ("c");
|
||||
pragma Warnings (On, "condition is always *");
|
||||
end Reset;
|
||||
|
||||
procedure Reset (Gen : out Generator; Initiator : Initialization_Vector) is
|
||||
I, J : Integer;
|
||||
|
||||
begin
|
||||
Init (Gen, 19650218); -- please give this constant a name ???
|
||||
Init (Gen, Seed1);
|
||||
I := 1;
|
||||
J := 0;
|
||||
|
||||
@ -517,8 +551,8 @@ package body System.Random_Numbers is
|
||||
for K in reverse 1 .. Integer'Max (N, Initiator'Length) loop
|
||||
Gen.S (I) :=
|
||||
(Gen.S (I)
|
||||
xor ((Gen.S (I - 1) xor Shift_Right (Gen.S (I - 1), 30))
|
||||
* 1664525))
|
||||
xor ((Gen.S (I - 1) xor Shift_Right (Gen.S (I - 1), 30))
|
||||
* Mult1))
|
||||
+ Initiator (J + Initiator'First) + Unsigned_32 (J);
|
||||
|
||||
I := I + 1;
|
||||
@ -538,7 +572,7 @@ package body System.Random_Numbers is
|
||||
for K in reverse 1 .. N - 1 loop
|
||||
Gen.S (I) :=
|
||||
(Gen.S (I) xor ((Gen.S (I - 1)
|
||||
xor Shift_Right (Gen.S (I - 1), 30)) * 1566083941))
|
||||
xor Shift_Right (Gen.S (I - 1), 30)) * Mult2))
|
||||
- Unsigned_32 (I);
|
||||
I := I + 1;
|
||||
|
||||
@ -548,7 +582,7 @@ package body System.Random_Numbers is
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
Gen.S (0) := Bit31_Mask;
|
||||
Gen.S (0) := Upper_Mask;
|
||||
end Reset;
|
||||
|
||||
procedure Reset (Gen : out Generator; From_State : Generator) is
|
||||
@ -612,7 +646,6 @@ package body System.Random_Numbers is
|
||||
|
||||
begin
|
||||
Result := (others => ' ');
|
||||
|
||||
for J in 0 .. N - 1 loop
|
||||
Insert_Image (Result, J, Gen.S ((J + Gen.I) mod N));
|
||||
end loop;
|
||||
@ -643,9 +676,8 @@ package body System.Random_Numbers is
|
||||
|
||||
for I in 1 .. N - 1 loop
|
||||
Gen.S (I) :=
|
||||
1812433253
|
||||
* (Gen.S (I - 1) xor Shift_Right (Gen.S (I - 1), 30))
|
||||
+ Unsigned_32 (I);
|
||||
Mult0 * (Gen.S (I - 1) xor Shift_Right (Gen.S (I - 1), 30)) +
|
||||
Unsigned_32 (I);
|
||||
end loop;
|
||||
|
||||
Gen.I := 0;
|
||||
|
@ -6,7 +6,7 @@
|
||||
-- --
|
||||
-- S p e c --
|
||||
-- --
|
||||
-- Copyright (C) 2007,2009 Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 2007-2010, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- GNAT is free software; you can redistribute it and/or modify it under --
|
||||
-- terms of the GNU General Public License as published by the Free Soft- --
|
||||
@ -140,7 +140,7 @@ private
|
||||
-- The shift register, a circular buffer
|
||||
|
||||
I : Integer := N;
|
||||
-- Current starting position in shift register S
|
||||
-- Current starting position in shift register S (N means uninitialized)
|
||||
end record;
|
||||
|
||||
end System.Random_Numbers;
|
||||
|
@ -215,10 +215,10 @@ package body Switch.M is
|
||||
|
||||
-- One-letter switches
|
||||
|
||||
when 'a' | 'A' | 'b' | 'c' | 'D' | 'E' | 'f' |
|
||||
'F' | 'g' | 'h' | 'H' | 'k' | 'l' | 'L' | 'n' | 'N' |
|
||||
'o' | 'O' | 'p' | 'P' | 'q' | 'Q' | 'r' | 's' | 't' |
|
||||
'u' | 'U' | 'v' | 'x' | 'X' | 'Z' =>
|
||||
when 'a' | 'A' | 'b' | 'c' | 'D' | 'E' | 'f' | 'F' |
|
||||
'g' | 'h' | 'H' | 'l' | 'L' | 'n' | 'N' | 'o' |
|
||||
'O' | 'p' | 'P' | 'q' | 'Q' | 'r' | 's' | 't' |
|
||||
'u' | 'U' | 'v' | 'x' | 'X' | 'Z' =>
|
||||
Storing (First_Stored) := C;
|
||||
Add_Switch_Component
|
||||
(Storing (Storing'First .. First_Stored));
|
||||
@ -226,7 +226,7 @@ package body Switch.M is
|
||||
|
||||
-- One-letter switches followed by a positive number
|
||||
|
||||
when 'm' | 'T' =>
|
||||
when 'k' | 'm' | 'T' =>
|
||||
Storing (First_Stored) := C;
|
||||
Last_Stored := First_Stored;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user