On September 21, 2019 11:12:38 AM GMT+02:00, Christian Biesinger via
gcc-patches <[email protected]> wrote:
>Hello,
>
>I would like to move hash-table.h, hash-map.h and related files
>to libiberty, so that GDB can make use of it.
>
>I see that gcc already has a C++ file in include/ (unique-ptr.h),
>which I understand is libiberty.
>
>However, this patch is not complete yet (for a start, it doesn't
>compile). Before I go further down this road, is this acceptable
>in principle to the gcc/libiberty maintainers?
>
>(the bulk of the patch is including vec.h in a lot of files,
>because hash-table.h previously included it. It doesn't
>actually use it, and I didn't think it was necessary to
>move that to libiberty as well, so I removed that include
>and instead am adding it to all the files that now don't
>compile.)
The bulk seems to be hash_table to hash_table_ggc renaming. Can you explain?
Also we can then rename create_ggc back to create?
Richard.
>Thanks!
>Christian
>
>Index: Makefile.in
>===================================================================
>--- Makefile.in (revision 275695)
>+++ Makefile.in (working copy)
>@@ -1490,7 +1490,6 @@
> spellcheck-tree.o \
> sreal.o \
> stack-ptr-mod.o \
>- statistics.o \
> stmt.o \
> stor-layout.o \
> store-motion.o \
>Index: bitmap.c
>===================================================================
>--- bitmap.c (revision 275695)
>+++ bitmap.c (working copy)
>@@ -22,6 +22,7 @@
> #include "coretypes.h"
> #include "bitmap.h"
> #include "selftest.h"
>+#include "vec.h"
>
> /* Memory allocation statistics purpose instance. */
> mem_alloc_description<bitmap_usage> bitmap_mem_desc;
>Index: cfgloop.c
>===================================================================
>--- cfgloop.c (revision 275695)
>+++ cfgloop.c (working copy)
>@@ -1135,7 +1135,7 @@
>
> gcc_assert (current_loops->exits == NULL);
> current_loops->exits
>- = hash_table<loop_exit_hasher>::create_ggc (2 * number_of_loops
>(cfun));
>+ = hash_table_ggc<loop_exit_hasher>::create_ggc (2 *
>number_of_loops (cfun));
>
> FOR_EACH_BB_FN (bb, cfun)
> {
>Index: cgraph.c
>===================================================================
>--- cgraph.c (revision 275695)
>+++ cgraph.c (working copy)
>@@ -183,7 +183,7 @@
> version_info_node->this_node = this;
>
> if (cgraph_fnver_htab == NULL)
>- cgraph_fnver_htab =
>hash_table<function_version_hasher>::create_ggc (2);
>+ cgraph_fnver_htab =
>hash_table_ggc<function_version_hasher>::create_ggc (2);
>
> *cgraph_fnver_htab->find_slot (version_info_node, INSERT)
> = version_info_node;
>@@ -760,7 +760,7 @@
>
> if (n > 100)
> {
>- call_site_hash = hash_table<cgraph_edge_hasher>::create_ggc
>(120);
>+ call_site_hash = hash_table_ggc<cgraph_edge_hasher>::create_ggc
>(120);
> for (e2 = callees; e2; e2 = e2->next_callee)
> cgraph_add_edge_to_call_site_hash (e2);
> for (e2 = indirect_calls; e2; e2 = e2->next_callee)
>Index: common/common-target.h
>===================================================================
>--- common/common-target.h (revision 275695)
>+++ common/common-target.h (working copy)
>@@ -22,6 +22,7 @@
> #ifndef GCC_COMMON_TARGET_H
> #define GCC_COMMON_TARGET_H
>
>+#include "vec.h"
>
> /* Sets of optimization levels at which an option may be enabled by
> default_options_optimization. */
>Index: common/common-targhooks.h
>===================================================================
>--- common/common-targhooks.h (revision 275695)
>+++ common/common-targhooks.h (working copy)
>@@ -20,6 +20,8 @@
> #ifndef GCC_COMMON_TARGHOOKS_H
> #define GCC_COMMON_TARGHOOKS_H
>
>+#include "vec.h"
>+
>extern enum unwind_info_type default_except_unwind_info (struct
>gcc_options *);
>extern enum unwind_info_type dwarf2_except_unwind_info (struct
>gcc_options *);
>extern enum unwind_info_type sjlj_except_unwind_info (struct
>gcc_options *);
>Index: config/darwin.c
>===================================================================
>--- config/darwin.c (revision 275695)
>+++ config/darwin.c (working copy)
>@@ -572,7 +572,7 @@
>sprintf (buffer, "&%s%c%s%s%s%s", quote, L_or_l, prefix, name, suffix,
>quote);
>
> if (!machopic_indirections)
>- machopic_indirections = hash_table<indirection_hasher>::create_ggc
>(37);
>+ machopic_indirections =
>hash_table_ggc<indirection_hasher>::create_ggc (37);
>
> machopic_indirection **slot
> = machopic_indirections->find_slot_with_hash (buffer,
>@@ -3454,7 +3454,7 @@
> rest_of_decl_compilation (cfstring_class_reference, 0, 0);
>
>/* Initialize the hash table used to hold the constant CFString
>objects. */
>- cfstring_htab = hash_table<cfstring_hasher>::create_ggc (31);
>+ cfstring_htab = hash_table_ggc<cfstring_hasher>::create_ggc (31);
>
> return cfstring_type_node;
> }
>Index: config/i386/i386.c
>===================================================================
>--- config/i386/i386.c (revision 275695)
>+++ config/i386/i386.c (working copy)
>@@ -95,6 +95,7 @@
> #include "i386-builtins.h"
> #include "i386-expand.h"
> #include "i386-features.h"
>+#include "hash-table-ggc.h"
>
> /* This file should be included last. */
> #include "target-def.h"
>@@ -11048,7 +11049,7 @@
> rtx rtl;
>
> if (!dllimport_map)
>- dllimport_map = hash_table<dllimport_hasher>::create_ggc (512);
>+ dllimport_map = hash_table_ggc<dllimport_hasher>::create_ggc
>(512);
>
> in.hash = htab_hash_pointer (decl);
> in.base.from = decl;
>Index: cp/constexpr.c
>===================================================================
>--- cp/constexpr.c (revision 275695)
>+++ cp/constexpr.c (working copy)
>@@ -895,7 +895,7 @@
> /* Create the constexpr function table if necessary. */
> if (constexpr_fundef_table == NULL)
> constexpr_fundef_table
>- = hash_table<constexpr_fundef_hasher>::create_ggc (101);
>+ = hash_table_ggc<constexpr_fundef_hasher>::create_ggc (101);
>
> entry.decl = fun;
> tree saved_fn = current_function_decl;
>@@ -1081,7 +1081,7 @@
> maybe_initialize_constexpr_call_table (void)
> {
> if (constexpr_call_table == NULL)
>- constexpr_call_table =
>hash_table<constexpr_call_hasher>::create_ggc (101);
>+ constexpr_call_table =
>hash_table_ggc<constexpr_call_hasher>::create_ggc (101);
> }
>
>/* During constexpr CALL_EXPR evaluation, to avoid issues with sharing
>when
>Index: cp/decl.c
>===================================================================
>--- cp/decl.c (revision 275695)
>+++ cp/decl.c (working copy)
>@@ -3070,7 +3070,7 @@
> }
>
> if (!named_labels)
>- named_labels = hash_table<named_label_hash>::create_ggc (13);
>+ named_labels = hash_table_ggc<named_label_hash>::create_ggc (13);
>
> hashval_t hash = IDENTIFIER_HASH_VALUE (id);
> named_label_entry **slot
>@@ -3754,7 +3754,7 @@
> hashval_t hash;
>
> if (typename_htab == NULL)
>- typename_htab = hash_table<typename_hasher>::create_ggc (61);
>+ typename_htab = hash_table_ggc<typename_hasher>::create_ggc (61);
>
> ti.scope = FROB_CONTEXT (context);
> ti.name = name;
>Index: cp/decl2.c
>===================================================================
>--- cp/decl2.c (revision 275695)
>+++ cp/decl2.c (working copy)
>@@ -4612,7 +4612,7 @@
> record_mangling (tree decl, bool need_warning)
> {
> if (!mangled_decls)
>- mangled_decls = hash_table<mangled_decl_hash>::create_ggc (499);
>+ mangled_decls = hash_table_ggc<mangled_decl_hash>::create_ggc
>(499);
>
> gcc_checking_assert (DECL_ASSEMBLER_NAME_SET_P (decl));
> tree id = DECL_ASSEMBLER_NAME_RAW (decl);
>Index: cp/lex.c
>===================================================================
>--- cp/lex.c (revision 275695)
>+++ cp/lex.c (working copy)
>@@ -625,7 +625,7 @@
> return error_mark_node;
>
> if (conv_type_names == NULL)
>- conv_type_names = hash_table<conv_type_hasher>::create_ggc (31);
>+ conv_type_names = hash_table_ggc<conv_type_hasher>::create_ggc
>(31);
>
> tree *slot = conv_type_names->find_slot_with_hash
> (type, (hashval_t) TYPE_UID (type), INSERT);
>@@ -703,7 +703,7 @@
>
> if (sel == lds_ns)
> /* Who'd create a namespace, only to put nothing in it? */
>- ld->u.ns.bindings = hash_table<named_decl_hash>::create_ggc (499);
>+ ld->u.ns.bindings = hash_table_ggc<named_decl_hash>::create_ggc
>(499);
>
> if (GATHER_STATISTICS)
> {
>Index: cp/name-lookup.c
>===================================================================
>--- cp/name-lookup.c (revision 275695)
>+++ cp/name-lookup.c (working copy)
>@@ -2522,7 +2522,7 @@
> return;
>
> if (!extern_c_decls)
>- extern_c_decls = hash_table<named_decl_hash>::create_ggc (127);
>+ extern_c_decls = hash_table_ggc<named_decl_hash>::create_ggc
>(127);
>
> tree *slot = extern_c_decls
> ->find_slot_with_hash (DECL_NAME (decl),
>@@ -2907,7 +2907,7 @@
>
> if (cp_function_chain->extern_decl_map == NULL)
> cp_function_chain->extern_decl_map
>- = hash_table<cxx_int_tree_map_hasher>::create_ggc (20);
>+ = hash_table_ggc<cxx_int_tree_map_hasher>::create_ggc (20);
>
> h = ggc_alloc<cxx_int_tree_map> ();
> h->uid = DECL_UID (decl);
>Index: cp/pt.c
>===================================================================
>--- cp/pt.c (revision 275695)
>+++ cp/pt.c (working copy)
>@@ -28306,11 +28306,11 @@
> if (!flag_concepts)
> return;
>
>- decl_constraints = hash_table<constr_hasher>::create_ggc(37);
>- constraint_memos =
>hash_table<constraint_sat_hasher>::create_ggc(37);
>- concept_memos = hash_table<concept_spec_hasher>::create_ggc(37);
>- concept_expansions =
>hash_table<concept_spec_hasher>::create_ggc(37);
>- subsumption_table = hash_table<subsumption_hasher>::create_ggc(37);
>+ decl_constraints = hash_table_ggc<constr_hasher>::create_ggc(37);
>+ constraint_memos =
>hash_table_ggc<constraint_sat_hasher>::create_ggc(37);
>+ concept_memos = hash_table_ggc<concept_spec_hasher>::create_ggc(37);
>+ concept_expansions =
>hash_table_ggc<concept_spec_hasher>::create_ggc(37);
>+ subsumption_table =
>hash_table_ggc<subsumption_hasher>::create_ggc(37);
> }
>
>/* __integer_pack(N) in a pack expansion expands to a sequence of
>numbers from
>@@ -28335,8 +28335,8 @@
> init_template_processing (void)
> {
> /* FIXME: enable sanitization (PR87847) */
>- decl_specializations = hash_table<spec_hasher>::create_ggc (37,
>false);
>- type_specializations = hash_table<spec_hasher>::create_ggc (37,
>false);
>+ decl_specializations = hash_table_ggc<spec_hasher>::create_ggc (37,
>false);
>+ type_specializations = hash_table_ggc<spec_hasher>::create_ggc (37,
>false);
>
> if (cxx_dialect >= cxx11)
> declare_integer_pack ();
>Index: cp/tree.c
>===================================================================
>--- cp/tree.c (revision 275695)
>+++ cp/tree.c (working copy)
>@@ -1011,7 +1011,7 @@
> hashval_t hash;
>
> if (cplus_array_htab == NULL)
>- cplus_array_htab = hash_table<cplus_array_hasher>::create_ggc (61);
>+ cplus_array_htab = hash_table_ggc<cplus_array_hasher>::create_ggc
>(61);
>
> hash = TYPE_UID (elt_type);
> if (index_type)
>@@ -4982,7 +4982,7 @@
> void
> init_tree (void)
> {
>- list_hash_table = hash_table<list_hasher>::create_ggc (61);
>+ list_hash_table = hash_table_ggc<list_hasher>::create_ggc (61);
> register_scoped_attributes (std_attribute_table, NULL);
> }
>
>Index: cp/typeck2.c
>===================================================================
>--- cp/typeck2.c (revision 275695)
>+++ cp/typeck2.c (working copy)
>@@ -277,7 +277,7 @@
>
> if (!abstract_pending_vars)
> abstract_pending_vars
>- = hash_table<abstract_type_hasher>::create_ggc (31);
>+ = hash_table_ggc<abstract_type_hasher>::create_ggc (31);
>
> pending_abstract_type **slot
> = abstract_pending_vars->find_slot_with_hash (type, TYPE_UID (type),
>Index: dbgcnt.c
>===================================================================
>--- dbgcnt.c (revision 275695)
>+++ dbgcnt.c (working copy)
>@@ -24,6 +24,7 @@
> #include "coretypes.h"
> #include "diagnostic-core.h"
> #include "dumpfile.h"
>+#include "vec.h"
>
> #include "dbgcnt.h"
>
>Index: diagnostic-show-locus.c
>===================================================================
>--- diagnostic-show-locus.c (revision 275695)
>+++ diagnostic-show-locus.c (working copy)
>@@ -30,6 +30,7 @@
> #include "gcc-rich-location.h"
> #include "selftest.h"
> #include "selftest-diagnostic.h"
>+#include "vec.h"
>
> #ifdef HAVE_TERMIOS_H
> # include <termios.h>
>Index: dwarf2out.c
>===================================================================
>--- dwarf2out.c (revision 275695)
>+++ dwarf2out.c (working copy)
>@@ -4651,7 +4651,7 @@
> find_AT_string (const char *str, enum insert_option insert = INSERT)
> {
> if (! debug_str_hash)
>- debug_str_hash = hash_table<indirect_string_hasher>::create_ggc
>(10);
>+ debug_str_hash =
>hash_table_ggc<indirect_string_hasher>::create_ggc (10);
>
> return find_AT_string_in_table (str, debug_str_hash, insert);
> }
>@@ -5023,7 +5023,7 @@
>
> gcc_assert (dwarf_split_debug_info);
> if (! addr_index_table)
>- addr_index_table = hash_table<addr_hasher>::create_ggc (10);
>+ addr_index_table = hash_table_ggc<addr_hasher>::create_ggc (10);
> init_addr_table_entry (&finder, kind, addr);
>addr_table_entry **slot = addr_index_table->find_slot (&finder,
>INSERT);
>
>@@ -11170,7 +11170,7 @@
>
> if (! skeleton_debug_str_hash)
> skeleton_debug_str_hash
>- = hash_table<indirect_string_hasher>::create_ggc (10);
>+ = hash_table_ggc<indirect_string_hasher>::create_ggc (10);
>
> node = find_AT_string_in_table (str, skeleton_debug_str_hash);
> find_string_form (node);
>@@ -12145,7 +12145,7 @@
> case DW_FORM_line_strp:
> if (!debug_line_str_hash)
> debug_line_str_hash
>- = hash_table<indirect_string_hasher>::create_ggc (10);
>+ = hash_table_ggc<indirect_string_hasher>::create_ggc (10);
>
> struct indirect_string_node *node;
> node = find_AT_string_in_table (str, debug_line_str_hash);
>@@ -23765,7 +23765,7 @@
> }
>
> if (common_block_die_table == NULL)
>- common_block_die_table = hash_table<block_die_hasher>::create_ggc
>(10);
>+ common_block_die_table = hash_table_ggc<block_die_hasher>::create_ggc
>(10);
>
> com_die_arg.decl_id = DECL_UID (com_decl);
> com_die_arg.die_parent = context_die;
>@@ -27666,7 +27666,7 @@
>
> if (!inline_entry_data_table)
> inline_entry_data_table
>- = hash_table<inline_entry_data_hasher>::create_ggc (10);
>+ = hash_table_ggc<inline_entry_data_hasher>::create_ggc (10);
>
>
> inline_entry_data **iedp
>@@ -28836,17 +28836,17 @@
> dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
> {
> /* Allocate the file_table. */
>- file_table = hash_table<dwarf_file_hasher>::create_ggc (50);
>+ file_table = hash_table_ggc<dwarf_file_hasher>::create_ggc (50);
>
> #ifndef DWARF2_LINENO_DEBUGGING_INFO
> /* Allocate the decl_die_table. */
>- decl_die_table = hash_table<decl_die_hasher>::create_ggc (10);
>+ decl_die_table = hash_table_ggc<decl_die_hasher>::create_ggc (10);
>
> /* Allocate the decl_loc_table. */
>- decl_loc_table = hash_table<decl_loc_hasher>::create_ggc (10);
>+ decl_loc_table = hash_table_ggc<decl_loc_hasher>::create_ggc (10);
>
> /* Allocate the cached_dw_loc_list_table. */
>- cached_dw_loc_list_table =
>hash_table<dw_loc_list_hasher>::create_ggc (10);
>+ cached_dw_loc_list_table =
>hash_table_ggc<dw_loc_list_hasher>::create_ggc (10);
>
> /* Allocate the initial hunk of the abbrev_die_table. */
> vec_alloc (abbrev_die_table, 256);
>@@ -32002,7 +32002,7 @@
> {
> if (!variable_value_hash)
> variable_value_hash
>- = hash_table<variable_value_hasher>::create_ggc (10);
>+ = hash_table_ggc<variable_value_hasher>::create_ggc (10);
>
> tree fndecl = DECL_CONTEXT (decl);
> struct variable_value_struct *node;
>@@ -32098,7 +32098,7 @@
>
> if (! debug_line_str_hash)
> debug_line_str_hash
>- = hash_table<indirect_string_hasher>::create_ggc (10);
>+ = hash_table_ggc<indirect_string_hasher>::create_ggc (10);
>
> struct indirect_string_node *node
> = find_AT_string_in_table (AT_string (a), debug_line_str_hash);
>Index: edit-context.c
>===================================================================
>--- edit-context.c (revision 275695)
>+++ edit-context.c (working copy)
>@@ -25,6 +25,7 @@
> #include "pretty-print.h"
> #include "diagnostic-color.h"
> #include "selftest.h"
>+#include "vec.h"
>
> /* This file implements a way to track the effect of fix-its,
> via a class edit_context; the other classes are support classes for
>Index: emit-rtl.c
>===================================================================
>--- emit-rtl.c (revision 275695)
>+++ emit-rtl.c (working copy)
>@@ -6218,19 +6218,19 @@
>
> /* Initialize the CONST_INT, CONST_WIDE_INT, CONST_DOUBLE,
> CONST_FIXED, and memory attribute hash tables. */
>- const_int_htab = hash_table<const_int_hasher>::create_ggc (37);
>+ const_int_htab = hash_table_ggc<const_int_hasher>::create_ggc (37);
>
> #if TARGET_SUPPORTS_WIDE_INT
>- const_wide_int_htab = hash_table<const_wide_int_hasher>::create_ggc
>(37);
>+ const_wide_int_htab =
>hash_table_ggc<const_wide_int_hasher>::create_ggc (37);
> #endif
>- const_double_htab = hash_table<const_double_hasher>::create_ggc
>(37);
>+ const_double_htab = hash_table_ggc<const_double_hasher>::create_ggc
>(37);
>
> if (NUM_POLY_INT_COEFFS > 1)
>- const_poly_int_htab =
>hash_table<const_poly_int_hasher>::create_ggc (37);
>+ const_poly_int_htab =
>hash_table_ggc<const_poly_int_hasher>::create_ggc (37);
>
>- const_fixed_htab = hash_table<const_fixed_hasher>::create_ggc (37);
>+ const_fixed_htab = hash_table_ggc<const_fixed_hasher>::create_ggc
>(37);
>
>- reg_attrs_htab = hash_table<reg_attr_hasher>::create_ggc (37);
>+ reg_attrs_htab = hash_table_ggc<reg_attr_hasher>::create_ggc (37);
>
> #ifdef INIT_EXPANDERS
>/* This is to initialize {init|mark|free}_machine_status before the
>first
>Index: fibonacci_heap.h
>===================================================================
>--- fibonacci_heap.h (revision 275695)
>+++ fibonacci_heap.h (working copy)
>@@ -40,6 +40,8 @@
> #ifndef GCC_FIBONACCI_HEAP_H
> #define GCC_FIBONACCI_HEAP_H
>
>+#include "vec.h"
>+
> /* Forward definition. */
>
> template<class K, class V>
>Index: fortran/trans-decl.c
>===================================================================
>--- fortran/trans-decl.c (revision 275695)
>+++ fortran/trans-decl.c (working copy)
>@@ -5095,7 +5095,7 @@
> gfc_find_module (const char *name)
> {
> if (! module_htab)
>- module_htab = hash_table<module_hasher>::create_ggc (10);
>+ module_htab = hash_table_ggc<module_hasher>::create_ggc (10);
>
> module_htab_entry **slot
>= module_htab->find_slot_with_hash (name, htab_hash_string (name),
>INSERT);
>@@ -5104,7 +5104,7 @@
> module_htab_entry *entry = ggc_cleared_alloc<module_htab_entry> ();
>
> entry->name = gfc_get_string ("%s", name);
>- entry->decls = hash_table<module_decl_hasher>::create_ggc (10);
>+ entry->decls = hash_table_ggc<module_decl_hasher>::create_ggc
>(10);
> *slot = entry;
> }
> return *slot;
>Index: function.c
>===================================================================
>--- function.c (revision 275695)
>+++ function.c (working copy)
>@@ -1237,7 +1237,7 @@
>
> /* Set up the table to map addresses to temp slots. */
> if (! temp_slot_address_table)
>- temp_slot_address_table =
>hash_table<temp_address_hasher>::create_ggc (32);
>+ temp_slot_address_table =
>hash_table_ggc<temp_address_hasher>::create_ggc (32);
> else
> temp_slot_address_table->empty ();
> }
>@@ -5607,7 +5607,7 @@
> hash_table<insn_cache_hasher> *hash = *hashp;
>
> if (hash == NULL)
>- *hashp = hash = hash_table<insn_cache_hasher>::create_ggc (17);
>+ *hashp = hash = hash_table_ggc<insn_cache_hasher>::create_ggc
>(17);
>
> for (tmp = insns; tmp != end; tmp = NEXT_INSN (tmp))
> {
>@@ -6285,7 +6285,7 @@
> e.type = type;
> if (types_used_by_vars_hash == NULL)
> types_used_by_vars_hash
>- = hash_table<used_type_hasher>::create_ggc (37);
>+ = hash_table_ggc<used_type_hasher>::create_ggc (37);
>
> slot = types_used_by_vars_hash->find_slot (&e, INSERT);
> if (*slot == NULL)
>Index: function.h
>===================================================================
>--- function.h (revision 275695)
>+++ function.h (working copy)
>@@ -20,6 +20,7 @@
> #ifndef GCC_FUNCTION_H
> #define GCC_FUNCTION_H
>
>+#include "vec.h"
>
> /* Stack of pending (incomplete) sequences saved by `start_sequence'.
> Each element describes one pending sequence.
>Index: genmatch.c
>===================================================================
>--- genmatch.c (revision 275695)
>+++ genmatch.c (working copy)
>@@ -29,6 +29,7 @@
> #include "hash-table.h"
> #include "hash-set.h"
> #include "is-a.h"
>+#include "vec.h"
>
>
>/* Stubs for GGC referenced through instantiations triggered by
>hash-map. */
>Index: ggc-common.c
>===================================================================
>--- ggc-common.c (revision 275695)
>+++ ggc-common.c (working copy)
>@@ -29,6 +29,7 @@
> #include "params.h"
> #include "hosthooks.h"
> #include "plugin.h"
>+#include "vec.h"
>
> /* When set, ggc_collect will do collection. */
> bool ggc_force_collect;
>Index: graphds.h
>===================================================================
>--- graphds.h (revision 275695)
>+++ graphds.h (working copy)
>@@ -20,6 +20,8 @@
> #ifndef GCC_GRAPHDS_H
> #define GCC_GRAPHDS_H
>
>+#include "vec.h"
>+
> /* Structure representing edge of a graph. */
>
> struct graph_edge
>Index: hash-map-traits.h
>===================================================================
>--- hash-map-traits.h (revision 275695)
>+++ hash-map-traits.h (nonexistent)
>@@ -1,188 +0,0 @@
>-/* A hash map traits.
>- Copyright (C) 2015-2019 Free Software Foundation, Inc.
>-
>-This file is part of GCC.
>-
>-GCC is free software; you can redistribute it and/or modify it under
>-the terms of the GNU General Public License as published by the Free
>-Software Foundation; either version 3, or (at your option) any later
>-version.
>-
>-GCC is distributed in the hope that it will be useful, but WITHOUT 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
>-along with GCC; see the file COPYING3. If not see
>-<http://www.gnu.org/licenses/>. */
>-
>-#ifndef HASH_MAP_TRAITS_H
>-#define HASH_MAP_TRAITS_H
>-
>-/* Bacause mem-stats.h uses default hashmap traits, we have to
>- put the class to this separate header file. */
>-
>-#include "hash-traits.h"
>-
>-/* Implement hash_map traits for a key with hash traits H. Empty and
>- deleted map entries are represented as empty and deleted keys. */
>-
>-template <typename H, typename Value>
>-struct simple_hashmap_traits
>-{
>- typedef typename H::value_type key_type;
>- static const bool maybe_mx = true;
>- static inline hashval_t hash (const key_type &);
>- static inline bool equal_keys (const key_type &, const key_type &);
>- template <typename T> static inline void remove (T &);
>- template <typename T> static inline bool is_empty (const T &);
>- template <typename T> static inline bool is_deleted (const T &);
>- template <typename T> static inline void mark_empty (T &);
>- template <typename T> static inline void mark_deleted (T &);
>-};
>-
>-template <typename H, typename Value>
>-inline hashval_t
>-simple_hashmap_traits <H, Value>::hash (const key_type &h)
>-{
>- return H::hash (h);
>-}
>-
>-template <typename H, typename Value>
>-inline bool
>-simple_hashmap_traits <H, Value>::equal_keys (const key_type &k1,
>- const key_type &k2)
>-{
>- return H::equal (k1, k2);
>-}
>-
>-template <typename H, typename Value>
>-template <typename T>
>-inline void
>-simple_hashmap_traits <H, Value>::remove (T &entry)
>-{
>- H::remove (entry.m_key);
>- entry.m_value.~Value ();
>-}
>-
>-template <typename H, typename Value>
>-template <typename T>
>-inline bool
>-simple_hashmap_traits <H, Value>::is_empty (const T &entry)
>-{
>- return H::is_empty (entry.m_key);
>-}
>-
>-template <typename H, typename Value>
>-template <typename T>
>-inline bool
>-simple_hashmap_traits <H, Value>::is_deleted (const T &entry)
>-{
>- return H::is_deleted (entry.m_key);
>-}
>-
>-template <typename H, typename Value>
>-template <typename T>
>-inline void
>-simple_hashmap_traits <H, Value>::mark_empty (T &entry)
>-{
>- H::mark_empty (entry.m_key);
>-}
>-
>-template <typename H, typename Value>
>-template <typename T>
>-inline void
>-simple_hashmap_traits <H, Value>::mark_deleted (T &entry)
>-{
>- H::mark_deleted (entry.m_key);
>-}
>-
>-template <typename H, typename Value>
>-struct simple_cache_map_traits: public simple_hashmap_traits<H,Value>
>-{
>- static const bool maybe_mx = false;
>-};
>-
>-/* Implement traits for a hash_map with values of type Value for cases
>- in which the key cannot represent empty and deleted slots. Instead
>- record empty and deleted entries in Value. Derived classes must
>- implement the hash and equal_keys functions. */
>-
>-template <typename Value>
>-struct unbounded_hashmap_traits
>-{
>- template <typename T> static inline void remove (T &);
>- template <typename T> static inline bool is_empty (const T &);
>- template <typename T> static inline bool is_deleted (const T &);
>- template <typename T> static inline void mark_empty (T &);
>- template <typename T> static inline void mark_deleted (T &);
>-};
>-
>-template <typename Value>
>-template <typename T>
>-inline void
>-unbounded_hashmap_traits <Value>::remove (T &entry)
>-{
>- default_hash_traits <Value>::remove (entry.m_value);
>-}
>-
>-template <typename Value>
>-template <typename T>
>-inline bool
>-unbounded_hashmap_traits <Value>::is_empty (const T &entry)
>-{
>- return default_hash_traits <Value>::is_empty (entry.m_value);
>-}
>-
>-template <typename Value>
>-template <typename T>
>-inline bool
>-unbounded_hashmap_traits <Value>::is_deleted (const T &entry)
>-{
>- return default_hash_traits <Value>::is_deleted (entry.m_value);
>-}
>-
>-template <typename Value>
>-template <typename T>
>-inline void
>-unbounded_hashmap_traits <Value>::mark_empty (T &entry)
>-{
>- default_hash_traits <Value>::mark_empty (entry.m_value);
>-}
>-
>-template <typename Value>
>-template <typename T>
>-inline void
>-unbounded_hashmap_traits <Value>::mark_deleted (T &entry)
>-{
>- default_hash_traits <Value>::mark_deleted (entry.m_value);
>-}
>-
>-/* Implement traits for a hash_map from integer type Key to Value in
>- cases where Key has no spare values for recording empty and deleted
>- slots. */
>-
>-template <typename Key, typename Value>
>-struct unbounded_int_hashmap_traits : unbounded_hashmap_traits <Value>
>-{
>- typedef Key key_type;
>- static inline hashval_t hash (Key);
>- static inline bool equal_keys (Key, Key);
>-};
>-
>-template <typename Key, typename Value>
>-inline hashval_t
>-unbounded_int_hashmap_traits <Key, Value>::hash (Key k)
>-{
>- return k;
>-}
>-
>-template <typename Key, typename Value>
>-inline bool
>-unbounded_int_hashmap_traits <Key, Value>::equal_keys (Key k1, Key k2)
>-{
>- return k1 == k2;
>-}
>-
>-#endif // HASH_MAP_TRAITS_H
>Index: hash-map.h
>===================================================================
>--- hash-map.h (revision 275695)
>+++ hash-map.h (working copy)
>@@ -21,6 +21,8 @@
> #ifndef hash_map_h
> #define hash_map_h
>
>+#include "hash-table-ggc.h"
>+
> /* Class hash_map is a hash-value based container mapping objects of
> KeyId type to those of the Value type.
> Both KeyId and Value may be non-trivial (non-POD) types provided
>Index: hash-table.h
>===================================================================
>--- hash-table.h (revision 275695)
>+++ hash-table.h (nonexistent)
>@@ -1,1231 +0,0 @@
>-/* A type-safe hash table template.
>- Copyright (C) 2012-2019 Free Software Foundation, Inc.
>- Contributed by Lawrence Crowl <[email protected]>
>-
>-This file is part of GCC.
>-
>-GCC is free software; you can redistribute it and/or modify it under
>-the terms of the GNU General Public License as published by the Free
>-Software Foundation; either version 3, or (at your option) any later
>-version.
>-
>-GCC is distributed in the hope that it will be useful, but WITHOUT 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
>-along with GCC; see the file COPYING3. If not see
>-<http://www.gnu.org/licenses/>. */
>-
>-
>-/* This file implements a typed hash table.
>- The implementation borrows from libiberty's htab_t in hashtab.h.
>-
>-
>- INTRODUCTION TO TYPES
>-
>- Users of the hash table generally need to be aware of three types.
>-
>- 1. The type being placed into the hash table. This type is
>called
>- the value type.
>-
>- 2. The type used to describe how to handle the value type within
>- the hash table. This descriptor type provides the hash table
>with
>- several things.
>-
>- - A typedef named 'value_type' to the value type (from
>above).
>- Provided a suitable Descriptor class it may be a user-defined,
>- non-POD type.
>-
>- - A static member function named 'hash' that takes a
>value_type
>- (or 'const value_type &') and returns a hashval_t value.
>-
>- - A typedef named 'compare_type' that is used to test when a
>value
>- is found. This type is the comparison type. Usually, it will be
>- the same as value_type and may be a user-defined, non-POD type.
>- If it is not the same type, you must generally explicitly compute
>- hash values and pass them to the hash table.
>-
>- - A static member function named 'equal' that takes a
>value_type
>- and a compare_type, and returns a bool. Both arguments can
>be
>- const references.
>-
>- - A static function named 'remove' that takes an value_type
>pointer
>- and frees the memory allocated by it. This function is used
>when
>- individual elements of the table need to be disposed of
>(e.g.,
>- when deleting a hash table, removing elements from the table,
>etc).
>-
>- - An optional static function named 'keep_cache_entry'. This
>- function is provided only for garbage-collected elements that
>- are not marked by the normal gc mark pass. It describes what
>- what should happen to the element at the end of the gc mark phase.
>- The return value should be:
>- - 0 if the element should be deleted
>- - 1 if the element should be kept and needs to be marked
>- - -1 if the element should be kept and is already marked.
>- Returning -1 rather than 1 is purely an optimization.
>-
>- 3. The type of the hash table itself. (More later.)
>-
>- In very special circumstances, users may need to know about a
>fourth type.
>-
>- 4. The template type used to describe how hash table memory
>- is allocated. This type is called the allocator type. It is
>- parameterized on the value type. It provides two functions:
>-
>- - A static member function named 'data_alloc'. This function
>- allocates the data elements in the table.
>-
>- - A static member function named 'data_free'. This function
>- deallocates the data elements in the table.
>-
>- Hash table are instantiated with two type arguments.
>-
>- * The descriptor type, (2) above.
>-
>- * The allocator type, (4) above. In general, you will not need
>to
>- provide your own allocator type. By default, hash tables will
>use
>- the class template xcallocator, which uses malloc/free for
>allocation.
>-
>-
>- DEFINING A DESCRIPTOR TYPE
>-
>- The first task in using the hash table is to describe the element
>type.
>- We compose this into a few steps.
>-
>- 1. Decide on a removal policy for values stored in the table.
>- hash-traits.h provides class templates for the four most
>common
>- policies:
>-
>- * typed_free_remove implements the static 'remove' member
>function
>- by calling free().
>-
>- * typed_noop_remove implements the static 'remove' member
>function
>- by doing nothing.
>-
>- * ggc_remove implements the static 'remove' member by doing
>nothing,
>- but instead provides routines for gc marking and for PCH
>streaming.
>- Use this for garbage-collected data that needs to be
>preserved across
>- collections.
>-
>- * ggc_cache_remove is like ggc_remove, exce