sem_attr.adb: Implement Machine_Rounding attribute

2005-11-14  Robert Dewar  <dewar@adacore.com>
	    Hristian Kirtchev  <kirtchev@adacore.com>

	* sem_attr.adb: Implement Machine_Rounding attribute
	(Analyze_Access_Attribute): The access attribute may appear within an
	aggregate that has been expanded into a loop.
	(Check_Task_Prefix): Add semantic check for attribute 'Callable and
	'Terminated whenever the prefix is of a task interface class-wide type.
	(Analyze_Attribute): Add semantic check for attribute 'Identity whenever
	the prefix is of a task interface class-wide type.

	* s-vaflop-vms-alpha.adb: Valid_D, Valid_F, Valid_G: Make Val constant
	to avoid warnings.

	* s-fatgen.ads, s-fatgen.adb (Machine_Rounding): New function
	Remove pragma Inline for [Unaligned_]Valid.
	Add comments that Valid routines do not work for Vax_Float

	* exp_attr.adb: Implement Machine_Rounding attribute

	* snames.h: Add entry for Machine_Rounding attribute

From-SVN: r106970
This commit is contained in:
Robert Dewar 2005-11-15 14:56:51 +01:00 committed by Arnaud Charlet
parent 7b9d0d6990
commit 65f01153ab
6 changed files with 514 additions and 230 deletions

View File

