aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/libgnat/a-chtgfo.ads
diff options
context:
space:
mode:
authorYannick Moy <moy@adacore.com>2022-02-16 13:56:50 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-13 08:04:39 +0000
commit2e2f53d50c6fd17eb87d256d57696acc650a50e1 (patch)
treeb9feda92254b0b4e2ea3aeb9f9e259c3eefed573 /gcc/ada/libgnat/a-chtgfo.ads
parent6d22fb118f5c292c6c35c9177074485be0159810 (diff)
downloadgcc-2e2f53d50c6fd17eb87d256d57696acc650a50e1.zip
gcc-2e2f53d50c6fd17eb87d256d57696acc650a50e1.tar.gz
gcc-2e2f53d50c6fd17eb87d256d57696acc650a50e1.tar.bz2
[Ada] Remove dependency on tampering checks and controlled types for formal
Formal hashed sets and maps are now using a different type of hash table that does not require controlled types. This is possible because formal containers do not rely on tampering checks, as cursors do not hold a pointer to a single matching container, but are logical indexes that can be used with multiple containers. For simplicity of the package organisation, and symmetry with other versions of containers, add a formal version of hashed types in the shared Ada.Containers.Hash_Tables unit. This unit should be specialized to only include the formal version of hash tables for runtimes that do not support controlled types (so that the dependency on Ada.Containers.Helpers can be removed). The new versions of units for generic keys and operations are modified versions of the units for bounded containers, with all tampering checks removed (they were no-op in formal containers). A declaration of constant Checks is added at the start of the body, as these units cannot use the version in Ada.Containers.Helpers. gcc/ada/ * Makefile.rtl: Add new files. * libgnat/a-cfhama.adb: Use formal version of hash tables. * libgnat/a-cfhama.ads: Same. * libgnat/a-cfhase.adb: Same. * libgnat/a-cfhase.ads: Same. * libgnat/a-chtgfk.adb: New unit for formal containers, modified version of Generic_Bounded_Keys. * libgnat/a-chtgfk.ads: Same. * libgnat/a-chtgfo.adb: New unit for formal containers, modified version of Generic_Bounded_Operations. * libgnat/a-chtgfo.ads: Same. * libgnat/a-cohata.ads (Generic_Formal_Hash_Table_Types): Third version of the type for hash tables, equivalent to the bounded version without tampering checks.
Diffstat (limited to 'gcc/ada/libgnat/a-chtgfo.ads')
-rw-r--r--gcc/ada/libgnat/a-chtgfo.ads156
1 files changed, 156 insertions, 0 deletions
diff --git a/gcc/ada/libgnat/a-chtgfo.ads b/gcc/ada/libgnat/a-chtgfo.ads
new file mode 100644
index 0000000..4936c73
--- /dev/null
+++ b/gcc/ada/libgnat/a-chtgfo.ads
@@ -0,0 +1,156 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT LIBRARY COMPONENTS --
+-- --
+-- ADA.CONTAINERS.HASH_TABLES.GENERIC_FORMAL_OPERATIONS --
+-- --
+-- S p e c --
+-- --
+-- Copyright (C) 2004-2022, 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/>. --
+-- --
+-- This unit was originally developed by Matthew J Heaney. --
+------------------------------------------------------------------------------
+
+-- Hash_Table_Type is used to implement hashed containers. This package
+-- declares hash-table operations that do not depend on keys.
+
+with Ada.Streams;
+
+generic
+ with package HT_Types is
+ new Generic_Formal_Hash_Table_Types (<>);
+
+ use HT_Types;
+
+ with function Hash_Node (Node : Node_Type) return Hash_Type;
+
+ with function Next (Node : Node_Type) return Count_Type;
+
+ with procedure Set_Next
+ (Node : in out Node_Type;
+ Next : Count_Type);
+
+package Ada.Containers.Hash_Tables.Generic_Formal_Operations is
+ pragma Pure;
+
+ function Index
+ (Buckets : Buckets_Type;
+ Node : Node_Type) return Hash_Type;
+ pragma Inline (Index);
+ -- Uses the hash value of Node to compute its Buckets array index
+
+ function Index
+ (HT : Hash_Table_Type'Class;
+ Node : Node_Type) return Hash_Type;
+ pragma Inline (Index);
+ -- Uses the hash value of Node to compute its Hash_Table buckets array
+ -- index.
+
+ function Checked_Index
+ (Hash_Table : Hash_Table_Type'Class;
+ Node : Count_Type) return Hash_Type;
+ -- Calls Index, but also locks and unlocks the container, per AI05-0022, in
+ -- order to detect element tampering by the generic actual Hash function.
+
+ generic
+ with function Find
+ (HT : Hash_Table_Type'Class;
+ Key : Node_Type) return Boolean;
+ function Generic_Equal (L, R : Hash_Table_Type'Class) return Boolean;
+ -- Used to implement hashed container equality. For each node in hash table
+ -- L, it calls Find to search for an equivalent item in hash table R. If
+ -- Find returns False for any node then Generic_Equal terminates
+ -- immediately and returns False. Otherwise if Find returns True for every
+ -- node then Generic_Equal returns True.
+
+ procedure Clear (HT : in out Hash_Table_Type'Class);
+ -- Deallocates each node in hash table HT. (Note that it only deallocates
+ -- the nodes, not the buckets array.) Program_Error is raised if the hash
+ -- table is busy.
+
+ procedure Delete_Node_At_Index
+ (HT : in out Hash_Table_Type'Class;
+ Indx : Hash_Type;
+ X : Count_Type);
+ -- Delete a node whose bucket position is known. extracted from following
+ -- subprogram, but also used directly to remove a node whose element has
+ -- been modified through a key_preserving reference: in that case we cannot
+ -- use the value of the element precisely because the current value does
+ -- not correspond to the hash code that determines its bucket.
+
+ procedure Delete_Node_Sans_Free
+ (HT : in out Hash_Table_Type'Class;
+ X : Count_Type);
+ -- Removes node X from the hash table without deallocating the node
+
+ generic
+ with procedure Set_Element (Node : in out Node_Type);
+ procedure Generic_Allocate
+ (HT : in out Hash_Table_Type'Class;
+ Node : out Count_Type);
+ -- Claim a node from the free store. Generic_Allocate first
+ -- calls Set_Element on the potential node, and then returns
+ -- the node's index as the value of the Node parameter.
+
+ procedure Free
+ (HT : in out Hash_Table_Type'Class;
+ X : Count_Type);
+ -- Return a node back to the free store, from where it had
+ -- been previously claimed via Generic_Allocate.
+
+ function First (HT : Hash_Table_Type'Class) return Count_Type;
+ -- Returns the head of the list in the first (lowest-index) non-empty
+ -- bucket.
+
+ function Next
+ (HT : Hash_Table_Type'Class;
+ Node : Count_Type) return Count_Type;
+ -- Returns the node that immediately follows Node. This corresponds to
+ -- either the next node in the same bucket, or (if Node is the last node in
+ -- its bucket) the head of the list in the first non-empty bucket that
+ -- follows.
+
+ generic
+ with procedure Process (Node : Count_Type);
+ procedure Generic_Iteration (HT : Hash_Table_Type'Class);
+ -- Calls Process for each node in hash table HT
+
+ generic
+ use Ada.Streams;
+ with procedure Write
+ (Stream : not null access Root_Stream_Type'Class;
+ Node : Node_Type);
+ procedure Generic_Write
+ (Stream : not null access Root_Stream_Type'Class;
+ HT : Hash_Table_Type'Class);
+ -- Used to implement the streaming attribute for hashed containers. It
+ -- calls Write for each node to write its value into Stream.
+
+ generic
+ use Ada.Streams;
+ with function New_Node (Stream : not null access Root_Stream_Type'Class)
+ return Count_Type;
+ procedure Generic_Read
+ (Stream : not null access Root_Stream_Type'Class;
+ HT : out Hash_Table_Type'Class);
+ -- Used to implement the streaming attribute for hashed containers. It
+ -- first clears hash table HT, then populates the hash table by calling
+ -- New_Node for each item in Stream.
+
+end Ada.Containers.Hash_Tables.Generic_Formal_Operations;