------------------------------------------------------------------------------ -- -- -- GNAT COMPILER COMPONENTS -- -- -- -- E X P _ S E L -- -- -- -- B o d y -- -- -- -- Copyright (C) 1992-2005, 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 2, 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 COPYING. If not, write -- -- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, -- -- Boston, MA 02110-1301, USA. -- -- -- -- GNAT was originally developed by the GNAT team at New York University. -- -- Extensive contributions were provided by Ada Core Technologies Inc. -- -- -- ------------------------------------------------------------------------------ with Einfo; use Einfo; with Nlists; use Nlists; with Nmake; use Nmake; with Rtsfind; use Rtsfind; with Stand; use Stand; with Tbuild; use Tbuild; package body Exp_Sel is ----------------------- -- Build_Abort_Block -- ----------------------- function Build_Abort_Block (Loc : Source_Ptr; Abr_Blk_Ent : Entity_Id; Cln_Blk_Ent : Entity_Id; Blk : Node_Id) return Node_Id is begin return Make_Block_Statement (Loc, Identifier => New_Reference_To (Abr_Blk_Ent, Loc), Declarations => No_List, Handled_Statement_Sequence => Make_Handled_Sequence_Of_Statements (Loc, Statements => New_List ( Make_Implicit_Label_Declaration (Loc, Defining_Identifier => Cln_Blk_Ent, Label_Construct => Blk), Blk), Exception_Handlers => New_List ( Make_Exception_Handler (Loc, Exception_Choices => New_List ( New_Reference_To (Stand.Abort_Signal, Loc)), Statements => New_List ( Make_Procedure_Call_Statement (Loc, Name => New_Reference_To (RTE ( RE_Abort_Undefer), Loc), Parameter_Associations => No_List)))))); end Build_Abort_Block; ------------- -- Build_B -- ------------- function Build_B (Loc : Source_Ptr; Decls : List_Id) return Entity_Id is B : constant Entity_Id := Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('B')); begin Append_To (Decls, Make_Object_Declaration (Loc, Defining_Identifier => B, Object_Definition => New_Reference_To (Standard_Boolean, Loc), Expression => New_Reference_To (Standard_False, Loc))); return B; end Build_B; ------------- -- Build_C -- ------------- function Build_C (Loc : Source_Ptr; Decls : List_Id) return Entity_Id is C : constant Entity_Id := Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('C')); begin Append_To (Decls, Make_Object_Declaration (Loc, Defining_Identifier => C, Object_Definition => New_Reference_To (RTE (RE_Prim_Op_Kind), Loc))); return C; end Build_C; ------------------------- -- Build_Cleanup_Block -- ------------------------- function Build_Cleanup_Block (Loc : Source_Ptr; Blk_Ent : Entity_Id; Stmts : List_Id; Clean_Ent : Entity_Id) return Node_Id is Cleanup_Block : constant Node_Id := Make_Block_Statement (Loc, Identifier => New_Reference_To (Blk_Ent, Loc), Declarations => No_List, Handled_Statement_Sequence => Make_Handled_Sequence_Of_Statements (Loc, Statements => Stmts), Is_Asynchronous_Call_Block => True); begin Set_Entry_Cancel_Parameter (Blk_Ent, Clean_Ent); return Cleanup_Block; end Build_Cleanup_Block; ------------- -- Build_K -- ------------- function Build_K (Loc : Source_Ptr; Decls : List_Id; Obj : Entity_Id) return Entity_Id is K : constant Entity_Id := Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('K')); begin Append_To (Decls, Make_Object_Declaration (Loc, Defining_Identifier => K, Object_Definition => New_Reference_To (RTE (RE_Tagged_Kind), Loc), Expression => Make_Function_Call (Loc, Name => New_Reference_To (RTE (RE_Get_Tagged_Kind), Loc), Parameter_Associations => New_List ( Unchecked_Convert_To (RTE (RE_Tag), Obj))))); return K; end Build_K; ------------- -- Build_S -- ------------- function Build_S (Loc : Source_Ptr; Decls : List_Id) return Entity_Id is S : constant Entity_Id := Make_Defining_Identifier (Loc, Chars => New_Internal_Name ('S')); begin Append_To (Decls, Make_Object_Declaration (Loc, Defining_Identifier => S, Object_Definition => New_Reference_To (Standard_Integer, Loc))); return S; end Build_S; ------------------------ -- Build_S_Assignment -- ------------------------ function Build_S_Assignment (Loc : Source_Ptr; S : Entity_Id; Obj : Entity_Id; Call_Ent : Entity_Id) return Node_Id is begin return Make_Assignment_Statement (Loc, Name => New_Reference_To (S, Loc), Expression => Make_Function_Call (Loc, Name => New_Reference_To (RTE (RE_Get_Offset_Index), Loc), Parameter_Associations => New_List ( Unchecked_Convert_To (RTE (RE_Tag), Obj), Make_Integer_Literal (Loc, DT_Position (Call_Ent))))); end Build_S_Assignment; end Exp_Sel;