@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2005 Free Software Foundation, Inc. -- -- Copyright (C) 1992-2005, 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- --
@ -85,16 +85,17 @@ package body Exp_Attr is
procedure Expand_Fpt_Attribute procedure Expand_Fpt_Attribute
(N : Node_Id; (N : Node_Id;
Rtp : Entity_Id; Pkg : RE_Id;
Nam : Name_Id; Nam : Name_Id;
Args : List_Id); Args : List_Id);
-- This procedure expands a call to a floating-point attribute function. -- This procedure expands a call to a floating-point attribute function.
-- N is the attribute reference node, and Args is a list of arguments to -- N is the attribute reference node, and Args is a list of arguments to
-- be passed to the function call. Rtp is the root type of the floating -- be passed to the function call. Pkg identifies the package containing
-- point type involved (used to select the proper generic instantiation -- the appropriate instantiation of System.Fat_Gen. Float arguments in Args
-- of the package containing the attribute routines). The Nam argument -- have already been converted to the floating-point type for which Pkg was
-- is the attribute processing routine to be called. This is normally -- instantiated. The Nam argument is the relevant attribute processing
-- the same as the attribute name, except in the Unaligned_Valid case. -- routine to be called. This is the same as the attribute name, except in
-- the Unaligned_Valid case.
procedure Expand_Fpt_Attribute_R (N : Node_Id); procedure Expand_Fpt_Attribute_R (N : Node_Id);
-- This procedure expands a call to a floating-point attribute function -- This procedure expands a call to a floating-point attribute function
@ -123,6 +124,15 @@ package body Exp_Attr is
-- A reference to a type within its own scope is resolved to a reference -- A reference to a type within its own scope is resolved to a reference
-- to the current instance of the type in its initialization procedure. -- to the current instance of the type in its initialization procedure.
procedure Find_Fat_Info
(T : Entity_Id;
Fat_Type : out Entity_Id;
Fat_Pkg : out RE_Id);
-- Given a floating-point type T, identifies the package containing the
-- attributes for this type (returned in Fat_Pkg), and the corresponding
-- type for which this package was instantiated from Fat_Gen. Error if T
-- is not a floating-point type.
function Find_Stream_Subprogram function Find_Stream_Subprogram
(Typ : Entity_Id; (Typ : Entity_Id;
Nam : TSS_Name_Type) return Entity_Id; Nam : TSS_Name_Type) return Entity_Id;
@ -176,7 +186,7 @@ package body Exp_Attr is
if Check then if Check then
Insert_Action (N, Decl); Insert_Action (N, Decl);
else else
Insert_Action (N, Decl, All_Checks); Insert_Action (N, Decl, Suppress => All_Checks);
end if; end if;
if Installed then if Installed then
@ -260,18 +270,17 @@ package body Exp_Attr is
procedure Expand_Fpt_Attribute procedure Expand_Fpt_Attribute
(N : Node_Id; (N : Node_Id;
Rtp : Entity_Id; Pkg : RE_Id;
Nam : Name_Id; Nam : Name_Id;
Args : List_Id) Args : List_Id)
is is
Loc : constant Source_Ptr := Sloc (N); Loc : constant Source_Ptr := Sloc (N);
Typ : constant Entity_Id := Etype (N); Typ : constant Entity_Id := Etype (N);
Pkg : RE_Id;
Fnm : Node_Id; Fnm : Node_Id;
begin begin
-- The function name is the selected component Fat_xxx.yyy where xxx -- The function name is the selected component Attr_xxx.yyy where
-- is the floating-point root type, and yyy is the argument Nam. -- Attr_xxx is the package name, and yyy is the argument Nam.
-- Note: it would be more usual to have separate RE entries for each -- Note: it would be more usual to have separate RE entries for each
-- of the entities in the Fat packages, but first they have identical -- of the entities in the Fat packages, but first they have identical
@ -279,16 +288,6 @@ package body Exp_Attr is
-- meet the normal RE rule of separate names for all runtime entities), -- meet the normal RE rule of separate names for all runtime entities),
-- and second there would be an awful lot of them! -- and second there would be an awful lot of them!
if Rtp = Standard_Short_Float then
Pkg := RE_Fat_Short_Float;
elsif Rtp = Standard_Float then
Pkg := RE_Fat_Float;
elsif Rtp = Standard_Long_Float then
Pkg := RE_Fat_Long_Float;
else
Pkg := RE_Fat_Long_Long_Float;
end if;
Fnm := Fnm :=
Make_Selected_Component (Loc, Make_Selected_Component (Loc,
Prefix => New_Reference_To (RTE (Pkg), Loc), Prefix => New_Reference_To (RTE (Pkg), Loc),
@ -302,7 +301,7 @@ package body Exp_Attr is
Rewrite (N, Rewrite (N,
Unchecked_Convert_To (Base_Type (Etype (N)), Unchecked_Convert_To (Base_Type (Etype (N)),
Make_Function_Call (Loc, Make_Function_Call (Loc,
Name => Fnm, Name => Fnm,
Parameter_Associations => Args))); Parameter_Associations => Args)));
Analyze_And_Resolve (N, Typ); Analyze_And_Resolve (N, Typ);
@ -318,12 +317,13 @@ package body Exp_Attr is
procedure Expand_Fpt_Attribute_R (N : Node_Id) is procedure Expand_Fpt_Attribute_R (N : Node_Id) is
E1 : constant Node_Id := First (Expressions (N)); E1 : constant Node_Id := First (Expressions (N));
Rtp : constant Entity_Id := Root_Type (Etype (E1)); Ftp : Entity_Id;
Pkg : RE_Id;
begin begin
Find_Fat_Info (Etype (E1), Ftp, Pkg);
Expand_Fpt_Attribute Expand_Fpt_Attribute
(N, Rtp, Attribute_Name (N), (N, Pkg, Attribute_Name (N),
New_List (Unchecked_Convert_To (Rtp, Relocate_Node (E1)))); New_List (Unchecked_Convert_To (Ftp, Relocate_Node (E1))));
end Expand_Fpt_Attribute_R; end Expand_Fpt_Attribute_R;
----------------------------- -----------------------------
@ -337,14 +337,15 @@ package body Exp_Attr is
procedure Expand_Fpt_Attribute_RI (N : Node_Id) is procedure Expand_Fpt_Attribute_RI (N : Node_Id) is
E1 : constant Node_Id := First (Expressions (N)); E1 : constant Node_Id := First (Expressions (N));
Rtp : constant Entity_Id := Root_Type (Etype (E1)); Ftp : Entity_Id;
Pkg : RE_Id;
E2 : constant Node_Id := Next (E1); E2 : constant Node_Id := Next (E1);
begin begin
Find_Fat_Info (Etype (E1), Ftp, Pkg);
Expand_Fpt_Attribute Expand_Fpt_Attribute
(N, Rtp, Attribute_Name (N), (N, Pkg, Attribute_Name (N),
New_List ( New_List (
Unchecked_Convert_To (Rtp, Relocate_Node (E1)), Unchecked_Convert_To (Ftp, Relocate_Node (E1)),
Unchecked_Convert_To (Standard_Integer, Relocate_Node (E2)))); Unchecked_Convert_To (Standard_Integer, Relocate_Node (E2))));
end Expand_Fpt_Attribute_RI; end Expand_Fpt_Attribute_RI;
@ -358,15 +359,16 @@ package body Exp_Attr is
procedure Expand_Fpt_Attribute_RR (N : Node_Id) is procedure Expand_Fpt_Attribute_RR (N : Node_Id) is
E1 : constant Node_Id := First (Expressions (N)); E1 : constant Node_Id := First (Expressions (N));
Rtp : constant Entity_Id := Root_Type (Etype (E1)); Ftp : Entity_Id;
Pkg : RE_Id;
E2 : constant Node_Id := Next (E1); E2 : constant Node_Id := Next (E1);
begin begin
Find_Fat_Info (Etype (E1), Ftp, Pkg);
Expand_Fpt_Attribute Expand_Fpt_Attribute
(N, Rtp, Attribute_Name (N), (N, Pkg, Attribute_Name (N),
New_List ( New_List (
Unchecked_Convert_To (Rtp, Relocate_Node (E1)), Unchecked_Convert_To (Ftp, Relocate_Node (E1)),
Unchecked_Convert_To (Rtp, Relocate_Node (E2)))); Unchecked_Convert_To (Ftp, Relocate_Node (E2))));
end Expand_Fpt_Attribute_RR; end Expand_Fpt_Attribute_RR;
---------------------------------- ----------------------------------
@ -1011,8 +1013,31 @@ package body Exp_Attr is
when Attribute_Callable => Callable : when Attribute_Callable => Callable :
begin begin
Rewrite (N, -- We have an object of a task interface class-wide type as a prefix
Build_Call_With_Task (Pref, RTE (RE_Callable))); -- to Callable. Generate:
-- callable (Pref._disp_get_task_id);
if Ada_Version >= Ada_05
and then Ekind (Etype (Pref)) = E_Class_Wide_Type
and then Is_Interface (Etype (Pref))
and then Is_Task_Interface (Etype (Pref))
then
Rewrite (N,
Make_Function_Call (Loc,
Name =>
New_Reference_To (RTE (RE_Callable), Loc),
Parameter_Associations => New_List (
Make_Selected_Component (Loc,
Prefix =>
New_Copy_Tree (Pref),
Selector_Name =>
Make_Identifier (Loc, Name_uDisp_Get_Task_Id)))));
else
Rewrite (N,
Build_Call_With_Task (Pref, RTE (RE_Callable)));
end if;
Analyze_And_Resolve (N, Standard_Boolean); Analyze_And_Resolve (N, Standard_Boolean);
end Callable; end Callable;
@ -1630,8 +1655,8 @@ package body Exp_Attr is
-- expands into -- expands into
-- Result_Type (System.Fore (Long_Long_Float (Type'First)), -- Result_Type (System.Fore (Universal_Real (Type'First)),
-- Long_Long_Float (Type'Last)) -- Universal_Real (Type'Last))
-- Note that we know that the type is a non-static subtype, or Fore -- Note that we know that the type is a non-static subtype, or Fore
-- would have itself been computed dynamically in Eval_Attribute. -- would have itself been computed dynamically in Eval_Attribute.
@ -1647,12 +1672,12 @@ package body Exp_Attr is
Name => New_Reference_To (RTE (RE_Fore), Loc), Name => New_Reference_To (RTE (RE_Fore), Loc),
Parameter_Associations => New_List ( Parameter_Associations => New_List (
Convert_To (Standard_Long_Long_Float, Convert_To (Universal_Real,
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,
Prefix => New_Reference_To (Ptyp, Loc), Prefix => New_Reference_To (Ptyp, Loc),
Attribute_Name => Name_First)), Attribute_Name => Name_First)),
Convert_To (Standard_Long_Long_Float, Convert_To (Universal_Real,
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,
Prefix => New_Reference_To (Ptyp, Loc), Prefix => New_Reference_To (Ptyp, Loc),
Attribute_Name => Name_Last)))))); Attribute_Name => Name_Last))))));
@ -2283,6 +2308,17 @@ package body Exp_Attr is
when Attribute_Machine => when Attribute_Machine =>
Expand_Fpt_Attribute_R (N); Expand_Fpt_Attribute_R (N);
----------------------
-- Machine_Rounding --
----------------------
-- Transforms 'Machine_Rounding into a call to the floating-point
-- attribute function Machine_Rounding in Fat_xxx (where xxx is the root
-- type).
when Attribute_Machine_Rounding =>
Expand_Fpt_Attribute_R (N);
------------------ ------------------
-- Machine_Size -- -- Machine_Size --
------------------ ------------------
@ -2425,7 +2461,7 @@ package body Exp_Attr is
end if; end if;
Analyze_And_Resolve (N, Btyp, All_Checks); Analyze_And_Resolve (N, Btyp, Suppress => All_Checks);
end Mod_Case; end Mod_Case;
----------- -----------
@ -3211,7 +3247,7 @@ package body Exp_Attr is
Rewrite (Prefix (N), New_Occurrence_Of (Entity (Pref), Loc)); Rewrite (Prefix (N), New_Occurrence_Of (Entity (Pref), Loc));
return; return;
-- For x'Size applied to an object of a class-wide type, transform -- For X'Size applied to an object of a class-wide type, transform
-- X'Size into a call to the primitive operation _Size applied to X. -- X'Size into a call to the primitive operation _Size applied to X.
elsif Is_Class_Wide_Type (Ptyp) then elsif Is_Class_Wide_Type (Ptyp) then
@ -3268,8 +3304,8 @@ package body Exp_Attr is
else else
Apply_Universal_Integer_Attribute_Checks (N); Apply_Universal_Integer_Attribute_Checks (N);
-- If we have Size applied to a formal parameter, that is a -- If Size is applied to a formal parameter that is of a packed
-- packed array subtype, then apply size to the actual subtype. -- array subtype, then apply Size to the actual subtype.
if Is_Entity_Name (Pref) if Is_Entity_Name (Pref)
and then Is_Formal (Entity (Pref)) and then Is_Formal (Entity (Pref))
@ -3284,6 +3320,20 @@ package body Exp_Attr is
Analyze_And_Resolve (N, Typ); Analyze_And_Resolve (N, Typ);
end if; end if;
-- If Size is applied to a dereference of an access to
-- unconstrained packed array, GIGI needs to see its
-- unconstrained nominal type, but also a hint to the actual
-- constrained type.
if Nkind (Pref) = N_Explicit_Dereference
and then Is_Array_Type (Etype (Pref))
and then not Is_Constrained (Etype (Pref))
and then Is_Packed (Etype (Pref))
then
Set_Actual_Designated_Subtype (Pref,
Get_Actual_Subtype (Pref));
end if;
return; return;
end if; end if;
@ -3590,7 +3640,28 @@ package body Exp_Attr is
when Attribute_Terminated => Terminated : when Attribute_Terminated => Terminated :
begin begin
if Restricted_Profile then -- The prefix of Terminated is of a task interface class-wide type.
-- Generate:
-- terminated (Pref._disp_get_task_id);
if Ada_Version >= Ada_05
and then Ekind (Etype (Pref)) = E_Class_Wide_Type
and then Is_Interface (Etype (Pref))
and then Is_Task_Interface (Etype (Pref))
then
Rewrite (N,
Make_Function_Call (Loc,
Name =>
New_Reference_To (RTE (RE_Terminated), Loc),
Parameter_Associations => New_List (
Make_Selected_Component (Loc,
Prefix =>
New_Copy_Tree (Pref),
Selector_Name =>
Make_Identifier (Loc, Name_uDisp_Get_Task_Id)))));
elsif Restricted_Profile then
Rewrite (N, Rewrite (N,
Build_Call_With_Task (Pref, RTE (RE_Restricted_Terminated))); Build_Call_With_Task (Pref, RTE (RE_Restricted_Terminated)));
@ -3641,7 +3712,26 @@ package body Exp_Attr is
---------------------- ----------------------
when Attribute_Unchecked_Access => when Attribute_Unchecked_Access =>
Expand_Access_To_Type (N);
-- Ada 2005 (AI-251): If the designated type is an interface, then
-- rewrite the referenced object as a conversion to force the
-- displacement of the pointer to the secondary dispatch table.
if Is_Interface (Directly_Designated_Type (Btyp)) then
declare
Ref_Object : constant Node_Id := Get_Referenced_Object (Pref);
Conversion : Node_Id;
begin
Conversion := Convert_To (Typ, New_Copy_Tree (Ref_Object));
Rewrite (N, Conversion);
Analyze_And_Resolve (N, Typ);
end;
-- Otherwise this is like normal Access without a check
else
Expand_Access_To_Type (N);
end if;
----------------- -----------------
-- UET_Address -- -- UET_Address --
@ -3687,7 +3777,26 @@ package body Exp_Attr is
------------------------- -------------------------
when Attribute_Unrestricted_Access => when Attribute_Unrestricted_Access =>
Expand_Access_To_Type (N);
-- Ada 2005 (AI-251): If the designated type is an interface, then
-- rewrite the referenced object as a conversion to force the
-- displacement of the pointer to the secondary dispatch table.
if Is_Interface (Directly_Designated_Type (Btyp)) then
declare
Ref_Object : constant Node_Id := Get_Referenced_Object (Pref);
Conversion : Node_Id;
begin
Conversion := Convert_To (Typ, New_Copy_Tree (Ref_Object));
Rewrite (N, Conversion);
Analyze_And_Resolve (N, Typ);
end;
-- Otherwise this is like Access without a check
else
Expand_Access_To_Type (N);
end if;
--------------- ---------------
-- VADS_Size -- -- VADS_Size --
@ -3824,43 +3933,50 @@ package body Exp_Attr is
if Is_Floating_Point_Type (Ptyp) then if Is_Floating_Point_Type (Ptyp) then
declare declare
Rtp : constant Entity_Id := Root_Type (Etype (Pref)); Pkg : RE_Id;
Ftp : Entity_Id;
begin begin
-- For vax fpt types, call appropriate routine in special vax -- For vax fpt types, call appropriate routine in special vax
-- floating point unit. We do not have to worry about loads in -- floating point unit. We do not have to worry about loads in
-- this case, since these types have no signalling NaN's. -- this case, since these types have no signalling NaN's.
if Vax_Float (Rtp) then if Vax_Float (Btyp) then
Expand_Vax_Valid (N); Expand_Vax_Valid (N);
-- If the floating-point object might be unaligned, we need -- Non VAX float case
-- to call the special routine Unaligned_Valid, which makes
-- the needed copy, being careful not to load the value into
-- any floating-point register. The argument in this case is
-- obj'Address (see Unchecked_Valid routine in s-fatgen.ads).
elsif Is_Possibly_Unaligned_Object (Pref) then
Set_Attribute_Name (N, Name_Unaligned_Valid);
Expand_Fpt_Attribute
(N, Rtp, Name_Unaligned_Valid,
New_List (
Make_Attribute_Reference (Loc,
Prefix => Relocate_Node (Pref),
Attribute_Name => Name_Address)));
-- In the normal case where we are sure the object is aligned,
-- we generate a call to Valid, and the argument in this case
-- is obj'Unrestricted_Access (after converting obj to the
-- right floating-point type).
else else
Expand_Fpt_Attribute Find_Fat_Info (Etype (Pref), Ftp, Pkg);
(N, Rtp, Name_Valid,
New_List ( -- If the floating-point object might be unaligned, we need
Make_Attribute_Reference (Loc, -- to call the special routine Unaligned_Valid, which makes
Prefix => Unchecked_Convert_To (Rtp, Pref), -- the needed copy, being careful not to load the value into
Attribute_Name => Name_Unrestricted_Access))); -- any floating-point register. The argument in this case is
-- obj'Address (see Unchecked_Valid routine in Fat_Gen).
if Is_Possibly_Unaligned_Object (Pref) then
Set_Attribute_Name (N, Name_Unaligned_Valid);
Expand_Fpt_Attribute
(N, Pkg, Name_Unaligned_Valid,
New_List (
Make_Attribute_Reference (Loc,
Prefix => Relocate_Node (Pref),
Attribute_Name => Name_Address)));
-- In the normal case where we are sure the object is
-- aligned, we generate a call to Valid, and the argument in
-- this case is obj'Unrestricted_Access (after converting
-- obj to the right floating-point type).
else
Expand_Fpt_Attribute
(N, Pkg, Name_Valid,
New_List (
Make_Attribute_Reference (Loc,
Prefix => Unchecked_Convert_To (Ftp, Pref),
Attribute_Name => Name_Unrestricted_Access)));
end if;
end if; end if;
-- One more task, we still need a range check. Required -- One more task, we still need a range check. Required
@ -4488,6 +4604,78 @@ package body Exp_Attr is
Reason => CE_Overflow_Check_Failed)); Reason => CE_Overflow_Check_Failed));
end Expand_Pred_Succ; end Expand_Pred_Succ;
-------------------
-- Find_Fat_Info --
-------------------
procedure Find_Fat_Info
(T : Entity_Id;
Fat_Type : out Entity_Id;
Fat_Pkg : out RE_Id)
is
Btyp : constant Entity_Id := Base_Type (T);
Rtyp : constant Entity_Id := Root_Type (T);
Digs : constant Nat := UI_To_Int (Digits_Value (Btyp));
begin
-- If the base type is VAX float, then get appropriate VAX float type
if Vax_Float (Btyp) then
case Digs is
when 6 =>
Fat_Type := RTE (RE_Fat_VAX_F);
Fat_Pkg := RE_Attr_VAX_F_Float;
when 9 =>
Fat_Type := RTE (RE_Fat_VAX_D);
Fat_Pkg := RE_Attr_VAX_D_Float;
when 15 =>
Fat_Type := RTE (RE_Fat_VAX_G);
Fat_Pkg := RE_Attr_VAX_G_Float;
when others =>
raise Program_Error;
end case;
-- If root type is VAX float, this is the case where the library has
-- been recompiled in VAX float mode, and we have an IEEE float type.
-- This is when we use the special IEEE Fat packages.
elsif Vax_Float (Rtyp) then
case Digs is
when 6 =>
Fat_Type := RTE (RE_Fat_IEEE_Short);
Fat_Pkg := RE_Attr_IEEE_Short;
when 15 =>
Fat_Type := RTE (RE_Fat_IEEE_Long);
Fat_Pkg := RE_Attr_IEEE_Long;
when others =>
raise Program_Error;
end case;
-- If neither the base type nor the root type is VAX_Float then VAX
-- float is out of the picture, and we can just use the root type.
else
Fat_Type := Rtyp;
if Fat_Type = Standard_Short_Float then
Fat_Pkg := RE_Attr_Short_Float;
elsif Fat_Type = Standard_Float then
Fat_Pkg := RE_Attr_Float;
elsif Fat_Type = Standard_Long_Float then
Fat_Pkg := RE_Attr_Long_Float;
elsif Fat_Type = Standard_Long_Long_Float then
Fat_Pkg := RE_Attr_Long_Long_Float;
else
raise Program_Error;
end if;
end if;
end Find_Fat_Info;
---------------------------- ----------------------------
-- Find_Stream_Subprogram -- -- Find_Stream_Subprogram --
---------------------------- ----------------------------

