Mercurial > hg > CbC > CbC_gcc
diff gcc/ada/scil_ll.adb @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/ada/scil_ll.adb Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,205 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT COMPILER COMPONENTS -- +-- -- +-- S C I L _ L L -- +-- -- +-- B o d y -- +-- -- +-- Copyright (C) 2010-2016, 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. -- +-- -- +-- As a special exception under Section 7 of GPL version 3, you are granted -- +-- additional permissions described in the GCC Runtime Library Exception, -- +-- version 3.1, as published by the Free Software Foundation. -- +-- -- +-- You should have received a copy of the GNU General Public License and -- +-- a copy of the GCC Runtime Library Exception along with this program; -- +-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- +-- <http://www.gnu.org/licenses/>. -- +-- -- +-- 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 Opt; use Opt; +with Sinfo; use Sinfo; +with System.HTable; use System.HTable; + +package body SCIL_LL is + + procedure Copy_SCIL_Node (Target : Node_Id; Source : Node_Id); + -- Copy the SCIL field from Source to Target (it is used as the argument + -- for a call to Set_Reporting_Proc in package atree). + + type Header_Num is range 1 .. 4096; + + function Hash (N : Node_Id) return Header_Num; + -- Hash function for Node_Ids + + -------------------------- + -- Internal Hash Tables -- + -------------------------- + + package Contract_Only_Body_Flag is new Simple_HTable + (Header_Num => Header_Num, + Element => Boolean, + No_Element => False, + Key => Node_Id, + Hash => Hash, + Equal => "="); + -- This table records the value of flag Is_Contract_Only_Flag of tree nodes + + package Contract_Only_Body_Nodes is new Simple_HTable + (Header_Num => Header_Num, + Element => Node_Id, + No_Element => Empty, + Key => Node_Id, + Hash => Hash, + Equal => "="); + -- This table records the value of attribute Contract_Only_Body of tree + -- nodes. + + package SCIL_Nodes is new Simple_HTable + (Header_Num => Header_Num, + Element => Node_Id, + No_Element => Empty, + Key => Node_Id, + Hash => Hash, + Equal => "="); + -- This table records the value of attribute SCIL_Node of tree nodes + + -------------------- + -- Copy_SCIL_Node -- + -------------------- + + procedure Copy_SCIL_Node (Target : Node_Id; Source : Node_Id) is + begin + Set_SCIL_Node (Target, Get_SCIL_Node (Source)); + end Copy_SCIL_Node; + + ---------------------------- + -- Get_Contract_Only_Body -- + ---------------------------- + + function Get_Contract_Only_Body (N : Node_Id) return Node_Id is + begin + if CodePeer_Mode + and then Present (N) + then + return Contract_Only_Body_Nodes.Get (N); + else + return Empty; + end if; + end Get_Contract_Only_Body; + + ------------------- + -- Get_SCIL_Node -- + ------------------- + + function Get_SCIL_Node (N : Node_Id) return Node_Id is + begin + if Generate_SCIL + and then Present (N) + then + return SCIL_Nodes.Get (N); + else + return Empty; + end if; + end Get_SCIL_Node; + + ---------- + -- Hash -- + ---------- + + function Hash (N : Node_Id) return Header_Num is + begin + return Header_Num (1 + N mod Node_Id (Header_Num'Last)); + end Hash; + + ---------------- + -- Initialize -- + ---------------- + + procedure Initialize is + begin + SCIL_Nodes.Reset; + Contract_Only_Body_Nodes.Reset; + Contract_Only_Body_Flag.Reset; + Set_Reporting_Proc (Copy_SCIL_Node'Access); + end Initialize; + + --------------------------- + -- Is_Contract_Only_Body -- + --------------------------- + + function Is_Contract_Only_Body (E : Entity_Id) return Boolean is + begin + return Contract_Only_Body_Flag.Get (E); + end Is_Contract_Only_Body; + + ---------------------------- + -- Set_Contract_Only_Body -- + ---------------------------- + + procedure Set_Contract_Only_Body (N : Node_Id; Value : Node_Id) is + begin + pragma Assert (CodePeer_Mode + and then Present (N) + and then Is_Contract_Only_Body (Value)); + + Contract_Only_Body_Nodes.Set (N, Value); + end Set_Contract_Only_Body; + + ------------------------------- + -- Set_Is_Contract_Only_Body -- + ------------------------------- + + procedure Set_Is_Contract_Only_Body (E : Entity_Id) is + begin + Contract_Only_Body_Flag.Set (E, True); + end Set_Is_Contract_Only_Body; + + ------------------- + -- Set_SCIL_Node -- + ------------------- + + procedure Set_SCIL_Node (N : Node_Id; Value : Node_Id) is + begin + pragma Assert (Generate_SCIL); + + if Present (Value) then + case Nkind (Value) is + when N_SCIL_Dispatch_Table_Tag_Init => + pragma Assert (Nkind (N) = N_Object_Declaration); + null; + + when N_SCIL_Dispatching_Call => + pragma Assert (Nkind (N) in N_Subprogram_Call); + null; + + when N_SCIL_Membership_Test => + pragma Assert (Nkind_In (N, N_Identifier, + N_And_Then, + N_Or_Else, + N_Expression_With_Actions)); + null; + + when others => + pragma Assert (False); + raise Program_Error; + end case; + end if; + + SCIL_Nodes.Set (N, Value); + end Set_SCIL_Node; + +end SCIL_LL;