diff options
author | Lawrence Crowl <crowl@google.com> | 2013-04-26 00:28:35 +0000 |
---|---|---|
committer | Lawrence Crowl <crowl@gcc.gnu.org> | 2013-04-26 00:28:35 +0000 |
commit | 4a8fb1a1de7c34fc788ccca21f3a15980bbce093 (patch) | |
tree | 5115f0a81b7cea52ab7997ce3322160f2baf2374 /gcc/dwarf2out.c | |
parent | 11dae3ad79feec9dda4610f1f9adbc742a2b3661 (diff) | |
download | gcc-4a8fb1a1de7c34fc788ccca21f3a15980bbce093.zip gcc-4a8fb1a1de7c34fc788ccca21f3a15980bbce093.tar.gz gcc-4a8fb1a1de7c34fc788ccca21f3a15980bbce093.tar.bz2 |
This patch is the main part of a consolodation of the hash_table patches to the...
This patch is the main part of a consolodation of the hash_table
patches to the cxx-conversion branch for files not under gcc/config.
Update various hash tables from htab_t to hash_table.
Modify types and calls to match.
* tree-parloops.c'reduction
* tree-parloops.c'name_to_copy
Fold reduction_info_hash and reduction_info_eq into new struct
reduction_hasher. Fold name_to_copy_elt_eq and name_to_copy_elt_hash
into new struct name_to_copy_hasher.
* trans-mem.c'tm_log
Fold tm_log_hash, tm_log_eq, tm_log_free into new struct log_entry_hasher.
* trans-mem.c'tm_memopt_value_numbers
Fold tm_memop_hash, tm_memop_eq into new struct tm_memop_hasher.
* tree-ssa-strlen.c'decl_to_stridxlist_htab
Fold decl_to_stridxlist_hash into new struct stridxlist_hasher.
* tree-ssa-loop-ivopts.c'ivopts_data::inv_expr_tab
Fold htab_inv_expr_hash and htab_inv_expr_eq into new struct
iv_inv_expr_hasher.
* tree-ssa-uncprop.c'equiv
Equiv renamed to val_ssa_equiv because of name ambiguity with local variables.
Fold equiv_hash, equiv_eq and equiv_free into new struct val_ssa_equiv_hasher.
Renamed variables equiv_hash_elt to an_equiv_elt because of name ambiguity
with struct type. Changed equiv_hash_elt_p to an_equiv_elt_p to match.
* tree-ssa-phiopt.c'seen_ssa_names
Fold name_to_bb_hash and name_to_bb_eq into new struct ssa_names_hasher.
* tree-ssa-structalias.c'pointer_equiv_class_table
* tree-ssa-structalias.c'location_equiv_class_table
Fold equiv_class_label_hash and equiv_class_label_eq into new
struct equiv_class_hasher.
* tree-ssa-structalias.c'shared_bitmap_table
Fold shared_bitmap_hash and shared_bitmap_eq into new struct
shared_bitmap_hasher.
* tree-ssa-live.c'var_map_base_init::tree_to_index
New struct tree_int_map_hasher.
* tree-sra.c'candidates
Fold uid_decl_map_hash and uid_decl_map_eq into new struct
uid_decl_hasher. This change moves the definitions from tree-ssa.c
into tree-sra.c and removes the declarations from tree-flow.h
tree-browser.c
Remove stale declaration of removed TB_parent_eq.
Fix template parameter for base class to match value_type.
gimple.h
Use gimplify_hasher::hash rather than gimple_tree_hash in the
assertion check.
Change return values to match return type. (I.e. no conversions.)
* graphite-clast-to-gimple.c'ivs_params::newivs_index
* graphite-clast-to-gimple.c'ivs_params::params_index
* graphite-clast-to-gimple.c'print_generated_program::params_index
* graphite-clast-to-gimple.c'gloog::newivs_index
* graphite-clast-to-gimple.c'gloog::params_index
* graphite.c graphite_transform_loops::bb_pbb_mapping
* sese.c copy_bb_and_scalar_dependences::rename_map
Move hash table declarations to a new graphite-htab.h, because they
are used in few places.
Remove unused:
htab_t scop::original_pddrs
SCOP_ORIGINAL_PDDRS
Remove unused:
insert_loop_close_phis
insert_guard_phis
debug_ivtype_map
ivtype_map_elt_info
new_ivtype_map_elt
* gimplify.c'gimplify_ctx::temp_htab
Move struct gimple_temp_hash_elt and struct gimplify_ctx to a new
gimplify-ctx.h, because they are used few places.
* cselib.c'cselib_hash_table
* gcse.c'pre_ldst_table
* gimple-ssa-strength-reduction.c'base_cand_map
* haifa-sched.c'delay_htab
* haifa-sched.c'delay_htab_i2
* ira-color.c'allocno_hard_regs_htab
* ira-costs.c'cost_classes_htab
* loop-invariant.c'merge_identical_invariants::eq
* loop-iv.c'bivs
* loop-unroll.c'opt_info::insns_to_split
* loop-unroll.c'opt_info::insns_with_var_to_expand
* passes.c'name_to_pass_map
* plugin.c'event_tab
* postreload-gcse.c'expr_table
* store-motion.c'store_motion_mems_table
* tree-cfg.c'discriminator_per_locus
* tree-scalar-evolution.c'resolve_mixers::cache
* tree-ssa-dom.c'avail_exprs
Remove unused:
dse.c bitmap clear_alias_sets
dse.c bitmap disqualified_clear_alias_sets
dse.c alloc_pool clear_alias_mode_pool
dse.c dse_step2_spill
dse.c dse_step5_spill
graphds.h htab_t graph::indices
* attribs.c'scoped_attributes::attribute_hash
* bitmap.c'bitmap_desc_hash
* dwarf2cfi.c'trace_index
* dwarf2out.c'break_out_includes::cu_hash_table
* dwarf2out.c'copy_decls_for_unworthy_types::decl_table
* dwarf2out.c'optimize_external_refs::map
* dwarf2out.c'output_comp_unit::extern_map
* dwarf2out.c'output_comdat_type_unit::extern_map
* dwarf2out.c'output_macinfo::macinfo_htab
* dwarf2out.c'optimize_location_lists::htab
* dwarf2out.c'dwarf2out_finish::comdat_type_table
* except.c'ehspec_hash_type
* except.c'assign_filter_values::ttypes
* except.c'assign_filter_values::ehspec
* except.c'sjlj_assign_call_site_values::ar_hash
* except.c'convert_to_eh_region_ranges::ar_hash
* trans-mem.c'tm_new_mem_hash
* tree-browser.c'TB_up_ht
* tree-eh.c'finally_tree
Move the declaration of hash_table <alloc_pool_hasher> alloc_pool_hash
in alloc-pool.c to after the method definitions for its parameter
class.
* ggc-common.c'loc_hash
* ggc-common.c'ptr_hash
Add a new hash_table method elements_with_deleted to meet the needs of
gcc-common.c.
Correct many methods with parameter types compare_type to the correct
value_type. (Correct code was unlikely to notice the change, but
incorrect code will.)
* tree-complex.c'complex_variable_components
* tree-parloops.c'eliminate_local_variables_stmt::decl_address
* tree-parloops.c'separate_decls_in_region::decl_copies
Move hash table declarations to a new tree-hasher.h, to resolve
compilation dependences and because they are used in few places.
* lto-streamer.h'output_block::string_hash_table
* lto-streamer-in.c'file_name_hash_table
* lto-streamer.c'tree_htab
The struct string_slot moves from data-streamer.h to lto-streamer.h to
resolve compilation dependences.
Tested on x86_64.
Index: gcc/ChangeLog
2013-04-25 Lawrence Crowl <crowl@google.com>
* Makefile.in: Update as needed below.
* alloc-pool.c (static hash_table <alloc_pool_hasher> alloc_pool_hash):
Move declaration to after the type's method definitons.
* attribs.c (htab_t scoped_attributes::attribute_hash):
Change type to hash_table. Update dependent calls and types.
* bitmap.c (htab_t bitmap_desc_hash):
Change type to hash_table. Update dependent calls and types.
* cselib.c (htab_t cselib_hash_table):
Change type to hash_table. Update dependent calls and types.
* data-streamer.h (struct string_slot): Move to lto-streamer.h.
(hash_string_slot_node): Move implementation into lto-streamer.h
struct string_slot_hasher.
(eq_string_slot_node): Likewise.
* data-streamer-out.c: Update output_block::string_hash_table
dependent calls and types.
* dwarf2cfi.c (htab_t trace_index):
Change type to hash_table. Update dependent calls and types.
* dwarf2out.c (htab_t break_out_includes::cu_hash_table):
Change type to hash_table. Update dependent calls and types.
(htab_t copy_decls_for_unworthy_types::decl_table): Likewise.
(htab_t optimize_external_refs::map): Likewise.
(htab_t output_comp_unit::extern_map): Likewise.
(htab_t output_comdat_type_unit::extern_map): Likewise.
(htab_t output_macinfo::macinfo_htab): Likewise.
(htab_t optimize_location_lists::htab): Likewise.
(htab_t dwarf2out_finish::comdat_type_table): Likewise.
* except.c (htab_t ehspec_hash_type):
Change type to hash_table. Update dependent calls and types.
(assign_filter_values::ttypes): Likewise.
(assign_filter_values::ehspec): Likewise.
(sjlj_assign_call_site_values::ar_hash): Likewise.
(convert_to_eh_region_ranges::ar_hash): Likewise.
* gcse.c (htab_t pre_ldst_table):
Change type to hash_table. Update dependent calls and types.
* ggc-common.c (htab_t saving_htab):
Change type to hash_table. Update dependent calls and types.
(htab_t loc_hash): Likewise.
(htab_t ptr_hash): Likewise.
(call_count): Rename ggc_call_count.
(call_alloc): Rename ggc_call_alloc.
(loc_descriptor): Rename make_loc_descriptor.
(add_statistics): Rename ggc_add_statistics.
* ggc-common.c (saving_htab):
Change type to hash_table. Update dependent calls and types.
* gimple.h (struct gimplify_ctx): Move to gimplify-ctx.h.
(push_gimplify_context): Likewise.
(pop_gimplify_context): Likewise.
(struct gimple_temp_hash_elt): Added.
(struct gimplify_hasher): Likewise.
(struct gimplify_ctx.temp_htab):
Change type to hash_table. Update dependent calls and types.
* gimple-fold.c: Include gimplify-ctx.h.
* gimple-ssa-strength-reduction.c (htab_t base_cand_map):
Change type to hash_table. Update dependent calls and types.
(base_cand_dump_callback): Rename to ssa_base_cand_dump_callback to
avoid potential global name collision.
* gimplify.c: Include gimplify-ctx.h.
(struct gimple_temp_hash_elt): Move to gimplify-ctx.h.
(htab_t gimplify_ctx::temp_htab):
Update dependent calls and types for new type hash_table.
(gimple_tree_hash): Move into gimplify_hasher in gimplify-ctx.h.
(gimple_tree_eq): Move into gimplify_hasher in gimplify-ctx.h.
* gimplify-ctx.h: New.
(struct gimple_temp_hash_elt): Move from gimplify.c.
(class gimplify_hasher): New.
(struct gimplify_ctx): Move from gimple.h.
(htab_t gimplify_ctx::temp_htab):
Change type to hash_table. Update dependent calls and types.
* graphite-clast-to-gimple.c: Include graphite-htab.h.
(htab_t ivs_params::newivs_index):
Change type to hash_table. Update dependent calls and types.
(htab_t ivs_params::params_index): Likewise.
(htab_t print_generated_program::params_index): Likewise.
(htab_t gloog::newivs_index): Likewise.
(htab_t gloog::params_index): Likewise.
* graphite.c: Include graphite-htab.h.
4htab_t graphite_transform_loops::bb_pbb_mapping):
Change type to hash_table. Update dependent calls and types.
* graphite-clast-to-gimple.h: (extern gloog) Move to graphite-htab.h.
(bb_pbb_map_hash): Fold into bb_pbb_htab_type in graphite-htab.h.
(eq_bb_pbb_map): Fold into bb_pbb_htab_type in graphite-htab.h.
* graphite-dependences.c: Include graphite-htab.h.
(loop_is_parallel_p): Change hash table type of parameter.
* graphite-htab.h: New.
(typedef hash_table <bb_pbb_hasher> bb_pbb_htab_type): New.
(extern find_pbb_via_hash): Move from graphite-poly.h.
(extern loop_is_parallel_p): Move from graphite-poly.h.
(extern get_loop_body_pbbs): Move from graphite-poly.h.
* graphite-poly.h (extern find_pbb_via_hash): Move to graphite-htab.h.
(extern loop_is_parallel_p): Move to graphite-htab.h.
(extern get_loop_body_pbbs): Move to graphite-htab.h.
* haifa-sched.c (htab_t delay_htab):
Change type to hash_table. Update dependent calls and types.
(htab_t delay_htab_i2): Likewise.
* ira-color.c (htab_t allocno_hard_regs_htab):
Change type to hash_table. Update dependent calls and types.
* ira-costs.c (htab_t cost_classes_htab):
Change type to hash_table. Update dependent calls and types.
* loop-invariant.c (htab_t merge_identical_invariants::eq):
Change type to hash_table. Update dependent calls and types.
* loop-iv.c (htab_t bivs):
Change type to hash_table. Update dependent calls and types.
* loop-unroll.c (htab_t opt_info::insns_to_split):
Change type to hash_table. Update dependent calls and types.
(htab_t opt_info::insns_with_var_to_expand): Likewise.
* lto-streamer.h (struct string_slot): Move from data-streamer.h
(struct string_slot_hasher): New.
(htab_t output_block::string_hash_table):
Change type to hash_table. Update dependent calls and types.
* lto-streamer-in.c (freeing_string_slot_hasher): New.
(htab_t file_name_hash_table):
Change type to hash_table. Update dependent calls and types.
* lto-streamer-out.c: Update output_block::string_hash_table dependent
calls and types.
* lto-streamer.c (htab_t tree_htab):
Change type to hash_table. Update dependent calls and types.
* omp-low.c: Include gimplify-ctx.h.
* passes.c (htab_t name_to_pass_map):
Change type to hash_table. Update dependent calls and types.
(pass_traverse): Rename to passes_pass_traverse.
* plugin.c (htab_t event_tab):
Change type to hash_table. Update dependent calls and types.
* postreload-gcse.c (htab_t expr_table):
Change type to hash_table. Update dependent calls and types.
(dump_hash_table_entry): Rename dump_expr_hash_table_entry.
* sese.c (debug_rename_map_1): Make extern.
(htab_t copy_bb_and_scalar_dependences::rename_map):
Change type to hash_table. Update dependent calls and types.
* sese.h (extern debug_rename_map): Move to .c file.
* store-motion.c (htab_t store_motion_mems_table):
Change type to hash_table. Update dependent calls and types.
* trans-mem.c (htab_t tm_new_mem_hash):
Change type to hash_table. Update dependent calls and types.
* tree-browser.c (htab_t TB_up_ht):
Change type to hash_table. Update dependent calls and types.
* tree-cfg.c (htab_t discriminator_per_locus):
Change type to hash_table. Update dependent calls and types.
* tree-complex.c: Include tree-hasher.h
(htab_t complex_variable_components):
Change type to hash_table. Update dependent calls and types.
* tree-eh.c (htab_t finally_tree):
Change type to hash_table. Update dependent calls and types.
* tree-flow.h (extern int_tree_map_hash): Moved into tree-hasher
struct int_tree_hasher.
(extern int_tree_map_eq): Likewise.
(uid_decl_map_hash): Removed.
(extern decl_tree_map_eq): Likewise.
* tree-hasher.h: New.
(struct int_tree_hasher): New.
(typedef int_tree_htab_type): New.
* tree-inline.c: Include gimplify-ctx.h.
* tree-mudflap.c: Include gimplify-ctx.h.
* tree-parloops.c: Include tree-hasher.h.
(htab_t eliminate_local_variables_stmt::decl_address):
Change type to hash_table. Update dependent calls and types.
(htab_t separate_decls_in_region::decl_copies): Likewise.
* tree-scalar-evolution.c (htab_t resolve_mixers::cache):
Change type to hash_table. Update dependent calls and types.
* tree-sra.c (candidates):
Change type to hash_table. Update dependent calls and types.
* tree-ssa.c (int_tree_map_eq): Moved into struct int_tree_hasher
in tree-flow.h.
(int_tree_map_hash): Likewise.
* tree-ssa-dom.c (htab_t avail_exprs):
Change type to hash_table. Update dependent calls and types.
* tree-ssa-live.c (var_map_base_init::tree_to_index):
Change type to hash_table. Update dependent calls and types.
* tree-ssa-loop-ivopts.c (struct ivopts_data.inv_expr_tab):
Change type to hash_table. Update dependent calls and types.
* tree-ssa-phiopt.c (seen_ssa_names):
Change type to hash_table. Update dependent calls and types.
* tree-ssa-strlen.c (decl_to_stridxlist_htab):
Change type to hash_table. Update dependent calls and types.
* tree-ssa-uncprop.c (equiv):
Change type to hash_table. Update dependent calls and types.
From-SVN: r198329
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 448 |
1 files changed, 235 insertions, 213 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index b4e5313..de69cc8 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -84,7 +84,7 @@ along with GCC; see the file COPYING3. If not see #include "target.h" #include "common/common-target.h" #include "langhooks.h" -#include "hashtab.h" +#include "hash-table.h" #include "cgraph.h" #include "input.h" #include "gimple.h" @@ -3038,17 +3038,9 @@ static dw_die_ref remove_child_or_replace_with_skeleton (dw_die_ref, dw_die_ref, dw_die_ref); static void break_out_comdat_types (dw_die_ref); -static dw_die_ref copy_ancestor_tree (dw_die_ref, dw_die_ref, htab_t); -static void copy_decls_walk (dw_die_ref, dw_die_ref, htab_t); static void copy_decls_for_unworthy_types (dw_die_ref); -static hashval_t htab_cu_hash (const void *); -static int htab_cu_eq (const void *, const void *); -static void htab_cu_del (void *); -static int check_duplicate_cu (dw_die_ref, htab_t, unsigned *); -static void record_comdat_symbol_number (dw_die_ref, htab_t, unsigned); static void add_sibling_attributes (dw_die_ref); -static void build_abbrev_table (dw_die_ref, htab_t); static void output_location_lists (dw_die_ref); static int constant_size (unsigned HOST_WIDE_INT); static unsigned long size_of_die (dw_die_ref); @@ -6539,31 +6531,34 @@ struct cu_hash_table_entry struct cu_hash_table_entry *next; }; -/* Routines to manipulate hash table of CUs. */ -static hashval_t -htab_cu_hash (const void *of) +/* Helpers to manipulate hash table of CUs. */ + +struct cu_hash_table_entry_hasher { - const struct cu_hash_table_entry *const entry = - (const struct cu_hash_table_entry *) of; + typedef cu_hash_table_entry value_type; + typedef die_struct compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); + static inline void remove (value_type *); +}; +inline hashval_t +cu_hash_table_entry_hasher::hash (const value_type *entry) +{ return htab_hash_string (entry->cu->die_id.die_symbol); } -static int -htab_cu_eq (const void *of1, const void *of2) +inline bool +cu_hash_table_entry_hasher::equal (const value_type *entry1, + const compare_type *entry2) { - const struct cu_hash_table_entry *const entry1 = - (const struct cu_hash_table_entry *) of1; - const struct die_struct *const entry2 = (const struct die_struct *) of2; - return !strcmp (entry1->cu->die_id.die_symbol, entry2->die_id.die_symbol); } -static void -htab_cu_del (void *what) +inline void +cu_hash_table_entry_hasher::remove (value_type *entry) { - struct cu_hash_table_entry *next, - *entry = (struct cu_hash_table_entry *) what; + struct cu_hash_table_entry *next; while (entry) { @@ -6573,19 +6568,21 @@ htab_cu_del (void *what) } } +typedef hash_table <cu_hash_table_entry_hasher> cu_hash_type; + /* Check whether we have already seen this CU and set up SYM_NUM accordingly. */ static int -check_duplicate_cu (dw_die_ref cu, htab_t htable, unsigned int *sym_num) +check_duplicate_cu (dw_die_ref cu, cu_hash_type htable, unsigned int *sym_num) { struct cu_hash_table_entry dummy; struct cu_hash_table_entry **slot, *entry, *last = &dummy; dummy.max_comdat_num = 0; - slot = (struct cu_hash_table_entry **) - htab_find_slot_with_hash (htable, cu, htab_hash_string (cu->die_id.die_symbol), - INSERT); + slot = htable.find_slot_with_hash (cu, + htab_hash_string (cu->die_id.die_symbol), + INSERT); entry = *slot; for (; entry; last = entry, entry = entry->next) @@ -6611,13 +6608,14 @@ check_duplicate_cu (dw_die_ref cu, htab_t htable, unsigned int *sym_num) /* Record SYM_NUM to record of CU in HTABLE. */ static void -record_comdat_symbol_number (dw_die_ref cu, htab_t htable, unsigned int sym_num) +record_comdat_symbol_number (dw_die_ref cu, cu_hash_type htable, + unsigned int sym_num) { struct cu_hash_table_entry **slot, *entry; - slot = (struct cu_hash_table_entry **) - htab_find_slot_with_hash (htable, cu, htab_hash_string (cu->die_id.die_symbol), - NO_INSERT); + slot = htable.find_slot_with_hash (cu, + htab_hash_string (cu->die_id.die_symbol), + NO_INSERT); entry = *slot; entry->max_comdat_num = sym_num; @@ -6633,7 +6631,7 @@ break_out_includes (dw_die_ref die) dw_die_ref c; dw_die_ref unit = NULL; limbo_die_node *node, **pnode; - htab_t cu_hash_table; + cu_hash_type cu_hash_table; c = die->die_child; if (c) do { @@ -6666,7 +6664,7 @@ break_out_includes (dw_die_ref die) #endif assign_symbol_names (die); - cu_hash_table = htab_create (10, htab_cu_hash, htab_cu_eq, htab_cu_del); + cu_hash_table.create (10); for (node = limbo_die_list, pnode = &limbo_die_list; node; node = node->next) @@ -6686,7 +6684,7 @@ break_out_includes (dw_die_ref die) comdat_symbol_number); } } - htab_delete (cu_hash_table); + cu_hash_table.dispose (); } /* Return non-zero if this DIE is a declaration. */ @@ -6861,6 +6859,94 @@ clone_as_declaration (dw_die_ref die) return clone; } + +/* Structure to map a DIE in one CU to its copy in a comdat type unit. */ + +struct decl_table_entry +{ + dw_die_ref orig; + dw_die_ref copy; +}; + +/* Helpers to manipulate hash table of copied declarations. */ + +/* Hashtable helpers. */ + +struct decl_table_entry_hasher : typed_free_remove <decl_table_entry> +{ + typedef decl_table_entry value_type; + typedef die_struct compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); +}; + +inline hashval_t +decl_table_entry_hasher::hash (const value_type *entry) +{ + return htab_hash_pointer (entry->orig); +} + +inline bool +decl_table_entry_hasher::equal (const value_type *entry1, + const compare_type *entry2) +{ + return entry1->orig == entry2; +} + +typedef hash_table <decl_table_entry_hasher> decl_hash_type; + +/* Copy DIE and its ancestors, up to, but not including, the compile unit + or type unit entry, to a new tree. Adds the new tree to UNIT and returns + a pointer to the copy of DIE. If DECL_TABLE is provided, it is used + to check if the ancestor has already been copied into UNIT. */ + +static dw_die_ref +copy_ancestor_tree (dw_die_ref unit, dw_die_ref die, decl_hash_type decl_table) +{ + dw_die_ref parent = die->die_parent; + dw_die_ref new_parent = unit; + dw_die_ref copy; + decl_table_entry **slot = NULL; + struct decl_table_entry *entry = NULL; + + if (decl_table.is_created ()) + { + /* Check if the entry has already been copied to UNIT. */ + slot = decl_table.find_slot_with_hash (die, htab_hash_pointer (die), + INSERT); + if (*slot != HTAB_EMPTY_ENTRY) + { + entry = *slot; + return entry->copy; + } + + /* Record in DECL_TABLE that DIE has been copied to UNIT. */ + entry = XCNEW (struct decl_table_entry); + entry->orig = die; + entry->copy = NULL; + *slot = entry; + } + + if (parent != NULL) + { + dw_die_ref spec = get_AT_ref (parent, DW_AT_specification); + if (spec != NULL) + parent = spec; + if (!is_unit_die (parent)) + new_parent = copy_ancestor_tree (unit, parent, decl_table); + } + + copy = clone_as_declaration (die); + add_child_die (new_parent, copy); + + if (decl_table.is_created ()) + { + /* Record the pointer to the copy. */ + entry->copy = copy; + } + + return copy; +} /* Copy the declaration context to the new type unit DIE. This includes any surrounding namespace or type declarations. If the DIE has an AT_specification attribute, it also includes attributes and children @@ -6908,7 +6994,7 @@ copy_declaration_context (dw_die_ref unit, dw_die_ref die) if (decl->die_parent != NULL && !is_unit_die (decl->die_parent)) { - new_decl = copy_ancestor_tree (unit, decl, NULL); + new_decl = copy_ancestor_tree (unit, decl, decl_hash_type ()); if (new_decl != NULL) { remove_AT (new_decl, DW_AT_signature); @@ -7107,106 +7193,16 @@ break_out_comdat_types (dw_die_ref die) } while (next != NULL); } -/* Structure to map a DIE in one CU to its copy in a comdat type unit. */ - -struct decl_table_entry -{ - dw_die_ref orig; - dw_die_ref copy; -}; - -/* Routines to manipulate hash table of copied declarations. */ - -static hashval_t -htab_decl_hash (const void *of) -{ - const struct decl_table_entry *const entry = - (const struct decl_table_entry *) of; - - return htab_hash_pointer (entry->orig); -} - -static int -htab_decl_eq (const void *of1, const void *of2) -{ - const struct decl_table_entry *const entry1 = - (const struct decl_table_entry *) of1; - const struct die_struct *const entry2 = (const struct die_struct *) of2; - - return entry1->orig == entry2; -} - -static void -htab_decl_del (void *what) -{ - struct decl_table_entry *entry = (struct decl_table_entry *) what; - - free (entry); -} - -/* Copy DIE and its ancestors, up to, but not including, the compile unit - or type unit entry, to a new tree. Adds the new tree to UNIT and returns - a pointer to the copy of DIE. If DECL_TABLE is provided, it is used - to check if the ancestor has already been copied into UNIT. */ - -static dw_die_ref -copy_ancestor_tree (dw_die_ref unit, dw_die_ref die, htab_t decl_table) -{ - dw_die_ref parent = die->die_parent; - dw_die_ref new_parent = unit; - dw_die_ref copy; - void **slot = NULL; - struct decl_table_entry *entry = NULL; - - if (decl_table) - { - /* Check if the entry has already been copied to UNIT. */ - slot = htab_find_slot_with_hash (decl_table, die, - htab_hash_pointer (die), INSERT); - if (*slot != HTAB_EMPTY_ENTRY) - { - entry = (struct decl_table_entry *) *slot; - return entry->copy; - } - - /* Record in DECL_TABLE that DIE has been copied to UNIT. */ - entry = XCNEW (struct decl_table_entry); - entry->orig = die; - entry->copy = NULL; - *slot = entry; - } - - if (parent != NULL) - { - dw_die_ref spec = get_AT_ref (parent, DW_AT_specification); - if (spec != NULL) - parent = spec; - if (!is_unit_die (parent)) - new_parent = copy_ancestor_tree (unit, parent, decl_table); - } - - copy = clone_as_declaration (die); - add_child_die (new_parent, copy); - - if (decl_table != NULL) - { - /* Record the pointer to the copy. */ - entry->copy = copy; - } - - return copy; -} - /* Like clone_tree, but additionally enter all the children into the hash table decl_table. */ static dw_die_ref -clone_tree_hash (dw_die_ref die, htab_t decl_table) +clone_tree_hash (dw_die_ref die, decl_hash_type decl_table) { dw_die_ref c; dw_die_ref clone = clone_die (die); struct decl_table_entry *entry; - void **slot = htab_find_slot_with_hash (decl_table, die, + decl_table_entry **slot = decl_table.find_slot_with_hash (die, htab_hash_pointer (die), INSERT); /* Assert that DIE isn't in the hash table yet. If it would be there before, the ancestors would be necessarily there as well, therefore @@ -7228,7 +7224,7 @@ clone_tree_hash (dw_die_ref die, htab_t decl_table) type_unit). */ static void -copy_decls_walk (dw_die_ref unit, dw_die_ref die, htab_t decl_table) +copy_decls_walk (dw_die_ref unit, dw_die_ref die, decl_hash_type decl_table) { dw_die_ref c; dw_attr_ref a; @@ -7239,20 +7235,20 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, htab_t decl_table) if (AT_class (a) == dw_val_class_die_ref) { dw_die_ref targ = AT_ref (a); - void **slot; + decl_table_entry **slot; struct decl_table_entry *entry; if (targ->die_mark != 0 || targ->comdat_type_p) continue; - slot = htab_find_slot_with_hash (decl_table, targ, - htab_hash_pointer (targ), INSERT); + slot = decl_table.find_slot_with_hash (targ, htab_hash_pointer (targ), + INSERT); if (*slot != HTAB_EMPTY_ENTRY) { /* TARG has already been copied, so we just need to modify the reference to point to the copy. */ - entry = (struct decl_table_entry *) *slot; + entry = *slot; a->dw_attr_val.v.val_die_ref.die = entry->copy; } else @@ -7319,12 +7315,12 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, htab_t decl_table) static void copy_decls_for_unworthy_types (dw_die_ref unit) { - htab_t decl_table; + decl_hash_type decl_table; mark_dies (unit); - decl_table = htab_create (10, htab_decl_hash, htab_decl_eq, htab_decl_del); + decl_table.create (10); copy_decls_walk (unit, unit, decl_table); - htab_delete (decl_table); + decl_table.dispose (); unmark_dies (unit); } @@ -7379,37 +7375,42 @@ struct external_ref unsigned n_refs; }; -/* Hash an external_ref. */ +/* Hashtable helpers. */ -static hashval_t -hash_external_ref (const void *p) +struct external_ref_hasher : typed_free_remove <external_ref> +{ + typedef external_ref value_type; + typedef external_ref compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); +}; + +inline hashval_t +external_ref_hasher::hash (const value_type *r) { - const struct external_ref *r = (const struct external_ref *)p; return htab_hash_pointer (r->type); } -/* Compare external_refs. */ - -static int -external_ref_eq (const void *p1, const void *p2) +inline bool +external_ref_hasher::equal (const value_type *r1, const compare_type *r2) { - const struct external_ref *r1 = (const struct external_ref *)p1; - const struct external_ref *r2 = (const struct external_ref *)p2; return r1->type == r2->type; } +typedef hash_table <external_ref_hasher> external_ref_hash_type; + /* Return a pointer to the external_ref for references to DIE. */ static struct external_ref * -lookup_external_ref (htab_t map, dw_die_ref die) +lookup_external_ref (external_ref_hash_type map, dw_die_ref die) { struct external_ref ref, *ref_p; - void ** slot; + external_ref **slot; ref.type = die; - slot = htab_find_slot (map, &ref, INSERT); + slot = map.find_slot (&ref, INSERT); if (*slot != HTAB_EMPTY_ENTRY) - return (struct external_ref *) *slot; + return *slot; ref_p = XCNEW (struct external_ref); ref_p->type = die; @@ -7423,7 +7424,7 @@ lookup_external_ref (htab_t map, dw_die_ref die) references, remember how many we've seen. */ static void -optimize_external_refs_1 (dw_die_ref die, htab_t map) +optimize_external_refs_1 (dw_die_ref die, external_ref_hash_type map) { dw_die_ref c; dw_attr_ref a; @@ -7456,17 +7457,17 @@ optimize_external_refs_1 (dw_die_ref die, htab_t map) points to an external_ref, DATA is the CU we're processing. If we don't already have a local stub, and we have multiple refs, build a stub. */ -static int -build_local_stub (void **slot, void *data) +int +dwarf2_build_local_stub (external_ref **slot, dw_die_ref data) { - struct external_ref *ref_p = (struct external_ref *)*slot; + struct external_ref *ref_p = *slot; if (ref_p->stub == NULL && ref_p->n_refs > 1 && !dwarf_strict) { /* We have multiple references to this type, so build a small stub. Both of these forms are a bit dodgy from the perspective of the DWARF standard, since technically they should have names. */ - dw_die_ref cu = (dw_die_ref) data; + dw_die_ref cu = data; dw_die_ref type = ref_p->type; dw_die_ref stub = NULL; @@ -7494,12 +7495,13 @@ build_local_stub (void **slot, void *data) them which will be applied in build_abbrev_table. This is useful because references to local DIEs are smaller. */ -static htab_t +static external_ref_hash_type optimize_external_refs (dw_die_ref die) { - htab_t map = htab_create (10, hash_external_ref, external_ref_eq, free); + external_ref_hash_type map; + map.create (10); optimize_external_refs_1 (die, map); - htab_traverse (map, build_local_stub, die); + map.traverse <dw_die_ref, dwarf2_build_local_stub> (die); return map; } @@ -7509,7 +7511,7 @@ optimize_external_refs (dw_die_ref die) die are visited recursively. */ static void -build_abbrev_table (dw_die_ref die, htab_t extern_map) +build_abbrev_table (dw_die_ref die, external_ref_hash_type extern_map) { unsigned long abbrev_id; unsigned int n_alloc; @@ -8640,7 +8642,7 @@ output_comp_unit (dw_die_ref die, int output_if_empty) { const char *secname, *oldsym; char *tmp; - htab_t extern_map; + external_ref_hash_type extern_map; /* Unless we are outputting main CU, we may throw away empty ones. */ if (!output_if_empty && die->die_child == NULL) @@ -8657,7 +8659,7 @@ output_comp_unit (dw_die_ref die, int output_if_empty) build_abbrev_table (die, extern_map); - htab_delete (extern_map); + extern_map.dispose (); /* Initialize the beginning DIE offset - and calculate sizes/offsets. */ next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE; @@ -8830,7 +8832,7 @@ output_comdat_type_unit (comdat_type_node *node) #if defined (OBJECT_FORMAT_ELF) tree comdat_key; #endif - htab_t extern_map; + external_ref_hash_type extern_map; /* First mark all the DIEs in this CU so we know which get local refs. */ mark_dies (node->root_die); @@ -8839,7 +8841,7 @@ output_comdat_type_unit (comdat_type_node *node) build_abbrev_table (node->root_die, extern_map); - htab_delete (extern_map); + extern_map.dispose (); /* Initialize the beginning DIE offset - and calculate sizes/offsets. */ next_die_offset = DWARF_COMDAT_TYPE_UNIT_HEADER_SIZE; @@ -21326,26 +21328,31 @@ dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED, } } -/* Routines to manipulate hash table of CUs. */ +/* Helpers to manipulate hash table of CUs. */ -static hashval_t -htab_macinfo_hash (const void *of) +struct macinfo_entry_hasher : typed_noop_remove <macinfo_entry> { - const macinfo_entry *const entry = - (const macinfo_entry *) of; + typedef macinfo_entry value_type; + typedef macinfo_entry compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); +}; +inline hashval_t +macinfo_entry_hasher::hash (const value_type *entry) +{ return htab_hash_string (entry->info); } -static int -htab_macinfo_eq (const void *of1, const void *of2) +inline bool +macinfo_entry_hasher::equal (const value_type *entry1, + const compare_type *entry2) { - const macinfo_entry *const entry1 = (const macinfo_entry *) of1; - const macinfo_entry *const entry2 = (const macinfo_entry *) of2; - return !strcmp (entry1->info, entry2->info); } +typedef hash_table <macinfo_entry_hasher> macinfo_hash_type; + /* Output a single .debug_macinfo entry. */ static void @@ -21434,7 +21441,7 @@ output_macinfo_op (macinfo_entry *ref) static unsigned optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files, - htab_t *macinfo_htab) + macinfo_hash_type *macinfo_htab) { macinfo_entry *first, *second, *cur, *inc; char linebuf[sizeof (HOST_WIDE_INT) * 3 + 1]; @@ -21443,7 +21450,7 @@ optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files, char *grp_name, *tail; const char *base; unsigned int i, count, encoded_filename_len, linebuf_len; - void **slot; + macinfo_entry **slot; first = &(*macinfo_table)[idx]; second = &(*macinfo_table)[idx + 1]; @@ -21521,17 +21528,17 @@ optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files, inc->code = DW_MACRO_GNU_transparent_include; inc->lineno = 0; inc->info = ggc_strdup (grp_name); - if (*macinfo_htab == NULL) - *macinfo_htab = htab_create (10, htab_macinfo_hash, htab_macinfo_eq, NULL); + if (!macinfo_htab->is_created ()) + macinfo_htab->create (10); /* Avoid emitting duplicates. */ - slot = htab_find_slot (*macinfo_htab, inc, INSERT); + slot = macinfo_htab->find_slot (inc, INSERT); if (*slot != NULL) { inc->code = 0; inc->info = NULL; /* If such an entry has been used before, just emit a DW_MACRO_GNU_transparent_include op. */ - inc = (macinfo_entry *) *slot; + inc = *slot; output_macinfo_op (inc); /* And clear all macinfo_entry in the range to avoid emitting them in the second pass. */ @@ -21544,7 +21551,7 @@ optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files, else { *slot = inc; - inc->lineno = htab_elements (*macinfo_htab); + inc->lineno = macinfo_htab->elements (); output_macinfo_op (inc); } return count; @@ -21595,7 +21602,7 @@ output_macinfo (void) unsigned long length = vec_safe_length (macinfo_table); macinfo_entry *ref; vec<macinfo_entry, va_gc> *files = NULL; - htab_t macinfo_htab = NULL; + macinfo_hash_type macinfo_htab; if (! length) return; @@ -21668,10 +21675,10 @@ output_macinfo (void) ref->code = 0; } - if (macinfo_htab == NULL) + if (!macinfo_htab.is_created ()) return; - htab_delete (macinfo_htab); + macinfo_htab.dispose (); /* If any DW_MACRO_GNU_transparent_include were used, on those DW_MACRO_GNU_transparent_include entries terminate the @@ -22410,24 +22417,28 @@ file_table_relative_p (void ** slot, void *param) return 1; } -/* Routines to manipulate hash table of comdat type units. */ +/* Helpers to manipulate hash table of comdat type units. */ -static hashval_t -htab_ct_hash (const void *of) +struct comdat_type_hasher : typed_noop_remove <comdat_type_node> { - hashval_t h; - const comdat_type_node *const type_node = (const comdat_type_node *) of; + typedef comdat_type_node value_type; + typedef comdat_type_node compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); +}; +inline hashval_t +comdat_type_hasher::hash (const value_type *type_node) +{ + hashval_t h; memcpy (&h, type_node->signature, sizeof (h)); return h; } -static int -htab_ct_eq (const void *of1, const void *of2) +inline bool +comdat_type_hasher::equal (const value_type *type_node_1, + const compare_type *type_node_2) { - const comdat_type_node *const type_node_1 = (const comdat_type_node *) of1; - const comdat_type_node *const type_node_2 = (const comdat_type_node *) of2; - return (! memcmp (type_node_1->signature, type_node_2->signature, DWARF_TYPE_SIGNATURE_SIZE)); } @@ -23491,21 +23502,29 @@ compare_locs (dw_loc_descr_ref x, dw_loc_descr_ref y) return x == NULL && y == NULL; } +/* Hashtable helpers. */ + +struct loc_list_hasher : typed_noop_remove <dw_loc_list_struct> +{ + typedef dw_loc_list_struct value_type; + typedef dw_loc_list_struct compare_type; + static inline hashval_t hash (const value_type *); + static inline bool equal (const value_type *, const compare_type *); +}; + /* Return precomputed hash of location list X. */ -static hashval_t -loc_list_hash (const void *x) +inline hashval_t +loc_list_hasher::hash (const value_type *x) { - return ((const struct dw_loc_list_struct *) x)->hash; + return x->hash; } -/* Return 1 if location lists X and Y are the same. */ +/* Return true if location lists A and B are the same. */ -static int -loc_list_eq (const void *x, const void *y) +inline bool +loc_list_hasher::equal (const value_type *a, const compare_type *b) { - const struct dw_loc_list_struct *a = (const struct dw_loc_list_struct *) x; - const struct dw_loc_list_struct *b = (const struct dw_loc_list_struct *) y; if (a == b) return 1; if (a->hash != b->hash) @@ -23520,16 +23539,19 @@ loc_list_eq (const void *x, const void *y) return a == NULL && b == NULL; } +typedef hash_table <loc_list_hasher> loc_list_hash_type; + + /* Recursively optimize location lists referenced from DIE children and share them whenever possible. */ static void -optimize_location_lists_1 (dw_die_ref die, htab_t htab) +optimize_location_lists_1 (dw_die_ref die, loc_list_hash_type htab) { dw_die_ref c; dw_attr_ref a; unsigned ix; - void **slot; + dw_loc_list_struct **slot; FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a) if (AT_class (a) == dw_val_class_loc_list) @@ -23538,12 +23560,11 @@ optimize_location_lists_1 (dw_die_ref die, htab_t htab) /* TODO: perform some optimizations here, before hashing it and storing into the hash table. */ hash_loc_list (list); - slot = htab_find_slot_with_hash (htab, list, list->hash, - INSERT); + slot = htab.find_slot_with_hash (list, list->hash, INSERT); if (*slot == NULL) - *slot = (void *) list; + *slot = list; else - a->dw_attr_val.v.val_loc_list = (dw_loc_list_ref) *slot; + a->dw_attr_val.v.val_loc_list = *slot; } FOR_EACH_CHILD (die, c, optimize_location_lists_1 (c, htab)); @@ -23588,9 +23609,10 @@ index_location_lists (dw_die_ref die) static void optimize_location_lists (dw_die_ref die) { - htab_t htab = htab_create (500, loc_list_hash, loc_list_eq, NULL); + loc_list_hash_type htab; + htab.create (500); optimize_location_lists_1 (die, htab); - htab_delete (htab); + htab.dispose (); } /* Output stuff that dwarf requires at the end of every file, @@ -23601,7 +23623,7 @@ dwarf2out_finish (const char *filename) { limbo_die_node *node, *next_node; comdat_type_node *ctnode; - htab_t comdat_type_table; + hash_table <comdat_type_hasher> comdat_type_table; unsigned int i; dw_die_ref main_comp_unit_die; @@ -23870,10 +23892,10 @@ dwarf2out_finish (const char *filename) for (node = limbo_die_list; node; node = node->next) output_comp_unit (node->die, 0); - comdat_type_table = htab_create (100, htab_ct_hash, htab_ct_eq, NULL); + comdat_type_table.create (100); for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next) { - void **slot = htab_find_slot (comdat_type_table, ctnode, INSERT); + comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT); /* Don't output duplicate types. */ if (*slot != HTAB_EMPTY_ENTRY) @@ -23891,7 +23913,7 @@ dwarf2out_finish (const char *filename) output_comdat_type_unit (ctnode); *slot = ctnode; } - htab_delete (comdat_type_table); + comdat_type_table.dispose (); /* The AT_pubnames attribute needs to go in all skeleton dies, including both the main_cu and all skeleton TUs. Making this call unconditional |