View File

@ -99,10 +99,8 @@ package body System.Fat_Gen is
begin begin
if Towards = X then if Towards = X then
return X; return X;
elsif Towards > X then elsif Towards > X then
return Succ (X); return Succ (X);
else else
return Pred (X); return Pred (X);
end if; end if;
@ -114,14 +112,11 @@ package body System.Fat_Gen is
function Ceiling (X : T) return T is function Ceiling (X : T) return T is
XT : constant T := Truncation (X); XT : constant T := Truncation (X);
begin begin
if X <= 0.0 then if X <= 0.0 then
return XT; return XT;
elsif X = XT then elsif X = XT then
return X; return X;
else else
return XT + 1.0; return XT + 1.0;
end if; end if;
@ -175,7 +170,7 @@ package body System.Fat_Gen is
-- T'Machine_Emin - T'Machine_Mantissa, which would preserve -- T'Machine_Emin - T'Machine_Mantissa, which would preserve
-- monotonicity of the exponent function ??? -- monotonicity of the exponent function ???
-- Check for infinities, transfinites, whatnot. -- Check for infinities, transfinites, whatnot
elsif X > T'Safe_Last then elsif X > T'Safe_Last then
Frac := Invrad; Frac := Invrad;
@ -193,7 +188,7 @@ package body System.Fat_Gen is
Ax : T := abs X; Ax : T := abs X;
Ex : UI := 0; Ex : UI := 0;
-- Ax * Rad ** Ex is invariant. -- Ax * Rad ** Ex is invariant
begin begin
if Ax >= 1.0 then if Ax >= 1.0 then
@ -256,7 +251,6 @@ package body System.Fat_Gen is
function Exponent (X : T) return UI is function Exponent (X : T) return UI is
X_Frac : T; X_Frac : T;
X_Exp : UI; X_Exp : UI;
begin begin
Decompose (X, X_Frac, X_Exp); Decompose (X, X_Frac, X_Exp);
return X_Exp; return X_Exp;
@ -268,14 +262,11 @@ package body System.Fat_Gen is
function Floor (X : T) return T is function Floor (X : T) return T is
XT : constant T := Truncation (X); XT : constant T := Truncation (X);
begin begin
if X >= 0.0 then if X >= 0.0 then
return XT; return XT;
elsif XT = X then elsif XT = X then
return X; return X;
else else
return XT - 1.0; return XT - 1.0;
end if; end if;
@ -288,7 +279,6 @@ package body System.Fat_Gen is
function Fraction (X : T) return T is function Fraction (X : T) return T is
X_Frac : T; X_Frac : T;
X_Exp : UI; X_Exp : UI;
begin begin
Decompose (X, X_Frac, X_Exp); Decompose (X, X_Frac, X_Exp);
return X_Frac; return X_Frac;
@ -366,6 +356,38 @@ package body System.Fat_Gen is
return Temp; return Temp;
end Machine; end Machine;
----------------------
-- Machine_Rounding --
----------------------
-- For now, the implementation is identical to that of Rounding, which is
-- a permissible behavior, but is not the most efficient possible approach.
function Machine_Rounding (X : T) return T is
Result : T;
Tail : T;
begin
Result := Truncation (abs X);
Tail := abs X - Result;
if Tail >= 0.5 then
Result := Result + 1.0;
end if;
if X > 0.0 then
return Result;
elsif X < 0.0 then
return -Result;
-- For zero case, make sure sign of zero is preserved
else
return X;
end if;
end Machine_Rounding;
----------- -----------
-- Model -- -- Model --
----------- -----------
@ -542,7 +564,7 @@ package body System.Fat_Gen is
return X; return X;
end if; end if;
-- Nonzero x. essentially, just multiply repeatedly by Rad ** (+-2**n). -- Nonzero x. essentially, just multiply repeatedly by Rad ** (+-2**n)
declare declare
Y : T := X; Y : T := X;
@ -587,6 +609,7 @@ package body System.Fat_Gen is
end if; end if;
-- 0 <= Ex < Log_Power (N) -- 0 <= Ex < Log_Power (N)
end loop; end loop;
-- Ex = 0 -- Ex = 0
@ -652,7 +675,7 @@ package body System.Fat_Gen is
-- The basic approach is to compute -- The basic approach is to compute
-- T'Machine (RM1 + N) - RM1. -- T'Machine (RM1 + N) - RM1
-- where N >= 0.0 and RM1 = radix ** (mantissa - 1) -- where N >= 0.0 and RM1 = radix ** (mantissa - 1)
@ -693,7 +716,6 @@ package body System.Fat_Gen is
return X; return X;
end if; end if;
end if; end if;
end Truncation; end Truncation;
----------------------- -----------------------
@ -727,13 +749,16 @@ package body System.Fat_Gen is
else else
return X; return X;
end if; end if;
end Unbiased_Rounding; end Unbiased_Rounding;
----------- -----------
-- Valid -- -- Valid --
----------- -----------
-- Note: this routine does not work for VAX float. We compensate for this
-- in Exp_Attr by using the Valid functions in Vax_Float_Operations rather
-- than the corresponding instantiation of this function.
function Valid (X : access T) return Boolean is function Valid (X : access T) return Boolean is
IEEE_Emin : constant Integer := T'Machine_Emin - 1; IEEE_Emin : constant Integer := T'Machine_Emin - 1;
@ -744,17 +769,17 @@ package body System.Fat_Gen is
subtype IEEE_Exponent_Range is subtype IEEE_Exponent_Range is
Integer range IEEE_Emin - 1 .. IEEE_Emax + 1; Integer range IEEE_Emin - 1 .. IEEE_Emax + 1;
-- The implementation of this floating point attribute uses -- The implementation of this floating point attribute uses a
-- a representation type Float_Rep that allows direct access to -- representation type Float_Rep that allows direct access to the
-- the exponent and mantissa parts of a floating point number. -- exponent and mantissa parts of a floating point number.
-- The Float_Rep type is an array of Float_Word elements. This -- The Float_Rep type is an array of Float_Word elements. This
-- representation is chosen to make it possible to size the -- representation is chosen to make it possible to size the type based
-- type based on a generic parameter. Since the array size is -- on a generic parameter. Since the array size is known at compile
-- known at compile-time, efficient code can still be generated. -- time, efficient code can still be generated. The size of Float_Word
-- The size of Float_Word elements should be large enough to allow -- elements should be large enough to allow accessing the exponent in
-- accessing the exponent in one read, but small enough so that all -- one read, but small enough so that all floating point object sizes
-- floating point object sizes are a multiple of the Float_Word'Size. -- are a multiple of the Float_Word'Size.
-- The following conditions must be met for all possible -- The following conditions must be met for all possible
-- instantiations of the attributes package: -- instantiations of the attributes package:
@ -764,9 +789,9 @@ package body System.Fat_Gen is
-- - The exponent and sign are completely contained in a single -- - The exponent and sign are completely contained in a single
-- component of Float_Rep, named Most_Significant_Word (MSW). -- component of Float_Rep, named Most_Significant_Word (MSW).
-- - The sign occupies the most significant bit of the MSW -- - The sign occupies the most significant bit of the MSW and the
-- and the exponent is in the following bits. -- exponent is in the following bits. Unused bits (if any) are in
-- Unused bits (if any) are in the least significant part. -- the least significant part.
type Float_Word is mod 2**Positive'Min (System.Word_Size, 32); type Float_Word is mod 2**Positive'Min (System.Word_Size, 32);
type Rep_Index is range 0 .. 7; type Rep_Index is range 0 .. 7;
@ -775,12 +800,12 @@ package body System.Fat_Gen is
(T'Size + Float_Word'Size - 1) / Float_Word'Size; (T'Size + Float_Word'Size - 1) / Float_Word'Size;
Rep_Last : constant Rep_Index := Rep_Index'Min Rep_Last : constant Rep_Index := Rep_Index'Min
(Rep_Index (Rep_Words - 1), (T'Mantissa + 16) / Float_Word'Size); (Rep_Index (Rep_Words - 1), (T'Mantissa + 16) / Float_Word'Size);
-- Determine the number of Float_Words needed for representing -- Determine the number of Float_Words needed for representing the
-- the entire floating-poinit value. Do not take into account -- entire floating-point value. Do not take into account excessive
-- excessive padding, as occurs on IA-64 where 80 bits floats get -- padding, as occurs on IA-64 where 80 bits floats get padded to 128
-- padded to 128 bits. In general, the exponent field cannot -- bits. In general, the exponent field cannot be larger than 15 bits,
-- be larger than 15 bits, even for 128-bit floating-poin t types, -- even for 128-bit floating-poin t types, so the final format size
-- so the final format size won't be larger than T'Mantissa + 16. -- won't be larger than T'Mantissa + 16.
type Float_Rep is type Float_Rep is
array (Rep_Index range 0 .. Rep_Index (Rep_Words - 1)) of Float_Word; array (Rep_Index range 0 .. Rep_Index (Rep_Words - 1)) of Float_Word;
@ -794,26 +819,26 @@ package body System.Fat_Gen is
Most_Significant_Word : constant Rep_Index := Most_Significant_Word : constant Rep_Index :=
Rep_Last * Standard'Default_Bit_Order; Rep_Last * Standard'Default_Bit_Order;
-- Finding the location of the Exponent_Word is a bit tricky. -- Finding the location of the Exponent_Word is a bit tricky. In general
-- In general we assume Word_Order = Bit_Order. -- we assume Word_Order = Bit_Order. This expression needs to be refined
-- This expression needs to be refined for VMS. -- for VMS.
Exponent_Factor : constant Float_Word := Exponent_Factor : constant Float_Word :=
2**(Float_Word'Size - 1) / 2**(Float_Word'Size - 1) /
Float_Word (IEEE_Emax - IEEE_Emin + 3) * Float_Word (IEEE_Emax - IEEE_Emin + 3) *
Boolean'Pos (Most_Significant_Word /= 2) + Boolean'Pos (Most_Significant_Word /= 2) +
Boolean'Pos (Most_Significant_Word = 2); Boolean'Pos (Most_Significant_Word = 2);
-- Factor that the extracted exponent needs to be divided by -- Factor that the extracted exponent needs to be divided by to be in
-- to be in range 0 .. IEEE_Emax - IEEE_Emin + 2. -- range 0 .. IEEE_Emax - IEEE_Emin + 2. Special kludge: Exponent_Factor
-- Special kludge: Exponent_Factor is 1 for x86/IA64 double extended -- is 1 for x86/IA64 double extended as GCC adds unused bits to the
-- as GCC adds unused bits to the type. -- type.
Exponent_Mask : constant Float_Word := Exponent_Mask : constant Float_Word :=
Float_Word (IEEE_Emax - IEEE_Emin + 2) * Float_Word (IEEE_Emax - IEEE_Emin + 2) *
Exponent_Factor; Exponent_Factor;
-- Value needed to mask out the exponent field. -- Value needed to mask out the exponent field. This assumes that the
-- This assumes that the range IEEE_Emin - 1 .. IEEE_Emax + 1 -- range IEEE_Emin - 1 .. IEEE_Emax + contains 2**N values, for some N
-- contains 2**N values, for some N in Natural. -- in Natural.
function To_Float is new Ada.Unchecked_Conversion (Float_Rep, T); function To_Float is new Ada.Unchecked_Conversion (Float_Rep, T);
@ -834,8 +859,8 @@ package body System.Fat_Gen is
Integer ((R (Most_Significant_Word) and Exponent_Mask) / Integer ((R (Most_Significant_Word) and Exponent_Mask) /
Exponent_Factor) Exponent_Factor)
- IEEE_Bias; - IEEE_Bias;
-- Mask/Shift T to only get bits from the exponent -- Mask/Shift T to only get bits from the exponent. Then convert biased
-- Then convert biased value to integer value. -- value to integer value.
SR : Float_Rep; SR : Float_Rep;
-- Float_Rep representation of significant of X.all -- Float_Rep representation of significant of X.all
@ -843,8 +868,8 @@ package body System.Fat_Gen is
begin begin
if T'Denorm then if T'Denorm then
-- All denormalized numbers are valid, so only invalid numbers -- All denormalized numbers are valid, so only invalid numbers are
-- are overflows and NaN's, both with exponent = Emax + 1. -- overflows and NaN's, both with exponent = Emax + 1.
return E /= IEEE_Emax + 1; return E /= IEEE_Emax + 1;

View File

@ -71,6 +71,8 @@ package System.Fat_Gen is
function Machine (X : T) return T; function Machine (X : T) return T;
function Machine_Rounding (X : T) return T;
function Model (X : T) return T; function Model (X : T) return T;
function Pred (X : T) return T; function Pred (X : T) return T;
@ -95,6 +97,8 @@ package System.Fat_Gen is
-- register, and the whole point of 'Valid is to prevent exceptions. -- register, and the whole point of 'Valid is to prevent exceptions.
-- Note that the object of type T must have the natural alignment -- Note that the object of type T must have the natural alignment
-- for type T. See Unaligned_Valid for further discussion. -- for type T. See Unaligned_Valid for further discussion.
--
-- Note: this routine does not work for Vax_Float ???
function Unaligned_Valid (A : System.Address) return Boolean; function Unaligned_Valid (A : System.Address) return Boolean;
-- This version of Valid is used if the floating-point value to -- This version of Valid is used if the floating-point value to
@ -112,11 +116,16 @@ package System.Fat_Gen is
-- not require strict alignment (e.g. the ia32/x86), since on a -- not require strict alignment (e.g. the ia32/x86), since on a
-- target not requiring strict alignment, it is fine to pass a -- target not requiring strict alignment, it is fine to pass a
-- non-aligned value to the standard Valid routine. -- non-aligned value to the standard Valid routine.
--
-- Note: this routine does not work for Vax_Float ???
private private
pragma Inline (Machine); pragma Inline (Machine);
pragma Inline (Model); pragma Inline (Model);
pragma Inline_Always (Valid);
pragma Inline_Always (Unaligned_Valid); -- Note: previously the validity checking subprograms (Unaligned_Valid and
-- Valid) were also inlined, but this was changed since there were some
-- problems with this inlining in optimized mode, and in any case it seems
-- better to avoid this inlining (space and robustness considerations).
end System.Fat_Gen; end System.Fat_Gen;

View File

@ -626,7 +626,7 @@ package body System.Vax_Float_Operations is
-- accurate, but is good enough in practice. -- accurate, but is good enough in practice.
function Valid_D (Arg : D) return Boolean is function Valid_D (Arg : D) return Boolean is
Val : T := G_To_T (D_To_G (Arg)); Val : constant T := G_To_T (D_To_G (Arg));
begin begin
return Val'Valid; return Val'Valid;
end Valid_D; end Valid_D;
@ -639,7 +639,7 @@ package body System.Vax_Float_Operations is
-- accurate, but is good enough in practice. -- accurate, but is good enough in practice.
function Valid_F (Arg : F) return Boolean is function Valid_F (Arg : F) return Boolean is
Val : S := F_To_S (Arg); Val : constant S := F_To_S (Arg);
begin begin
return Val'Valid; return Val'Valid;
end Valid_F; end Valid_F;
@ -652,7 +652,7 @@ package body System.Vax_Float_Operations is
-- accurate, but is good enough in practice. -- accurate, but is good enough in practice.
function Valid_G (Arg : G) return Boolean is function Valid_G (Arg : G) return Boolean is
Val : T := G_To_T (Arg); Val : constant T := G_To_T (Arg);
begin begin
return Val'Valid; return Val'Valid;
end Valid_G; end Valid_G;

View File

@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2005 Free Software Foundation, Inc. -- -- Copyright (C) 1992-2005, 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- --
@ -492,9 +492,16 @@ package body Sem_Attr is
-- accesses are allowed (references to the current type instance). -- accesses are allowed (references to the current type instance).
if Is_Entity_Name (P) then if Is_Entity_Name (P) then
Scop := Current_Scope;
Typ := Entity (P); Typ := Entity (P);
-- The reference may appear in an aggregate that has been expanded
-- into a loop. Locate scope of type definition, if any.
Scop := Current_Scope;
while Ekind (Scop) = E_Loop loop
Scop := Scope (Scop);
end loop;
if Is_Type (Typ) then if Is_Type (Typ) then
-- OK if we are within the scope of a limited type -- OK if we are within the scope of a limited type
@ -516,6 +523,7 @@ package body Sem_Attr is
loop loop
Q := Parent (Q); Q := Parent (Q);
end loop; end loop;
if Present (Q) then if Present (Q) then
Set_Has_Per_Object_Constraint ( Set_Has_Per_Object_Constraint (
Defining_Identifier (Q), True); Defining_Identifier (Q), True);
@ -585,11 +593,9 @@ package body Sem_Attr is
declare declare
Index : Interp_Index; Index : Interp_Index;
It : Interp; It : Interp;
begin begin
Set_Etype (N, Any_Type); Set_Etype (N, Any_Type);
Get_First_Interp (P, Index, It); Get_First_Interp (P, Index, It);
while Present (It.Typ) loop while Present (It.Typ) loop
Acc_Type := Build_Access_Object_Type (It.Typ); Acc_Type := Build_Access_Object_Type (It.Typ);
Add_One_Interp (N, Acc_Type, Acc_Type); Add_One_Interp (N, Acc_Type, Acc_Type);
@ -1373,13 +1379,27 @@ package body Sem_Attr is
begin begin
Analyze (P); Analyze (P);
-- Ada 2005 (AI-345): Attribute 'Terminated can be applied to
-- task interface class-wide types.
if Is_Task_Type (Etype (P)) if Is_Task_Type (Etype (P))
or else (Is_Access_Type (Etype (P)) or else (Is_Access_Type (Etype (P))
and then Is_Task_Type (Designated_Type (Etype (P)))) and then Is_Task_Type (Designated_Type (Etype (P))))
or else (Ada_Version >= Ada_05
and then Ekind (Etype (P)) = E_Class_Wide_Type
and then Is_Interface (Etype (P))
and then Is_Task_Interface (Etype (P)))
then then
Resolve (P); Resolve (P);
else else
Error_Attr ("prefix of % attribute must be a task", P); if Ada_Version >= Ada_05 then
Error_Attr ("prefix of % attribute must be a task or a task "
& "interface class-wide object", P);
else
Error_Attr ("prefix of % attribute must be a task", P);
end if;
end if; end if;
end Check_Task_Prefix; end Check_Task_Prefix;
@ -2793,16 +2813,28 @@ package body Sem_Attr is
if Etype (P) = Standard_Exception_Type then if Etype (P) = Standard_Exception_Type then
Set_Etype (N, RTE (RE_Exception_Id)); Set_Etype (N, RTE (RE_Exception_Id));
-- Ada 2005 (AI-345): Attribute 'Identity may be applied to
-- task interface class-wide types.
elsif Is_Task_Type (Etype (P)) elsif Is_Task_Type (Etype (P))
or else (Is_Access_Type (Etype (P)) or else (Is_Access_Type (Etype (P))
and then Is_Task_Type (Designated_Type (Etype (P)))) and then Is_Task_Type (Designated_Type (Etype (P))))
or else (Ada_Version >= Ada_05
and then Ekind (Etype (P)) = E_Class_Wide_Type
and then Is_Interface (Etype (P))
and then Is_Task_Interface (Etype (P)))
then then
Resolve (P); Resolve (P);
Set_Etype (N, RTE (RO_AT_Task_Id)); Set_Etype (N, RTE (RO_AT_Task_Id));
else else
Error_Attr ("prefix of % attribute must be a task or an " if Ada_Version >= Ada_05 then
& "exception", P); Error_Attr ("prefix of % attribute must be an exception, a "
& "task or a task interface class-wide object", P);
else
Error_Attr ("prefix of % attribute must be a task or an "
& "exception", P);
end if;
end if; end if;
----------- -----------
@ -2962,6 +2994,15 @@ package body Sem_Attr is
Check_E0; Check_E0;
Set_Etype (N, Universal_Integer); Set_Etype (N, Universal_Integer);
----------------------
-- Machine_Rounding --
----------------------
when Attribute_Machine_Rounding =>
Check_Floating_Point_Type_1;
Set_Etype (N, P_Base_Type);
Resolve (E1, P_Base_Type);
-------------------- --------------------
-- Machine_Rounds -- -- Machine_Rounds --
-------------------- --------------------
@ -5481,6 +5522,20 @@ package body Sem_Attr is
Fold_Uint (N, Uint_2, True); Fold_Uint (N, Uint_2, True);
end if; end if;
----------------------
-- Machine_Rounding --
----------------------
-- Note: for the folding case, it is fine to treat Machine_Rounding
-- exactly the same way as Rounding, since this is one of the allowed
-- behaviors, and performance is not an issue here. It might be a bit
-- better to give the same result as it would give at run-time, even
-- though the non-determinism is certainly permitted.
when Attribute_Machine_Rounding =>
Fold_Ureal (N,
Eval_Fat.Rounding (P_Root_Type, Expr_Value_R (E1)), Static);
-------------------- --------------------
-- Machine_Rounds -- -- Machine_Rounds --
-------------------- --------------------
@ -6243,7 +6298,6 @@ package body Sem_Attr is
end if; end if;
Rewrite (N, New_Occurrence_Of (RTE (Id), Loc)); Rewrite (N, New_Occurrence_Of (RTE (Id), Loc));
end Type_Class; end Type_Class;
----------------------- -----------------------
@ -7685,12 +7739,19 @@ package body Sem_Attr is
return True; return True;
end if; end if;
if Nam = TSS_Stream_Input then -- In Ada 2005, Input can invoke Read, and Output can invoke Write
return Ada_Version >= Ada_05
and then Stream_Attribute_Available (Etyp, TSS_Stream_Read); if Nam = TSS_Stream_Input
elsif Nam = TSS_Stream_Output then and then Ada_Version >= Ada_05
return Ada_Version >= Ada_05 and then Stream_Attribute_Available (Etyp, TSS_Stream_Read)
and then Stream_Attribute_Available (Etyp, TSS_Stream_Write); then
return True;
elsif Nam = TSS_Stream_Output
and then Ada_Version >= Ada_05
and then Stream_Attribute_Available (Etyp, TSS_Stream_Write)
then
return True;
end if; end if;
-- Case of Read and Write: check for attribute definition clause that -- Case of Read and Write: check for attribute definition clause that

View File

@ -95,91 +95,92 @@ extern unsigned char Get_Attribute_Id (int);
#define Attr_Machine_Mantissa 47 #define Attr_Machine_Mantissa 47
#define Attr_Machine_Overflows 48 #define Attr_Machine_Overflows 48
#define Attr_Machine_Radix 49 #define Attr_Machine_Radix 49
#define Attr_Machine_Rounds 50 #define Attr_Machine_Rounding 50
#define Attr_Machine_Size 51 #define Attr_Machine_Rounds 51
#define Attr_Mantissa 52 #define Attr_Machine_Size 52
#define Attr_Max_Size_In_Storage_Elements 53 #define Attr_Mantissa 53
#define Attr_Maximum_Alignment 54 #define Attr_Max_Size_In_Storage_Elements 54
#define Attr_Mechanism_Code 55 #define Attr_Maximum_Alignment 55
#define Attr_Mod 56 #define Attr_Mechanism_Code 56
#define Attr_Model_Emin 57 #define Attr_Mod 57
#define Attr_Model_Epsilon 58 #define Attr_Model_Emin 58
#define Attr_Model_Mantissa 59 #define Attr_Model_Epsilon 59
#define Attr_Model_Small 60 #define Attr_Model_Mantissa 60
#define Attr_Modulus 61 #define Attr_Model_Small 61
#define Attr_Null_Parameter 62 #define Attr_Modulus 62
#define Attr_Object_Size 63 #define Attr_Null_Parameter 63
#define Attr_Partition_ID 64 #define Attr_Object_Size 64
#define Attr_Passed_By_Reference 65 #define Attr_Partition_ID 65
#define Attr_Pool_Address 66 #define Attr_Passed_By_Reference 66
#define Attr_Pos 67 #define Attr_Pool_Address 67
#define Attr_Position 68 #define Attr_Pos 68
#define Attr_Range 69 #define Attr_Position 69
#define Attr_Range_Length 70 #define Attr_Range 70
#define Attr_Round 71 #define Attr_Range_Length 71
#define Attr_Safe_Emax 72 #define Attr_Round 72
#define Attr_Safe_First 73 #define Attr_Safe_Emax 73
#define Attr_Safe_Large 74 #define Attr_Safe_First 74
#define Attr_Safe_Last 75 #define Attr_Safe_Large 75
#define Attr_Safe_Small 76 #define Attr_Safe_Last 76
#define Attr_Scale 77 #define Attr_Safe_Small 77
#define Attr_Scaling 78 #define Attr_Scale 78
#define Attr_Signed_Zeros 79 #define Attr_Scaling 79
#define Attr_Size 80 #define Attr_Signed_Zeros 80
#define Attr_Small 81 #define Attr_Size 81
#define Attr_Storage_Size 82 #define Attr_Small 82
#define Attr_Storage_Unit 83 #define Attr_Storage_Size 83
#define Attr_Stream_Size 84 #define Attr_Storage_Unit 84
#define Attr_Tag 85 #define Attr_Stream_Size 85
#define Attr_Target_Name 86 #define Attr_Tag 86
#define Attr_Terminated 87 #define Attr_Target_Name 87
#define Attr_To_Address 88 #define Attr_Terminated 88
#define Attr_Type_Class 89 #define Attr_To_Address 89
#define Attr_UET_Address 90 #define Attr_Type_Class 90
#define Attr_Unbiased_Rounding 91 #define Attr_UET_Address 91
#define Attr_Unchecked_Access 92 #define Attr_Unbiased_Rounding 92
#define Attr_Unconstrained_Array 93 #define Attr_Unchecked_Access 93
#define Attr_Universal_Literal_String 94 #define Attr_Unconstrained_Array 94
#define Attr_Unrestricted_Access 95 #define Attr_Universal_Literal_String 95
#define Attr_VADS_Size 96 #define Attr_Unrestricted_Access 96
#define Attr_Val 97 #define Attr_VADS_Size 97
#define Attr_Valid 98 #define Attr_Val 98
#define Attr_Value_Size 99 #define Attr_Valid 99
#define Attr_Version 100 #define Attr_Value_Size 100
#define Attr_Wchar_T_Size 101 #define Attr_Version 101
#define Attr_Wide_Wide_Width 102 #define Attr_Wchar_T_Size 102
#define Attr_Wide_Width 103 #define Attr_Wide_Wide_Width 103
#define Attr_Width 104 #define Attr_Wide_Width 104
#define Attr_Word_Size 105 #define Attr_Width 105
#define Attr_Adjacent 106 #define Attr_Word_Size 106
#define Attr_Ceiling 107 #define Attr_Adjacent 107
#define Attr_Copy_Sign 108 #define Attr_Ceiling 108
#define Attr_Floor 109 #define Attr_Copy_Sign 109
#define Attr_Fraction 110 #define Attr_Floor 110
#define Attr_Image 111 #define Attr_Fraction 111
#define Attr_Input 112 #define Attr_Image 112
#define Attr_Machine 113 #define Attr_Input 113
#define Attr_Max 114 #define Attr_Machine 114
#define Attr_Min 115 #define Attr_Max 115
#define Attr_Model 116 #define Attr_Min 116
#define Attr_Pred 117 #define Attr_Model 117
#define Attr_Remainder 118 #define Attr_Pred 118
#define Attr_Rounding 119 #define Attr_Remainder 119
#define Attr_Succ 120 #define Attr_Rounding 120
#define Attr_Truncation 121 #define Attr_Succ 121
#define Attr_Value 122 #define Attr_Truncation 122
#define Attr_Wide_Image 123 #define Attr_Value 123
#define Attr_Wide_Wide_Image 124 #define Attr_Wide_Image 124
#define Attr_Wide_Value 125 #define Attr_Wide_Wide_Image 125
#define Attr_Wide_Wide_Value 126 #define Attr_Wide_Value 126
#define Attr_Output 127 #define Attr_Wide_Wide_Value 127
#define Attr_Read 128 #define Attr_Output 128
#define Attr_Write 129 #define Attr_Read 129
#define Attr_Elab_Body 130 #define Attr_Write 130
#define Attr_Elab_Spec 131 #define Attr_Elab_Body 131
#define Attr_Storage_Pool 132 #define Attr_Elab_Spec 132
#define Attr_Base 133 #define Attr_Storage_Pool 133
#define Attr_Class 134 #define Attr_Base 134
#define Attr_Class 135
/* Define the numeric values for the conventions. */ /* Define the numeric values for the conventions. */