aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.4.0/gcc/ada/exp_ch8.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.4.0/gcc/ada/exp_ch8.adb')
-rw-r--r--gcc-4.4.0/gcc/ada/exp_ch8.adb362
1 files changed, 0 insertions, 362 deletions
diff --git a/gcc-4.4.0/gcc/ada/exp_ch8.adb b/gcc-4.4.0/gcc/ada/exp_ch8.adb
deleted file mode 100644
index 68fa50eb6..000000000
--- a/gcc-4.4.0/gcc/ada/exp_ch8.adb
+++ /dev/null
@@ -1,362 +0,0 @@
-------------------------------------------------------------------------------
--- --
--- GNAT COMPILER COMPONENTS --
--- --
--- E X P _ C H 8 --
--- --
--- B o d y --
--- --
--- Copyright (C) 1992-2007, 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- --
--- ware Foundation; either version 3, or (at your option) any later ver- --
--- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
--- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
--- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
--- for more details. You should have received a copy of the GNU General --
--- Public License distributed with GNAT; see file COPYING3. If not, go to --
--- http://www.gnu.org/licenses for a complete copy of the license. --
--- --
--- GNAT was originally developed by the GNAT team at New York University. --
--- Extensive contributions were provided by Ada Core Technologies Inc. --
--- --
-------------------------------------------------------------------------------
-
-with Atree; use Atree;
-with Einfo; use Einfo;
-with Exp_Ch6; use Exp_Ch6;
-with Exp_Dbug; use Exp_Dbug;
-with Exp_Util; use Exp_Util;
-with Freeze; use Freeze;
-with Nlists; use Nlists;
-with Opt; use Opt;
-with Sem; use Sem;
-with Sem_Ch8; use Sem_Ch8;
-with Sinfo; use Sinfo;
-with Stand; use Stand;
-with Targparm; use Targparm;
-
-package body Exp_Ch8 is
-
- ---------------------------------------------
- -- Expand_N_Exception_Renaming_Declaration --
- ---------------------------------------------
-
- procedure Expand_N_Exception_Renaming_Declaration (N : Node_Id) is
- Decl : constant Node_Id := Debug_Renaming_Declaration (N);
-
- begin
- if Present (Decl) then
- Insert_Action (N, Decl);
- end if;
- end Expand_N_Exception_Renaming_Declaration;
-
- ------------------------------------------
- -- Expand_N_Object_Renaming_Declaration --
- ------------------------------------------
-
- -- Most object renaming cases can be done by just capturing the address
- -- of the renamed object. The cases in which this is not true are when
- -- this address is not computable, since it involves extraction of a
- -- packed array element, or of a record component to which a component
- -- clause applies (that can specify an arbitrary bit boundary), or where
- -- the enclosing record itself has a non-standard representation.
-
- -- In these two cases, we pre-evaluate the renaming expression, by
- -- extracting and freezing the values of any subscripts, and then we
- -- set the flag Is_Renaming_Of_Object which means that any reference
- -- to the object will be handled by macro substitution in the front
- -- end, and the back end will know to ignore the renaming declaration.
-
- -- An additional odd case that requires processing by expansion is
- -- the renaming of a discriminant of a mutable record type. The object
- -- is a constant because it renames something that cannot be assigned to,
- -- but in fact the underlying value can change and must be reevaluated
- -- at each reference. Gigi does have a notion of a "constant view" of
- -- an object, and therefore the front-end must perform the expansion.
- -- For simplicity, and to bypass some obscure code-generation problem,
- -- we use macro substitution for all renamed discriminants, whether the
- -- enclosing type is constrained or not.
-
- -- The other special processing required is for the case of renaming
- -- of an object of a class wide type, where it is necessary to build
- -- the appropriate subtype for the renamed object.
- -- More comments needed for this para ???
-
- procedure Expand_N_Object_Renaming_Declaration (N : Node_Id) is
- Nam : constant Node_Id := Name (N);
- T : Entity_Id;
- Decl : Node_Id;
-
- procedure Evaluate_Name (Fname : Node_Id);
- -- A recursive procedure used to freeze a name in the sense described
- -- above, i.e. any variable references or function calls are removed.
- -- Of course the outer level variable reference must not be removed.
- -- For example in A(J,F(K)), A is left as is, but J and F(K) are
- -- evaluated and removed.
-
- function Evaluation_Required (Nam : Node_Id) return Boolean;
- -- Determines whether it is necessary to do static name evaluation
- -- for renaming of Nam. It is considered necessary if evaluating the
- -- name involves indexing a packed array, or extracting a component
- -- of a record to which a component clause applies. Note that we are
- -- only interested in these operations if they occur as part of the
- -- name itself, subscripts are just values that are computed as part
- -- of the evaluation, so their form is unimportant.
-
- -------------------
- -- Evaluate_Name --
- -------------------
-
- procedure Evaluate_Name (Fname : Node_Id) is
- K : constant Node_Kind := Nkind (Fname);
- E : Node_Id;
-
- begin
- -- For an explicit dereference, we simply force the evaluation
- -- of the name expression. The dereference provides a value that
- -- is the address for the renamed object, and it is precisely
- -- this value that we want to preserve.
-
- if K = N_Explicit_Dereference then
- Force_Evaluation (Prefix (Fname));
-
- -- For a selected component, we simply evaluate the prefix
-
- elsif K = N_Selected_Component then
- Evaluate_Name (Prefix (Fname));
-
- -- For an indexed component, or an attribute reference, we evaluate
- -- the prefix, which is itself a name, recursively, and then force
- -- the evaluation of all the subscripts (or attribute expressions).
-
- elsif Nkind_In (K, N_Indexed_Component, N_Attribute_Reference) then
- Evaluate_Name (Prefix (Fname));
-
- E := First (Expressions (Fname));
- while Present (E) loop
- Force_Evaluation (E);
-
- if Original_Node (E) /= E then
- Set_Do_Range_Check (E, Do_Range_Check (Original_Node (E)));
- end if;
-
- Next (E);
- end loop;
-
- -- For a slice, we evaluate the prefix, as for the indexed component
- -- case and then, if there is a range present, either directly or
- -- as the constraint of a discrete subtype indication, we evaluate
- -- the two bounds of this range.
-
- elsif K = N_Slice then
- Evaluate_Name (Prefix (Fname));
-
- declare
- DR : constant Node_Id := Discrete_Range (Fname);
- Constr : Node_Id;
- Rexpr : Node_Id;
-
- begin
- if Nkind (DR) = N_Range then
- Force_Evaluation (Low_Bound (DR));
- Force_Evaluation (High_Bound (DR));
-
- elsif Nkind (DR) = N_Subtype_Indication then
- Constr := Constraint (DR);
-
- if Nkind (Constr) = N_Range_Constraint then
- Rexpr := Range_Expression (Constr);
-
- Force_Evaluation (Low_Bound (Rexpr));
- Force_Evaluation (High_Bound (Rexpr));
- end if;
- end if;
- end;
-
- -- For a type conversion, the expression of the conversion must be
- -- the name of an object, and we simply need to evaluate this name.
-
- elsif K = N_Type_Conversion then
- Evaluate_Name (Expression (Fname));
-
- -- For a function call, we evaluate the call
-
- elsif K = N_Function_Call then
- Force_Evaluation (Fname);
-
- -- The remaining cases are direct name, operator symbol and
- -- character literal. In all these cases, we do nothing, since
- -- we want to reevaluate each time the renamed object is used.
-
- else
- return;
- end if;
- end Evaluate_Name;
-
- -------------------------
- -- Evaluation_Required --
- -------------------------
-
- function Evaluation_Required (Nam : Node_Id) return Boolean is
- begin
- if Nkind_In (Nam, N_Indexed_Component, N_Slice) then
- if Is_Packed (Etype (Prefix (Nam))) then
- return True;
- else
- return Evaluation_Required (Prefix (Nam));
- end if;
-
- elsif Nkind (Nam) = N_Selected_Component then
- declare
- Rec_Type : constant Entity_Id := Etype (Prefix (Nam));
-
- begin
- if Present (Component_Clause (Entity (Selector_Name (Nam))))
- or else Has_Non_Standard_Rep (Rec_Type)
- then
- return True;
-
- elsif Ekind (Entity (Selector_Name (Nam))) = E_Discriminant
- and then Is_Record_Type (Rec_Type)
- and then not Is_Concurrent_Record_Type (Rec_Type)
- then
- return True;
-
- else
- return Evaluation_Required (Prefix (Nam));
- end if;
- end;
-
- else
- return False;
- end if;
- end Evaluation_Required;
-
- -- Start of processing for Expand_N_Object_Renaming_Declaration
-
- begin
- -- Perform name evaluation if required
-
- if Evaluation_Required (Nam) then
- Evaluate_Name (Nam);
- Set_Is_Renaming_Of_Object (Defining_Identifier (N));
- end if;
-
- -- Deal with construction of subtype in class-wide case
-
- T := Etype (Defining_Identifier (N));
-
- if Is_Class_Wide_Type (T) then
- Expand_Subtype_From_Expr (N, T, Subtype_Mark (N), Name (N));
- Find_Type (Subtype_Mark (N));
- Set_Etype (Defining_Identifier (N), Entity (Subtype_Mark (N)));
-
- -- Freeze the class-wide subtype here to ensure that the subtype
- -- and equivalent type are frozen before the renaming. This is
- -- required for targets where Frontend_Layout_On_Target is true.
- -- For targets where Gigi is used, class-wide subtype should not
- -- be frozen (in that case the subtype is marked as already frozen
- -- when it's created).
-
- if Frontend_Layout_On_Target then
- Freeze_Before (N, Entity (Subtype_Mark (N)));
- end if;
- end if;
-
- -- Ada 2005 (AI-318-02): If the renamed object is a call to a build-in-
- -- place function, then a temporary return object needs to be created
- -- and access to it must be passed to the function. Currently we limit
- -- such functions to those with inherently limited result subtypes, but
- -- eventually we plan to expand the functions that are treated as
- -- build-in-place to include other composite result types.
-
- if Ada_Version >= Ada_05
- and then Is_Build_In_Place_Function_Call (Nam)
- then
- Make_Build_In_Place_Call_In_Anonymous_Context (Nam);
- end if;
-
- -- Create renaming entry for debug information
-
- Decl := Debug_Renaming_Declaration (N);
-
- if Present (Decl) then
- Insert_Action (N, Decl);
- end if;
- end Expand_N_Object_Renaming_Declaration;
-
- -------------------------------------------
- -- Expand_N_Package_Renaming_Declaration --
- -------------------------------------------
-
- procedure Expand_N_Package_Renaming_Declaration (N : Node_Id) is
- Decl : constant Node_Id := Debug_Renaming_Declaration (N);
-
- begin
- if Present (Decl) then
-
- -- If we are in a compilation unit, then this is an outer
- -- level declaration, and must have a scope of Standard
-
- if Nkind (Parent (N)) = N_Compilation_Unit then
- declare
- Aux : constant Node_Id := Aux_Decls_Node (Parent (N));
-
- begin
- Push_Scope (Standard_Standard);
-
- if No (Actions (Aux)) then
- Set_Actions (Aux, New_List (Decl));
- else
- Append (Decl, Actions (Aux));
- end if;
-
- Analyze (Decl);
-
- -- Enter the debug variable in the qualification list, which
- -- must be done at this point because auxiliary declarations
- -- occur at the library level and aren't associated with a
- -- normal scope.
-
- Qualify_Entity_Names (Decl);
-
- Pop_Scope;
- end;
-
- -- Otherwise, just insert after the package declaration
-
- else
- Insert_Action (N, Decl);
- end if;
- end if;
- end Expand_N_Package_Renaming_Declaration;
-
- ----------------------------------------------
- -- Expand_N_Subprogram_Renaming_Declaration --
- ----------------------------------------------
-
- procedure Expand_N_Subprogram_Renaming_Declaration (N : Node_Id) is
- Nam : constant Node_Id := Name (N);
-
- begin
- -- When the prefix of the name is a function call, we must force the
- -- call to be made by removing side effects from the call, since we
- -- must only call the function once.
-
- if Nkind (Nam) = N_Selected_Component
- and then Nkind (Prefix (Nam)) = N_Function_Call
- then
- Remove_Side_Effects (Prefix (Nam));
-
- -- For an explicit dereference, the prefix must be captured to prevent
- -- reevaluation on calls through the renaming, which could result in
- -- calling the wrong subprogram if the access value were to be changed.
-
- elsif Nkind (Nam) = N_Explicit_Dereference then
- Force_Evaluation (Prefix (Nam));
- end if;
- end Expand_N_Subprogram_Renaming_Declaration;
-
-end Exp_Ch8;