Autogenerated fixes of "->symbol." to "->"

This is the autogenerated part of the conversion of the symtable types
to a C++ class hierarchy.

gcc/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* asan.c (asan_finish_file): Update for conversion of symtab types to
	a true class hierarchy.
	* cfgexpand.c (estimated_stack_frame_size): Likewise.
	* cgraph.c (cgraph_get_body): Likewise.
	(cgraph_get_create_real_symbol_node): Likewise.
	(verify_cgraph_node): Likewise.
	(verify_edge_corresponds_to_fndecl): Likewise.
	(verify_edge_count_and_frequency): Likewise.
	(cgraph_will_be_removed_from_program_if_no_direct_calls): Likewise.
	(cgraph_can_remove_if_no_direct_calls_p): Likewise.
	(cgraph_can_remove_if_no_direct_calls_and_refs_p): Likewise.
	(cgraph_node_cannot_return): Likewise.
	(cgraph_set_pure_flag_1): Likewise.
	(cgraph_set_const_flag_1): Likewise.
	(cgraph_set_nothrow_flag_1): Likewise.
	(cgraph_make_node_local_1): Likewise.
	(cgraph_for_node_and_aliases): Likewise.
	(cgraph_for_node_thunks_and_aliases): Likewise.
	(cgraph_node_can_be_local_p): Likewise.
	(cgraph_node_cannot_be_local_p_1): Likewise.
	(cgraph_function_body_availability): Likewise.
	(dump_cgraph_node): Likewise.
	(cgraph_rtl_info): Likewise.
	(cgraph_mark_address_taken_node): Likewise.
	(cgraph_remove_node): Likewise.
	(cgraph_release_function_body): Likewise.
	(cgraph_update_edges_for_call_stmt_node): Likewise.
	(cgraph_redirect_edge_call_stmt_to_callee): Likewise.
	(cgraph_make_edge_direct): Likewise.
	(cgraph_resolve_speculation): Likewise.
	(cgraph_speculative_call_info): Likewise.
	(cgraph_turn_edge_to_speculative): Likewise.
	(cgraph_create_edge_1): Likewise.
	(cgraph_set_call_stmt): Likewise.
	(cgraph_node_for_asm): Likewise.
	(cgraph_add_thunk): Likewise.
	(cgraph_same_body_alias): Likewise.
	(cgraph_create_function_alias): Likewise.
	(cgraph_create_node): Likewise.
	(cgraph_create_empty_node): Likewise.
	(record_function_versions): Likewise.
	(used_from_object_file_p): Likewise.
	* cgraph.h (symtab_can_be_discarded): Likewise.
	(symtab_real_symbol_p): Likewise.
	(cgraph_mark_force_output_node): Likewise.
	(cgraph_edge_recursive_p): Likewise.
	(symtab_alias_target): Likewise.
	(varpool_all_refs_explicit_p): Likewise.
	(varpool_can_remove_if_no_refs): Likewise.
	(cgraph_only_called_directly_or_aliased_p): Likewise.
	(cgraph_next_function_with_gimple_body): Likewise.
	(cgraph_first_function_with_gimple_body): Likewise.
	(cgraph_function_with_gimple_body_p): Likewise.
	(cgraph_next_function): Likewise.
	(cgraph_first_function): Likewise.
	(cgraph_next_defined_function): Likewise.
	(cgraph_first_defined_function): Likewise.
	(varpool_next_defined_variable): Likewise.
	(varpool_first_defined_variable): Likewise.
	(varpool_next_static_initializer): Likewise.
	(varpool_first_static_initializer): Likewise.
	(varpool_next_variable): Likewise.
	(varpool_first_variable): Likewise.
	(varpool_node_name): Likewise.
	(varpool): Likewise.
	(cgraph): Likewise.
	(is_a_helper <varpool_node>::test): Likewise.
	(is_a_helper <cgraph_node>::test): Likewise.
	(varpool_variable_node): Likewise.
	(cgraph_function_or_thunk_node): Likewise.
	(varpool_alias_target): Likewise.
	(cgraph_alias_target): Likewise.
	(cgraph_node_name): Likewise.
	(varpool_node_asm_name): Likewise.
	(cgraph_node_asm_name): Likewise.
	* cgraphbuild.c (remove_cgraph_callee_edges): Likewise.
	(cgraph_rebuild_references): Likewise.
	(rebuild_cgraph_edges): Likewise.
	(record_eh_tables): Likewise.
	(build_cgraph_edges): Likewise.
	(mark_store): Likewise.
	(mark_load): Likewise.
	(mark_address): Likewise.
	(record_type_list): Likewise.
	(record_reference): Likewise.
	* cgraphclones.c (cgraph_materialize_all_clones): Likewise.
	(cgraph_materialize_clone): Likewise.
	(cgraph_function_versioning): Likewise.
	(cgraph_copy_node_for_versioning): Likewise.
	(update_call_expr): Likewise.
	(cgraph_find_replacement_node): Likewise.
	(cgraph_create_virtual_clone): Likewise.
	(cgraph_clone_node): Likewise.
	* cgraphunit.c (compile): Likewise.
	(output_weakrefs): Likewise.
	(output_in_order): Likewise.
	(expand_function): Likewise.
	(assemble_thunks_and_aliases): Likewise.
	(expand_thunk): Likewise.
	(mark_functions_to_output): Likewise.
	(handle_alias_pairs): Likewise.
	(analyze_functions): Likewise.
	(walk_polymorphic_call_targets): Likewise.
	(varpool_finalize_decl): Likewise.
	(process_function_and_variable_attributes): Likewise.
	(cgraph_process_same_body_aliases): Likewise.
	(analyze_function): Likewise.
	(cgraph_add_new_function): Likewise.
	(cgraph_finalize_function): Likewise.
	(referred_to_p): Likewise.
	(cgraph_reset_node): Likewise.
	(cgraph_process_new_functions): Likewise.
	(enqueue_node): Likewise.
	(decide_is_symbol_needed): Likewise.
	* coverage.c (coverage_compute_profile_id): Likewise.
	* dbxout.c (dbxout_expand_expr): Likewise.
	* dwarf2out.c (premark_types_used_by_global_vars_helper): Likewise.
	(reference_to_unused): Likewise.
	* gimple-fold.c (can_refer_decl_in_current_unit_p): Likewise.
	* gimplify.c (unvisit_body): Likewise.
	(unshare_body): Likewise.
	* ipa-cp.c (ipcp_generate_summary): Likewise.
	(ipcp_decision_stage): Likewise.
	(identify_dead_nodes): Likewise.
	(decide_whether_version_node): Likewise.
	(decide_about_value): Likewise.
	(perhaps_add_new_callers): Likewise.
	(create_specialized_node): Likewise.
	(update_profiling_info): Likewise.
	(ipcp_propagate_stage): Likewise.
	(estimate_local_effects): Likewise.
	(good_cloning_opportunity_p): Likewise.
	(devirtualization_time_bonus): Likewise.
	(propagate_constants_accross_call): Likewise.
	(initialize_node_lattices): Likewise.
	(ipcp_cloning_candidate_p): Likewise.
	(determine_versionability): Likewise.
	(print_all_lattices): Likewise.
	(print_lattice): Likewise.
	(ipcp_discover_new_direct_edges): Likewise.
	* ipa-devirt.c (ipa_devirt): Likewise.
	(likely_target_p): Likewise.
	(update_type_inheritance_graph): Likewise.
	(possible_polymorphic_call_target_p): Likewise.
	(dump_possible_polymorphic_call_targets): Likewise.
	(devirt_variable_node_removal_hook): Likewise.
	(record_binfo): Likewise.
	(maybe_record_node): Likewise.
	(build_type_inheritance_graph): Likewise.
	* ipa-inline-analysis.c (inline_write_summary): Likewise.
	(inline_generate_summary): Likewise.
	(inline_analyze_function): Likewise.
	(do_estimate_growth): Likewise.
	(simple_edge_hints): Likewise.
	(estimate_node_size_and_time): Likewise.
	(estimate_edge_devirt_benefit): Likewise.
	(compute_inline_parameters): Likewise.
	(estimate_function_body_sizes): Likewise.
	(compute_bb_predicates): Likewise.
	(initialize_inline_failed): Likewise.
	(dump_inline_summary): Likewise.
	(dump_inline_edge_summary): Likewise.
	* ipa-inline-transform.c (inline_transform): Likewise.
	(preserve_function_body_p): Likewise.
	(save_inline_function_body): Likewise.
	(inline_call): Likewise.
	(clone_inlined_nodes): Likewise.
	(can_remove_node_now_p): Likewise.
	(can_remove_node_now_p_1): Likewise.
	* ipa-inline.c (early_inliner): Likewise.
	(early_inline_small_functions): Likewise.
	(inline_always_inline_functions): Likewise.
	(ipa_inline): Likewise.
	(flatten_function): Likewise.
	(inline_small_functions): Likewise.
	(speculation_useful_p): Likewise.
	(recursive_inlining): Likewise.
	(update_caller_keys): Likewise.
	(reset_edge_caches): Likewise.
	(update_edge_key): Likewise.
	(edge_badness): Likewise.
	(relative_time_benefit): Likewise.
	(want_inline_self_recursive_call_p): Likewise.
	(want_inline_small_function_p): Likewise.
	(want_early_inline_function_p): Likewise.
	(num_calls): Likewise.
	(can_early_inline_edge_p): Likewise.
	(can_inline_edge_p): Likewise.
	(report_inline_failed_reason): Likewise.
	* ipa-profile.c (ipa_profile): Likewise.
	(ipa_propagate_frequency): Likewise.
	(ipa_propagate_frequency_1): Likewise.
	(ipa_profile_generate_summary): Likewise.
	* ipa-prop.c (ipcp_transform_function): Likewise.
	(read_replacements_section): Likewise.
	(ipa_prop_read_section): Likewise.
	(ipa_modify_call_arguments): Likewise.
	(ipa_print_node_params): Likewise.
	(propagate_controlled_uses): Likewise.
	(update_indirect_edges_after_inlining): Likewise.
	(remove_described_reference): Likewise.
	(ipa_make_edge_direct_to_target): Likewise.
	(ipa_analyze_node): Likewise.
	(ipa_analyze_params_uses): Likewise.
	(ipa_compute_jump_functions): Likewise.
	(ipa_get_callee_param_type): Likewise.
	(ipa_print_node_jump_functions): Likewise.
	(ipa_initialize_node_params): Likewise.
	(ipa_populate_param_decls): Likewise.
	(ipa_func_spec_opts_forbid_analysis_p): Likewise.
	(write_agg_replacement_chain): Likewise.
	(ipa_write_node_info): Likewise.
	(ipa_edge_duplication_hook): Likewise.
	(try_decrement_rdesc_refcount): Likewise.
	* ipa-pure-const.c (propagate_nothrow): Likewise.
	(propagate_pure_const): Likewise.
	(pure_const_read_summary): Likewise.
	(pure_const_write_summary): Likewise.
	(analyze_function): Likewise.
	* ipa-ref-inline.h (ipa_ref_referred_ref_list): Likewise.
	(ipa_ref_referring_ref_list): Likewise.
	* ipa-ref.c (ipa_clear_stmts_in_references): Likewise.
	(ipa_remove_stmt_references): Likewise.
	(ipa_find_reference): Likewise.
	(ipa_dump_referring): Likewise.
	(ipa_dump_references): Likewise.
	(ipa_record_reference): Likewise.
	* ipa-reference.c (ipa_reference_read_optimization_summary): Likewise.
	(ipa_reference_write_optimization_summary): Likewise.
	(write_node_summary_p): Likewise.
	(propagate): Likewise.
	(read_write_all_from_decl): Likewise.
	(generate_summary): Likewise.
	(analyze_function): Likewise.
	(propagate_bits): Likewise.
	(ipa_reference_get_not_written_global): Likewise.
	(ipa_reference_get_not_read_global): Likewise.
	* ipa-split.c (execute_split_functions): Likewise.
	(split_function): Likewise.
	* ipa-utils.c (ipa_merge_profiles): Likewise.
	(dump_cgraph_node_set): Likewise.
	(ipa_reverse_postorder): Likewise.
	(ipa_edge_within_scc): Likewise.
	(ipa_get_nodes_in_cycle): Likewise.
	(ipa_free_postorder_info): Likewise.
	(ipa_reduced_postorder): Likewise.
	(searchc): Likewise.
	(recursive_call_p): Likewise.
	* ipa.c (ipa_cdtor_merge): Likewise.
	(record_cdtor_fn): Likewise.
	(function_and_variable_visibility): Likewise.
	(varpool_externally_visible_p): Likewise.
	(cgraph_externally_visible_p): Likewise.
	(comdat_can_be_unshared_p): Likewise.
	(comdat_can_be_unshared_p_1): Likewise.
	(address_taken_from_non_vtable_p): Likewise.
	(ipa_discover_readonly_nonaddressable_vars): Likewise.
	(symtab_remove_unreachable_nodes): Likewise.
	(walk_polymorphic_call_targets): Likewise.
	(process_references): Likewise.
	(enqueue_node): Likewise.
	(has_addr_references_p): Likewise.
	(cgraph_non_local_node_p_1): Likewise.
	* is-a.h (varpool_analyze_node): Likewise.
	* lto-cgraph.c (input_symtab): Likewise.
	(merge_profile_summaries): Likewise.
	(input_cgraph_1): Likewise.
	(input_edge): Likewise.
	(input_varpool_node): Likewise.
	(input_node): Likewise.
	(input_overwrite_node): Likewise.
	(compute_ltrans_boundary): Likewise.
	(output_refs): Likewise.
	(lto_output_varpool_node): Likewise.
	(lto_output_node): Likewise.
	(reachable_from_other_partition_p): Likewise.
	(referenced_from_other_partition_p): Likewise.
	(lto_output_edge): Likewise.
	(output_node_opt_summary): Likewise.
	(add_node_to): Likewise.
	(reachable_from_this_partition_p): Likewise.
	(lto_set_symtab_encoder_in_partition): Likewise.
	(lto_symtab_encoder_in_partition_p): Likewise.
	(lto_set_symtab_encoder_encode_initializer): Likewise.
	(lto_symtab_encoder_encode_initializer_p): Likewise.
	(lto_set_symtab_encoder_encode_body): Likewise.
	(lto_symtab_encoder_encode_body_p): Likewise.
	* lto-section-in.c (lto_free_function_in_decl_state_for_node):
	Likewise.
	* lto-streamer-in.c (lto_read_body): Likewise.
	(fixup_call_stmt_edges): Likewise.
	(fixup_call_stmt_edges_1): Likewise.
	* lto-streamer-out.c (produce_symtab): Likewise.
	(output_symbol_p): Likewise.
	(write_symbol): Likewise.
	(lto_output): Likewise.
	(copy_function): Likewise.
	(output_function): Likewise.
	* passes.c (function_called_by_processed_nodes_p): Likewise.
	(ipa_write_optimization_summaries): Likewise.
	(ipa_write_summaries): Likewise.
	(do_per_function_toporder): Likewise.
	(do_per_function): Likewise.
	(dump_passes): Likewise.
	* symtab.c (symtab_semantically_equivalent_p): Likewise.
	(symtab_nonoverwritable_alias): Likewise.
	(symtab_nonoverwritable_alias_1): Likewise.
	(symtab_for_node_and_aliases): Likewise.
	(symtab_resolve_alias): Likewise.
	(fixup_same_cpp_alias_visibility): Likewise.
	(symtab_alias_ultimate_target): Likewise.
	(symtab_used_from_object_file_p): Likewise.
	(verify_symtab_base): Likewise.
	(dump_symtab_base): Likewise.
	(symtab_node_name): Likewise.
	(symtab_node_asm_name): Likewise.
	(symtab_dissolve_same_comdat_group_list): Likewise.
	(symtab_add_to_same_comdat_group): Likewise.
	(symtab_unregister_node): Likewise.
	(symtab_insert_node_to_hashtable): Likewise.
	(symtab_register_node): Likewise.
	(unlink_from_assembler_name_hash): Likewise.
	(insert_to_assembler_name_hash): Likewise.
	(eq_assembler_name): Likewise.
	(hash_node_by_assembler_name): Likewise.
	(eq_node): Likewise.
	(hash_node): Likewise.
	* toplev.c (wrapup_global_declaration_2): Likewise.
	* trans-mem.c (ipa_tm_execute): Likewise.
	(ipa_tm_transform_clone): Likewise.
	(ipa_tm_transform_transaction): Likewise.
	(ipa_tm_transform_calls_redirect): Likewise.
	(ipa_tm_insert_gettmclone_call): Likewise.
	(ipa_tm_insert_irr_call): Likewise.
	(ipa_tm_create_version): Likewise.
	(ipa_tm_create_version_alias): Likewise.
	(ipa_tm_mark_forced_by_abi_node): Likewise.
	(ipa_tm_mark_force_output_node): Likewise.
	(ipa_tm_diagnose_tm_safe): Likewise.
	(ipa_tm_mayenterirr_function): Likewise.
	(ipa_tm_scan_irr_function): Likewise.
	(ipa_tm_note_irrevocable): Likewise.
	(ipa_tm_scan_calls_clone): Likewise.
	(get_cg_data): Likewise.
	* tree-eh.c (tree_could_trap_p): Likewise.
	* tree-emutls.c (ipa_lower_emutls): Likewise.
	(create_emultls_var): Likewise.
	(lower_emutls_function_body): Likewise.
	(gen_emutls_addr): Likewise.
	(emutls_decl): Likewise.
	(new_emutls_decl): Likewise.
	* tree-inline.c (tree_function_versioning): Likewise.
	(optimize_inline_calls): Likewise.
	(expand_call_inline): Likewise.
	(estimate_num_insns): Likewise.
	(copy_bb): Likewise.
	(delete_unreachable_blocks_update_callgraph): Likewise.
	* tree-nested.c (gimplify_all_functions): Likewise.
	(create_nesting_tree): Likewise.
	(check_for_nested_with_variably_modified): Likewise.
	* tree-pretty-print.c (dump_function_header): Likewise.
	* tree-profile.c (tree_profiling): Likewise.
	* tree-sra.c (ipa_sra_preliminary_function_checks): Likewise.
	(modify_function): Likewise.
	(convert_callers): Likewise.
	(convert_callers_for_node): Likewise.
	* tree-ssa-structalias.c (ipa_pta_execute): Likewise.
	(associate_varinfo_to_alias): Likewise.
	(create_variable_info_for): Likewise.
	(get_constraint_for_ssa_var): Likewise.
	* tree-vectorizer.c (increase_alignment): Likewise.
	* tree.c (find_decls_types_in_var): Likewise.
	(find_decls_types_in_node): Likewise.
	(free_lang_data_in_decl): Likewise.
	* value-prof.c (gimple_ic_transform): Likewise.
	(gimple_ic): Likewise.
	(check_ic_target): Likewise.
	(init_node_map): Likewise.
	* varasm.c (decl_binds_to_current_def_p): Likewise.
	(default_binds_local_p_1): Likewise.
	(dump_tm_clone_pairs): Likewise.
	(assemble_alias): Likewise.
	(find_decl): Likewise.
	(mark_decl_referenced): Likewise.
	* varpool.c (varpool_for_node_and_aliases): Likewise.
	(varpool_extra_name_alias): Likewise.
	(varpool_create_variable_alias): Likewise.
	(add_new_static_var): Likewise.
	(varpool_finalize_named_section_flags): Likewise.
	(varpool_remove_unreferenced_decls): Likewise.
	(enqueue_node): Likewise.
	(varpool_assemble_decl): Likewise.
	(assemble_aliases): Likewise.
	(varpool_analyze_node): Likewise.
	(cgraph_variable_initializer_availability): Likewise.
	(varpool_add_new_variable): Likewise.
	(ctor_for_folding): Likewise.
	(dump_varpool_node): Likewise.
	(varpool_remove_initializer): Likewise.
	(varpool_remove_node): Likewise.
	(varpool_node_for_decl): Likewise.
	(varpool_create_empty_node): Likewise.
	* config/i386/i386.c (ix86_generate_version_dispatcher_body):
	Likewise.
	(ix86_get_function_versions_dispatcher): Likewise.

gcc/ada/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* gcc-interface/trans.c (finalize_nrv): Update for conversion of
	symtab types to a true class hierarchy.
	* gcc-interface/utils.c (gnat_write_global_declarations): Likewise.

gcc/c-family/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* c-gimplify.c (c_genericize): Update for conversion of symtab types
	to a true class hierarchy.
	* c-pragma.c (maybe_apply_pending_pragma_weaks): Likewise.

gcc/cp/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* call.c (mark_versions_used): Update for conversion of symtab types
	to a true class hierarchy.
	* decl2.c (cp_write_global_declarations): Likewise.
	(clear_decl_external): Likewise.
	(build_java_method_aliases): Likewise.
	(collect_candidates_for_java_method_aliases): Likewise.
	(mark_needed): Likewise.
	(var_finalized_p): Likewise.
	(maybe_make_one_only): Likewise.
	(maybe_emit_vtables): Likewise.
	* lambda.c (maybe_add_lambda_conv_op): Likewise.
	* method.c (use_thunk): Likewise.
	* optimize.c (maybe_clone_body): Likewise.
	* tree.c (cp_fix_function_decl_p): Likewise.

gcc/java/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* decl.c (java_mark_decl_local): Update for conversion of symtab types
	to a true class hierarchy.

gcc/lto/

	Patch autogenerated by refactor_symtab.py from
	https://github.com/davidmalcolm/gcc-refactoring-scripts
	revision 58bb219cc090b2f4516a9297d868c245495ee622

	* lto-partition.c (lto_promote_cross_file_statics): Update for
	conversion of symtab types to a true class hierarchy.
	(rename_statics): Likewise.
	(promote_symbol): Likewise.
	(privatize_symbol_name): Likewise.
	(lto_balanced_map): Likewise.
	(varpool_node_cmp): Likewise.
	(node_cmp): Likewise.
	(lto_1_to_1_map): Likewise.
	(undo_partition): Likewise.
	(add_symbol_to_partition): Likewise.
	(contained_in_symbol): Likewise.
	(add_symbol_to_partition_1): Likewise.
	(add_references_to_partition): Likewise.
	(symbol_partitioned_p): Likewise.
	(get_symbol_class): Likewise.
	(lto_max_map): Likewise.
	* lto-symtab.c (lto_symtab_prevailing_decl): Likewise.
	(lto_symtab_merge_symbols): Likewise.
	(lto_symtab_merge_symbols_1): Likewise.
	(lto_symtab_merge_decls): Likewise.
	(lto_symtab_merge_decls_1): Likewise.
	(lto_symtab_merge_decls_2): Likewise.
	(lto_symtab_resolve_symbols): Likewise.
	(lto_symtab_resolve_can_prevail_p): Likewise.
	(lto_symtab_symbol_p): Likewise.
	(lto_symtab_resolve_replaceable_p): Likewise.
	(lto_symtab_merge): Likewise.
	(lto_varpool_replace_node): Likewise.
	(lto_cgraph_replace_node): Likewise.
	* lto.c (lto_main): Likewise.
	(do_whole_program_analysis): Likewise.
	(materialize_cgraph): Likewise.
	(read_cgraph_and_symbols): Likewise.
	(cmp_partitions_order): Likewise.
	(lto_materialize_function): Likewise.
	(has_analyzed_clone_p): Likewise.

From-SVN: r204171
This commit is contained in:
David Malcolm 2013-10-29 18:30:00 +00:00 committed by David Malcolm
parent a3bfa8b80c
commit 67348ccc9c
69 changed files with 2424 additions and 1918 deletions

View File

@ -1,3 +1,415 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* asan.c (asan_finish_file): Update for conversion of symtab types to
a true class hierarchy.
* cfgexpand.c (estimated_stack_frame_size): Likewise.
* cgraph.c (cgraph_get_body): Likewise.
(cgraph_get_create_real_symbol_node): Likewise.
(verify_cgraph_node): Likewise.
(verify_edge_corresponds_to_fndecl): Likewise.
(verify_edge_count_and_frequency): Likewise.
(cgraph_will_be_removed_from_program_if_no_direct_calls): Likewise.
(cgraph_can_remove_if_no_direct_calls_p): Likewise.
(cgraph_can_remove_if_no_direct_calls_and_refs_p): Likewise.
(cgraph_node_cannot_return): Likewise.
(cgraph_set_pure_flag_1): Likewise.
(cgraph_set_const_flag_1): Likewise.
(cgraph_set_nothrow_flag_1): Likewise.
(cgraph_make_node_local_1): Likewise.
(cgraph_for_node_and_aliases): Likewise.
(cgraph_for_node_thunks_and_aliases): Likewise.
(cgraph_node_can_be_local_p): Likewise.
(cgraph_node_cannot_be_local_p_1): Likewise.
(cgraph_function_body_availability): Likewise.
(dump_cgraph_node): Likewise.
(cgraph_rtl_info): Likewise.
(cgraph_mark_address_taken_node): Likewise.
(cgraph_remove_node): Likewise.
(cgraph_release_function_body): Likewise.
(cgraph_update_edges_for_call_stmt_node): Likewise.
(cgraph_redirect_edge_call_stmt_to_callee): Likewise.
(cgraph_make_edge_direct): Likewise.
(cgraph_resolve_speculation): Likewise.
(cgraph_speculative_call_info): Likewise.
(cgraph_turn_edge_to_speculative): Likewise.
(cgraph_create_edge_1): Likewise.
(cgraph_set_call_stmt): Likewise.
(cgraph_node_for_asm): Likewise.
(cgraph_add_thunk): Likewise.
(cgraph_same_body_alias): Likewise.
(cgraph_create_function_alias): Likewise.
(cgraph_create_node): Likewise.
(cgraph_create_empty_node): Likewise.
(record_function_versions): Likewise.
(used_from_object_file_p): Likewise.
* cgraph.h (symtab_can_be_discarded): Likewise.
(symtab_real_symbol_p): Likewise.
(cgraph_mark_force_output_node): Likewise.
(cgraph_edge_recursive_p): Likewise.
(symtab_alias_target): Likewise.
(varpool_all_refs_explicit_p): Likewise.
(varpool_can_remove_if_no_refs): Likewise.
(cgraph_only_called_directly_or_aliased_p): Likewise.
(cgraph_next_function_with_gimple_body): Likewise.
(cgraph_first_function_with_gimple_body): Likewise.
(cgraph_function_with_gimple_body_p): Likewise.
(cgraph_next_function): Likewise.
(cgraph_first_function): Likewise.
(cgraph_next_defined_function): Likewise.
(cgraph_first_defined_function): Likewise.
(varpool_next_defined_variable): Likewise.
(varpool_first_defined_variable): Likewise.
(varpool_next_static_initializer): Likewise.
(varpool_first_static_initializer): Likewise.
(varpool_next_variable): Likewise.
(varpool_first_variable): Likewise.
(varpool_node_name): Likewise.
(varpool): Likewise.
(cgraph): Likewise.
(is_a_helper <varpool_node>::test): Likewise.
(is_a_helper <cgraph_node>::test): Likewise.
(varpool_variable_node): Likewise.
(cgraph_function_or_thunk_node): Likewise.
(varpool_alias_target): Likewise.
(cgraph_alias_target): Likewise.
(cgraph_node_name): Likewise.
(varpool_node_asm_name): Likewise.
(cgraph_node_asm_name): Likewise.
* cgraphbuild.c (remove_cgraph_callee_edges): Likewise.
(cgraph_rebuild_references): Likewise.
(rebuild_cgraph_edges): Likewise.
(record_eh_tables): Likewise.
(build_cgraph_edges): Likewise.
(mark_store): Likewise.
(mark_load): Likewise.
(mark_address): Likewise.
(record_type_list): Likewise.
(record_reference): Likewise.
* cgraphclones.c (cgraph_materialize_all_clones): Likewise.
(cgraph_materialize_clone): Likewise.
(cgraph_function_versioning): Likewise.
(cgraph_copy_node_for_versioning): Likewise.
(update_call_expr): Likewise.
(cgraph_find_replacement_node): Likewise.
(cgraph_create_virtual_clone): Likewise.
(cgraph_clone_node): Likewise.
* cgraphunit.c (compile): Likewise.
(output_weakrefs): Likewise.
(output_in_order): Likewise.
(expand_function): Likewise.
(assemble_thunks_and_aliases): Likewise.
(expand_thunk): Likewise.
(mark_functions_to_output): Likewise.
(handle_alias_pairs): Likewise.
(analyze_functions): Likewise.
(walk_polymorphic_call_targets): Likewise.
(varpool_finalize_decl): Likewise.
(process_function_and_variable_attributes): Likewise.
(cgraph_process_same_body_aliases): Likewise.
(analyze_function): Likewise.
(cgraph_add_new_function): Likewise.
(cgraph_finalize_function): Likewise.
(referred_to_p): Likewise.
(cgraph_reset_node): Likewise.
(cgraph_process_new_functions): Likewise.
(enqueue_node): Likewise.
(decide_is_symbol_needed): Likewise.
* coverage.c (coverage_compute_profile_id): Likewise.
* dbxout.c (dbxout_expand_expr): Likewise.
* dwarf2out.c (premark_types_used_by_global_vars_helper): Likewise.
(reference_to_unused): Likewise.
* gimple-fold.c (can_refer_decl_in_current_unit_p): Likewise.
* gimplify.c (unvisit_body): Likewise.
(unshare_body): Likewise.
* ipa-cp.c (ipcp_generate_summary): Likewise.
(ipcp_decision_stage): Likewise.
(identify_dead_nodes): Likewise.
(decide_whether_version_node): Likewise.
(decide_about_value): Likewise.
(perhaps_add_new_callers): Likewise.
(create_specialized_node): Likewise.
(update_profiling_info): Likewise.
(ipcp_propagate_stage): Likewise.
(estimate_local_effects): Likewise.
(good_cloning_opportunity_p): Likewise.
(devirtualization_time_bonus): Likewise.
(propagate_constants_accross_call): Likewise.
(initialize_node_lattices): Likewise.
(ipcp_cloning_candidate_p): Likewise.
(determine_versionability): Likewise.
(print_all_lattices): Likewise.
(print_lattice): Likewise.
(ipcp_discover_new_direct_edges): Likewise.
* ipa-devirt.c (ipa_devirt): Likewise.
(likely_target_p): Likewise.
(update_type_inheritance_graph): Likewise.
(possible_polymorphic_call_target_p): Likewise.
(dump_possible_polymorphic_call_targets): Likewise.
(devirt_variable_node_removal_hook): Likewise.
(record_binfo): Likewise.
(maybe_record_node): Likewise.
(build_type_inheritance_graph): Likewise.
* ipa-inline-analysis.c (inline_write_summary): Likewise.
(inline_generate_summary): Likewise.
(inline_analyze_function): Likewise.
(do_estimate_growth): Likewise.
(simple_edge_hints): Likewise.
(estimate_node_size_and_time): Likewise.
(estimate_edge_devirt_benefit): Likewise.
(compute_inline_parameters): Likewise.
(estimate_function_body_sizes): Likewise.
(compute_bb_predicates): Likewise.
(initialize_inline_failed): Likewise.
(dump_inline_summary): Likewise.
(dump_inline_edge_summary): Likewise.
* ipa-inline-transform.c (inline_transform): Likewise.
(preserve_function_body_p): Likewise.
(save_inline_function_body): Likewise.
(inline_call): Likewise.
(clone_inlined_nodes): Likewise.
(can_remove_node_now_p): Likewise.
(can_remove_node_now_p_1): Likewise.
* ipa-inline.c (early_inliner): Likewise.
(early_inline_small_functions): Likewise.
(inline_always_inline_functions): Likewise.
(ipa_inline): Likewise.
(flatten_function): Likewise.
(inline_small_functions): Likewise.
(speculation_useful_p): Likewise.
(recursive_inlining): Likewise.
(update_caller_keys): Likewise.
(reset_edge_caches): Likewise.
(update_edge_key): Likewise.
(edge_badness): Likewise.
(relative_time_benefit): Likewise.
(want_inline_self_recursive_call_p): Likewise.
(want_inline_small_function_p): Likewise.
(want_early_inline_function_p): Likewise.
(num_calls): Likewise.
(can_early_inline_edge_p): Likewise.
(can_inline_edge_p): Likewise.
(report_inline_failed_reason): Likewise.
* ipa-profile.c (ipa_profile): Likewise.
(ipa_propagate_frequency): Likewise.
(ipa_propagate_frequency_1): Likewise.
(ipa_profile_generate_summary): Likewise.
* ipa-prop.c (ipcp_transform_function): Likewise.
(read_replacements_section): Likewise.
(ipa_prop_read_section): Likewise.
(ipa_modify_call_arguments): Likewise.
(ipa_print_node_params): Likewise.
(propagate_controlled_uses): Likewise.
(update_indirect_edges_after_inlining): Likewise.
(remove_described_reference): Likewise.
(ipa_make_edge_direct_to_target): Likewise.
(ipa_analyze_node): Likewise.
(ipa_analyze_params_uses): Likewise.
(ipa_compute_jump_functions): Likewise.
(ipa_get_callee_param_type): Likewise.
(ipa_print_node_jump_functions): Likewise.
(ipa_initialize_node_params): Likewise.
(ipa_populate_param_decls): Likewise.
(ipa_func_spec_opts_forbid_analysis_p): Likewise.
(write_agg_replacement_chain): Likewise.
(ipa_write_node_info): Likewise.
(ipa_edge_duplication_hook): Likewise.
(try_decrement_rdesc_refcount): Likewise.
* ipa-pure-const.c (propagate_nothrow): Likewise.
(propagate_pure_const): Likewise.
(pure_const_read_summary): Likewise.
(pure_const_write_summary): Likewise.
(analyze_function): Likewise.
* ipa-ref-inline.h (ipa_ref_referred_ref_list): Likewise.
(ipa_ref_referring_ref_list): Likewise.
* ipa-ref.c (ipa_clear_stmts_in_references): Likewise.
(ipa_remove_stmt_references): Likewise.
(ipa_find_reference): Likewise.
(ipa_dump_referring): Likewise.
(ipa_dump_references): Likewise.
(ipa_record_reference): Likewise.
* ipa-reference.c (ipa_reference_read_optimization_summary): Likewise.
(ipa_reference_write_optimization_summary): Likewise.
(write_node_summary_p): Likewise.
(propagate): Likewise.
(read_write_all_from_decl): Likewise.
(generate_summary): Likewise.
(analyze_function): Likewise.
(propagate_bits): Likewise.
(ipa_reference_get_not_written_global): Likewise.
(ipa_reference_get_not_read_global): Likewise.
* ipa-split.c (execute_split_functions): Likewise.
(split_function): Likewise.
* ipa-utils.c (ipa_merge_profiles): Likewise.
(dump_cgraph_node_set): Likewise.
(ipa_reverse_postorder): Likewise.
(ipa_edge_within_scc): Likewise.
(ipa_get_nodes_in_cycle): Likewise.
(ipa_free_postorder_info): Likewise.
(ipa_reduced_postorder): Likewise.
(searchc): Likewise.
(recursive_call_p): Likewise.
* ipa.c (ipa_cdtor_merge): Likewise.
(record_cdtor_fn): Likewise.
(function_and_variable_visibility): Likewise.
(varpool_externally_visible_p): Likewise.
(cgraph_externally_visible_p): Likewise.
(comdat_can_be_unshared_p): Likewise.
(comdat_can_be_unshared_p_1): Likewise.
(address_taken_from_non_vtable_p): Likewise.
(ipa_discover_readonly_nonaddressable_vars): Likewise.
(symtab_remove_unreachable_nodes): Likewise.
(walk_polymorphic_call_targets): Likewise.
(process_references): Likewise.
(enqueue_node): Likewise.
(has_addr_references_p): Likewise.
(cgraph_non_local_node_p_1): Likewise.
* is-a.h (varpool_analyze_node): Likewise.
* lto-cgraph.c (input_symtab): Likewise.
(merge_profile_summaries): Likewise.
(input_cgraph_1): Likewise.
(input_edge): Likewise.
(input_varpool_node): Likewise.
(input_node): Likewise.
(input_overwrite_node): Likewise.
(compute_ltrans_boundary): Likewise.
(output_refs): Likewise.
(lto_output_varpool_node): Likewise.
(lto_output_node): Likewise.
(reachable_from_other_partition_p): Likewise.
(referenced_from_other_partition_p): Likewise.
(lto_output_edge): Likewise.
(output_node_opt_summary): Likewise.
(add_node_to): Likewise.
(reachable_from_this_partition_p): Likewise.
(lto_set_symtab_encoder_in_partition): Likewise.
(lto_symtab_encoder_in_partition_p): Likewise.
(lto_set_symtab_encoder_encode_initializer): Likewise.
(lto_symtab_encoder_encode_initializer_p): Likewise.
(lto_set_symtab_encoder_encode_body): Likewise.
(lto_symtab_encoder_encode_body_p): Likewise.
* lto-section-in.c (lto_free_function_in_decl_state_for_node):
Likewise.
* lto-streamer-in.c (lto_read_body): Likewise.
(fixup_call_stmt_edges): Likewise.
(fixup_call_stmt_edges_1): Likewise.
* lto-streamer-out.c (produce_symtab): Likewise.
(output_symbol_p): Likewise.
(write_symbol): Likewise.
(lto_output): Likewise.
(copy_function): Likewise.
(output_function): Likewise.
* passes.c (function_called_by_processed_nodes_p): Likewise.
(ipa_write_optimization_summaries): Likewise.
(ipa_write_summaries): Likewise.
(do_per_function_toporder): Likewise.
(do_per_function): Likewise.
(dump_passes): Likewise.
* symtab.c (symtab_semantically_equivalent_p): Likewise.
(symtab_nonoverwritable_alias): Likewise.
(symtab_nonoverwritable_alias_1): Likewise.
(symtab_for_node_and_aliases): Likewise.
(symtab_resolve_alias): Likewise.
(fixup_same_cpp_alias_visibility): Likewise.
(symtab_alias_ultimate_target): Likewise.
(symtab_used_from_object_file_p): Likewise.
(verify_symtab_base): Likewise.
(dump_symtab_base): Likewise.
(symtab_node_name): Likewise.
(symtab_node_asm_name): Likewise.
(symtab_dissolve_same_comdat_group_list): Likewise.
(symtab_add_to_same_comdat_group): Likewise.
(symtab_unregister_node): Likewise.
(symtab_insert_node_to_hashtable): Likewise.
(symtab_register_node): Likewise.
(unlink_from_assembler_name_hash): Likewise.
(insert_to_assembler_name_hash): Likewise.
(eq_assembler_name): Likewise.
(hash_node_by_assembler_name): Likewise.
(eq_node): Likewise.
(hash_node): Likewise.
* toplev.c (wrapup_global_declaration_2): Likewise.
* trans-mem.c (ipa_tm_execute): Likewise.
(ipa_tm_transform_clone): Likewise.
(ipa_tm_transform_transaction): Likewise.
(ipa_tm_transform_calls_redirect): Likewise.
(ipa_tm_insert_gettmclone_call): Likewise.
(ipa_tm_insert_irr_call): Likewise.
(ipa_tm_create_version): Likewise.
(ipa_tm_create_version_alias): Likewise.
(ipa_tm_mark_forced_by_abi_node): Likewise.
(ipa_tm_mark_force_output_node): Likewise.
(ipa_tm_diagnose_tm_safe): Likewise.
(ipa_tm_mayenterirr_function): Likewise.
(ipa_tm_scan_irr_function): Likewise.
(ipa_tm_note_irrevocable): Likewise.
(ipa_tm_scan_calls_clone): Likewise.
(get_cg_data): Likewise.
* tree-eh.c (tree_could_trap_p): Likewise.
* tree-emutls.c (ipa_lower_emutls): Likewise.
(create_emultls_var): Likewise.
(lower_emutls_function_body): Likewise.
(gen_emutls_addr): Likewise.
(emutls_decl): Likewise.
(new_emutls_decl): Likewise.
* tree-inline.c (tree_function_versioning): Likewise.
(optimize_inline_calls): Likewise.
(expand_call_inline): Likewise.
(estimate_num_insns): Likewise.
(copy_bb): Likewise.
(delete_unreachable_blocks_update_callgraph): Likewise.
* tree-nested.c (gimplify_all_functions): Likewise.
(create_nesting_tree): Likewise.
(check_for_nested_with_variably_modified): Likewise.
* tree-pretty-print.c (dump_function_header): Likewise.
* tree-profile.c (tree_profiling): Likewise.
* tree-sra.c (ipa_sra_preliminary_function_checks): Likewise.
(modify_function): Likewise.
(convert_callers): Likewise.
(convert_callers_for_node): Likewise.
* tree-ssa-structalias.c (ipa_pta_execute): Likewise.
(associate_varinfo_to_alias): Likewise.
(create_variable_info_for): Likewise.
(get_constraint_for_ssa_var): Likewise.
* tree-vectorizer.c (increase_alignment): Likewise.
* tree.c (find_decls_types_in_var): Likewise.
(find_decls_types_in_node): Likewise.
(free_lang_data_in_decl): Likewise.
* value-prof.c (gimple_ic_transform): Likewise.
(gimple_ic): Likewise.
(check_ic_target): Likewise.
(init_node_map): Likewise.
* varasm.c (decl_binds_to_current_def_p): Likewise.
(default_binds_local_p_1): Likewise.
(dump_tm_clone_pairs): Likewise.
(assemble_alias): Likewise.
(find_decl): Likewise.
(mark_decl_referenced): Likewise.
* varpool.c (varpool_for_node_and_aliases): Likewise.
(varpool_extra_name_alias): Likewise.
(varpool_create_variable_alias): Likewise.
(add_new_static_var): Likewise.
(varpool_finalize_named_section_flags): Likewise.
(varpool_remove_unreferenced_decls): Likewise.
(enqueue_node): Likewise.
(varpool_assemble_decl): Likewise.
(assemble_aliases): Likewise.
(varpool_analyze_node): Likewise.
(cgraph_variable_initializer_availability): Likewise.
(varpool_add_new_variable): Likewise.
(ctor_for_folding): Likewise.
(dump_varpool_node): Likewise.
(varpool_remove_initializer): Likewise.
(varpool_remove_node): Likewise.
(varpool_node_for_decl): Likewise.
(varpool_create_empty_node): Likewise.
* config/i386/i386.c (ix86_generate_version_dispatcher_body):
Likewise.
(ix86_get_function_versions_dispatcher): Likewise.
2013-10-29 David Malcolm <dmalcolm@redhat.com> 2013-10-29 David Malcolm <dmalcolm@redhat.com>
* cgraph.h (symtab_node_base): Convert to a class; * cgraph.h (symtab_node_base): Convert to a class;

View File

@ -1,3 +1,13 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* gcc-interface/trans.c (finalize_nrv): Update for conversion of
symtab types to a true class hierarchy.
* gcc-interface/utils.c (gnat_write_global_declarations): Likewise.
2013-10-28 Trevor Saunders <tsaunders@mozilla.com> 2013-10-28 Trevor Saunders <tsaunders@mozilla.com>
* gcc-interface/decl.c (components_to_record): Adjust. * gcc-interface/decl.c (components_to_record): Adjust.

View File

@ -3246,7 +3246,7 @@ finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret
/* Prune also the candidates that are referenced by nested functions. */ /* Prune also the candidates that are referenced by nested functions. */
node = cgraph_get_create_node (fndecl); node = cgraph_get_create_node (fndecl);
for (node = node->nested; node; node = node->next_nested) for (node = node->nested; node; node = node->next_nested)
walk_tree_without_duplicates (&DECL_SAVED_TREE (node->symbol.decl), prune_nrv_r, walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), prune_nrv_r,
&data); &data);
if (bitmap_empty_p (nrv)) if (bitmap_empty_p (nrv))
return; return;

View File

@ -5633,7 +5633,7 @@ gnat_write_global_declarations (void)
TREE_STATIC (dummy_global) = 1; TREE_STATIC (dummy_global) = 1;
TREE_ASM_WRITTEN (dummy_global) = 1; TREE_ASM_WRITTEN (dummy_global) = 1;
node = varpool_node_for_decl (dummy_global); node = varpool_node_for_decl (dummy_global);
node->symbol.force_output = 1; node->force_output = 1;
while (!types_used_by_cur_var_decl->is_empty ()) while (!types_used_by_cur_var_decl->is_empty ())
{ {

View File

@ -2175,8 +2175,8 @@ asan_finish_file (void)
tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT); tree fn = builtin_decl_implicit (BUILT_IN_ASAN_INIT);
append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements); append_to_statement_list (build_call_expr (fn, 0), &asan_ctor_statements);
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
if (TREE_ASM_WRITTEN (vnode->symbol.decl) if (TREE_ASM_WRITTEN (vnode->decl)
&& asan_protect_global (vnode->symbol.decl)) && asan_protect_global (vnode->decl))
++gcount; ++gcount;
htab_t const_desc_htab = constant_pool_htab (); htab_t const_desc_htab = constant_pool_htab ();
htab_traverse (const_desc_htab, count_string_csts, &gcount); htab_traverse (const_desc_htab, count_string_csts, &gcount);
@ -2197,9 +2197,9 @@ asan_finish_file (void)
DECL_IGNORED_P (var) = 1; DECL_IGNORED_P (var) = 1;
vec_alloc (v, gcount); vec_alloc (v, gcount);
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
if (TREE_ASM_WRITTEN (vnode->symbol.decl) if (TREE_ASM_WRITTEN (vnode->decl)
&& asan_protect_global (vnode->symbol.decl)) && asan_protect_global (vnode->decl))
asan_add_global (vnode->symbol.decl, TREE_TYPE (type), v); asan_add_global (vnode->decl, TREE_TYPE (type), v);
struct asan_add_string_csts_data aascd; struct asan_add_string_csts_data aascd;
aascd.type = TREE_TYPE (type); aascd.type = TREE_TYPE (type);
aascd.v = v; aascd.v = v;

View File

@ -1,3 +1,13 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* c-gimplify.c (c_genericize): Update for conversion of symtab types
to a true class hierarchy.
* c-pragma.c (maybe_apply_pending_pragma_weaks): Likewise.
2013-10-27 Richard Sandiford <rdsandiford@googlemail.com> 2013-10-27 Richard Sandiford <rdsandiford@googlemail.com>
* c-lex.c (interpret_integer): Remove call to cpp_num_sign_extend. * c-lex.c (interpret_integer): Remove call to cpp_num_sign_extend.

View File

@ -98,7 +98,7 @@ c_genericize (tree fndecl)
/* Dump all nested functions now. */ /* Dump all nested functions now. */
cgn = cgraph_get_create_node (fndecl); cgn = cgraph_get_create_node (fndecl);
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested) for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
c_genericize (cgn->symbol.decl); c_genericize (cgn->decl);
} }
static void static void

View File

@ -322,7 +322,7 @@ maybe_apply_pending_pragma_weaks (void)
target = symtab_node_for_asm (id); target = symtab_node_for_asm (id);
decl = build_decl (UNKNOWN_LOCATION, decl = build_decl (UNKNOWN_LOCATION,
target ? TREE_CODE (target->symbol.decl) : FUNCTION_DECL, target ? TREE_CODE (target->decl) : FUNCTION_DECL,
alias_id, default_function_type); alias_id, default_function_type);
DECL_ARTIFICIAL (decl) = 1; DECL_ARTIFICIAL (decl) = 1;

View File

@ -1509,7 +1509,7 @@ estimated_stack_frame_size (struct cgraph_node *node)
HOST_WIDE_INT size = 0; HOST_WIDE_INT size = 0;
size_t i; size_t i;
tree var; tree var;
struct function *fn = DECL_STRUCT_FUNCTION (node->symbol.decl); struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
push_cfun (fn); push_cfun (fn);

View File

@ -274,8 +274,8 @@ record_function_versions (tree decl1, tree decl2)
/* Macros to access the next item in the list of free cgraph nodes and /* Macros to access the next item in the list of free cgraph nodes and
edges. */ edges. */
#define NEXT_FREE_NODE(NODE) cgraph ((NODE)->symbol.next) #define NEXT_FREE_NODE(NODE) cgraph ((NODE)->next)
#define SET_NEXT_FREE_NODE(NODE,NODE2) ((NODE))->symbol.next = (symtab_node)NODE2 #define SET_NEXT_FREE_NODE(NODE,NODE2) ((NODE))->next = NODE2
#define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller #define NEXT_FREE_EDGE(EDGE) (EDGE)->prev_caller
/* Register HOOK to be called with DATA on each removed edge. */ /* Register HOOK to be called with DATA on each removed edge. */
@ -513,7 +513,7 @@ cgraph_create_empty_node (void)
{ {
struct cgraph_node *node = cgraph_allocate_node (); struct cgraph_node *node = cgraph_allocate_node ();
node->symbol.type = SYMTAB_FUNCTION; node->type = SYMTAB_FUNCTION;
node->frequency = NODE_FREQUENCY_NORMAL; node->frequency = NODE_FREQUENCY_NORMAL;
node->count_materialization_scale = REG_BR_PROB_BASE; node->count_materialization_scale = REG_BR_PROB_BASE;
cgraph_n_nodes++; cgraph_n_nodes++;
@ -528,8 +528,8 @@ cgraph_create_node (tree decl)
struct cgraph_node *node = cgraph_create_empty_node (); struct cgraph_node *node = cgraph_create_empty_node ();
gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
node->symbol.decl = decl; node->decl = decl;
symtab_register_node ((symtab_node) node); symtab_register_node (node);
if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL) if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
{ {
@ -567,12 +567,12 @@ cgraph_create_function_alias (tree alias, tree target)
|| TREE_CODE (target) == IDENTIFIER_NODE); || TREE_CODE (target) == IDENTIFIER_NODE);
gcc_assert (TREE_CODE (alias) == FUNCTION_DECL); gcc_assert (TREE_CODE (alias) == FUNCTION_DECL);
alias_node = cgraph_get_create_node (alias); alias_node = cgraph_get_create_node (alias);
gcc_assert (!alias_node->symbol.definition); gcc_assert (!alias_node->definition);
alias_node->symbol.alias_target = target; alias_node->alias_target = target;
alias_node->symbol.definition = true; alias_node->definition = true;
alias_node->symbol.alias = true; alias_node->alias = true;
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
alias_node->symbol.weakref = true; alias_node->weakref = true;
return alias_node; return alias_node;
} }
@ -595,10 +595,10 @@ cgraph_same_body_alias (struct cgraph_node *decl_node ATTRIBUTE_UNUSED, tree ali
return NULL; return NULL;
n = cgraph_create_function_alias (alias, decl); n = cgraph_create_function_alias (alias, decl);
n->symbol.cpp_implicit_alias = true; n->cpp_implicit_alias = true;
if (cpp_implicit_aliases_done) if (cpp_implicit_aliases_done)
symtab_resolve_alias ((symtab_node)n, symtab_resolve_alias (n,
(symtab_node)cgraph_get_node (decl)); cgraph_get_node (decl));
return n; return n;
} }
@ -619,8 +619,8 @@ cgraph_add_thunk (struct cgraph_node *decl_node ATTRIBUTE_UNUSED,
node = cgraph_get_node (alias); node = cgraph_get_node (alias);
if (node) if (node)
{ {
gcc_assert (node->symbol.definition); gcc_assert (node->definition);
gcc_assert (!node->symbol.alias); gcc_assert (!node->alias);
gcc_assert (!node->thunk.thunk_p); gcc_assert (!node->thunk.thunk_p);
cgraph_remove_node (node); cgraph_remove_node (node);
} }
@ -635,7 +635,7 @@ cgraph_add_thunk (struct cgraph_node *decl_node ATTRIBUTE_UNUSED,
node->thunk.virtual_offset_p = virtual_offset != NULL; node->thunk.virtual_offset_p = virtual_offset != NULL;
node->thunk.alias = real_alias; node->thunk.alias = real_alias;
node->thunk.thunk_p = true; node->thunk.thunk_p = true;
node->symbol.definition = true; node->definition = true;
return node; return node;
} }
@ -649,7 +649,7 @@ cgraph_node_for_asm (tree asmname)
/* We do not want to look at inline clones. */ /* We do not want to look at inline clones. */
for (symtab_node node = symtab_node_for_asm (asmname); for (symtab_node node = symtab_node_for_asm (asmname);
node; node;
node = node->symbol.next_sharing_asm_name) node = node->next_sharing_asm_name)
{ {
cgraph_node *cn = dyn_cast <cgraph_node> (node); cgraph_node *cn = dyn_cast <cgraph_node> (node);
if (cn && !cn->global.inlined_to) if (cn && !cn->global.inlined_to)
@ -804,7 +804,7 @@ cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt,
e = cgraph_make_edge_direct (e, new_callee); e = cgraph_make_edge_direct (e, new_callee);
} }
push_cfun (DECL_STRUCT_FUNCTION (e->caller->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
e->can_throw_external = stmt_can_throw_external (new_stmt); e->can_throw_external = stmt_can_throw_external (new_stmt);
pop_cfun (); pop_cfun ();
if (e->caller->call_site_hash) if (e->caller->call_site_hash)
@ -863,13 +863,13 @@ cgraph_create_edge_1 (struct cgraph_node *caller, struct cgraph_node *callee,
gcc_assert (freq <= CGRAPH_FREQ_MAX); gcc_assert (freq <= CGRAPH_FREQ_MAX);
edge->call_stmt = call_stmt; edge->call_stmt = call_stmt;
push_cfun (DECL_STRUCT_FUNCTION (caller->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (caller->decl));
edge->can_throw_external edge->can_throw_external
= call_stmt ? stmt_can_throw_external (call_stmt) : false; = call_stmt ? stmt_can_throw_external (call_stmt) : false;
pop_cfun (); pop_cfun ();
if (call_stmt if (call_stmt
&& callee && callee->symbol.decl && callee && callee->decl
&& !gimple_check_call_matching_types (call_stmt, callee->symbol.decl, && !gimple_check_call_matching_types (call_stmt, callee->decl,
false)) false))
edge->call_stmt_cannot_inline_p = true; edge->call_stmt_cannot_inline_p = true;
else else
@ -1081,14 +1081,14 @@ cgraph_turn_edge_to_speculative (struct cgraph_edge *e,
{ {
fprintf (dump_file, "Indirect call -> speculative call" fprintf (dump_file, "Indirect call -> speculative call"
" %s/%i => %s/%i\n", " %s/%i => %s/%i\n",
xstrdup (cgraph_node_name (n)), n->symbol.order, xstrdup (cgraph_node_name (n)), n->order,
xstrdup (cgraph_node_name (n2)), n2->symbol.order); xstrdup (cgraph_node_name (n2)), n2->order);
} }
e->speculative = true; e->speculative = true;
e2 = cgraph_create_edge (n, n2, e->call_stmt, direct_count, direct_frequency); e2 = cgraph_create_edge (n, n2, e->call_stmt, direct_count, direct_frequency);
initialize_inline_failed (e2); initialize_inline_failed (e2);
e2->speculative = true; e2->speculative = true;
if (TREE_NOTHROW (n2->symbol.decl)) if (TREE_NOTHROW (n2->decl))
e2->can_throw_external = false; e2->can_throw_external = false;
else else
e2->can_throw_external = e->can_throw_external; e2->can_throw_external = e->can_throw_external;
@ -1096,7 +1096,7 @@ cgraph_turn_edge_to_speculative (struct cgraph_edge *e,
e->count -= e2->count; e->count -= e2->count;
e->frequency -= e2->frequency; e->frequency -= e2->frequency;
cgraph_call_edge_duplication_hooks (e, e2); cgraph_call_edge_duplication_hooks (e, e2);
ref = ipa_record_reference ((symtab_node)n, (symtab_node)n2, ref = ipa_record_reference (n, n2,
IPA_REF_ADDR, e->call_stmt); IPA_REF_ADDR, e->call_stmt);
ref->lto_stmt_uid = e->lto_stmt_uid; ref->lto_stmt_uid = e->lto_stmt_uid;
ref->speculative = e->speculative; ref->speculative = e->speculative;
@ -1150,7 +1150,7 @@ cgraph_speculative_call_info (struct cgraph_edge *e,
indirect = e2; indirect = e2;
reference = NULL; reference = NULL;
for (i = 0; ipa_ref_list_reference_iterate (&e->caller->symbol.ref_list, for (i = 0; ipa_ref_list_reference_iterate (&e->caller->ref_list,
i, ref); i++) i, ref); i++)
if (ref->speculative if (ref->speculative
&& ((ref->stmt && ref->stmt == e->call_stmt) && ((ref->stmt && ref->stmt == e->call_stmt)
@ -1192,7 +1192,7 @@ cgraph_resolve_speculation (struct cgraph_edge *edge, tree callee_decl)
gcc_assert (edge->speculative); gcc_assert (edge->speculative);
cgraph_speculative_call_info (edge, e2, edge, ref); cgraph_speculative_call_info (edge, e2, edge, ref);
if (!callee_decl if (!callee_decl
|| !symtab_semantically_equivalent_p ((symtab_node) ref->referred, || !symtab_semantically_equivalent_p (ref->referred,
symtab_get_node (callee_decl))) symtab_get_node (callee_decl)))
{ {
if (dump_file) if (dump_file)
@ -1201,16 +1201,16 @@ cgraph_resolve_speculation (struct cgraph_edge *edge, tree callee_decl)
{ {
fprintf (dump_file, "Speculative indirect call %s/%i => %s/%i has " fprintf (dump_file, "Speculative indirect call %s/%i => %s/%i has "
"turned out to have contradicting known target ", "turned out to have contradicting known target ",
xstrdup (cgraph_node_name (edge->caller)), edge->caller->symbol.order, xstrdup (cgraph_node_name (edge->caller)), edge->caller->order,
xstrdup (cgraph_node_name (e2->callee)), e2->callee->symbol.order); xstrdup (cgraph_node_name (e2->callee)), e2->callee->order);
print_generic_expr (dump_file, callee_decl, 0); print_generic_expr (dump_file, callee_decl, 0);
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
else else
{ {
fprintf (dump_file, "Removing speculative call %s/%i => %s/%i\n", fprintf (dump_file, "Removing speculative call %s/%i => %s/%i\n",
xstrdup (cgraph_node_name (edge->caller)), edge->caller->symbol.order, xstrdup (cgraph_node_name (edge->caller)), edge->caller->order,
xstrdup (cgraph_node_name (e2->callee)), e2->callee->symbol.order); xstrdup (cgraph_node_name (e2->callee)), e2->callee->order);
} }
} }
} }
@ -1252,7 +1252,7 @@ cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
/* If we are redirecting speculative call, make it non-speculative. */ /* If we are redirecting speculative call, make it non-speculative. */
if (edge->indirect_unknown_callee && edge->speculative) if (edge->indirect_unknown_callee && edge->speculative)
{ {
edge = cgraph_resolve_speculation (edge, callee->symbol.decl); edge = cgraph_resolve_speculation (edge, callee->decl);
/* On successful speculation just return the pre existing direct edge. */ /* On successful speculation just return the pre existing direct edge. */
if (!edge->indirect_unknown_callee) if (!edge->indirect_unknown_callee)
@ -1283,7 +1283,7 @@ cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
if (edge->call_stmt) if (edge->call_stmt)
edge->call_stmt_cannot_inline_p edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types (edge->call_stmt, callee->symbol.decl, = !gimple_check_call_matching_types (edge->call_stmt, callee->decl,
false); false);
/* We need to re-determine the inlining status of the edge. */ /* We need to re-determine the inlining status of the edge. */
@ -1320,23 +1320,23 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
signature. We did not update the call statement yet, so compare it signature. We did not update the call statement yet, so compare it
with the reference that still points to the proper type. */ with the reference that still points to the proper type. */
else if (!gimple_check_call_matching_types (e->call_stmt, else if (!gimple_check_call_matching_types (e->call_stmt,
ref->referred->symbol.decl, ref->referred->decl,
true)) true))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Not expanding speculative call of %s/%i -> %s/%i\n" fprintf (dump_file, "Not expanding speculative call of %s/%i -> %s/%i\n"
"Type mismatch.\n", "Type mismatch.\n",
xstrdup (cgraph_node_name (e->caller)), xstrdup (cgraph_node_name (e->caller)),
e->caller->symbol.order, e->caller->order,
xstrdup (cgraph_node_name (e->callee)), xstrdup (cgraph_node_name (e->callee)),
e->callee->symbol.order); e->callee->order);
e = cgraph_resolve_speculation (e, NULL); e = cgraph_resolve_speculation (e, NULL);
/* We are producing the final function body and will throw away the /* We are producing the final function body and will throw away the
callgraph edges really soon. Reset the counts/frequencies to callgraph edges really soon. Reset the counts/frequencies to
keep verifier happy in the case of roundoff errors. */ keep verifier happy in the case of roundoff errors. */
e->count = gimple_bb (e->call_stmt)->count; e->count = gimple_bb (e->call_stmt)->count;
e->frequency = compute_call_stmt_bb_frequency e->frequency = compute_call_stmt_bb_frequency
(e->caller->symbol.decl, gimple_bb (e->call_stmt)); (e->caller->decl, gimple_bb (e->call_stmt));
} }
/* Expand speculation into GIMPLE code. */ /* Expand speculation into GIMPLE code. */
else else
@ -1346,12 +1346,12 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
"Expanding speculative call of %s/%i -> %s/%i count:" "Expanding speculative call of %s/%i -> %s/%i count:"
HOST_WIDEST_INT_PRINT_DEC"\n", HOST_WIDEST_INT_PRINT_DEC"\n",
xstrdup (cgraph_node_name (e->caller)), xstrdup (cgraph_node_name (e->caller)),
e->caller->symbol.order, e->caller->order,
xstrdup (cgraph_node_name (e->callee)), xstrdup (cgraph_node_name (e->callee)),
e->callee->symbol.order, e->callee->order,
(HOST_WIDEST_INT)e->count); (HOST_WIDEST_INT)e->count);
gcc_assert (e2->speculative); gcc_assert (e2->speculative);
push_cfun (DECL_STRUCT_FUNCTION (e->caller->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
new_stmt = gimple_ic (e->call_stmt, cgraph (ref->referred), new_stmt = gimple_ic (e->call_stmt, cgraph (ref->referred),
e->count || e2->count e->count || e2->count
? RDIV (e->count * REG_BR_PROB_BASE, ? RDIV (e->count * REG_BR_PROB_BASE,
@ -1365,9 +1365,9 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt, cgraph_set_call_stmt_including_clones (e->caller, e->call_stmt,
new_stmt, false); new_stmt, false);
e->frequency = compute_call_stmt_bb_frequency e->frequency = compute_call_stmt_bb_frequency
(e->caller->symbol.decl, gimple_bb (e->call_stmt)); (e->caller->decl, gimple_bb (e->call_stmt));
e2->frequency = compute_call_stmt_bb_frequency e2->frequency = compute_call_stmt_bb_frequency
(e2->caller->symbol.decl, gimple_bb (e2->call_stmt)); (e2->caller->decl, gimple_bb (e2->call_stmt));
e2->speculative = false; e2->speculative = false;
ref->speculative = false; ref->speculative = false;
ref->stmt = NULL; ref->stmt = NULL;
@ -1381,7 +1381,7 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
} }
if (e->indirect_unknown_callee if (e->indirect_unknown_callee
|| decl == e->callee->symbol.decl) || decl == e->callee->decl)
return e->call_stmt; return e->call_stmt;
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
@ -1395,8 +1395,8 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
fprintf (cgraph_dump_file, "updating call of %s/%i -> %s/%i: ", fprintf (cgraph_dump_file, "updating call of %s/%i -> %s/%i: ",
xstrdup (cgraph_node_name (e->caller)), e->caller->symbol.order, xstrdup (cgraph_node_name (e->caller)), e->caller->order,
xstrdup (cgraph_node_name (e->callee)), e->callee->symbol.order); xstrdup (cgraph_node_name (e->callee)), e->callee->order);
print_gimple_stmt (cgraph_dump_file, e->call_stmt, 0, dump_flags); print_gimple_stmt (cgraph_dump_file, e->call_stmt, 0, dump_flags);
if (e->callee->clone.combined_args_to_skip) if (e->callee->clone.combined_args_to_skip)
{ {
@ -1413,7 +1413,7 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
new_stmt new_stmt
= gimple_call_copy_skip_args (e->call_stmt, = gimple_call_copy_skip_args (e->call_stmt,
e->callee->clone.combined_args_to_skip); e->callee->clone.combined_args_to_skip);
gimple_call_set_fndecl (new_stmt, e->callee->symbol.decl); gimple_call_set_fndecl (new_stmt, e->callee->decl);
gimple_call_set_fntype (new_stmt, gimple_call_fntype (e->call_stmt)); gimple_call_set_fntype (new_stmt, gimple_call_fntype (e->call_stmt));
if (gimple_vdef (new_stmt) if (gimple_vdef (new_stmt)
@ -1436,7 +1436,7 @@ cgraph_redirect_edge_call_stmt_to_callee (struct cgraph_edge *e)
else else
{ {
new_stmt = e->call_stmt; new_stmt = e->call_stmt;
gimple_call_set_fndecl (new_stmt, e->callee->symbol.decl); gimple_call_set_fndecl (new_stmt, e->callee->decl);
update_stmt (new_stmt); update_stmt (new_stmt);
} }
@ -1486,7 +1486,7 @@ cgraph_update_edges_for_call_stmt_node (struct cgraph_node *node,
struct cgraph_node *callee = e->callee; struct cgraph_node *callee = e->callee;
while (callee) while (callee)
{ {
if (callee->symbol.decl == new_call if (callee->decl == new_call
|| callee->former_clone_of == new_call) || callee->former_clone_of == new_call)
return; return;
callee = callee->clone_of; callee = callee->clone_of;
@ -1659,17 +1659,17 @@ cgraph_release_function_body (struct cgraph_node *node)
node->ipa_transforms_to_apply.release (); node->ipa_transforms_to_apply.release ();
if (!node->used_as_abstract_origin && cgraph_state != CGRAPH_STATE_PARSING) if (!node->used_as_abstract_origin && cgraph_state != CGRAPH_STATE_PARSING)
{ {
DECL_RESULT (node->symbol.decl) = NULL; DECL_RESULT (node->decl) = NULL;
DECL_ARGUMENTS (node->symbol.decl) = NULL; DECL_ARGUMENTS (node->decl) = NULL;
} }
/* If the node is abstract and needed, then do not clear DECL_INITIAL /* If the node is abstract and needed, then do not clear DECL_INITIAL
of its associated function function declaration because it's of its associated function function declaration because it's
needed to emit debug info later. */ needed to emit debug info later. */
if (!node->used_as_abstract_origin && DECL_INITIAL (node->symbol.decl)) if (!node->used_as_abstract_origin && DECL_INITIAL (node->decl))
DECL_INITIAL (node->symbol.decl) = error_mark_node; DECL_INITIAL (node->decl) = error_mark_node;
release_function_body (node->symbol.decl); release_function_body (node->decl);
if (node->symbol.lto_file_data) if (node->lto_file_data)
lto_free_function_in_decl_state_for_node ((symtab_node) node); lto_free_function_in_decl_state_for_node (node);
} }
/* Remove the node from cgraph. */ /* Remove the node from cgraph. */
@ -1687,8 +1687,8 @@ cgraph_remove_node (struct cgraph_node *node)
/* Incremental inlining access removed nodes stored in the postorder list. /* Incremental inlining access removed nodes stored in the postorder list.
*/ */
node->symbol.force_output = false; node->force_output = false;
node->symbol.forced_by_abi = false; node->forced_by_abi = false;
for (n = node->nested; n; n = n->next_nested) for (n = node->nested; n; n = n->next_nested)
n->origin = NULL; n->origin = NULL;
node->nested = NULL; node->nested = NULL;
@ -1700,7 +1700,7 @@ cgraph_remove_node (struct cgraph_node *node)
node2 = &(*node2)->next_nested; node2 = &(*node2)->next_nested;
*node2 = node->next_nested; *node2 = node->next_nested;
} }
symtab_unregister_node ((symtab_node)node); symtab_unregister_node (node);
if (node->prev_sibling_clone) if (node->prev_sibling_clone)
node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone; node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
else if (node->clone_of) else if (node->clone_of)
@ -1744,18 +1744,18 @@ cgraph_remove_node (struct cgraph_node *node)
*/ */
if (cgraph_state != CGRAPH_LTO_STREAMING) if (cgraph_state != CGRAPH_LTO_STREAMING)
{ {
n = cgraph_get_node (node->symbol.decl); n = cgraph_get_node (node->decl);
if (!n if (!n
|| (!n->clones && !n->clone_of && !n->global.inlined_to || (!n->clones && !n->clone_of && !n->global.inlined_to
&& (cgraph_global_info_ready && (cgraph_global_info_ready
&& (TREE_ASM_WRITTEN (n->symbol.decl) && (TREE_ASM_WRITTEN (n->decl)
|| DECL_EXTERNAL (n->symbol.decl) || DECL_EXTERNAL (n->decl)
|| !n->symbol.analyzed || !n->analyzed
|| (!flag_wpa && n->symbol.in_other_partition))))) || (!flag_wpa && n->in_other_partition)))))
cgraph_release_function_body (node); cgraph_release_function_body (node);
} }
node->symbol.decl = NULL; node->decl = NULL;
if (node->call_site_hash) if (node->call_site_hash)
{ {
htab_delete (node->call_site_hash); htab_delete (node->call_site_hash);
@ -1766,7 +1766,7 @@ cgraph_remove_node (struct cgraph_node *node)
/* Clear out the node to NULL all pointers and add the node to the free /* Clear out the node to NULL all pointers and add the node to the free
list. */ list. */
memset (node, 0, sizeof (*node)); memset (node, 0, sizeof (*node));
node->symbol.type = SYMTAB_FUNCTION; node->type = SYMTAB_FUNCTION;
node->uid = uid; node->uid = uid;
SET_NEXT_FREE_NODE (node, free_nodes); SET_NEXT_FREE_NODE (node, free_nodes);
free_nodes = node; free_nodes = node;
@ -1791,9 +1791,9 @@ cgraph_mark_address_taken_node (struct cgraph_node *node)
of the object was taken (and thus it should be set on node alias is of the object was taken (and thus it should be set on node alias is
referring to). We should remove the first use and the remove the referring to). We should remove the first use and the remove the
following set. */ following set. */
node->symbol.address_taken = 1; node->address_taken = 1;
node = cgraph_function_or_thunk_node (node, NULL); node = cgraph_function_or_thunk_node (node, NULL);
node->symbol.address_taken = 1; node->address_taken = 1;
} }
/* Return local info for the compiled function. */ /* Return local info for the compiled function. */
@ -1835,7 +1835,7 @@ cgraph_rtl_info (tree decl)
node = cgraph_get_node (decl); node = cgraph_get_node (decl);
if (!node if (!node
|| (decl != current_function_decl || (decl != current_function_decl
&& !TREE_ASM_WRITTEN (node->symbol.decl))) && !TREE_ASM_WRITTEN (node->decl)))
return NULL; return NULL;
return &node->rtl; return &node->rtl;
} }
@ -1871,18 +1871,18 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
struct cgraph_edge *edge; struct cgraph_edge *edge;
int indirect_calls_count = 0; int indirect_calls_count = 0;
dump_symtab_base (f, (symtab_node) node); dump_symtab_base (f, node);
if (node->global.inlined_to) if (node->global.inlined_to)
fprintf (f, " Function %s/%i is inline copy in %s/%i\n", fprintf (f, " Function %s/%i is inline copy in %s/%i\n",
xstrdup (cgraph_node_name (node)), xstrdup (cgraph_node_name (node)),
node->symbol.order, node->order,
xstrdup (cgraph_node_name (node->global.inlined_to)), xstrdup (cgraph_node_name (node->global.inlined_to)),
node->global.inlined_to->symbol.order); node->global.inlined_to->order);
if (node->clone_of) if (node->clone_of)
fprintf (f, " Clone of %s/%i\n", fprintf (f, " Clone of %s/%i\n",
cgraph_node_asm_name (node->clone_of), cgraph_node_asm_name (node->clone_of),
node->clone_of->symbol.order); node->clone_of->order);
if (cgraph_function_flags_ready) if (cgraph_function_flags_ready)
fprintf (f, " Availability: %s\n", fprintf (f, " Availability: %s\n",
cgraph_availability_names [cgraph_function_body_availability (node)]); cgraph_availability_names [cgraph_function_body_availability (node)]);
@ -1896,7 +1896,7 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
(HOST_WIDEST_INT)node->count); (HOST_WIDEST_INT)node->count);
if (node->origin) if (node->origin)
fprintf (f, " nested in: %s", cgraph_node_asm_name (node->origin)); fprintf (f, " nested in: %s", cgraph_node_asm_name (node->origin));
if (gimple_has_body_p (node->symbol.decl)) if (gimple_has_body_p (node->decl))
fprintf (f, " body"); fprintf (f, " body");
if (node->process) if (node->process)
fprintf (f, " process"); fprintf (f, " process");
@ -1926,7 +1926,7 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
(int)node->thunk.virtual_value, (int)node->thunk.virtual_value,
(int)node->thunk.virtual_offset_p); (int)node->thunk.virtual_offset_p);
} }
if (node->symbol.alias && node->thunk.alias if (node->alias && node->thunk.alias
&& DECL_P (node->thunk.alias)) && DECL_P (node->thunk.alias))
{ {
fprintf (f, " Alias of %s", fprintf (f, " Alias of %s",
@ -1942,7 +1942,7 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
for (edge = node->callers; edge; edge = edge->next_caller) for (edge = node->callers; edge; edge = edge->next_caller)
{ {
fprintf (f, "%s/%i ", cgraph_node_asm_name (edge->caller), fprintf (f, "%s/%i ", cgraph_node_asm_name (edge->caller),
edge->caller->symbol.order); edge->caller->order);
if (edge->count) if (edge->count)
fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ", fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
(HOST_WIDEST_INT)edge->count); (HOST_WIDEST_INT)edge->count);
@ -1963,7 +1963,7 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
for (edge = node->callees; edge; edge = edge->next_callee) for (edge = node->callees; edge; edge = edge->next_callee)
{ {
fprintf (f, "%s/%i ", cgraph_node_asm_name (edge->callee), fprintf (f, "%s/%i ", cgraph_node_asm_name (edge->callee),
edge->callee->symbol.order); edge->callee->order);
if (edge->speculative) if (edge->speculative)
fprintf (f, "(speculative) "); fprintf (f, "(speculative) ");
if (!edge->inline_failed) if (!edge->inline_failed)
@ -2047,20 +2047,20 @@ enum availability
cgraph_function_body_availability (struct cgraph_node *node) cgraph_function_body_availability (struct cgraph_node *node)
{ {
enum availability avail; enum availability avail;
if (!node->symbol.analyzed) if (!node->analyzed)
avail = AVAIL_NOT_AVAILABLE; avail = AVAIL_NOT_AVAILABLE;
else if (node->local.local) else if (node->local.local)
avail = AVAIL_LOCAL; avail = AVAIL_LOCAL;
else if (node->symbol.alias && node->symbol.weakref) else if (node->alias && node->weakref)
cgraph_function_or_thunk_node (node, &avail); cgraph_function_or_thunk_node (node, &avail);
else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (node->symbol.decl))) else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (node->decl)))
avail = AVAIL_OVERWRITABLE; avail = AVAIL_OVERWRITABLE;
else if (!node->symbol.externally_visible) else if (!node->externally_visible)
avail = AVAIL_AVAILABLE; avail = AVAIL_AVAILABLE;
/* Inline functions are safe to be analyzed even if their symbol can /* Inline functions are safe to be analyzed even if their symbol can
be overwritten at runtime. It is not meaningful to enforce any sane be overwritten at runtime. It is not meaningful to enforce any sane
behaviour on replacing inline function by different body. */ behaviour on replacing inline function by different body. */
else if (DECL_DECLARED_INLINE_P (node->symbol.decl)) else if (DECL_DECLARED_INLINE_P (node->decl))
avail = AVAIL_AVAILABLE; avail = AVAIL_AVAILABLE;
/* If the function can be overwritten, return OVERWRITABLE. Take /* If the function can be overwritten, return OVERWRITABLE. Take
@ -2073,8 +2073,8 @@ cgraph_function_body_availability (struct cgraph_node *node)
AVAIL_AVAILABLE here? That would be good reason to preserve this AVAIL_AVAILABLE here? That would be good reason to preserve this
bit. */ bit. */
else if (decl_replaceable_p (node->symbol.decl) else if (decl_replaceable_p (node->decl)
&& !DECL_EXTERNAL (node->symbol.decl)) && !DECL_EXTERNAL (node->decl))
avail = AVAIL_OVERWRITABLE; avail = AVAIL_OVERWRITABLE;
else avail = AVAIL_AVAILABLE; else avail = AVAIL_AVAILABLE;
@ -2086,12 +2086,12 @@ static bool
cgraph_node_cannot_be_local_p_1 (struct cgraph_node *node, cgraph_node_cannot_be_local_p_1 (struct cgraph_node *node,
void *data ATTRIBUTE_UNUSED) void *data ATTRIBUTE_UNUSED)
{ {
return !(!node->symbol.force_output return !(!node->force_output
&& ((DECL_COMDAT (node->symbol.decl) && ((DECL_COMDAT (node->decl)
&& !node->symbol.forced_by_abi && !node->forced_by_abi
&& !symtab_used_from_object_file_p ((symtab_node) node) && !symtab_used_from_object_file_p (node)
&& !node->symbol.same_comdat_group) && !node->same_comdat_group)
|| !node->symbol.externally_visible)); || !node->externally_visible));
} }
/* Return true if NODE can be made local for API change. /* Return true if NODE can be made local for API change.
@ -2101,7 +2101,7 @@ cgraph_node_cannot_be_local_p_1 (struct cgraph_node *node,
bool bool
cgraph_node_can_be_local_p (struct cgraph_node *node) cgraph_node_can_be_local_p (struct cgraph_node *node)
{ {
return (!node->symbol.address_taken return (!node->address_taken
&& !cgraph_for_node_and_aliases (node, && !cgraph_for_node_and_aliases (node,
cgraph_node_cannot_be_local_p_1, cgraph_node_cannot_be_local_p_1,
NULL, true)); NULL, true));
@ -2130,7 +2130,7 @@ cgraph_for_node_thunks_and_aliases (struct cgraph_node *node,
if (cgraph_for_node_thunks_and_aliases (e->caller, callback, data, if (cgraph_for_node_thunks_and_aliases (e->caller, callback, data,
include_overwritable)) include_overwritable))
return true; return true;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
struct cgraph_node *alias = ipa_ref_referring_node (ref); struct cgraph_node *alias = ipa_ref_referring_node (ref);
@ -2158,7 +2158,7 @@ cgraph_for_node_and_aliases (struct cgraph_node *node,
if (callback (node, data)) if (callback (node, data))
return true; return true;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
struct cgraph_node *alias = ipa_ref_referring_node (ref); struct cgraph_node *alias = ipa_ref_referring_node (ref);
@ -2177,16 +2177,16 @@ static bool
cgraph_make_node_local_1 (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED) cgraph_make_node_local_1 (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
{ {
gcc_checking_assert (cgraph_node_can_be_local_p (node)); gcc_checking_assert (cgraph_node_can_be_local_p (node));
if (DECL_COMDAT (node->symbol.decl) || DECL_EXTERNAL (node->symbol.decl)) if (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
{ {
symtab_make_decl_local (node->symbol.decl); symtab_make_decl_local (node->decl);
node->symbol.externally_visible = false; node->externally_visible = false;
node->symbol.forced_by_abi = false; node->forced_by_abi = false;
node->local.local = true; node->local.local = true;
node->symbol.unique_name = (node->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY node->unique_name = (node->resolution == LDPR_PREVAILING_DEF_IRONLY
|| node->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP); || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP);
node->symbol.resolution = LDPR_PREVAILING_DEF_IRONLY; node->resolution = LDPR_PREVAILING_DEF_IRONLY;
gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL); gcc_assert (cgraph_function_body_availability (node) == AVAIL_LOCAL);
} }
return false; return false;
@ -2208,7 +2208,7 @@ cgraph_set_nothrow_flag_1 (struct cgraph_node *node, void *data)
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
TREE_NOTHROW (node->symbol.decl) = data != NULL; TREE_NOTHROW (node->decl) = data != NULL;
if (data != NULL) if (data != NULL)
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
@ -2235,13 +2235,13 @@ cgraph_set_const_flag_1 (struct cgraph_node *node, void *data)
optimized out. */ optimized out. */
if (data && !((size_t)data & 2)) if (data && !((size_t)data & 2))
{ {
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl)) if (DECL_STATIC_CONSTRUCTOR (node->decl))
DECL_STATIC_CONSTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
if (DECL_STATIC_DESTRUCTOR (node->symbol.decl)) if (DECL_STATIC_DESTRUCTOR (node->decl))
DECL_STATIC_DESTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_DESTRUCTOR (node->decl) = 0;
} }
TREE_READONLY (node->symbol.decl) = data != NULL; TREE_READONLY (node->decl) = data != NULL;
DECL_LOOPING_CONST_OR_PURE_P (node->symbol.decl) = ((size_t)data & 2) != 0; DECL_LOOPING_CONST_OR_PURE_P (node->decl) = ((size_t)data & 2) != 0;
return false; return false;
} }
@ -2265,13 +2265,13 @@ cgraph_set_pure_flag_1 (struct cgraph_node *node, void *data)
optimized out. */ optimized out. */
if (data && !((size_t)data & 2)) if (data && !((size_t)data & 2))
{ {
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl)) if (DECL_STATIC_CONSTRUCTOR (node->decl))
DECL_STATIC_CONSTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
if (DECL_STATIC_DESTRUCTOR (node->symbol.decl)) if (DECL_STATIC_DESTRUCTOR (node->decl))
DECL_STATIC_DESTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_DESTRUCTOR (node->decl) = 0;
} }
DECL_PURE_P (node->symbol.decl) = data != NULL; DECL_PURE_P (node->decl) = data != NULL;
DECL_LOOPING_CONST_OR_PURE_P (node->symbol.decl) = ((size_t)data & 2) != 0; DECL_LOOPING_CONST_OR_PURE_P (node->decl) = ((size_t)data & 2) != 0;
return false; return false;
} }
@ -2292,7 +2292,7 @@ cgraph_set_pure_flag (struct cgraph_node *node, bool pure, bool looping)
bool bool
cgraph_node_cannot_return (struct cgraph_node *node) cgraph_node_cannot_return (struct cgraph_node *node)
{ {
int flags = flags_from_decl_or_type (node->symbol.decl); int flags = flags_from_decl_or_type (node->decl);
if (!flag_exceptions) if (!flag_exceptions)
return (flags & ECF_NORETURN) != 0; return (flags & ECF_NORETURN) != 0;
else else
@ -2331,19 +2331,19 @@ cgraph_can_remove_if_no_direct_calls_and_refs_p (struct cgraph_node *node)
{ {
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
/* Extern inlines can always go, we will use the external definition. */ /* Extern inlines can always go, we will use the external definition. */
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
return true; return true;
/* When function is needed, we can not remove it. */ /* When function is needed, we can not remove it. */
if (node->symbol.force_output || node->symbol.used_from_other_partition) if (node->force_output || node->used_from_other_partition)
return false; return false;
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl) if (DECL_STATIC_CONSTRUCTOR (node->decl)
|| DECL_STATIC_DESTRUCTOR (node->symbol.decl)) || DECL_STATIC_DESTRUCTOR (node->decl))
return false; return false;
/* Only COMDAT functions can be removed if externally visible. */ /* Only COMDAT functions can be removed if externally visible. */
if (node->symbol.externally_visible if (node->externally_visible
&& (!DECL_COMDAT (node->symbol.decl) && (!DECL_COMDAT (node->decl)
|| node->symbol.forced_by_abi || node->forced_by_abi
|| symtab_used_from_object_file_p ((symtab_node) node))) || symtab_used_from_object_file_p (node)))
return false; return false;
return true; return true;
} }
@ -2363,9 +2363,9 @@ bool
cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node) cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node)
{ {
/* Extern inlines can always go, we will use the external definition. */ /* Extern inlines can always go, we will use the external definition. */
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
return true; return true;
if (node->symbol.address_taken) if (node->address_taken)
return false; return false;
return !cgraph_for_node_and_aliases (node, nonremovable_p, NULL, true); return !cgraph_for_node_and_aliases (node, nonremovable_p, NULL, true);
} }
@ -2375,7 +2375,7 @@ cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node)
static bool static bool
used_from_object_file_p (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED) used_from_object_file_p (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
{ {
return symtab_used_from_object_file_p ((symtab_node) node); return symtab_used_from_object_file_p (node);
} }
/* Return true when function NODE can be expected to be removed /* Return true when function NODE can be expected to be removed
@ -2402,7 +2402,7 @@ cgraph_will_be_removed_from_program_if_no_direct_calls (struct cgraph_node *node
return cgraph_only_called_directly_p (node); return cgraph_only_called_directly_p (node);
else else
{ {
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
return true; return true;
return cgraph_can_remove_if_no_direct_calls_p (node); return cgraph_can_remove_if_no_direct_calls_p (node);
} }
@ -2492,7 +2492,7 @@ verify_edge_count_and_frequency (struct cgraph_edge *e)
error ("caller edge frequency is too large"); error ("caller edge frequency is too large");
error_found = true; error_found = true;
} }
if (gimple_has_body_p (e->caller->symbol.decl) if (gimple_has_body_p (e->caller->decl)
&& !e->caller->global.inlined_to && !e->caller->global.inlined_to
&& !e->speculative && !e->speculative
/* FIXME: Inline-analysis sets frequency to 0 when edge is optimized out. /* FIXME: Inline-analysis sets frequency to 0 when edge is optimized out.
@ -2502,12 +2502,12 @@ verify_edge_count_and_frequency (struct cgraph_edge *e)
&& ((inline_edge_summary_vec.length () <= (unsigned) e->uid) && ((inline_edge_summary_vec.length () <= (unsigned) e->uid)
|| !inline_edge_summary (e)->predicate))) || !inline_edge_summary (e)->predicate)))
&& (e->frequency && (e->frequency
!= compute_call_stmt_bb_frequency (e->caller->symbol.decl, != compute_call_stmt_bb_frequency (e->caller->decl,
gimple_bb (e->call_stmt)))) gimple_bb (e->call_stmt))))
{ {
error ("caller edge frequency %i does not match BB frequency %i", error ("caller edge frequency %i does not match BB frequency %i",
e->frequency, e->frequency,
compute_call_stmt_bb_frequency (e->caller->symbol.decl, compute_call_stmt_bb_frequency (e->caller->decl,
gimple_bb (e->call_stmt))); gimple_bb (e->call_stmt)));
error_found = true; error_found = true;
} }
@ -2549,11 +2549,11 @@ verify_edge_corresponds_to_fndecl (struct cgraph_edge *e, tree decl)
/* We do not know if a node from a different partition is an alias or what it /* We do not know if a node from a different partition is an alias or what it
aliases and therefore cannot do the former_clone_of check reliably. */ aliases and therefore cannot do the former_clone_of check reliably. */
if (!node || node->symbol.in_other_partition || e->callee->symbol.in_other_partition) if (!node || node->in_other_partition || e->callee->in_other_partition)
return false; return false;
node = cgraph_function_or_thunk_node (node, NULL); node = cgraph_function_or_thunk_node (node, NULL);
if (e->callee->former_clone_of != node->symbol.decl if (e->callee->former_clone_of != node->decl
/* IPA-CP sometimes redirect edge to clone and then back to the former /* IPA-CP sometimes redirect edge to clone and then back to the former
function. This ping-pong has to go, eventually. */ function. This ping-pong has to go, eventually. */
&& (node != cgraph_function_or_thunk_node (e->callee, NULL)) && (node != cgraph_function_or_thunk_node (e->callee, NULL))
@ -2568,7 +2568,7 @@ DEBUG_FUNCTION void
verify_cgraph_node (struct cgraph_node *node) verify_cgraph_node (struct cgraph_node *node)
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
struct function *this_cfun = DECL_STRUCT_FUNCTION (node->symbol.decl); struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
basic_block this_block; basic_block this_block;
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
bool error_found = false; bool error_found = false;
@ -2577,7 +2577,7 @@ verify_cgraph_node (struct cgraph_node *node)
return; return;
timevar_push (TV_CGRAPH_VERIFY); timevar_push (TV_CGRAPH_VERIFY);
error_found |= verify_symtab_base ((symtab_node) node); error_found |= verify_symtab_base (node);
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
if (e->aux) if (e->aux)
{ {
@ -2591,27 +2591,27 @@ verify_cgraph_node (struct cgraph_node *node)
error ("execution count is negative"); error ("execution count is negative");
error_found = true; error_found = true;
} }
if (node->global.inlined_to && node->symbol.same_comdat_group) if (node->global.inlined_to && node->same_comdat_group)
{ {
error ("inline clone in same comdat group list"); error ("inline clone in same comdat group list");
error_found = true; error_found = true;
} }
if (!node->symbol.definition && !node->symbol.in_other_partition && node->local.local) if (!node->definition && !node->in_other_partition && node->local.local)
{ {
error ("local symbols must be defined"); error ("local symbols must be defined");
error_found = true; error_found = true;
} }
if (node->global.inlined_to && node->symbol.externally_visible) if (node->global.inlined_to && node->externally_visible)
{ {
error ("externally visible inline clone"); error ("externally visible inline clone");
error_found = true; error_found = true;
} }
if (node->global.inlined_to && node->symbol.address_taken) if (node->global.inlined_to && node->address_taken)
{ {
error ("inline clone with address taken"); error ("inline clone with address taken");
error_found = true; error_found = true;
} }
if (node->global.inlined_to && node->symbol.force_output) if (node->global.inlined_to && node->force_output)
{ {
error ("inline clone is forced to output"); error ("inline clone is forced to output");
error_found = true; error_found = true;
@ -2714,7 +2714,7 @@ verify_cgraph_node (struct cgraph_node *node)
error_found = true; error_found = true;
} }
if (node->symbol.analyzed && node->symbol.alias) if (node->analyzed && node->alias)
{ {
bool ref_found = false; bool ref_found = false;
int i; int i;
@ -2725,7 +2725,7 @@ verify_cgraph_node (struct cgraph_node *node)
error ("Alias has call edges"); error ("Alias has call edges");
error_found = true; error_found = true;
} }
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use != IPA_REF_ALIAS) if (ref->use != IPA_REF_ALIAS)
{ {
@ -2745,7 +2745,7 @@ verify_cgraph_node (struct cgraph_node *node)
error_found = true; error_found = true;
} }
} }
if (node->symbol.analyzed && node->thunk.thunk_p) if (node->analyzed && node->thunk.thunk_p)
{ {
if (!node->callees) if (!node->callees)
{ {
@ -2757,15 +2757,15 @@ verify_cgraph_node (struct cgraph_node *node)
error ("More than one edge out of thunk node"); error ("More than one edge out of thunk node");
error_found = true; error_found = true;
} }
if (gimple_has_body_p (node->symbol.decl)) if (gimple_has_body_p (node->decl))
{ {
error ("Thunk is not supposed to have body"); error ("Thunk is not supposed to have body");
error_found = true; error_found = true;
} }
} }
else if (node->symbol.analyzed && gimple_has_body_p (node->symbol.decl) else if (node->analyzed && gimple_has_body_p (node->decl)
&& !TREE_ASM_WRITTEN (node->symbol.decl) && !TREE_ASM_WRITTEN (node->decl)
&& (!DECL_EXTERNAL (node->symbol.decl) || node->global.inlined_to) && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to)
&& !flag_wpa) && !flag_wpa)
{ {
if (this_cfun->cfg) if (this_cfun->cfg)
@ -2804,7 +2804,7 @@ verify_cgraph_node (struct cgraph_node *node)
if (verify_edge_corresponds_to_fndecl (e, decl)) if (verify_edge_corresponds_to_fndecl (e, decl))
{ {
error ("edge points to wrong declaration:"); error ("edge points to wrong declaration:");
debug_tree (e->callee->symbol.decl); debug_tree (e->callee->decl);
fprintf (stderr," Instead of:"); fprintf (stderr," Instead of:");
debug_tree (decl); debug_tree (decl);
error_found = true; error_found = true;
@ -2830,7 +2830,7 @@ verify_cgraph_node (struct cgraph_node *node)
} }
} }
for (i = 0; for (i = 0;
ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); ipa_ref_list_reference_iterate (&node->ref_list, i, ref);
i++) i++)
if (ref->stmt && !pointer_set_contains (stmts, ref->stmt)) if (ref->stmt && !pointer_set_contains (stmts, ref->stmt))
{ {
@ -2919,17 +2919,17 @@ cgraph_get_create_real_symbol_node (tree decl)
{ {
first_clone->clone_of = node; first_clone->clone_of = node;
node->clones = first_clone; node->clones = first_clone;
symtab_prevail_in_asm_name_hash ((symtab_node) node); symtab_prevail_in_asm_name_hash (node);
symtab_insert_node_to_hashtable ((symtab_node) node); symtab_insert_node_to_hashtable (node);
if (dump_file) if (dump_file)
fprintf (dump_file, "Introduced new external node " fprintf (dump_file, "Introduced new external node "
"(%s/%i) and turned into root of the clone tree.\n", "(%s/%i) and turned into root of the clone tree.\n",
xstrdup (cgraph_node_name (node)), node->symbol.order); xstrdup (cgraph_node_name (node)), node->order);
} }
else if (dump_file) else if (dump_file)
fprintf (dump_file, "Introduced new external node " fprintf (dump_file, "Introduced new external node "
"(%s/%i).\n", xstrdup (cgraph_node_name (node)), "(%s/%i).\n", xstrdup (cgraph_node_name (node)),
node->symbol.order); node->order);
return node; return node;
} }
@ -2968,14 +2968,14 @@ cgraph_get_body (struct cgraph_node *node)
struct lto_file_decl_data *file_data; struct lto_file_decl_data *file_data;
const char *data, *name; const char *data, *name;
size_t len; size_t len;
tree decl = node->symbol.decl; tree decl = node->decl;
if (DECL_RESULT (decl)) if (DECL_RESULT (decl))
return false; return false;
gcc_assert (in_lto_p); gcc_assert (in_lto_p);
file_data = node->symbol.lto_file_data; file_data = node->lto_file_data;
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
/* We may have renamed the declaration, e.g., a static function. */ /* We may have renamed the declaration, e.g., a static function. */
@ -2997,7 +2997,7 @@ cgraph_get_body (struct cgraph_node *node)
lto_stats.num_function_bodies++; lto_stats.num_function_bodies++;
lto_free_section_data (file_data, LTO_section_function_body, name, lto_free_section_data (file_data, LTO_section_function_body, name,
data, len); data, len);
lto_free_function_in_decl_state_for_node ((symtab_node) node); lto_free_function_in_decl_state_for_node (node);
return true; return true;
} }

View File

@ -538,7 +538,7 @@ template <>
inline bool inline bool
is_a_helper <cgraph_node>::test (symtab_node_base *p) is_a_helper <cgraph_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_FUNCTION; return p->type == SYMTAB_FUNCTION;
} }
/* Report whether or not THIS symtab node is a vriable, aka varpool_node. */ /* Report whether or not THIS symtab node is a vriable, aka varpool_node. */
@ -548,7 +548,7 @@ template <>
inline bool inline bool
is_a_helper <varpool_node>::test (symtab_node_base *p) is_a_helper <varpool_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_VARIABLE; return p->type == SYMTAB_VARIABLE;
} }
extern GTY(()) symtab_node symtab_nodes; extern GTY(()) symtab_node symtab_nodes;
@ -850,7 +850,7 @@ void varpool_remove_initializer (struct varpool_node *);
static inline struct cgraph_node * static inline struct cgraph_node *
cgraph (symtab_node node) cgraph (symtab_node node)
{ {
gcc_checking_assert (!node || node->symbol.type == SYMTAB_FUNCTION); gcc_checking_assert (!node || node->type == SYMTAB_FUNCTION);
return (struct cgraph_node *)node; return (struct cgraph_node *)node;
} }
@ -858,7 +858,7 @@ cgraph (symtab_node node)
static inline struct varpool_node * static inline struct varpool_node *
varpool (symtab_node node) varpool (symtab_node node)
{ {
gcc_checking_assert (!node || node->symbol.type == SYMTAB_VARIABLE); gcc_checking_assert (!node || node->type == SYMTAB_VARIABLE);
return (struct varpool_node *)node; return (struct varpool_node *)node;
} }
@ -882,33 +882,33 @@ varpool_get_node (const_tree decl)
static inline const char * static inline const char *
cgraph_node_asm_name (struct cgraph_node *node) cgraph_node_asm_name (struct cgraph_node *node)
{ {
return symtab_node_asm_name ((symtab_node)node); return symtab_node_asm_name (node);
} }
/* Return asm name of varpool node. */ /* Return asm name of varpool node. */
static inline const char * static inline const char *
varpool_node_asm_name (struct varpool_node *node) varpool_node_asm_name (struct varpool_node *node)
{ {
return symtab_node_asm_name ((symtab_node)node); return symtab_node_asm_name (node);
} }
/* Return name of cgraph node. */ /* Return name of cgraph node. */
static inline const char * static inline const char *
cgraph_node_name (struct cgraph_node *node) cgraph_node_name (struct cgraph_node *node)
{ {
return symtab_node_name ((symtab_node)node); return symtab_node_name (node);
} }
/* Return name of varpool node. */ /* Return name of varpool node. */
static inline const char * static inline const char *
varpool_node_name (struct varpool_node *node) varpool_node_name (struct varpool_node *node)
{ {
return symtab_node_name ((symtab_node)node); return symtab_node_name (node);
} }
/* Walk all symbols. */ /* Walk all symbols. */
#define FOR_EACH_SYMBOL(node) \ #define FOR_EACH_SYMBOL(node) \
for ((node) = symtab_nodes; (node); (node) = (node)->symbol.next) for ((node) = symtab_nodes; (node); (node) = (node)->next)
/* Return first variable. */ /* Return first variable. */
@ -916,7 +916,7 @@ static inline struct varpool_node *
varpool_first_variable (void) varpool_first_variable (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
if (varpool_node *vnode = dyn_cast <varpool_node> (node)) if (varpool_node *vnode = dyn_cast <varpool_node> (node))
return vnode; return vnode;
return NULL; return NULL;
@ -926,8 +926,8 @@ varpool_first_variable (void)
static inline struct varpool_node * static inline struct varpool_node *
varpool_next_variable (struct varpool_node *node) varpool_next_variable (struct varpool_node *node)
{ {
symtab_node node1 = (symtab_node) node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
if (varpool_node *vnode1 = dyn_cast <varpool_node> (node1)) if (varpool_node *vnode1 = dyn_cast <varpool_node> (node1))
return vnode1; return vnode1;
return NULL; return NULL;
@ -943,10 +943,10 @@ static inline struct varpool_node *
varpool_first_static_initializer (void) varpool_first_static_initializer (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
{ {
varpool_node *vnode = dyn_cast <varpool_node> (node); varpool_node *vnode = dyn_cast <varpool_node> (node);
if (vnode && DECL_INITIAL (node->symbol.decl)) if (vnode && DECL_INITIAL (node->decl))
return vnode; return vnode;
} }
return NULL; return NULL;
@ -956,11 +956,11 @@ varpool_first_static_initializer (void)
static inline struct varpool_node * static inline struct varpool_node *
varpool_next_static_initializer (struct varpool_node *node) varpool_next_static_initializer (struct varpool_node *node)
{ {
symtab_node node1 = (symtab_node) node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
{ {
varpool_node *vnode1 = dyn_cast <varpool_node> (node1); varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
if (vnode1 && DECL_INITIAL (node1->symbol.decl)) if (vnode1 && DECL_INITIAL (node1->decl))
return vnode1; return vnode1;
} }
return NULL; return NULL;
@ -976,10 +976,10 @@ static inline struct varpool_node *
varpool_first_defined_variable (void) varpool_first_defined_variable (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
{ {
varpool_node *vnode = dyn_cast <varpool_node> (node); varpool_node *vnode = dyn_cast <varpool_node> (node);
if (vnode && vnode->symbol.definition) if (vnode && vnode->definition)
return vnode; return vnode;
} }
return NULL; return NULL;
@ -989,11 +989,11 @@ varpool_first_defined_variable (void)
static inline struct varpool_node * static inline struct varpool_node *
varpool_next_defined_variable (struct varpool_node *node) varpool_next_defined_variable (struct varpool_node *node)
{ {
symtab_node node1 = (symtab_node) node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
{ {
varpool_node *vnode1 = dyn_cast <varpool_node> (node1); varpool_node *vnode1 = dyn_cast <varpool_node> (node1);
if (vnode1 && vnode1->symbol.definition) if (vnode1 && vnode1->definition)
return vnode1; return vnode1;
} }
return NULL; return NULL;
@ -1008,10 +1008,10 @@ static inline struct cgraph_node *
cgraph_first_defined_function (void) cgraph_first_defined_function (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
{ {
cgraph_node *cn = dyn_cast <cgraph_node> (node); cgraph_node *cn = dyn_cast <cgraph_node> (node);
if (cn && cn->symbol.definition) if (cn && cn->definition)
return cn; return cn;
} }
return NULL; return NULL;
@ -1021,11 +1021,11 @@ cgraph_first_defined_function (void)
static inline struct cgraph_node * static inline struct cgraph_node *
cgraph_next_defined_function (struct cgraph_node *node) cgraph_next_defined_function (struct cgraph_node *node)
{ {
symtab_node node1 = (symtab_node) node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
{ {
cgraph_node *cn1 = dyn_cast <cgraph_node> (node1); cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
if (cn1 && cn1->symbol.definition) if (cn1 && cn1->definition)
return cn1; return cn1;
} }
return NULL; return NULL;
@ -1041,7 +1041,7 @@ static inline struct cgraph_node *
cgraph_first_function (void) cgraph_first_function (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
if (cgraph_node *cn = dyn_cast <cgraph_node> (node)) if (cgraph_node *cn = dyn_cast <cgraph_node> (node))
return cn; return cn;
return NULL; return NULL;
@ -1051,8 +1051,8 @@ cgraph_first_function (void)
static inline struct cgraph_node * static inline struct cgraph_node *
cgraph_next_function (struct cgraph_node *node) cgraph_next_function (struct cgraph_node *node)
{ {
symtab_node node1 = (symtab_node) node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
if (cgraph_node *cn1 = dyn_cast <cgraph_node> (node1)) if (cgraph_node *cn1 = dyn_cast <cgraph_node> (node1))
return cn1; return cn1;
return NULL; return NULL;
@ -1071,7 +1071,7 @@ cgraph_next_function (struct cgraph_node *node)
static inline bool static inline bool
cgraph_function_with_gimple_body_p (struct cgraph_node *node) cgraph_function_with_gimple_body_p (struct cgraph_node *node)
{ {
return node->symbol.definition && !node->thunk.thunk_p && !node->symbol.alias; return node->definition && !node->thunk.thunk_p && !node->alias;
} }
/* Return first function with body defined. */ /* Return first function with body defined. */
@ -1079,7 +1079,7 @@ static inline struct cgraph_node *
cgraph_first_function_with_gimple_body (void) cgraph_first_function_with_gimple_body (void)
{ {
symtab_node node; symtab_node node;
for (node = symtab_nodes; node; node = node->symbol.next) for (node = symtab_nodes; node; node = node->next)
{ {
cgraph_node *cn = dyn_cast <cgraph_node> (node); cgraph_node *cn = dyn_cast <cgraph_node> (node);
if (cn && cgraph_function_with_gimple_body_p (cn)) if (cn && cgraph_function_with_gimple_body_p (cn))
@ -1092,8 +1092,8 @@ cgraph_first_function_with_gimple_body (void)
static inline struct cgraph_node * static inline struct cgraph_node *
cgraph_next_function_with_gimple_body (struct cgraph_node *node) cgraph_next_function_with_gimple_body (struct cgraph_node *node)
{ {
symtab_node node1 = node->symbol.next; symtab_node node1 = node->next;
for (; node1; node1 = node1->symbol.next) for (; node1; node1 = node1->next)
{ {
cgraph_node *cn1 = dyn_cast <cgraph_node> (node1); cgraph_node *cn1 = dyn_cast <cgraph_node> (node1);
if (cn1 && cgraph_function_with_gimple_body_p (cn1)) if (cn1 && cgraph_function_with_gimple_body_p (cn1))
@ -1245,12 +1245,12 @@ static inline bool
cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node) cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node)
{ {
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
return (!node->symbol.force_output && !node->symbol.address_taken return (!node->force_output && !node->address_taken
&& !node->symbol.used_from_other_partition && !node->used_from_other_partition
&& !DECL_VIRTUAL_P (node->symbol.decl) && !DECL_VIRTUAL_P (node->decl)
&& !DECL_STATIC_CONSTRUCTOR (node->symbol.decl) && !DECL_STATIC_CONSTRUCTOR (node->decl)
&& !DECL_STATIC_DESTRUCTOR (node->symbol.decl) && !DECL_STATIC_DESTRUCTOR (node->decl)
&& !node->symbol.externally_visible); && !node->externally_visible);
} }
/* Return true when function NODE can be removed from callgraph /* Return true when function NODE can be removed from callgraph
@ -1259,14 +1259,14 @@ cgraph_only_called_directly_or_aliased_p (struct cgraph_node *node)
static inline bool static inline bool
varpool_can_remove_if_no_refs (struct varpool_node *node) varpool_can_remove_if_no_refs (struct varpool_node *node)
{ {
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
return true; return true;
return (!node->symbol.force_output && !node->symbol.used_from_other_partition return (!node->force_output && !node->used_from_other_partition
&& ((DECL_COMDAT (node->symbol.decl) && ((DECL_COMDAT (node->decl)
&& !node->symbol.forced_by_abi && !node->forced_by_abi
&& !symtab_used_from_object_file_p ((symtab_node) node)) && !symtab_used_from_object_file_p (node))
|| !node->symbol.externally_visible || !node->externally_visible
|| DECL_HAS_VALUE_EXPR_P (node->symbol.decl))); || DECL_HAS_VALUE_EXPR_P (node->decl)));
} }
/* Return true when all references to VNODE must be visible in ipa_ref_list. /* Return true when all references to VNODE must be visible in ipa_ref_list.
@ -1277,10 +1277,10 @@ varpool_can_remove_if_no_refs (struct varpool_node *node)
static inline bool static inline bool
varpool_all_refs_explicit_p (struct varpool_node *vnode) varpool_all_refs_explicit_p (struct varpool_node *vnode)
{ {
return (vnode->symbol.definition return (vnode->definition
&& !vnode->symbol.externally_visible && !vnode->externally_visible
&& !vnode->symbol.used_from_other_partition && !vnode->used_from_other_partition
&& !vnode->symbol.force_output); && !vnode->force_output);
} }
/* Constant pool accessor function. */ /* Constant pool accessor function. */
@ -1295,7 +1295,7 @@ static inline symtab_node
symtab_alias_target (symtab_node n) symtab_alias_target (symtab_node n)
{ {
struct ipa_ref *ref; struct ipa_ref *ref;
ipa_ref_list_reference_iterate (&n->symbol.ref_list, 0, ref); ipa_ref_list_reference_iterate (&n->ref_list, 0, ref);
gcc_checking_assert (ref->use == IPA_REF_ALIAS); gcc_checking_assert (ref->use == IPA_REF_ALIAS);
return ref->referred; return ref->referred;
} }
@ -1303,13 +1303,13 @@ symtab_alias_target (symtab_node n)
static inline struct cgraph_node * static inline struct cgraph_node *
cgraph_alias_target (struct cgraph_node *n) cgraph_alias_target (struct cgraph_node *n)
{ {
return dyn_cast <cgraph_node> (symtab_alias_target ((symtab_node) n)); return dyn_cast <cgraph_node> (symtab_alias_target (n));
} }
static inline struct varpool_node * static inline struct varpool_node *
varpool_alias_target (struct varpool_node *n) varpool_alias_target (struct varpool_node *n)
{ {
return dyn_cast <varpool_node> (symtab_alias_target ((symtab_node) n)); return dyn_cast <varpool_node> (symtab_alias_target (n));
} }
/* Given NODE, walk the alias chain to return the function NODE is alias of. /* Given NODE, walk the alias chain to return the function NODE is alias of.
@ -1322,7 +1322,7 @@ cgraph_function_or_thunk_node (struct cgraph_node *node,
{ {
struct cgraph_node *n; struct cgraph_node *n;
n = dyn_cast <cgraph_node> (symtab_alias_ultimate_target ((symtab_node)node, n = dyn_cast <cgraph_node> (symtab_alias_ultimate_target (node,
availability)); availability));
if (!n && availability) if (!n && availability)
*availability = AVAIL_NOT_AVAILABLE; *availability = AVAIL_NOT_AVAILABLE;
@ -1338,7 +1338,7 @@ varpool_variable_node (struct varpool_node *node,
{ {
struct varpool_node *n; struct varpool_node *n;
n = dyn_cast <varpool_node> (symtab_alias_ultimate_target ((symtab_node)node, n = dyn_cast <varpool_node> (symtab_alias_ultimate_target (node,
availability)); availability));
if (!n && availability) if (!n && availability)
*availability = AVAIL_NOT_AVAILABLE; *availability = AVAIL_NOT_AVAILABLE;
@ -1351,9 +1351,9 @@ cgraph_edge_recursive_p (struct cgraph_edge *e)
{ {
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
if (e->caller->global.inlined_to) if (e->caller->global.inlined_to)
return e->caller->global.inlined_to->symbol.decl == callee->symbol.decl; return e->caller->global.inlined_to->decl == callee->decl;
else else
return e->caller->symbol.decl == callee->symbol.decl; return e->caller->decl == callee->decl;
} }
/* Return true if the TM_CLONE bit is set for a given FNDECL. */ /* Return true if the TM_CLONE bit is set for a given FNDECL. */
@ -1372,7 +1372,7 @@ decl_is_tm_clone (const_tree fndecl)
static inline void static inline void
cgraph_mark_force_output_node (struct cgraph_node *node) cgraph_mark_force_output_node (struct cgraph_node *node)
{ {
node->symbol.force_output = 1; node->force_output = 1;
gcc_checking_assert (!node->global.inlined_to); gcc_checking_assert (!node->global.inlined_to);
} }
@ -1384,7 +1384,7 @@ symtab_real_symbol_p (symtab_node node)
{ {
struct cgraph_node *cnode; struct cgraph_node *cnode;
if (DECL_ABSTRACT (node->symbol.decl)) if (DECL_ABSTRACT (node->decl))
return false; return false;
if (!is_a <cgraph_node> (node)) if (!is_a <cgraph_node> (node))
return true; return true;
@ -1399,10 +1399,10 @@ symtab_real_symbol_p (symtab_node node)
static inline bool static inline bool
symtab_can_be_discarded (symtab_node node) symtab_can_be_discarded (symtab_node node)
{ {
return (DECL_EXTERNAL (node->symbol.decl) return (DECL_EXTERNAL (node->decl)
|| (DECL_ONE_ONLY (node->symbol.decl) || (DECL_ONE_ONLY (node->decl)
&& node->symbol.resolution != LDPR_PREVAILING_DEF && node->resolution != LDPR_PREVAILING_DEF
&& node->symbol.resolution != LDPR_PREVAILING_DEF_IRONLY && node->resolution != LDPR_PREVAILING_DEF_IRONLY
&& node->symbol.resolution != LDPR_PREVAILING_DEF_IRONLY_EXP)); && node->resolution != LDPR_PREVAILING_DEF_IRONLY_EXP));
} }
#endif /* GCC_CGRAPH_H */ #endif /* GCC_CGRAPH_H */

View File

@ -74,16 +74,16 @@ record_reference (tree *tp, int *walk_subtrees, void *data)
struct cgraph_node *node = cgraph_get_create_real_symbol_node (decl); struct cgraph_node *node = cgraph_get_create_real_symbol_node (decl);
if (!ctx->only_vars) if (!ctx->only_vars)
cgraph_mark_address_taken_node (node); cgraph_mark_address_taken_node (node);
ipa_record_reference ((symtab_node)ctx->varpool_node, ipa_record_reference (ctx->varpool_node,
(symtab_node)node, node,
IPA_REF_ADDR, NULL); IPA_REF_ADDR, NULL);
} }
if (TREE_CODE (decl) == VAR_DECL) if (TREE_CODE (decl) == VAR_DECL)
{ {
struct varpool_node *vnode = varpool_node_for_decl (decl); struct varpool_node *vnode = varpool_node_for_decl (decl);
ipa_record_reference ((symtab_node)ctx->varpool_node, ipa_record_reference (ctx->varpool_node,
(symtab_node)vnode, vnode,
IPA_REF_ADDR, NULL); IPA_REF_ADDR, NULL);
} }
*walk_subtrees = 0; *walk_subtrees = 0;
@ -121,8 +121,8 @@ record_type_list (struct cgraph_node *node, tree list)
if (TREE_CODE (type) == VAR_DECL) if (TREE_CODE (type) == VAR_DECL)
{ {
struct varpool_node *vnode = varpool_node_for_decl (type); struct varpool_node *vnode = varpool_node_for_decl (type);
ipa_record_reference ((symtab_node)node, ipa_record_reference (node,
(symtab_node)vnode, vnode,
IPA_REF_ADDR, NULL); IPA_REF_ADDR, NULL);
} }
} }
@ -137,12 +137,12 @@ record_eh_tables (struct cgraph_node *node, struct function *fun)
{ {
eh_region i; eh_region i;
if (DECL_FUNCTION_PERSONALITY (node->symbol.decl)) if (DECL_FUNCTION_PERSONALITY (node->decl))
{ {
struct cgraph_node *per_node; struct cgraph_node *per_node;
per_node = cgraph_get_create_real_symbol_node (DECL_FUNCTION_PERSONALITY (node->symbol.decl)); per_node = cgraph_get_create_real_symbol_node (DECL_FUNCTION_PERSONALITY (node->decl));
ipa_record_reference ((symtab_node)node, (symtab_node)per_node, IPA_REF_ADDR, NULL); ipa_record_reference (node, per_node, IPA_REF_ADDR, NULL);
cgraph_mark_address_taken_node (per_node); cgraph_mark_address_taken_node (per_node);
} }
@ -224,7 +224,7 @@ mark_address (gimple stmt, tree addr, void *data)
struct cgraph_node *node = cgraph_get_create_real_symbol_node (addr); struct cgraph_node *node = cgraph_get_create_real_symbol_node (addr);
cgraph_mark_address_taken_node (node); cgraph_mark_address_taken_node (node);
ipa_record_reference ((symtab_node)data, ipa_record_reference ((symtab_node)data,
(symtab_node)node, node,
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
else if (addr && TREE_CODE (addr) == VAR_DECL else if (addr && TREE_CODE (addr) == VAR_DECL
@ -233,7 +233,7 @@ mark_address (gimple stmt, tree addr, void *data)
struct varpool_node *vnode = varpool_node_for_decl (addr); struct varpool_node *vnode = varpool_node_for_decl (addr);
ipa_record_reference ((symtab_node)data, ipa_record_reference ((symtab_node)data,
(symtab_node)vnode, vnode,
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
@ -253,7 +253,7 @@ mark_load (gimple stmt, tree t, void *data)
struct cgraph_node *node = cgraph_get_create_real_symbol_node (t); struct cgraph_node *node = cgraph_get_create_real_symbol_node (t);
cgraph_mark_address_taken_node (node); cgraph_mark_address_taken_node (node);
ipa_record_reference ((symtab_node)data, ipa_record_reference ((symtab_node)data,
(symtab_node)node, node,
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
else if (t && TREE_CODE (t) == VAR_DECL else if (t && TREE_CODE (t) == VAR_DECL
@ -262,7 +262,7 @@ mark_load (gimple stmt, tree t, void *data)
struct varpool_node *vnode = varpool_node_for_decl (t); struct varpool_node *vnode = varpool_node_for_decl (t);
ipa_record_reference ((symtab_node)data, ipa_record_reference ((symtab_node)data,
(symtab_node)vnode, vnode,
IPA_REF_LOAD, stmt); IPA_REF_LOAD, stmt);
} }
return false; return false;
@ -280,7 +280,7 @@ mark_store (gimple stmt, tree t, void *data)
struct varpool_node *vnode = varpool_node_for_decl (t); struct varpool_node *vnode = varpool_node_for_decl (t);
ipa_record_reference ((symtab_node)data, ipa_record_reference ((symtab_node)data,
(symtab_node)vnode, vnode,
IPA_REF_STORE, stmt); IPA_REF_STORE, stmt);
} }
return false; return false;
@ -337,21 +337,21 @@ build_cgraph_edges (void)
&& gimple_omp_parallel_child_fn (stmt)) && gimple_omp_parallel_child_fn (stmt))
{ {
tree fn = gimple_omp_parallel_child_fn (stmt); tree fn = gimple_omp_parallel_child_fn (stmt);
ipa_record_reference ((symtab_node)node, ipa_record_reference (node,
(symtab_node)cgraph_get_create_real_symbol_node (fn), cgraph_get_create_real_symbol_node (fn),
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
if (gimple_code (stmt) == GIMPLE_OMP_TASK) if (gimple_code (stmt) == GIMPLE_OMP_TASK)
{ {
tree fn = gimple_omp_task_child_fn (stmt); tree fn = gimple_omp_task_child_fn (stmt);
if (fn) if (fn)
ipa_record_reference ((symtab_node)node, ipa_record_reference (node,
(symtab_node) cgraph_get_create_real_symbol_node (fn), cgraph_get_create_real_symbol_node (fn),
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
fn = gimple_omp_task_copy_fn (stmt); fn = gimple_omp_task_copy_fn (stmt);
if (fn) if (fn)
ipa_record_reference ((symtab_node)node, ipa_record_reference (node,
(symtab_node)cgraph_get_create_real_symbol_node (fn), cgraph_get_create_real_symbol_node (fn),
IPA_REF_ADDR, stmt); IPA_REF_ADDR, stmt);
} }
} }
@ -437,7 +437,7 @@ rebuild_cgraph_edges (void)
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
node->count = ENTRY_BLOCK_PTR->count; node->count = ENTRY_BLOCK_PTR->count;
@ -485,7 +485,7 @@ cgraph_rebuild_references (void)
int i; int i;
/* Keep speculative references for further cgraph edge expansion. */ /* Keep speculative references for further cgraph edge expansion. */
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref);) for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref);)
if (!ref->speculative) if (!ref->speculative)
ipa_remove_reference (ref); ipa_remove_reference (ref);
else else
@ -547,7 +547,7 @@ remove_cgraph_callee_edges (void)
{ {
struct cgraph_node *node = cgraph_get_node (current_function_decl); struct cgraph_node *node = cgraph_get_node (current_function_decl);
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
return 0; return 0;
} }

View File

@ -187,19 +187,19 @@ cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq,
gcov_type count_scale; gcov_type count_scale;
unsigned i; unsigned i;
new_node->symbol.decl = decl; new_node->decl = decl;
symtab_register_node ((symtab_node)new_node); symtab_register_node (new_node);
new_node->origin = n->origin; new_node->origin = n->origin;
new_node->symbol.lto_file_data = n->symbol.lto_file_data; new_node->lto_file_data = n->lto_file_data;
if (new_node->origin) if (new_node->origin)
{ {
new_node->next_nested = new_node->origin->nested; new_node->next_nested = new_node->origin->nested;
new_node->origin->nested = new_node; new_node->origin->nested = new_node;
} }
new_node->symbol.analyzed = n->symbol.analyzed; new_node->analyzed = n->analyzed;
new_node->symbol.definition = n->symbol.definition; new_node->definition = n->definition;
new_node->local = n->local; new_node->local = n->local;
new_node->symbol.externally_visible = false; new_node->externally_visible = false;
new_node->local.local = true; new_node->local.local = true;
new_node->global = n->global; new_node->global = n->global;
new_node->global.inlined_to = new_inlined_to; new_node->global.inlined_to = new_inlined_to;
@ -239,7 +239,7 @@ cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq,
for (e = n->indirect_calls; e; e = e->next_callee) for (e = n->indirect_calls; e; e = e->next_callee)
cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid, cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
count_scale, freq, update_original); count_scale, freq, update_original);
ipa_clone_references ((symtab_node)new_node, &n->symbol.ref_list); ipa_clone_references (new_node, &n->ref_list);
new_node->next_sibling_clone = n->clones; new_node->next_sibling_clone = n->clones;
if (n->clones) if (n->clones)
@ -290,7 +290,7 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
bitmap args_to_skip, bitmap args_to_skip,
const char * suffix) const char * suffix)
{ {
tree old_decl = old_node->symbol.decl; tree old_decl = old_node->decl;
struct cgraph_node *new_node = NULL; struct cgraph_node *new_node = NULL;
tree new_decl; tree new_decl;
size_t len, i; size_t len, i;
@ -336,16 +336,16 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
that is not weak also. that is not weak also.
??? We cannot use COMDAT linkage because there is no ??? We cannot use COMDAT linkage because there is no
ABI support for this. */ ABI support for this. */
DECL_EXTERNAL (new_node->symbol.decl) = 0; DECL_EXTERNAL (new_node->decl) = 0;
if (DECL_ONE_ONLY (old_decl)) if (DECL_ONE_ONLY (old_decl))
DECL_SECTION_NAME (new_node->symbol.decl) = NULL; DECL_SECTION_NAME (new_node->decl) = NULL;
DECL_COMDAT_GROUP (new_node->symbol.decl) = 0; DECL_COMDAT_GROUP (new_node->decl) = 0;
TREE_PUBLIC (new_node->symbol.decl) = 0; TREE_PUBLIC (new_node->decl) = 0;
DECL_COMDAT (new_node->symbol.decl) = 0; DECL_COMDAT (new_node->decl) = 0;
DECL_WEAK (new_node->symbol.decl) = 0; DECL_WEAK (new_node->decl) = 0;
DECL_VIRTUAL_P (new_node->symbol.decl) = 0; DECL_VIRTUAL_P (new_node->decl) = 0;
DECL_STATIC_CONSTRUCTOR (new_node->symbol.decl) = 0; DECL_STATIC_CONSTRUCTOR (new_node->decl) = 0;
DECL_STATIC_DESTRUCTOR (new_node->symbol.decl) = 0; DECL_STATIC_DESTRUCTOR (new_node->decl) = 0;
new_node->clone.tree_map = tree_map; new_node->clone.tree_map = tree_map;
new_node->clone.args_to_skip = args_to_skip; new_node->clone.args_to_skip = args_to_skip;
@ -355,9 +355,9 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
&& !DECL_WEAK (old_decl) && !DECL_WEAK (old_decl)
&& !DECL_COMDAT (old_decl)) && !DECL_COMDAT (old_decl))
|| in_lto_p) || in_lto_p)
new_node->symbol.unique_name = true; new_node->unique_name = true;
FOR_EACH_VEC_SAFE_ELT (tree_map, i, map) FOR_EACH_VEC_SAFE_ELT (tree_map, i, map)
ipa_maybe_record_reference ((symtab_node) new_node, map->new_tree, ipa_maybe_record_reference (new_node, map->new_tree,
IPA_REF_ADDR, NULL); IPA_REF_ADDR, NULL);
if (!args_to_skip) if (!args_to_skip)
new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip; new_node->clone.combined_args_to_skip = old_node->clone.combined_args_to_skip;
@ -369,7 +369,7 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
struct cgraph_node *orig_node; struct cgraph_node *orig_node;
for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of) for (orig_node = old_node; orig_node->clone_of; orig_node = orig_node->clone_of)
; ;
for (arg = DECL_ARGUMENTS (orig_node->symbol.decl); for (arg = DECL_ARGUMENTS (orig_node->decl);
arg; arg = DECL_CHAIN (arg), oldi++) arg; arg = DECL_CHAIN (arg), oldi++)
{ {
if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi)) if (bitmap_bit_p (old_node->clone.combined_args_to_skip, oldi))
@ -385,7 +385,7 @@ cgraph_create_virtual_clone (struct cgraph_node *old_node,
} }
else else
new_node->clone.combined_args_to_skip = args_to_skip; new_node->clone.combined_args_to_skip = args_to_skip;
new_node->symbol.externally_visible = 0; new_node->externally_visible = 0;
new_node->local.local = 1; new_node->local.local = 1;
new_node->lowered = true; new_node->lowered = true;
@ -404,7 +404,7 @@ cgraph_find_replacement_node (struct cgraph_node *node)
for (next_inline_clone = node->clones; for (next_inline_clone = node->clones;
next_inline_clone next_inline_clone
&& next_inline_clone->symbol.decl != node->symbol.decl; && next_inline_clone->decl != node->decl;
next_inline_clone = next_inline_clone->next_sibling_clone) next_inline_clone = next_inline_clone->next_sibling_clone)
; ;
@ -631,8 +631,8 @@ update_call_expr (struct cgraph_node *new_version)
/* Update the call expr on the edges to call the new version. */ /* Update the call expr on the edges to call the new version. */
for (e = new_version->callers; e; e = e->next_caller) for (e = new_version->callers; e; e = e->next_caller)
{ {
struct function *inner_function = DECL_STRUCT_FUNCTION (e->caller->symbol.decl); struct function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
gimple_call_set_fndecl (e->call_stmt, new_version->symbol.decl); gimple_call_set_fndecl (e->call_stmt, new_version->decl);
maybe_clean_eh_stmt_fn (inner_function, e->call_stmt); maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
} }
} }
@ -663,11 +663,11 @@ cgraph_copy_node_for_versioning (struct cgraph_node *old_version,
new_version = cgraph_create_node (new_decl); new_version = cgraph_create_node (new_decl);
new_version->symbol.analyzed = old_version->symbol.analyzed; new_version->analyzed = old_version->analyzed;
new_version->symbol.definition = old_version->symbol.definition; new_version->definition = old_version->definition;
new_version->local = old_version->local; new_version->local = old_version->local;
new_version->symbol.externally_visible = false; new_version->externally_visible = false;
new_version->local.local = new_version->symbol.definition; new_version->local.local = new_version->definition;
new_version->global = old_version->global; new_version->global = old_version->global;
new_version->rtl = old_version->rtl; new_version->rtl = old_version->rtl;
new_version->count = old_version->count; new_version->count = old_version->count;
@ -728,7 +728,7 @@ cgraph_function_versioning (struct cgraph_node *old_version_node,
basic_block new_entry_block, basic_block new_entry_block,
const char *clone_name) const char *clone_name)
{ {
tree old_decl = old_version_node->symbol.decl; tree old_decl = old_version_node->decl;
struct cgraph_node *new_version_node = NULL; struct cgraph_node *new_version_node = NULL;
tree new_decl; tree new_decl;
@ -768,9 +768,9 @@ cgraph_function_versioning (struct cgraph_node *old_version_node,
that is not weak also. that is not weak also.
??? We cannot use COMDAT linkage because there is no ??? We cannot use COMDAT linkage because there is no
ABI support for this. */ ABI support for this. */
symtab_make_decl_local (new_version_node->symbol.decl); symtab_make_decl_local (new_version_node->decl);
DECL_VIRTUAL_P (new_version_node->symbol.decl) = 0; DECL_VIRTUAL_P (new_version_node->decl) = 0;
new_version_node->symbol.externally_visible = 0; new_version_node->externally_visible = 0;
new_version_node->local.local = 1; new_version_node->local.local = 1;
new_version_node->lowered = true; new_version_node->lowered = true;
/* Clones of global symbols or symbols with unique names are unique. */ /* Clones of global symbols or symbols with unique names are unique. */
@ -779,7 +779,7 @@ cgraph_function_versioning (struct cgraph_node *old_version_node,
&& !DECL_WEAK (old_decl) && !DECL_WEAK (old_decl)
&& !DECL_COMDAT (old_decl)) && !DECL_COMDAT (old_decl))
|| in_lto_p) || in_lto_p)
new_version_node->symbol.unique_name = true; new_version_node->unique_name = true;
/* Update the call_expr on the edges to call the new version node. */ /* Update the call_expr on the edges to call the new version node. */
update_call_expr (new_version_node); update_call_expr (new_version_node);
@ -794,18 +794,18 @@ static void
cgraph_materialize_clone (struct cgraph_node *node) cgraph_materialize_clone (struct cgraph_node *node)
{ {
bitmap_obstack_initialize (NULL); bitmap_obstack_initialize (NULL);
node->former_clone_of = node->clone_of->symbol.decl; node->former_clone_of = node->clone_of->decl;
if (node->clone_of->former_clone_of) if (node->clone_of->former_clone_of)
node->former_clone_of = node->clone_of->former_clone_of; node->former_clone_of = node->clone_of->former_clone_of;
/* Copy the OLD_VERSION_NODE function tree to the new version. */ /* Copy the OLD_VERSION_NODE function tree to the new version. */
tree_function_versioning (node->clone_of->symbol.decl, node->symbol.decl, tree_function_versioning (node->clone_of->decl, node->decl,
node->clone.tree_map, true, node->clone.tree_map, true,
node->clone.args_to_skip, false, node->clone.args_to_skip, false,
NULL, NULL); NULL, NULL);
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
dump_function_to_file (node->clone_of->symbol.decl, cgraph_dump_file, dump_flags); dump_function_to_file (node->clone_of->decl, cgraph_dump_file, dump_flags);
dump_function_to_file (node->symbol.decl, cgraph_dump_file, dump_flags); dump_function_to_file (node->decl, cgraph_dump_file, dump_flags);
} }
/* Function is no longer clone. */ /* Function is no longer clone. */
@ -817,11 +817,11 @@ cgraph_materialize_clone (struct cgraph_node *node)
node->clone_of->clones = node->next_sibling_clone; node->clone_of->clones = node->next_sibling_clone;
node->next_sibling_clone = NULL; node->next_sibling_clone = NULL;
node->prev_sibling_clone = NULL; node->prev_sibling_clone = NULL;
if (!node->clone_of->symbol.analyzed && !node->clone_of->clones) if (!node->clone_of->analyzed && !node->clone_of->clones)
{ {
cgraph_release_function_body (node->clone_of); cgraph_release_function_body (node->clone_of);
cgraph_node_remove_callees (node->clone_of); cgraph_node_remove_callees (node->clone_of);
ipa_remove_all_references (&node->clone_of->symbol.ref_list); ipa_remove_all_references (&node->clone_of->ref_list);
} }
node->clone_of = NULL; node->clone_of = NULL;
bitmap_obstack_release (NULL); bitmap_obstack_release (NULL);
@ -854,12 +854,12 @@ cgraph_materialize_all_clones (void)
stabilized = true; stabilized = true;
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
if (node->clone_of && node->symbol.decl != node->clone_of->symbol.decl if (node->clone_of && node->decl != node->clone_of->decl
&& !gimple_has_body_p (node->symbol.decl)) && !gimple_has_body_p (node->decl))
{ {
if (!node->clone_of->clone_of) if (!node->clone_of->clone_of)
cgraph_get_body (node->clone_of); cgraph_get_body (node->clone_of);
if (gimple_has_body_p (node->clone_of->symbol.decl)) if (gimple_has_body_p (node->clone_of->decl))
{ {
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
@ -903,13 +903,13 @@ cgraph_materialize_all_clones (void)
} }
} }
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
if (!node->symbol.analyzed && node->callees) if (!node->analyzed && node->callees)
{ {
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
} }
else else
ipa_clear_stmts_in_references ((symtab_node)node); ipa_clear_stmts_in_references (node);
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, "Materialization Call site updates done.\n"); fprintf (cgraph_dump_file, "Materialization Call site updates done.\n");
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING

View File

@ -227,25 +227,25 @@ static GTY (()) tree vtable_entry_type;
bool bool
decide_is_symbol_needed (symtab_node node) decide_is_symbol_needed (symtab_node node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
/* Double check that no one output the function into assembly file /* Double check that no one output the function into assembly file
early. */ early. */
gcc_checking_assert (!DECL_ASSEMBLER_NAME_SET_P (decl) gcc_checking_assert (!DECL_ASSEMBLER_NAME_SET_P (decl)
|| !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))); || !TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)));
if (!node->symbol.definition) if (!node->definition)
return false; return false;
if (DECL_EXTERNAL (decl)) if (DECL_EXTERNAL (decl))
return false; return false;
/* If the user told us it is used, then it must be so. */ /* If the user told us it is used, then it must be so. */
if (node->symbol.force_output) if (node->force_output)
return true; return true;
/* ABI forced symbols are needed when they are external. */ /* ABI forced symbols are needed when they are external. */
if (node->symbol.forced_by_abi && TREE_PUBLIC (decl)) if (node->forced_by_abi && TREE_PUBLIC (decl))
return true; return true;
/* Keep constructors, destructors and virtual functions. */ /* Keep constructors, destructors and virtual functions. */
@ -271,10 +271,10 @@ static symtab_node first = (symtab_node)(void *)1;
static void static void
enqueue_node (symtab_node node) enqueue_node (symtab_node node)
{ {
if (node->symbol.aux) if (node->aux)
return; return;
gcc_checking_assert (first); gcc_checking_assert (first);
node->symbol.aux = first; node->aux = first;
first = node; first = node;
} }
@ -298,7 +298,7 @@ cgraph_process_new_functions (void)
for (csi = csi_start (cgraph_new_nodes); !csi_end_p (csi); csi_next (&csi)) for (csi = csi_start (cgraph_new_nodes); !csi_end_p (csi); csi_next (&csi))
{ {
node = csi_node (csi); node = csi_node (csi);
fndecl = node->symbol.decl; fndecl = node->decl;
switch (cgraph_state) switch (cgraph_state)
{ {
case CGRAPH_STATE_CONSTRUCTION: case CGRAPH_STATE_CONSTRUCTION:
@ -308,7 +308,7 @@ cgraph_process_new_functions (void)
cgraph_finalize_function (fndecl, false); cgraph_finalize_function (fndecl, false);
output = true; output = true;
cgraph_call_function_insertion_hooks (node); cgraph_call_function_insertion_hooks (node);
enqueue_node ((symtab_node) node); enqueue_node (node);
break; break;
case CGRAPH_STATE_IPA: case CGRAPH_STATE_IPA:
@ -318,7 +318,7 @@ cgraph_process_new_functions (void)
cgraph but not on this function. */ cgraph but not on this function. */
gimple_register_cfg_hooks (); gimple_register_cfg_hooks ();
if (!node->symbol.analyzed) if (!node->analyzed)
analyze_function (node); analyze_function (node);
push_cfun (DECL_STRUCT_FUNCTION (fndecl)); push_cfun (DECL_STRUCT_FUNCTION (fndecl));
if (cgraph_state == CGRAPH_STATE_IPA_SSA if (cgraph_state == CGRAPH_STATE_IPA_SSA
@ -374,14 +374,14 @@ cgraph_reset_node (struct cgraph_node *node)
memset (&node->local, 0, sizeof (node->local)); memset (&node->local, 0, sizeof (node->local));
memset (&node->global, 0, sizeof (node->global)); memset (&node->global, 0, sizeof (node->global));
memset (&node->rtl, 0, sizeof (node->rtl)); memset (&node->rtl, 0, sizeof (node->rtl));
node->symbol.analyzed = false; node->analyzed = false;
node->symbol.definition = false; node->definition = false;
node->symbol.alias = false; node->alias = false;
node->symbol.weakref = false; node->weakref = false;
node->symbol.cpp_implicit_alias = false; node->cpp_implicit_alias = false;
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
} }
/* Return true when there are references to NODE. */ /* Return true when there are references to NODE. */
@ -392,7 +392,7 @@ referred_to_p (symtab_node node)
struct ipa_ref *ref; struct ipa_ref *ref;
/* See if there are any references at all. */ /* See if there are any references at all. */
if (ipa_ref_list_referring_iterate (&node->symbol.ref_list, 0, ref)) if (ipa_ref_list_referring_iterate (&node->ref_list, 0, ref))
return true; return true;
/* For functions check also calls. */ /* For functions check also calls. */
cgraph_node *cn = dyn_cast <cgraph_node> (node); cgraph_node *cn = dyn_cast <cgraph_node> (node);
@ -411,7 +411,7 @@ cgraph_finalize_function (tree decl, bool no_collect)
{ {
struct cgraph_node *node = cgraph_get_create_node (decl); struct cgraph_node *node = cgraph_get_create_node (decl);
if (node->symbol.definition) if (node->definition)
{ {
/* Nested functions should only be defined once. */ /* Nested functions should only be defined once. */
gcc_assert (!DECL_CONTEXT (decl) gcc_assert (!DECL_CONTEXT (decl)
@ -421,7 +421,7 @@ cgraph_finalize_function (tree decl, bool no_collect)
} }
notice_global_symbol (decl); notice_global_symbol (decl);
node->symbol.definition = true; node->definition = true;
node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL; node->lowered = DECL_STRUCT_FUNCTION (decl)->cfg != NULL;
/* With -fkeep-inline-functions we are keeping all inline functions except /* With -fkeep-inline-functions we are keeping all inline functions except
@ -430,7 +430,7 @@ cgraph_finalize_function (tree decl, bool no_collect)
&& DECL_DECLARED_INLINE_P (decl) && DECL_DECLARED_INLINE_P (decl)
&& !DECL_EXTERNAL (decl) && !DECL_EXTERNAL (decl)
&& !DECL_DISREGARD_INLINE_LIMITS (decl)) && !DECL_DISREGARD_INLINE_LIMITS (decl))
node->symbol.force_output = 1; node->force_output = 1;
/* When not optimizing, also output the static functions. (see /* When not optimizing, also output the static functions. (see
PR24561), but don't do so for always_inline functions, functions PR24561), but don't do so for always_inline functions, functions
@ -438,13 +438,13 @@ cgraph_finalize_function (tree decl, bool no_collect)
in the original implementation and it is unclear whether we want in the original implementation and it is unclear whether we want
to change the behavior here. */ to change the behavior here. */
if ((!optimize if ((!optimize
&& !node->symbol.cpp_implicit_alias && !node->cpp_implicit_alias
&& !DECL_DISREGARD_INLINE_LIMITS (decl) && !DECL_DISREGARD_INLINE_LIMITS (decl)
&& !DECL_DECLARED_INLINE_P (decl) && !DECL_DECLARED_INLINE_P (decl)
&& !(DECL_CONTEXT (decl) && !(DECL_CONTEXT (decl)
&& TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL))
&& !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl)) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
node->symbol.force_output = 1; node->force_output = 1;
/* If we've not yet emitted decl, tell the debug info about it. */ /* If we've not yet emitted decl, tell the debug info about it. */
if (!TREE_ASM_WRITTEN (decl)) if (!TREE_ASM_WRITTEN (decl))
@ -458,9 +458,9 @@ cgraph_finalize_function (tree decl, bool no_collect)
ggc_collect (); ggc_collect ();
if (cgraph_state == CGRAPH_STATE_CONSTRUCTION if (cgraph_state == CGRAPH_STATE_CONSTRUCTION
&& (decide_is_symbol_needed ((symtab_node) node) && (decide_is_symbol_needed (node)
|| referred_to_p ((symtab_node)node))) || referred_to_p (node)))
enqueue_node ((symtab_node)node); enqueue_node (node);
} }
/* Add the function FNDECL to the call graph. /* Add the function FNDECL to the call graph.
@ -502,8 +502,8 @@ cgraph_add_new_function (tree fndecl, bool lowered)
analyzing and compilation. */ analyzing and compilation. */
node = cgraph_get_create_node (fndecl); node = cgraph_get_create_node (fndecl);
node->local.local = false; node->local.local = false;
node->symbol.definition = true; node->definition = true;
node->symbol.force_output = true; node->force_output = true;
if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION) if (!lowered && cgraph_state == CGRAPH_STATE_EXPANSION)
{ {
push_cfun (DECL_STRUCT_FUNCTION (fndecl)); push_cfun (DECL_STRUCT_FUNCTION (fndecl));
@ -529,7 +529,7 @@ cgraph_add_new_function (tree fndecl, bool lowered)
node = cgraph_create_node (fndecl); node = cgraph_create_node (fndecl);
if (lowered) if (lowered)
node->lowered = true; node->lowered = true;
node->symbol.definition = true; node->definition = true;
analyze_function (node); analyze_function (node);
push_cfun (DECL_STRUCT_FUNCTION (fndecl)); push_cfun (DECL_STRUCT_FUNCTION (fndecl));
gimple_register_cfg_hooks (); gimple_register_cfg_hooks ();
@ -590,7 +590,7 @@ output_asm_statements (void)
static void static void
analyze_function (struct cgraph_node *node) analyze_function (struct cgraph_node *node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
location_t saved_loc = input_location; location_t saved_loc = input_location;
input_location = DECL_SOURCE_LOCATION (decl); input_location = DECL_SOURCE_LOCATION (decl);
@ -601,14 +601,14 @@ analyze_function (struct cgraph_node *node)
if (!expand_thunk (node, false)) if (!expand_thunk (node, false))
{ {
node->thunk.alias = NULL; node->thunk.alias = NULL;
node->symbol.analyzed = true; node->analyzed = true;
return; return;
} }
node->thunk.alias = NULL; node->thunk.alias = NULL;
} }
if (node->symbol.alias) if (node->alias)
symtab_resolve_alias symtab_resolve_alias
((symtab_node) node, (symtab_node) cgraph_get_node (node->symbol.alias_target)); (node, cgraph_get_node (node->alias_target));
else if (node->dispatcher_function) else if (node->dispatcher_function)
{ {
/* Generate the dispatcher body of multi-versioned functions. */ /* Generate the dispatcher body of multi-versioned functions. */
@ -628,7 +628,7 @@ analyze_function (struct cgraph_node *node)
{ {
push_cfun (DECL_STRUCT_FUNCTION (decl)); push_cfun (DECL_STRUCT_FUNCTION (decl));
assign_assembler_name_if_neeeded (node->symbol.decl); assign_assembler_name_if_neeeded (node->decl);
/* Make sure to gimplify bodies only once. During analyzing a /* Make sure to gimplify bodies only once. During analyzing a
function we lower it, which will require gimplified nested function we lower it, which will require gimplified nested
@ -642,7 +642,7 @@ analyze_function (struct cgraph_node *node)
if (!node->lowered) if (!node->lowered)
{ {
if (node->nested) if (node->nested)
lower_nested_functions (node->symbol.decl); lower_nested_functions (node->decl);
gcc_assert (!node->nested); gcc_assert (!node->nested);
gimple_register_cfg_hooks (); gimple_register_cfg_hooks ();
@ -657,7 +657,7 @@ analyze_function (struct cgraph_node *node)
pop_cfun (); pop_cfun ();
} }
node->symbol.analyzed = true; node->analyzed = true;
input_location = saved_loc; input_location = saved_loc;
} }
@ -673,12 +673,12 @@ cgraph_process_same_body_aliases (void)
{ {
symtab_node node; symtab_node node;
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (node->symbol.cpp_implicit_alias && !node->symbol.analyzed) if (node->cpp_implicit_alias && !node->analyzed)
symtab_resolve_alias symtab_resolve_alias
(node, (node,
TREE_CODE (node->symbol.alias_target) == VAR_DECL TREE_CODE (node->alias_target) == VAR_DECL
? (symtab_node)varpool_node_for_decl (node->symbol.alias_target) ? (symtab_node)varpool_node_for_decl (node->alias_target)
: (symtab_node)cgraph_get_create_node (node->symbol.alias_target)); : (symtab_node)cgraph_get_create_node (node->alias_target));
cpp_implicit_aliases_done = true; cpp_implicit_aliases_done = true;
} }
@ -734,20 +734,20 @@ process_function_and_variable_attributes (struct cgraph_node *first,
for (node = cgraph_first_function (); node != first; for (node = cgraph_first_function (); node != first;
node = cgraph_next_function (node)) node = cgraph_next_function (node))
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
if (DECL_PRESERVE_P (decl)) if (DECL_PRESERVE_P (decl))
cgraph_mark_force_output_node (node); cgraph_mark_force_output_node (node);
else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl))) else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{ {
if (! TREE_PUBLIC (node->symbol.decl)) if (! TREE_PUBLIC (node->decl))
warning_at (DECL_SOURCE_LOCATION (node->symbol.decl), OPT_Wattributes, warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
"%<externally_visible%>" "%<externally_visible%>"
" attribute have effect only on public objects"); " attribute have effect only on public objects");
} }
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
&& (node->symbol.definition && !node->symbol.alias)) && (node->definition && !node->alias))
{ {
warning_at (DECL_SOURCE_LOCATION (node->symbol.decl), OPT_Wattributes, warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
"%<weakref%> attribute ignored" "%<weakref%> attribute ignored"
" because function is defined"); " because function is defined");
DECL_WEAK (decl) = 0; DECL_WEAK (decl) = 0;
@ -767,24 +767,24 @@ process_function_and_variable_attributes (struct cgraph_node *first,
for (vnode = varpool_first_variable (); vnode != first_var; for (vnode = varpool_first_variable (); vnode != first_var;
vnode = varpool_next_variable (vnode)) vnode = varpool_next_variable (vnode))
{ {
tree decl = vnode->symbol.decl; tree decl = vnode->decl;
if (DECL_EXTERNAL (decl) if (DECL_EXTERNAL (decl)
&& DECL_INITIAL (decl)) && DECL_INITIAL (decl))
varpool_finalize_decl (decl); varpool_finalize_decl (decl);
if (DECL_PRESERVE_P (decl)) if (DECL_PRESERVE_P (decl))
vnode->symbol.force_output = true; vnode->force_output = true;
else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl))) else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{ {
if (! TREE_PUBLIC (vnode->symbol.decl)) if (! TREE_PUBLIC (vnode->decl))
warning_at (DECL_SOURCE_LOCATION (vnode->symbol.decl), OPT_Wattributes, warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
"%<externally_visible%>" "%<externally_visible%>"
" attribute have effect only on public objects"); " attribute have effect only on public objects");
} }
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
&& vnode->symbol.definition && vnode->definition
&& DECL_INITIAL (decl)) && DECL_INITIAL (decl))
{ {
warning_at (DECL_SOURCE_LOCATION (vnode->symbol.decl), OPT_Wattributes, warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
"%<weakref%> attribute ignored" "%<weakref%> attribute ignored"
" because variable is initialized"); " because variable is initialized");
DECL_WEAK (decl) = 0; DECL_WEAK (decl) = 0;
@ -806,21 +806,21 @@ varpool_finalize_decl (tree decl)
gcc_assert (TREE_STATIC (decl) || DECL_EXTERNAL (decl)); gcc_assert (TREE_STATIC (decl) || DECL_EXTERNAL (decl));
if (node->symbol.definition) if (node->definition)
return; return;
notice_global_symbol (decl); notice_global_symbol (decl);
node->symbol.definition = true; node->definition = true;
if (TREE_THIS_VOLATILE (decl) || DECL_PRESERVE_P (decl) if (TREE_THIS_VOLATILE (decl) || DECL_PRESERVE_P (decl)
/* Traditionally we do not eliminate static variables when not /* Traditionally we do not eliminate static variables when not
optimizing and when not doing toplevel reoder. */ optimizing and when not doing toplevel reoder. */
|| (!flag_toplevel_reorder && !DECL_COMDAT (node->symbol.decl) || (!flag_toplevel_reorder && !DECL_COMDAT (node->decl)
&& !DECL_ARTIFICIAL (node->symbol.decl))) && !DECL_ARTIFICIAL (node->decl)))
node->symbol.force_output = true; node->force_output = true;
if (cgraph_state == CGRAPH_STATE_CONSTRUCTION if (cgraph_state == CGRAPH_STATE_CONSTRUCTION
&& (decide_is_symbol_needed ((symtab_node) node) && (decide_is_symbol_needed (node)
|| referred_to_p ((symtab_node)node))) || referred_to_p (node)))
enqueue_node ((symtab_node)node); enqueue_node (node);
if (cgraph_state >= CGRAPH_STATE_IPA_SSA) if (cgraph_state >= CGRAPH_STATE_IPA_SSA)
varpool_analyze_node (node); varpool_analyze_node (node);
/* Some frontends produce various interface variables after compilation /* Some frontends produce various interface variables after compilation
@ -857,14 +857,14 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
/* Do not bother to mark virtual methods in anonymous namespace; /* Do not bother to mark virtual methods in anonymous namespace;
either we will find use of virtual table defining it, or it is either we will find use of virtual table defining it, or it is
unused. */ unused. */
if (targets[i]->symbol.definition if (targets[i]->definition
&& TREE_CODE && TREE_CODE
(TREE_TYPE (targets[i]->symbol.decl)) (TREE_TYPE (targets[i]->decl))
== METHOD_TYPE == METHOD_TYPE
&& !type_in_anonymous_namespace_p && !type_in_anonymous_namespace_p
(method_class_type (method_class_type
(TREE_TYPE (targets[i]->symbol.decl)))) (TREE_TYPE (targets[i]->decl))))
enqueue_node ((symtab_node) targets[i]); enqueue_node (targets[i]);
} }
} }
@ -934,7 +934,7 @@ analyze_functions (void)
C++ FE is confused about the COMDAT groups being right. */ C++ FE is confused about the COMDAT groups being right. */
if (cpp_implicit_aliases_done) if (cpp_implicit_aliases_done)
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (node->symbol.cpp_implicit_alias) if (node->cpp_implicit_alias)
fixup_same_cpp_alias_visibility (node, symtab_alias_target (node)); fixup_same_cpp_alias_visibility (node, symtab_alias_target (node));
if (optimize && flag_devirtualize) if (optimize && flag_devirtualize)
build_type_inheritance_graph (); build_type_inheritance_graph ();
@ -949,8 +949,8 @@ analyze_functions (void)
/* First identify the trivially needed symbols. */ /* First identify the trivially needed symbols. */
for (node = symtab_nodes; for (node = symtab_nodes;
node != (symtab_node)first_analyzed node != first_analyzed
&& node != (symtab_node)first_analyzed_var; node = node->symbol.next) && node != first_analyzed_var; node = node->next)
{ {
if (decide_is_symbol_needed (node)) if (decide_is_symbol_needed (node))
{ {
@ -963,8 +963,8 @@ analyze_functions (void)
if (!changed && cgraph_dump_file) if (!changed && cgraph_dump_file)
fprintf (cgraph_dump_file, "\n"); fprintf (cgraph_dump_file, "\n");
} }
if (node == (symtab_node)first_analyzed if (node == first_analyzed
|| node == (symtab_node)first_analyzed_var) || node == first_analyzed_var)
break; break;
} }
cgraph_process_new_functions (); cgraph_process_new_functions ();
@ -980,18 +980,18 @@ analyze_functions (void)
{ {
changed = true; changed = true;
node = first; node = first;
first = (symtab_node)first->symbol.aux; first = (symtab_node)first->aux;
cgraph_node *cnode = dyn_cast <cgraph_node> (node); cgraph_node *cnode = dyn_cast <cgraph_node> (node);
if (cnode && cnode->symbol.definition) if (cnode && cnode->definition)
{ {
struct cgraph_edge *edge; struct cgraph_edge *edge;
tree decl = cnode->symbol.decl; tree decl = cnode->decl;
/* ??? It is possible to create extern inline function /* ??? It is possible to create extern inline function
and later using weak alias attribute to kill its body. and later using weak alias attribute to kill its body.
See gcc.c-torture/compile/20011119-1.c */ See gcc.c-torture/compile/20011119-1.c */
if (!DECL_STRUCT_FUNCTION (decl) if (!DECL_STRUCT_FUNCTION (decl)
&& !cnode->symbol.alias && !cnode->alias
&& !cnode->thunk.thunk_p && !cnode->thunk.thunk_p
&& !cnode->dispatcher_function) && !cnode->dispatcher_function)
{ {
@ -1000,12 +1000,12 @@ analyze_functions (void)
continue; continue;
} }
if (!cnode->symbol.analyzed) if (!cnode->analyzed)
analyze_function (cnode); analyze_function (cnode);
for (edge = cnode->callees; edge; edge = edge->next_callee) for (edge = cnode->callees; edge; edge = edge->next_callee)
if (edge->callee->symbol.definition) if (edge->callee->definition)
enqueue_node ((symtab_node)edge->callee); enqueue_node (edge->callee);
if (optimize && flag_devirtualize) if (optimize && flag_devirtualize)
{ {
struct cgraph_edge *next; struct cgraph_edge *next;
@ -1033,20 +1033,20 @@ analyze_functions (void)
else else
{ {
varpool_node *vnode = dyn_cast <varpool_node> (node); varpool_node *vnode = dyn_cast <varpool_node> (node);
if (vnode && vnode->symbol.definition && !vnode->symbol.analyzed) if (vnode && vnode->definition && !vnode->analyzed)
varpool_analyze_node (vnode); varpool_analyze_node (vnode);
} }
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node next; symtab_node next;
for (next = node->symbol.same_comdat_group; for (next = node->same_comdat_group;
next != node; next != node;
next = next->symbol.same_comdat_group) next = next->same_comdat_group)
enqueue_node (next); enqueue_node (next);
} }
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
if (ref->referred->symbol.definition) if (ref->referred->definition)
enqueue_node (ref->referred); enqueue_node (ref->referred);
cgraph_process_new_functions (); cgraph_process_new_functions ();
} }
@ -1065,11 +1065,11 @@ analyze_functions (void)
fprintf (cgraph_dump_file, "\nRemoving unused symbols:"); fprintf (cgraph_dump_file, "\nRemoving unused symbols:");
for (node = symtab_nodes; for (node = symtab_nodes;
node != (symtab_node)first_handled node != first_handled
&& node != (symtab_node)first_handled_var; node = next) && node != first_handled_var; node = next)
{ {
next = node->symbol.next; next = node->next;
if (!node->symbol.aux && !referred_to_p (node)) if (!node->aux && !referred_to_p (node))
{ {
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, " %s", symtab_node_name (node)); fprintf (cgraph_dump_file, " %s", symtab_node_name (node));
@ -1078,22 +1078,22 @@ analyze_functions (void)
} }
if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
if (cnode->symbol.definition && !gimple_has_body_p (decl) if (cnode->definition && !gimple_has_body_p (decl)
&& !cnode->symbol.alias && !cnode->alias
&& !cnode->thunk.thunk_p) && !cnode->thunk.thunk_p)
cgraph_reset_node (cnode); cgraph_reset_node (cnode);
gcc_assert (!cnode->symbol.definition || cnode->thunk.thunk_p gcc_assert (!cnode->definition || cnode->thunk.thunk_p
|| cnode->symbol.alias || cnode->alias
|| gimple_has_body_p (decl)); || gimple_has_body_p (decl));
gcc_assert (cnode->symbol.analyzed == cnode->symbol.definition); gcc_assert (cnode->analyzed == cnode->definition);
} }
node->symbol.aux = NULL; node->aux = NULL;
} }
for (;node; node = node->symbol.next) for (;node; node = node->next)
node->symbol.aux = NULL; node->aux = NULL;
first_analyzed = cgraph_first_function (); first_analyzed = cgraph_first_function ();
first_analyzed_var = varpool_first_variable (); first_analyzed_var = varpool_first_variable ();
if (cgraph_dump_file) if (cgraph_dump_file)
@ -1136,9 +1136,9 @@ handle_alias_pairs (void)
symtab_node node = symtab_get_node (p->decl); symtab_node node = symtab_get_node (p->decl);
if (node) if (node)
{ {
node->symbol.alias_target = p->target; node->alias_target = p->target;
node->symbol.weakref = true; node->weakref = true;
node->symbol.alias = true; node->alias = true;
} }
alias_pairs->unordered_remove (i); alias_pairs->unordered_remove (i);
continue; continue;
@ -1148,17 +1148,17 @@ handle_alias_pairs (void)
error ("%q+D aliased to undefined symbol %qE", p->decl, p->target); error ("%q+D aliased to undefined symbol %qE", p->decl, p->target);
symtab_node node = symtab_get_node (p->decl); symtab_node node = symtab_get_node (p->decl);
if (node) if (node)
node->symbol.alias = false; node->alias = false;
alias_pairs->unordered_remove (i); alias_pairs->unordered_remove (i);
continue; continue;
} }
if (DECL_EXTERNAL (target_node->symbol.decl) if (DECL_EXTERNAL (target_node->decl)
/* We use local aliases for C++ thunks to force the tailcall /* We use local aliases for C++ thunks to force the tailcall
to bind locally. This is a hack - to keep it working do to bind locally. This is a hack - to keep it working do
the following (which is not strictly correct). */ the following (which is not strictly correct). */
&& (! TREE_CODE (target_node->symbol.decl) == FUNCTION_DECL && (! TREE_CODE (target_node->decl) == FUNCTION_DECL
|| ! DECL_VIRTUAL_P (target_node->symbol.decl)) || ! DECL_VIRTUAL_P (target_node->decl))
&& ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))) && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl)))
{ {
error ("%q+D aliased to external symbol %qE", error ("%q+D aliased to external symbol %qE",
@ -1169,15 +1169,15 @@ handle_alias_pairs (void)
&& target_node && is_a <cgraph_node> (target_node)) && target_node && is_a <cgraph_node> (target_node))
{ {
struct cgraph_node *src_node = cgraph_get_node (p->decl); struct cgraph_node *src_node = cgraph_get_node (p->decl);
if (src_node && src_node->symbol.definition) if (src_node && src_node->definition)
cgraph_reset_node (src_node); cgraph_reset_node (src_node);
cgraph_create_function_alias (p->decl, target_node->symbol.decl); cgraph_create_function_alias (p->decl, target_node->decl);
alias_pairs->unordered_remove (i); alias_pairs->unordered_remove (i);
} }
else if (TREE_CODE (p->decl) == VAR_DECL else if (TREE_CODE (p->decl) == VAR_DECL
&& target_node && is_a <varpool_node> (target_node)) && target_node && is_a <varpool_node> (target_node))
{ {
varpool_create_variable_alias (p->decl, target_node->symbol.decl); varpool_create_variable_alias (p->decl, target_node->decl);
alias_pairs->unordered_remove (i); alias_pairs->unordered_remove (i);
} }
else else
@ -1185,7 +1185,7 @@ handle_alias_pairs (void)
error ("%q+D alias in between function and variable is not supported", error ("%q+D alias in between function and variable is not supported",
p->decl); p->decl);
warning (0, "%q+D aliased declaration", warning (0, "%q+D aliased declaration",
target_node->symbol.decl); target_node->decl);
alias_pairs->unordered_remove (i); alias_pairs->unordered_remove (i);
} }
} }
@ -1208,34 +1208,34 @@ mark_functions_to_output (void)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
gcc_assert (!node->process || node->symbol.same_comdat_group); gcc_assert (!node->process || node->same_comdat_group);
if (node->process) if (node->process)
continue; continue;
/* We need to output all local functions that are used and not /* We need to output all local functions that are used and not
always inlined, as well as those that are reachable from always inlined, as well as those that are reachable from
outside the current compilation unit. */ outside the current compilation unit. */
if (node->symbol.analyzed if (node->analyzed
&& !node->thunk.thunk_p && !node->thunk.thunk_p
&& !node->symbol.alias && !node->alias
&& !node->global.inlined_to && !node->global.inlined_to
&& !TREE_ASM_WRITTEN (decl) && !TREE_ASM_WRITTEN (decl)
&& !DECL_EXTERNAL (decl)) && !DECL_EXTERNAL (decl))
{ {
node->process = 1; node->process = 1;
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
struct cgraph_node *next; struct cgraph_node *next;
for (next = cgraph (node->symbol.same_comdat_group); for (next = cgraph (node->same_comdat_group);
next != node; next != node;
next = cgraph (next->symbol.same_comdat_group)) next = cgraph (next->same_comdat_group))
if (!next->thunk.thunk_p && !next->symbol.alias) if (!next->thunk.thunk_p && !next->alias)
next->process = 1; next->process = 1;
} }
} }
else if (node->symbol.same_comdat_group) else if (node->same_comdat_group)
{ {
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
check_same_comdat_groups = true; check_same_comdat_groups = true;
@ -1250,8 +1250,8 @@ mark_functions_to_output (void)
/* FIXME: in ltrans unit when offline copy is outside partition but inline copies /* FIXME: in ltrans unit when offline copy is outside partition but inline copies
are inside partition, we can end up not removing the body since we no longer are inside partition, we can end up not removing the body since we no longer
have analyzed node pointing to it. */ have analyzed node pointing to it. */
&& !node->symbol.in_other_partition && !node->in_other_partition
&& !node->symbol.alias && !node->alias
&& !node->clones && !node->clones
&& !DECL_EXTERNAL (decl)) && !DECL_EXTERNAL (decl))
{ {
@ -1261,7 +1261,7 @@ mark_functions_to_output (void)
#endif #endif
gcc_assert (node->global.inlined_to gcc_assert (node->global.inlined_to
|| !gimple_has_body_p (decl) || !gimple_has_body_p (decl)
|| node->symbol.in_other_partition || node->in_other_partition
|| node->clones || node->clones
|| DECL_ARTIFICIAL (decl) || DECL_ARTIFICIAL (decl)
|| DECL_EXTERNAL (decl)); || DECL_EXTERNAL (decl));
@ -1272,16 +1272,16 @@ mark_functions_to_output (void)
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
if (check_same_comdat_groups) if (check_same_comdat_groups)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
if (node->symbol.same_comdat_group && !node->process) if (node->same_comdat_group && !node->process)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
if (!node->global.inlined_to if (!node->global.inlined_to
&& gimple_has_body_p (decl) && gimple_has_body_p (decl)
/* FIXME: in an ltrans unit when the offline copy is outside a /* FIXME: in an ltrans unit when the offline copy is outside a
partition but inline copies are inside a partition, we can partition but inline copies are inside a partition, we can
end up not removing the body since we no longer have an end up not removing the body since we no longer have an
analyzed node pointing to it. */ analyzed node pointing to it. */
&& !node->symbol.in_other_partition && !node->in_other_partition
&& !node->clones && !node->clones
&& !DECL_EXTERNAL (decl)) && !DECL_EXTERNAL (decl))
{ {
@ -1451,8 +1451,8 @@ expand_thunk (struct cgraph_node *node, bool output_asm_thunks)
HOST_WIDE_INT fixed_offset = node->thunk.fixed_offset; HOST_WIDE_INT fixed_offset = node->thunk.fixed_offset;
HOST_WIDE_INT virtual_value = node->thunk.virtual_value; HOST_WIDE_INT virtual_value = node->thunk.virtual_value;
tree virtual_offset = NULL; tree virtual_offset = NULL;
tree alias = node->callees->callee->symbol.decl; tree alias = node->callees->callee->decl;
tree thunk_fndecl = node->symbol.decl; tree thunk_fndecl = node->decl;
tree a; tree a;
@ -1504,7 +1504,7 @@ expand_thunk (struct cgraph_node *node, bool output_asm_thunks)
set_cfun (NULL); set_cfun (NULL);
TREE_ASM_WRITTEN (thunk_fndecl) = 1; TREE_ASM_WRITTEN (thunk_fndecl) = 1;
node->thunk.thunk_p = false; node->thunk.thunk_p = false;
node->symbol.analyzed = false; node->analyzed = false;
} }
else else
{ {
@ -1690,20 +1690,20 @@ assemble_thunks_and_aliases (struct cgraph_node *node)
} }
else else
e = e->next_caller; e = e->next_caller;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
struct cgraph_node *alias = ipa_ref_referring_node (ref); struct cgraph_node *alias = ipa_ref_referring_node (ref);
bool saved_written = TREE_ASM_WRITTEN (node->symbol.decl); bool saved_written = TREE_ASM_WRITTEN (node->decl);
/* Force assemble_alias to really output the alias this time instead /* Force assemble_alias to really output the alias this time instead
of buffering it in same alias pairs. */ of buffering it in same alias pairs. */
TREE_ASM_WRITTEN (node->symbol.decl) = 1; TREE_ASM_WRITTEN (node->decl) = 1;
do_assemble_alias (alias->symbol.decl, do_assemble_alias (alias->decl,
DECL_ASSEMBLER_NAME (node->symbol.decl)); DECL_ASSEMBLER_NAME (node->decl));
assemble_thunks_and_aliases (alias); assemble_thunks_and_aliases (alias);
TREE_ASM_WRITTEN (node->symbol.decl) = saved_written; TREE_ASM_WRITTEN (node->decl) = saved_written;
} }
} }
@ -1712,7 +1712,7 @@ assemble_thunks_and_aliases (struct cgraph_node *node)
static void static void
expand_function (struct cgraph_node *node) expand_function (struct cgraph_node *node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
location_t saved_loc; location_t saved_loc;
/* We ought to not compile any inline clones. */ /* We ought to not compile any inline clones. */
@ -1817,7 +1817,7 @@ expand_function (struct cgraph_node *node)
/* Eliminate all call edges. This is important so the GIMPLE_CALL no longer /* Eliminate all call edges. This is important so the GIMPLE_CALL no longer
points to the dead function body. */ points to the dead function body. */
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
} }
@ -1905,9 +1905,9 @@ output_in_order (void)
FOR_EACH_DEFINED_FUNCTION (pf) FOR_EACH_DEFINED_FUNCTION (pf)
{ {
if (pf->process && !pf->thunk.thunk_p && !pf->symbol.alias) if (pf->process && !pf->thunk.thunk_p && !pf->alias)
{ {
i = pf->symbol.order; i = pf->order;
gcc_assert (nodes[i].kind == ORDER_UNDEFINED); gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
nodes[i].kind = ORDER_FUNCTION; nodes[i].kind = ORDER_FUNCTION;
nodes[i].u.f = pf; nodes[i].u.f = pf;
@ -1915,9 +1915,9 @@ output_in_order (void)
} }
FOR_EACH_DEFINED_VARIABLE (pv) FOR_EACH_DEFINED_VARIABLE (pv)
if (!DECL_EXTERNAL (pv->symbol.decl)) if (!DECL_EXTERNAL (pv->decl))
{ {
i = pv->symbol.order; i = pv->order;
gcc_assert (nodes[i].kind == ORDER_UNDEFINED); gcc_assert (nodes[i].kind == ORDER_UNDEFINED);
nodes[i].kind = ORDER_VAR; nodes[i].kind = ORDER_VAR;
nodes[i].u.v = pv; nodes[i].u.v = pv;
@ -2050,9 +2050,9 @@ output_weakrefs (void)
{ {
symtab_node node; symtab_node node;
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (node->symbol.alias if (node->alias
&& !TREE_ASM_WRITTEN (node->symbol.decl) && !TREE_ASM_WRITTEN (node->decl)
&& node->symbol.weakref) && node->weakref)
{ {
tree target; tree target;
@ -2061,18 +2061,18 @@ output_weakrefs (void)
alias. alias.
When alias target is defined, we need to fetch it from symtab reference, When alias target is defined, we need to fetch it from symtab reference,
otherwise it is pointed to by alias_target. */ otherwise it is pointed to by alias_target. */
if (node->symbol.alias_target) if (node->alias_target)
target = (DECL_P (node->symbol.alias_target) target = (DECL_P (node->alias_target)
? DECL_ASSEMBLER_NAME (node->symbol.alias_target) ? DECL_ASSEMBLER_NAME (node->alias_target)
: node->symbol.alias_target); : node->alias_target);
else if (node->symbol.analyzed) else if (node->analyzed)
target = DECL_ASSEMBLER_NAME (symtab_alias_target (node)->symbol.decl); target = DECL_ASSEMBLER_NAME (symtab_alias_target (node)->decl);
else else
{ {
gcc_unreachable (); gcc_unreachable ();
target = get_alias_symbol (node->symbol.decl); target = get_alias_symbol (node->decl);
} }
do_assemble_alias (node->symbol.decl, target); do_assemble_alias (node->decl, target);
} }
} }
@ -2173,14 +2173,14 @@ compile (void)
symtab_node node; symtab_node node;
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (node->symbol.alias if (node->alias
&& lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl))) && lookup_attribute ("weakref", DECL_ATTRIBUTES (node->decl)))
{ {
IDENTIFIER_TRANSPARENT_ALIAS IDENTIFIER_TRANSPARENT_ALIAS
(DECL_ASSEMBLER_NAME (node->symbol.decl)) = 1; (DECL_ASSEMBLER_NAME (node->decl)) = 1;
TREE_CHAIN (DECL_ASSEMBLER_NAME (node->symbol.decl)) TREE_CHAIN (DECL_ASSEMBLER_NAME (node->decl))
= (node->symbol.alias_target ? node->symbol.alias_target = (node->alias_target ? node->alias_target
: DECL_ASSEMBLER_NAME (symtab_alias_target (node)->symbol.decl)); : DECL_ASSEMBLER_NAME (symtab_alias_target (node)->decl));
} }
#endif #endif
@ -2215,7 +2215,7 @@ compile (void)
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (node->global.inlined_to if (node->global.inlined_to
|| gimple_has_body_p (node->symbol.decl)) || gimple_has_body_p (node->decl))
{ {
error_found = true; error_found = true;
dump_cgraph_node (stderr, node); dump_cgraph_node (stderr, node);

View File

@ -30154,7 +30154,7 @@ ix86_get_function_versions_dispatcher (void *decl)
while (default_version_info != NULL) while (default_version_info != NULL)
{ {
if (is_function_default_version if (is_function_default_version
(default_version_info->this_node->symbol.decl)) (default_version_info->this_node->decl))
break; break;
default_version_info = default_version_info->next; default_version_info = default_version_info->next;
} }
@ -30184,7 +30184,7 @@ ix86_get_function_versions_dispatcher (void *decl)
struct cgraph_function_version_info *dispatcher_version_info = NULL; struct cgraph_function_version_info *dispatcher_version_info = NULL;
/* Right now, the dispatching is done via ifunc. */ /* Right now, the dispatching is done via ifunc. */
dispatch_decl = make_dispatcher_decl (default_node->symbol.decl); dispatch_decl = make_dispatcher_decl (default_node->decl);
dispatcher_node = cgraph_get_create_node (dispatch_decl); dispatcher_node = cgraph_get_create_node (dispatch_decl);
gcc_assert (dispatcher_node != NULL); gcc_assert (dispatcher_node != NULL);
@ -30192,7 +30192,7 @@ ix86_get_function_versions_dispatcher (void *decl)
dispatcher_version_info dispatcher_version_info
= insert_new_cgraph_node_version (dispatcher_node); = insert_new_cgraph_node_version (dispatcher_node);
dispatcher_version_info->next = default_version_info; dispatcher_version_info->next = default_version_info;
dispatcher_node->symbol.definition = 1; dispatcher_node->definition = 1;
/* Set the dispatcher for all the versions. */ /* Set the dispatcher for all the versions. */
it_v = default_version_info; it_v = default_version_info;
@ -30205,7 +30205,7 @@ ix86_get_function_versions_dispatcher (void *decl)
else else
#endif #endif
{ {
error_at (DECL_SOURCE_LOCATION (default_node->symbol.decl), error_at (DECL_SOURCE_LOCATION (default_node->decl),
"multiversioning needs ifunc which is not supported " "multiversioning needs ifunc which is not supported "
"on this target"); "on this target");
} }
@ -30344,13 +30344,13 @@ ix86_generate_version_dispatcher_body (void *node_p)
return node_version_info->dispatcher_resolver; return node_version_info->dispatcher_resolver;
/* The first version in the chain corresponds to the default version. */ /* The first version in the chain corresponds to the default version. */
default_ver_decl = node_version_info->next->this_node->symbol.decl; default_ver_decl = node_version_info->next->this_node->decl;
/* node is going to be an alias, so remove the finalized bit. */ /* node is going to be an alias, so remove the finalized bit. */
node->symbol.definition = false; node->definition = false;
resolver_decl = make_resolver_func (default_ver_decl, resolver_decl = make_resolver_func (default_ver_decl,
node->symbol.decl, &empty_bb); node->decl, &empty_bb);
node_version_info->dispatcher_resolver = resolver_decl; node_version_info->dispatcher_resolver = resolver_decl;
@ -30367,10 +30367,10 @@ ix86_generate_version_dispatcher_body (void *node_p)
not. This happens for methods in derived classes that override not. This happens for methods in derived classes that override
virtual methods in base classes but are not explicitly marked as virtual methods in base classes but are not explicitly marked as
virtual. */ virtual. */
if (DECL_VINDEX (versn->symbol.decl)) if (DECL_VINDEX (versn->decl))
sorry ("Virtual function multiversioning not supported"); sorry ("Virtual function multiversioning not supported");
fn_ver_vec.safe_push (versn->symbol.decl); fn_ver_vec.safe_push (versn->decl);
} }
dispatch_function_versions (resolver_decl, &fn_ver_vec, &empty_bb); dispatch_function_versions (resolver_decl, &fn_ver_vec, &empty_bb);

View File

@ -554,12 +554,12 @@ unsigned
coverage_compute_profile_id (struct cgraph_node *n) coverage_compute_profile_id (struct cgraph_node *n)
{ {
expanded_location xloc expanded_location xloc
= expand_location (DECL_SOURCE_LOCATION (n->symbol.decl)); = expand_location (DECL_SOURCE_LOCATION (n->decl));
unsigned chksum = xloc.line; unsigned chksum = xloc.line;
chksum = coverage_checksum_string (chksum, xloc.file); chksum = coverage_checksum_string (chksum, xloc.file);
chksum = coverage_checksum_string chksum = coverage_checksum_string
(chksum, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (n->symbol.decl))); (chksum, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (n->decl)));
if (first_global_object_name) if (first_global_object_name)
chksum = coverage_checksum_string chksum = coverage_checksum_string
(chksum, first_global_object_name); (chksum, first_global_object_name);

View File

@ -1,3 +1,24 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* call.c (mark_versions_used): Update for conversion of symtab types
to a true class hierarchy.
* decl2.c (cp_write_global_declarations): Likewise.
(clear_decl_external): Likewise.
(build_java_method_aliases): Likewise.
(collect_candidates_for_java_method_aliases): Likewise.
(mark_needed): Likewise.
(var_finalized_p): Likewise.
(maybe_make_one_only): Likewise.
(maybe_emit_vtables): Likewise.
* lambda.c (maybe_add_lambda_conv_op): Likewise.
* method.c (use_thunk): Likewise.
* optimize.c (maybe_clone_body): Likewise.
* tree.c (cp_fix_function_decl_p): Likewise.
2013-10-29 Paolo Carlini <paolo.carlini@oracle.com> 2013-10-29 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58888 PR c++/58888

View File

@ -6630,7 +6630,7 @@ mark_versions_used (tree fn)
it_v = node_v->next; it_v = node_v->next;
while (it_v != NULL) while (it_v != NULL)
{ {
mark_used (it_v->this_node->symbol.decl); mark_used (it_v->this_node->decl);
it_v = it_v->next; it_v = it_v->next;
} }
} }

View File

@ -1747,7 +1747,7 @@ maybe_make_one_only (tree decl)
struct varpool_node *node = varpool_node_for_decl (decl); struct varpool_node *node = varpool_node_for_decl (decl);
DECL_COMDAT (decl) = 1; DECL_COMDAT (decl) = 1;
/* Mark it needed so we don't forget to emit it. */ /* Mark it needed so we don't forget to emit it. */
node->symbol.forced_by_abi = true; node->forced_by_abi = true;
TREE_USED (decl) = 1; TREE_USED (decl) = 1;
} }
} }
@ -1845,7 +1845,7 @@ import_export_class (tree ctype)
static bool static bool
var_finalized_p (tree var) var_finalized_p (tree var)
{ {
return varpool_node_for_decl (var)->symbol.definition; return varpool_node_for_decl (var)->definition;
} }
/* DECL is a VAR_DECL or FUNCTION_DECL which, for whatever reason, /* DECL is a VAR_DECL or FUNCTION_DECL which, for whatever reason,
@ -1862,14 +1862,14 @@ mark_needed (tree decl)
functions can be marked reachable, just use the external functions can be marked reachable, just use the external
definition. */ definition. */
struct cgraph_node *node = cgraph_get_create_node (decl); struct cgraph_node *node = cgraph_get_create_node (decl);
node->symbol.forced_by_abi = true; node->forced_by_abi = true;
} }
else if (TREE_CODE (decl) == VAR_DECL) else if (TREE_CODE (decl) == VAR_DECL)
{ {
struct varpool_node *node = varpool_node_for_decl (decl); struct varpool_node *node = varpool_node_for_decl (decl);
/* C++ frontend use mark_decl_references to force COMDAT variables /* C++ frontend use mark_decl_references to force COMDAT variables
to be output that might appear dead otherwise. */ to be output that might appear dead otherwise. */
node->symbol.forced_by_abi = true; node->forced_by_abi = true;
} }
} }
@ -1979,7 +1979,7 @@ maybe_emit_vtables (tree ctype)
{ {
current = varpool_node_for_decl (vtbl); current = varpool_node_for_decl (vtbl);
if (last) if (last)
symtab_add_to_same_comdat_group ((symtab_node) current, (symtab_node) last); symtab_add_to_same_comdat_group (current, last);
last = current; last = current;
} }
} }
@ -3744,7 +3744,7 @@ collect_candidates_for_java_method_aliases (void)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
tree fndecl = node->symbol.decl; tree fndecl = node->decl;
if (DECL_CLASS_SCOPE_P (fndecl) if (DECL_CLASS_SCOPE_P (fndecl)
&& TYPE_FOR_JAVA (DECL_CONTEXT (fndecl)) && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl))
@ -3777,7 +3777,7 @@ build_java_method_aliases (struct pointer_set_t *candidates)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
tree fndecl = node->symbol.decl; tree fndecl = node->decl;
if (TREE_ASM_WRITTEN (fndecl) if (TREE_ASM_WRITTEN (fndecl)
&& pointer_set_contains (candidates, fndecl)) && pointer_set_contains (candidates, fndecl))
@ -3958,7 +3958,7 @@ collect_all_refs (const char *source_file)
static bool static bool
clear_decl_external (struct cgraph_node *node, void * /*data*/) clear_decl_external (struct cgraph_node *node, void * /*data*/)
{ {
DECL_EXTERNAL (node->symbol.decl) = 0; DECL_EXTERNAL (node->decl) = 0;
return false; return false;
} }
@ -4276,7 +4276,7 @@ cp_write_global_declarations (void)
struct cgraph_node *node, *next; struct cgraph_node *node, *next;
node = cgraph_get_node (decl); node = cgraph_get_node (decl);
if (node->symbol.cpp_implicit_alias) if (node->cpp_implicit_alias)
node = cgraph_alias_target (node); node = cgraph_alias_target (node);
cgraph_for_node_and_aliases (node, clear_decl_external, cgraph_for_node_and_aliases (node, clear_decl_external,
@ -4284,10 +4284,10 @@ cp_write_global_declarations (void)
/* If we mark !DECL_EXTERNAL one of the symbols in some comdat /* If we mark !DECL_EXTERNAL one of the symbols in some comdat
group, we need to mark all symbols in the same comdat group group, we need to mark all symbols in the same comdat group
that way. */ that way. */
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
for (next = cgraph (node->symbol.same_comdat_group); for (next = cgraph (node->same_comdat_group);
next != node; next != node;
next = cgraph (next->symbol.same_comdat_group)) next = cgraph (next->same_comdat_group))
cgraph_for_node_and_aliases (next, clear_decl_external, cgraph_for_node_and_aliases (next, clear_decl_external,
NULL, true); NULL, true);
} }
@ -4299,7 +4299,7 @@ cp_write_global_declarations (void)
if (!DECL_EXTERNAL (decl) if (!DECL_EXTERNAL (decl)
&& decl_needed_p (decl) && decl_needed_p (decl)
&& !TREE_ASM_WRITTEN (decl) && !TREE_ASM_WRITTEN (decl)
&& !cgraph_get_node (decl)->symbol.definition) && !cgraph_get_node (decl)->definition)
{ {
/* We will output the function; no longer consider it in this /* We will output the function; no longer consider it in this
loop. */ loop. */

View File

@ -1020,8 +1020,8 @@ maybe_add_lambda_conv_op (tree type)
{ {
/* Put the thunk in the same comdat group as the call op. */ /* Put the thunk in the same comdat group as the call op. */
symtab_add_to_same_comdat_group symtab_add_to_same_comdat_group
((symtab_node) cgraph_get_create_node (statfn), (cgraph_get_create_node (statfn),
(symtab_node) cgraph_get_create_node (callop)); cgraph_get_create_node (callop));
} }
tree body = begin_function_body (); tree body = begin_function_body ();
tree compound_stmt = begin_compound_stmt (0); tree compound_stmt = begin_compound_stmt (0);

View File

@ -386,8 +386,8 @@ use_thunk (tree thunk_fndecl, bool emit_p)
this_adjusting, fixed_offset, virtual_value, this_adjusting, fixed_offset, virtual_value,
virtual_offset, alias); virtual_offset, alias);
if (DECL_ONE_ONLY (function)) if (DECL_ONE_ONLY (function))
symtab_add_to_same_comdat_group ((symtab_node) thunk_node, symtab_add_to_same_comdat_group (thunk_node,
(symtab_node) funcn); funcn);
if (!this_adjusting if (!this_adjusting
|| !targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset, || !targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,

View File

@ -339,7 +339,7 @@ maybe_clone_body (tree fn)
virtual, it goes into the same comdat group as well. */ virtual, it goes into the same comdat group as well. */
if (comdat_group) if (comdat_group)
symtab_add_to_same_comdat_group symtab_add_to_same_comdat_group
((symtab_node) cgraph_get_create_node (clone), (cgraph_get_create_node (clone),
symtab_get_node (fns[0])); symtab_get_node (fns[0]));
} }
else if (alias) else if (alias)

View File

@ -3983,8 +3983,8 @@ cp_fix_function_decl_p (tree decl)
/* Don't fix same_body aliases. Although they don't have their own /* Don't fix same_body aliases. Although they don't have their own
CFG, they share it with what they alias to. */ CFG, they share it with what they alias to. */
if (!node || !node->symbol.alias if (!node || !node->alias
|| !vec_safe_length (node->symbol.ref_list.references)) || !vec_safe_length (node->ref_list.references))
return true; return true;
} }

View File

@ -2480,7 +2480,7 @@ dbxout_expand_expr (tree expr)
return NULL, otherwise stabs might reference an undefined return NULL, otherwise stabs might reference an undefined
symbol. */ symbol. */
struct varpool_node *node = varpool_get_node (expr); struct varpool_node *node = varpool_get_node (expr);
if (!node || !node->symbol.definition) if (!node || !node->definition)
return NULL; return NULL;
} }
/* FALLTHRU */ /* FALLTHRU */

View File

@ -15143,7 +15143,7 @@ reference_to_unused (tree * tp, int * walk_subtrees,
else if (TREE_CODE (*tp) == VAR_DECL) else if (TREE_CODE (*tp) == VAR_DECL)
{ {
struct varpool_node *node = varpool_get_node (*tp); struct varpool_node *node = varpool_get_node (*tp);
if (!node || !node->symbol.definition) if (!node || !node->definition)
return *tp; return *tp;
} }
else if (TREE_CODE (*tp) == FUNCTION_DECL else if (TREE_CODE (*tp) == FUNCTION_DECL
@ -17821,7 +17821,7 @@ premark_types_used_by_global_vars_helper (void **slot,
/* Ask cgraph if the global variable really is to be emitted. /* Ask cgraph if the global variable really is to be emitted.
If yes, then we'll keep the DIE of ENTRY->TYPE. */ If yes, then we'll keep the DIE of ENTRY->TYPE. */
struct varpool_node *node = varpool_get_node (entry->var_decl); struct varpool_node *node = varpool_get_node (entry->var_decl);
if (node && node->symbol.definition) if (node && node->definition)
{ {
die->die_perennial_p = 1; die->die_perennial_p = 1;
/* Keep the parent DIEs as well. */ /* Keep the parent DIEs as well. */

View File

@ -93,14 +93,14 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
|| TREE_CODE (from_decl) != VAR_DECL || TREE_CODE (from_decl) != VAR_DECL
|| !DECL_EXTERNAL (from_decl) || !DECL_EXTERNAL (from_decl)
|| (flag_ltrans || (flag_ltrans
&& symtab_get_node (from_decl)->symbol.in_other_partition)) && symtab_get_node (from_decl)->in_other_partition))
return true; return true;
/* We are folding reference from external vtable. The vtable may reffer /* We are folding reference from external vtable. The vtable may reffer
to a symbol keyed to other compilation unit. The other compilation to a symbol keyed to other compilation unit. The other compilation
unit may be in separate DSO and the symbol may be hidden. */ unit may be in separate DSO and the symbol may be hidden. */
if (DECL_VISIBILITY_SPECIFIED (decl) if (DECL_VISIBILITY_SPECIFIED (decl)
&& DECL_EXTERNAL (decl) && DECL_EXTERNAL (decl)
&& (!(snode = symtab_get_node (decl)) || !snode->symbol.in_other_partition)) && (!(snode = symtab_get_node (decl)) || !snode->in_other_partition))
return false; return false;
/* When function is public, we always can introduce new reference. /* When function is public, we always can introduce new reference.
Exception are the COMDAT functions where introducing a direct Exception are the COMDAT functions where introducing a direct
@ -131,7 +131,7 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
The second is important when devirtualization happens during final The second is important when devirtualization happens during final
compilation stage when making a new reference no longer makes callee compilation stage when making a new reference no longer makes callee
to be compiled. */ to be compiled. */
if (!node || !node->symbol.definition || node->global.inlined_to) if (!node || !node->definition || node->global.inlined_to)
{ {
gcc_checking_assert (!TREE_ASM_WRITTEN (decl)); gcc_checking_assert (!TREE_ASM_WRITTEN (decl));
return false; return false;
@ -140,7 +140,7 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
else if (TREE_CODE (decl) == VAR_DECL) else if (TREE_CODE (decl) == VAR_DECL)
{ {
vnode = varpool_get_node (decl); vnode = varpool_get_node (decl);
if (!vnode || !vnode->symbol.definition) if (!vnode || !vnode->definition)
{ {
gcc_checking_assert (!TREE_ASM_WRITTEN (decl)); gcc_checking_assert (!TREE_ASM_WRITTEN (decl));
return false; return false;

View File

@ -977,7 +977,7 @@ unshare_body (tree fndecl)
if (cgn) if (cgn)
for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
unshare_body (cgn->symbol.decl); unshare_body (cgn->decl);
} }
/* Callback for walk_tree to unmark the visited trees rooted at *TP. /* Callback for walk_tree to unmark the visited trees rooted at *TP.
@ -1020,7 +1020,7 @@ unvisit_body (tree fndecl)
if (cgn) if (cgn)
for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
unvisit_body (cgn->symbol.decl); unvisit_body (cgn->decl);
} }
/* Unconditionally make an unshared copy of EXPR. This is used when using /* Unconditionally make an unshared copy of EXPR. This is used when using

View File

@ -352,7 +352,7 @@ print_lattice (FILE * f, struct ipcp_lattice *lat,
fprintf (f, " [from:"); fprintf (f, " [from:");
for (s = val->sources; s; s = s->next) for (s = val->sources; s; s = s->next)
fprintf (f, " %i(%i)", s->cs->caller->symbol.order, fprintf (f, " %i(%i)", s->cs->caller->order,
s->cs->frequency); s->cs->frequency);
fprintf (f, "]"); fprintf (f, "]");
} }
@ -382,7 +382,7 @@ print_all_lattices (FILE * f, bool dump_sources, bool dump_benefits)
info = IPA_NODE_REF (node); info = IPA_NODE_REF (node);
fprintf (f, " Node: %s/%i:\n", cgraph_node_name (node), fprintf (f, " Node: %s/%i:\n", cgraph_node_name (node),
node->symbol.order); node->order);
count = ipa_get_param_count (info); count = ipa_get_param_count (info);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
@ -423,16 +423,16 @@ determine_versionability (struct cgraph_node *node)
/* There are a number of generic reasons functions cannot be versioned. We /* There are a number of generic reasons functions cannot be versioned. We
also cannot remove parameters if there are type attributes such as fnspec also cannot remove parameters if there are type attributes such as fnspec
present. */ present. */
if (node->symbol.alias || node->thunk.thunk_p) if (node->alias || node->thunk.thunk_p)
reason = "alias or thunk"; reason = "alias or thunk";
else if (!node->local.versionable) else if (!node->local.versionable)
reason = "not a tree_versionable_function"; reason = "not a tree_versionable_function";
else if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE) else if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
reason = "insufficient body availability"; reason = "insufficient body availability";
if (reason && dump_file && !node->symbol.alias && !node->thunk.thunk_p) if (reason && dump_file && !node->alias && !node->thunk.thunk_p)
fprintf (dump_file, "Function %s/%i is not versionable, reason: %s.\n", fprintf (dump_file, "Function %s/%i is not versionable, reason: %s.\n",
cgraph_node_name (node), node->symbol.order, reason); cgraph_node_name (node), node->order, reason);
node->local.versionable = (reason == NULL); node->local.versionable = (reason == NULL);
} }
@ -508,7 +508,7 @@ ipcp_cloning_candidate_p (struct cgraph_node *node)
return false; return false;
} }
if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->symbol.decl))) if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl)))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Not considering %s for cloning; " fprintf (dump_file, "Not considering %s for cloning; "
@ -710,9 +710,9 @@ initialize_node_lattices (struct cgraph_node *node)
set_all_contains_variable (plats); set_all_contains_variable (plats);
} }
if (dump_file && (dump_flags & TDF_DETAILS) if (dump_file && (dump_flags & TDF_DETAILS)
&& !node->symbol.alias && !node->thunk.thunk_p) && !node->alias && !node->thunk.thunk_p)
fprintf (dump_file, "Marking all lattices of %s/%i as %s\n", fprintf (dump_file, "Marking all lattices of %s/%i as %s\n",
cgraph_node_name (node), node->symbol.order, cgraph_node_name (node), node->order,
disable ? "BOTTOM" : "VARIABLE"); disable ? "BOTTOM" : "VARIABLE");
} }
@ -1405,7 +1405,7 @@ propagate_constants_accross_call (struct cgraph_edge *cs)
int i, args_count, parms_count; int i, args_count, parms_count;
callee = cgraph_function_node (cs->callee, &availability); callee = cgraph_function_node (cs->callee, &availability);
if (!callee->symbol.definition) if (!callee->definition)
return false; return false;
gcc_checking_assert (cgraph_function_with_gimple_body_p (callee)); gcc_checking_assert (cgraph_function_with_gimple_body_p (callee));
callee_info = IPA_NODE_REF (callee); callee_info = IPA_NODE_REF (callee);
@ -1418,7 +1418,7 @@ propagate_constants_accross_call (struct cgraph_edge *cs)
parameter. However, we might need to uncover a thunk from below a series parameter. However, we might need to uncover a thunk from below a series
of aliases first. */ of aliases first. */
alias_or_thunk = cs->callee; alias_or_thunk = cs->callee;
while (alias_or_thunk->symbol.alias) while (alias_or_thunk->alias)
alias_or_thunk = cgraph_alias_target (alias_or_thunk); alias_or_thunk = cgraph_alias_target (alias_or_thunk);
if (alias_or_thunk->thunk.thunk_p) if (alias_or_thunk->thunk.thunk_p)
{ {
@ -1597,7 +1597,7 @@ devirtualization_time_bonus (struct cgraph_node *node,
/* Only bare minimum benefit for clearly un-inlineable targets. */ /* Only bare minimum benefit for clearly un-inlineable targets. */
res += 1; res += 1;
callee = cgraph_get_node (target); callee = cgraph_get_node (target);
if (!callee || !callee->symbol.definition) if (!callee || !callee->definition)
continue; continue;
isummary = inline_summary (callee); isummary = inline_summary (callee);
if (!isummary->inlinable) if (!isummary->inlinable)
@ -1610,7 +1610,7 @@ devirtualization_time_bonus (struct cgraph_node *node,
else if (isummary->size <= MAX_INLINE_INSNS_AUTO / 2) else if (isummary->size <= MAX_INLINE_INSNS_AUTO / 2)
res += 15; res += 15;
else if (isummary->size <= MAX_INLINE_INSNS_AUTO else if (isummary->size <= MAX_INLINE_INSNS_AUTO
|| DECL_DECLARED_INLINE_P (callee->symbol.decl)) || DECL_DECLARED_INLINE_P (callee->decl))
res += 7; res += 7;
} }
@ -1640,7 +1640,7 @@ good_cloning_opportunity_p (struct cgraph_node *node, int time_benefit,
{ {
if (time_benefit == 0 if (time_benefit == 0
|| !flag_ipa_cp_clone || !flag_ipa_cp_clone
|| !optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->symbol.decl))) || !optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl)))
return false; return false;
gcc_assert (size_cost > 0); gcc_assert (size_cost > 0);
@ -1817,7 +1817,7 @@ estimate_local_effects (struct cgraph_node *node)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %i.\n", fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %i.\n",
cgraph_node_name (node), node->symbol.order, base_time); cgraph_node_name (node), node->order, base_time);
always_const = gather_context_independent_values (info, &known_csts, always_const = gather_context_independent_values (info, &known_csts,
&known_binfos, &known_aggs, &known_binfos, &known_aggs,
@ -2219,7 +2219,7 @@ ipcp_propagate_stage (struct topo_info *topo)
ipa_get_param_count (info)); ipa_get_param_count (info));
initialize_node_lattices (node); initialize_node_lattices (node);
} }
if (node->symbol.definition && !node->symbol.alias) if (node->definition && !node->alias)
overall_size += inline_summary (node)->self_size; overall_size += inline_summary (node)->self_size;
if (node->count > max_count) if (node->count > max_count)
max_count = node->count; max_count = node->count;
@ -2287,8 +2287,8 @@ ipcp_discover_new_direct_edges (struct cgraph_node *node,
fprintf (dump_file, " controlled uses count of param " fprintf (dump_file, " controlled uses count of param "
"%i bumped down to %i\n", param_index, c); "%i bumped down to %i\n", param_index, c);
if (c == 0 if (c == 0
&& (to_del = ipa_find_reference ((symtab_node) node, && (to_del = ipa_find_reference (node,
(symtab_node) cs->callee, cs->callee,
NULL, 0))) NULL, 0)))
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
@ -2544,7 +2544,7 @@ update_profiling_info (struct cgraph_node *orig_node,
fprintf (dump_file, " Problem: node %s/%i has too low count " fprintf (dump_file, " Problem: node %s/%i has too low count "
HOST_WIDE_INT_PRINT_DEC " while the sum of incoming " HOST_WIDE_INT_PRINT_DEC " while the sum of incoming "
"counts is " HOST_WIDE_INT_PRINT_DEC "\n", "counts is " HOST_WIDE_INT_PRINT_DEC "\n",
cgraph_node_name (orig_node), orig_node->symbol.order, cgraph_node_name (orig_node), orig_node->order,
(HOST_WIDE_INT) orig_node_count, (HOST_WIDE_INT) orig_node_count,
(HOST_WIDE_INT) (orig_sum + new_sum)); (HOST_WIDE_INT) (orig_sum + new_sum));
@ -2677,13 +2677,13 @@ create_specialized_node (struct cgraph_node *node,
args_to_skip, "constprop"); args_to_skip, "constprop");
ipa_set_node_agg_value_chain (new_node, aggvals); ipa_set_node_agg_value_chain (new_node, aggvals);
for (av = aggvals; av; av = av->next) for (av = aggvals; av; av = av->next)
ipa_maybe_record_reference ((symtab_node) new_node, av->value, ipa_maybe_record_reference (new_node, av->value,
IPA_REF_ADDR, NULL); IPA_REF_ADDR, NULL);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
fprintf (dump_file, " the new node is %s/%i.\n", fprintf (dump_file, " the new node is %s/%i.\n",
cgraph_node_name (new_node), new_node->symbol.order); cgraph_node_name (new_node), new_node->order);
if (aggvals) if (aggvals)
ipa_dump_agg_replacement_values (dump_file, aggvals); ipa_dump_agg_replacement_values (dump_file, aggvals);
} }
@ -3236,9 +3236,9 @@ perhaps_add_new_callers (struct cgraph_node *node, struct ipcp_value *val)
fprintf (dump_file, " - adding an extra caller %s/%i" fprintf (dump_file, " - adding an extra caller %s/%i"
" of %s/%i\n", " of %s/%i\n",
xstrdup (cgraph_node_name (cs->caller)), xstrdup (cgraph_node_name (cs->caller)),
cs->caller->symbol.order, cs->caller->order,
xstrdup (cgraph_node_name (val->spec_node)), xstrdup (cgraph_node_name (val->spec_node)),
val->spec_node->symbol.order); val->spec_node->order);
cgraph_redirect_edge_callee (cs, val->spec_node); cgraph_redirect_edge_callee (cs, val->spec_node);
redirected_sum += cs->count; redirected_sum += cs->count;
@ -3342,7 +3342,7 @@ decide_about_value (struct cgraph_node *node, int index, HOST_WIDE_INT offset,
if (dump_file) if (dump_file)
fprintf (dump_file, " Creating a specialized node of %s/%i.\n", fprintf (dump_file, " Creating a specialized node of %s/%i.\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
callers = gather_edges_for_value (val, caller_count); callers = gather_edges_for_value (val, caller_count);
kv = known_csts.copy (); kv = known_csts.copy ();
@ -3379,7 +3379,7 @@ decide_whether_version_node (struct cgraph_node *node)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nEvaluating opportunities for %s/%i.\n", fprintf (dump_file, "\nEvaluating opportunities for %s/%i.\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
gather_context_independent_values (info, &known_csts, &known_binfos, gather_context_independent_values (info, &known_csts, &known_binfos,
info->do_clone_for_all_contexts ? &known_aggs info->do_clone_for_all_contexts ? &known_aggs
@ -3423,7 +3423,7 @@ decide_whether_version_node (struct cgraph_node *node)
if (dump_file) if (dump_file)
fprintf (dump_file, " - Creating a specialized node of %s/%i " fprintf (dump_file, " - Creating a specialized node of %s/%i "
"for all known contexts.\n", cgraph_node_name (node), "for all known contexts.\n", cgraph_node_name (node),
node->symbol.order); node->order);
callers = collect_callers_of_node (node); callers = collect_callers_of_node (node);
move_binfos_to_values (known_csts, known_binfos); move_binfos_to_values (known_csts, known_binfos);
@ -3498,23 +3498,23 @@ static void
identify_dead_nodes (struct cgraph_node *node) identify_dead_nodes (struct cgraph_node *node)
{ {
struct cgraph_node *v; struct cgraph_node *v;
for (v = node; v ; v = ((struct ipa_dfs_info *) v->symbol.aux)->next_cycle) for (v = node; v ; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
if (cgraph_will_be_removed_from_program_if_no_direct_calls (v) if (cgraph_will_be_removed_from_program_if_no_direct_calls (v)
&& !cgraph_for_node_and_aliases (v, && !cgraph_for_node_and_aliases (v,
has_undead_caller_from_outside_scc_p, has_undead_caller_from_outside_scc_p,
NULL, true)) NULL, true))
IPA_NODE_REF (v)->node_dead = 1; IPA_NODE_REF (v)->node_dead = 1;
for (v = node; v ; v = ((struct ipa_dfs_info *) v->symbol.aux)->next_cycle) for (v = node; v ; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
if (!IPA_NODE_REF (v)->node_dead) if (!IPA_NODE_REF (v)->node_dead)
spread_undeadness (v); spread_undeadness (v);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
for (v = node; v ; v = ((struct ipa_dfs_info *) v->symbol.aux)->next_cycle) for (v = node; v ; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
if (IPA_NODE_REF (v)->node_dead) if (IPA_NODE_REF (v)->node_dead)
fprintf (dump_file, " Marking node as dead: %s/%i.\n", fprintf (dump_file, " Marking node as dead: %s/%i.\n",
cgraph_node_name (v), v->symbol.order); cgraph_node_name (v), v->order);
} }
} }
@ -3538,7 +3538,7 @@ ipcp_decision_stage (struct topo_info *topo)
{ {
struct cgraph_node *v; struct cgraph_node *v;
iterate = false; iterate = false;
for (v = node; v ; v = ((struct ipa_dfs_info *) v->symbol.aux)->next_cycle) for (v = node; v ; v = ((struct ipa_dfs_info *) v->aux)->next_cycle)
if (cgraph_function_with_gimple_body_p (v) if (cgraph_function_with_gimple_body_p (v)
&& ipcp_versionable_function_p (v)) && ipcp_versionable_function_p (v))
iterate |= decide_whether_version_node (v); iterate |= decide_whether_version_node (v);
@ -3611,7 +3611,7 @@ ipcp_generate_summary (void)
FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node) FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
{ {
node->local.versionable node->local.versionable
= tree_versionable_function_p (node->symbol.decl); = tree_versionable_function_p (node->decl);
ipa_analyze_node (node); ipa_analyze_node (node);
} }
} }

View File

@ -544,9 +544,9 @@ build_type_inheritance_graph (void)
/* We reconstruct the graph starting of types of all methods seen in the /* We reconstruct the graph starting of types of all methods seen in the
the unit. */ the unit. */
FOR_EACH_FUNCTION (n) FOR_EACH_FUNCTION (n)
if (DECL_VIRTUAL_P (n->symbol.decl) if (DECL_VIRTUAL_P (n->decl)
&& symtab_real_symbol_p ((symtab_node)n)) && symtab_real_symbol_p (n))
get_odr_type (method_class_type (TREE_TYPE (n->symbol.decl)), true); get_odr_type (method_class_type (TREE_TYPE (n->decl)), true);
if (inheritance_dump_file) if (inheritance_dump_file)
{ {
dump_type_inheritance_graph (inheritance_dump_file); dump_type_inheritance_graph (inheritance_dump_file);
@ -572,8 +572,8 @@ maybe_record_node (vec <cgraph_node *> &nodes,
&& !pointer_set_insert (inserted, target) && !pointer_set_insert (inserted, target)
&& (target_node = cgraph_get_node (target)) != NULL && (target_node = cgraph_get_node (target)) != NULL
&& (TREE_PUBLIC (target) && (TREE_PUBLIC (target)
|| target_node->symbol.definition) || target_node->definition)
&& symtab_real_symbol_p ((symtab_node)target_node)) && symtab_real_symbol_p (target_node))
{ {
pointer_set_insert (cached_polymorphic_call_targets, pointer_set_insert (cached_polymorphic_call_targets,
target_node); target_node);
@ -627,7 +627,7 @@ record_binfo (vec <cgraph_node *> &nodes,
if (TREE_CODE (vtable) == POINTER_PLUS_EXPR) if (TREE_CODE (vtable) == POINTER_PLUS_EXPR)
vtable = TREE_OPERAND (TREE_OPERAND (vtable, 0), 0); vtable = TREE_OPERAND (TREE_OPERAND (vtable, 0), 0);
vnode = varpool_get_node (vtable); vnode = varpool_get_node (vtable);
if (!vnode || !vnode->symbol.definition) if (!vnode || !vnode->definition)
return; return;
} }
tree target = gimple_get_virt_method_for_binfo (otr_token, type_binfo); tree target = gimple_get_virt_method_for_binfo (otr_token, type_binfo);
@ -761,8 +761,8 @@ devirt_variable_node_removal_hook (struct varpool_node *n,
void *d ATTRIBUTE_UNUSED) void *d ATTRIBUTE_UNUSED)
{ {
if (cached_polymorphic_call_targets if (cached_polymorphic_call_targets
&& DECL_VIRTUAL_P (n->symbol.decl) && DECL_VIRTUAL_P (n->decl)
&& type_in_anonymous_namespace_p (DECL_CONTEXT (n->symbol.decl))) && type_in_anonymous_namespace_p (DECL_CONTEXT (n->decl)))
free_polymorphic_call_targets_hash (); free_polymorphic_call_targets_hash ();
} }
@ -891,7 +891,7 @@ dump_possible_polymorphic_call_targets (FILE *f,
final ? " (full list)" : " (partial list, may call to other unit)"); final ? " (full list)" : " (partial list, may call to other unit)");
for (i = 0; i < targets.length (); i++) for (i = 0; i < targets.length (); i++)
fprintf (f, " %s/%i", cgraph_node_name (targets[i]), fprintf (f, " %s/%i", cgraph_node_name (targets[i]),
targets[i]->symbol.order); targets[i]->order);
fprintf (f, "\n"); fprintf (f, "\n");
} }
@ -917,7 +917,7 @@ possible_polymorphic_call_target_p (tree otr_type,
/* At a moment we allow middle end to dig out new external declarations /* At a moment we allow middle end to dig out new external declarations
as a targets of polymorphic calls. */ as a targets of polymorphic calls. */
if (!final && !n->symbol.definition) if (!final && !n->definition)
return true; return true;
return false; return false;
} }
@ -938,10 +938,10 @@ update_type_inheritance_graph (void)
/* We reconstruct the graph starting of types of all methods seen in the /* We reconstruct the graph starting of types of all methods seen in the
the unit. */ the unit. */
FOR_EACH_FUNCTION (n) FOR_EACH_FUNCTION (n)
if (DECL_VIRTUAL_P (n->symbol.decl) if (DECL_VIRTUAL_P (n->decl)
&& !n->symbol.definition && !n->definition
&& symtab_real_symbol_p ((symtab_node)n)) && symtab_real_symbol_p (n))
get_odr_type (method_class_type (TREE_TYPE (n->symbol.decl)), true); get_odr_type (method_class_type (TREE_TYPE (n->decl)), true);
timevar_pop (TV_IPA_INHERITANCE); timevar_pop (TV_IPA_INHERITANCE);
} }
@ -955,13 +955,13 @@ likely_target_p (struct cgraph_node *n)
{ {
int flags; int flags;
/* cxa_pure_virtual and similar things are not likely. */ /* cxa_pure_virtual and similar things are not likely. */
if (TREE_CODE (TREE_TYPE (n->symbol.decl)) != METHOD_TYPE) if (TREE_CODE (TREE_TYPE (n->decl)) != METHOD_TYPE)
return false; return false;
flags = flags_from_decl_or_type (n->symbol.decl); flags = flags_from_decl_or_type (n->decl);
if (flags & ECF_NORETURN) if (flags & ECF_NORETURN)
return false; return false;
if (lookup_attribute ("cold", if (lookup_attribute ("cold",
DECL_ATTRIBUTES (n->symbol.decl))) DECL_ATTRIBUTES (n->decl)))
return false; return false;
if (n->frequency < NODE_FREQUENCY_NORMAL) if (n->frequency < NODE_FREQUENCY_NORMAL)
return false; return false;
@ -988,7 +988,7 @@ ipa_devirt (void)
bool update = false; bool update = false;
if (dump_file && n->indirect_calls) if (dump_file && n->indirect_calls)
fprintf (dump_file, "\n\nProcesing function %s/%i\n", fprintf (dump_file, "\n\nProcesing function %s/%i\n",
cgraph_node_name (n), n->symbol.order); cgraph_node_name (n), n->order);
for (e = n->indirect_calls; e; e = e->next_callee) for (e = n->indirect_calls; e; e = e->next_callee)
if (e->indirect_info->polymorphic) if (e->indirect_info->polymorphic)
{ {
@ -1069,7 +1069,7 @@ ipa_devirt (void)
} }
continue; continue;
} }
if (!likely_target->symbol.definition) if (!likely_target->definition)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Target is not an definition\n"); fprintf (dump_file, "Target is not an definition\n");
@ -1080,7 +1080,7 @@ ipa_devirt (void)
can handle these just well, it is common for programs to can handle these just well, it is common for programs to
incorrectly with headers defining methods they are linked incorrectly with headers defining methods they are linked
with. */ with. */
if (DECL_EXTERNAL (likely_target->symbol.decl)) if (DECL_EXTERNAL (likely_target->decl))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Target is external\n"); fprintf (dump_file, "Target is external\n");
@ -1089,7 +1089,7 @@ ipa_devirt (void)
} }
if (cgraph_function_body_availability (likely_target) if (cgraph_function_body_availability (likely_target)
<= AVAIL_OVERWRITABLE <= AVAIL_OVERWRITABLE
&& symtab_can_be_discarded ((symtab_node) likely_target)) && symtab_can_be_discarded (likely_target))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Target is overwritable\n"); fprintf (dump_file, "Target is overwritable\n");
@ -1101,14 +1101,14 @@ ipa_devirt (void)
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
"Speculatively devirtualizing call in %s/%i to %s/%i\n", "Speculatively devirtualizing call in %s/%i to %s/%i\n",
cgraph_node_name (n), n->symbol.order, cgraph_node_name (n), n->order,
cgraph_node_name (likely_target), cgraph_node_name (likely_target),
likely_target->symbol.order); likely_target->order);
if (!symtab_can_be_discarded ((symtab_node) likely_target)) if (!symtab_can_be_discarded (likely_target))
{ {
cgraph_node *alias; cgraph_node *alias;
alias = cgraph (symtab_nonoverwritable_alias alias = cgraph (symtab_nonoverwritable_alias
((symtab_node)likely_target)); (likely_target));
if (alias) if (alias)
likely_target = alias; likely_target = alias;
} }

View File

@ -1298,7 +1298,7 @@ dump_inline_edge_summary (FILE *f, int indent, struct cgraph_node *node,
fprintf (f, fprintf (f,
"%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i" "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i"
" time: %2i callee size:%2i stack:%2i", " time: %2i callee size:%2i stack:%2i",
indent, "", cgraph_node_name (callee), callee->symbol.order, indent, "", cgraph_node_name (callee), callee->order,
!edge->inline_failed !edge->inline_failed
? "inlined" : cgraph_inline_failed_string (edge-> inline_failed), ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
indent, "", es->loop_depth, edge->frequency, indent, "", es->loop_depth, edge->frequency,
@ -1358,14 +1358,14 @@ dump_inline_edge_summary (FILE *f, int indent, struct cgraph_node *node,
void void
dump_inline_summary (FILE *f, struct cgraph_node *node) dump_inline_summary (FILE *f, struct cgraph_node *node)
{ {
if (node->symbol.definition) if (node->definition)
{ {
struct inline_summary *s = inline_summary (node); struct inline_summary *s = inline_summary (node);
size_time_entry *e; size_time_entry *e;
int i; int i;
fprintf (f, "Inline summary for %s/%i", cgraph_node_name (node), fprintf (f, "Inline summary for %s/%i", cgraph_node_name (node),
node->symbol.order); node->order);
if (DECL_DISREGARD_INLINE_LIMITS (node->symbol.decl)) if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
fprintf (f, " always_inline"); fprintf (f, " always_inline");
if (s->inlinable) if (s->inlinable)
fprintf (f, " inlinable"); fprintf (f, " inlinable");
@ -1434,7 +1434,7 @@ initialize_inline_failed (struct cgraph_edge *e)
if (e->indirect_unknown_callee) if (e->indirect_unknown_callee)
e->inline_failed = CIF_INDIRECT_UNKNOWN_CALL; e->inline_failed = CIF_INDIRECT_UNKNOWN_CALL;
else if (!callee->symbol.definition) else if (!callee->definition)
e->inline_failed = CIF_BODY_NOT_AVAILABLE; e->inline_failed = CIF_BODY_NOT_AVAILABLE;
else if (callee->local.redefined_extern_inline) else if (callee->local.redefined_extern_inline)
e->inline_failed = CIF_REDEFINED_EXTERN_INLINE; e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
@ -1821,7 +1821,7 @@ compute_bb_predicates (struct cgraph_node *node,
struct ipa_node_params *parms_info, struct ipa_node_params *parms_info,
struct inline_summary *summary) struct inline_summary *summary)
{ {
struct function *my_function = DECL_STRUCT_FUNCTION (node->symbol.decl); struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
bool done = false; bool done = false;
basic_block bb; basic_block bb;
@ -2348,7 +2348,7 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
<0,2>. */ <0,2>. */
basic_block bb; basic_block bb;
gimple_stmt_iterator bsi; gimple_stmt_iterator bsi;
struct function *my_function = DECL_STRUCT_FUNCTION (node->symbol.decl); struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
int freq; int freq;
struct inline_summary *info = inline_summary (node); struct inline_summary *info = inline_summary (node);
struct predicate bb_predicate; struct predicate bb_predicate;
@ -2396,7 +2396,7 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
for (n = 0; n < nblocks; n++) for (n = 0; n < nblocks; n++)
{ {
bb = BASIC_BLOCK (order[n]); bb = BASIC_BLOCK (order[n]);
freq = compute_call_stmt_bb_frequency (node->symbol.decl, bb); freq = compute_call_stmt_bb_frequency (node->decl, bb);
/* TODO: Obviously predicates can be propagated down across CFG. */ /* TODO: Obviously predicates can be propagated down across CFG. */
if (parms_info) if (parms_info)
@ -2743,7 +2743,7 @@ compute_inline_parameters (struct cgraph_node *node, bool early)
} }
/* Even is_gimple_min_invariant rely on current_function_decl. */ /* Even is_gimple_min_invariant rely on current_function_decl. */
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
/* Estimate the stack size for the function if we're optimizing. */ /* Estimate the stack size for the function if we're optimizing. */
self_stack_size = optimize ? estimated_stack_frame_size (node) : 0; self_stack_size = optimize ? estimated_stack_frame_size (node) : 0;
@ -2753,13 +2753,13 @@ compute_inline_parameters (struct cgraph_node *node, bool early)
/* Can this function be inlined at all? */ /* Can this function be inlined at all? */
if (!optimize && !lookup_attribute ("always_inline", if (!optimize && !lookup_attribute ("always_inline",
DECL_ATTRIBUTES (node->symbol.decl))) DECL_ATTRIBUTES (node->decl)))
info->inlinable = false; info->inlinable = false;
else else
info->inlinable = tree_inlinable_function_p (node->symbol.decl); info->inlinable = tree_inlinable_function_p (node->decl);
/* Type attributes can use parameter indices to describe them. */ /* Type attributes can use parameter indices to describe them. */
if (TYPE_ATTRIBUTES (TREE_TYPE (node->symbol.decl))) if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
node->local.can_change_signature = false; node->local.can_change_signature = false;
else else
{ {
@ -2771,7 +2771,7 @@ compute_inline_parameters (struct cgraph_node *node, bool early)
/* Functions calling builtin_apply can not change signature. */ /* Functions calling builtin_apply can not change signature. */
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
{ {
tree cdecl = e->callee->symbol.decl; tree cdecl = e->callee->decl;
if (DECL_BUILT_IN (cdecl) if (DECL_BUILT_IN (cdecl)
&& DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL && DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL
&& (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS && (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS
@ -2879,7 +2879,7 @@ estimate_edge_devirt_benefit (struct cgraph_edge *ie,
gcc_checking_assert (*size >= 0); gcc_checking_assert (*size >= 0);
callee = cgraph_get_node (target); callee = cgraph_get_node (target);
if (!callee || !callee->symbol.definition) if (!callee || !callee->definition)
return false; return false;
isummary = inline_summary (callee); isummary = inline_summary (callee);
return isummary->inlinable; return isummary->inlinable;
@ -2985,7 +2985,7 @@ estimate_node_size_and_time (struct cgraph_node *node,
bool found = false; bool found = false;
fprintf (dump_file, " Estimating body: %s/%i\n" fprintf (dump_file, " Estimating body: %s/%i\n"
" Known to be false: ", cgraph_node_name (node), " Known to be false: ", cgraph_node_name (node),
node->symbol.order); node->order);
for (i = predicate_not_inlined_condition; for (i = predicate_not_inlined_condition;
i < (predicate_first_dynamic_condition i < (predicate_first_dynamic_condition
@ -3036,7 +3036,7 @@ estimate_node_size_and_time (struct cgraph_node *node,
hints |= INLINE_HINT_array_index; hints |= INLINE_HINT_array_index;
if (info->scc_no) if (info->scc_no)
hints |= INLINE_HINT_in_scc; hints |= INLINE_HINT_in_scc;
if (DECL_DECLARED_INLINE_P (node->symbol.decl)) if (DECL_DECLARED_INLINE_P (node->decl))
hints |= INLINE_HINT_declared_inline; hints |= INLINE_HINT_declared_inline;
estimate_calls_size_and_time (node, &size, &time, &hints, possible_truths, estimate_calls_size_and_time (node, &size, &time, &hints, possible_truths,
@ -3496,8 +3496,8 @@ simple_edge_hints (struct cgraph_edge *edge)
&& !cgraph_edge_recursive_p (edge)) && !cgraph_edge_recursive_p (edge))
hints |= INLINE_HINT_same_scc; hints |= INLINE_HINT_same_scc;
if (to->symbol.lto_file_data && edge->callee->symbol.lto_file_data if (to->lto_file_data && edge->callee->lto_file_data
&& to->symbol.lto_file_data != edge->callee->symbol.lto_file_data) && to->lto_file_data != edge->callee->lto_file_data)
hints |= INLINE_HINT_cross_module; hints |= INLINE_HINT_cross_module;
return hints; return hints;
@ -3716,7 +3716,7 @@ do_estimate_growth (struct cgraph_node *node)
return zero or negative growths. */ return zero or negative growths. */
if (d.self_recursive) if (d.self_recursive)
d.growth = d.growth < info->size ? info->size : d.growth; d.growth = d.growth < info->size ? info->size : d.growth;
else if (DECL_EXTERNAL (node->symbol.decl)) else if (DECL_EXTERNAL (node->decl))
; ;
else else
{ {
@ -3725,7 +3725,7 @@ do_estimate_growth (struct cgraph_node *node)
/* COMDAT functions are very often not shared across multiple units /* COMDAT functions are very often not shared across multiple units
since they come from various template instantiations. since they come from various template instantiations.
Take this into account. */ Take this into account. */
else if (DECL_COMDAT (node->symbol.decl) else if (DECL_COMDAT (node->decl)
&& cgraph_can_remove_if_no_direct_calls_p (node)) && cgraph_can_remove_if_no_direct_calls_p (node))
d.growth -= (info->size d.growth -= (info->size
* (100 - PARAM_VALUE (PARAM_COMDAT_SHARING_PROBABILITY)) * (100 - PARAM_VALUE (PARAM_COMDAT_SHARING_PROBABILITY))
@ -3762,11 +3762,11 @@ inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
static void static void
inline_analyze_function (struct cgraph_node *node) inline_analyze_function (struct cgraph_node *node)
{ {
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
if (dump_file) if (dump_file)
fprintf (dump_file, "\nAnalyzing function: %s/%u\n", fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
if (optimize && !node->thunk.thunk_p) if (optimize && !node->thunk.thunk_p)
inline_indirect_intraprocedural_analysis (node); inline_indirect_intraprocedural_analysis (node);
compute_inline_parameters (node, false); compute_inline_parameters (node, false);
@ -3819,7 +3819,7 @@ inline_generate_summary (void)
inline_free_summary (); inline_free_summary ();
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (!node->symbol.alias) if (!node->alias)
inline_analyze_function (node); inline_analyze_function (node);
} }
@ -4053,7 +4053,7 @@ inline_write_summary (void)
{ {
symtab_node snode = lto_symtab_encoder_deref (encoder, i); symtab_node snode = lto_symtab_encoder_deref (encoder, i);
cgraph_node *cnode = dyn_cast <cgraph_node> (snode); cgraph_node *cnode = dyn_cast <cgraph_node> (snode);
if (cnode && cnode->symbol.definition && !cnode->symbol.alias) if (cnode && cnode->definition && !cnode->alias)
count++; count++;
} }
streamer_write_uhwi (ob, count); streamer_write_uhwi (ob, count);
@ -4062,7 +4062,7 @@ inline_write_summary (void)
{ {
symtab_node snode = lto_symtab_encoder_deref (encoder, i); symtab_node snode = lto_symtab_encoder_deref (encoder, i);
cgraph_node *cnode = dyn_cast <cgraph_node> (snode); cgraph_node *cnode = dyn_cast <cgraph_node> (snode);
if (cnode && (node = cnode)->symbol.definition && !node->symbol.alias) if (cnode && (node = cnode)->definition && !node->alias)
{ {
struct inline_summary *info = inline_summary (node); struct inline_summary *info = inline_summary (node);
struct bitpack_d bp; struct bitpack_d bp;
@ -4073,7 +4073,7 @@ inline_write_summary (void)
streamer_write_uhwi (ob, streamer_write_uhwi (ob,
lto_symtab_encoder_encode (encoder, lto_symtab_encoder_encode (encoder,
(symtab_node)
node)); node));
streamer_write_hwi (ob, info->estimated_self_stack_size); streamer_write_hwi (ob, info->estimated_self_stack_size);
streamer_write_hwi (ob, info->self_size); streamer_write_hwi (ob, info->self_size);

View File

@ -85,15 +85,15 @@ can_remove_node_now_p_1 (struct cgraph_node *node)
/* FIXME: When address is taken of DECL_EXTERNAL function we still /* FIXME: When address is taken of DECL_EXTERNAL function we still
can remove its offline copy, but we would need to keep unanalyzed node in can remove its offline copy, but we would need to keep unanalyzed node in
the callgraph so references can point to it. */ the callgraph so references can point to it. */
return (!node->symbol.address_taken return (!node->address_taken
&& !ipa_ref_has_aliases_p (&node->symbol.ref_list) && !ipa_ref_has_aliases_p (&node->ref_list)
&& !node->used_as_abstract_origin && !node->used_as_abstract_origin
&& cgraph_can_remove_if_no_direct_calls_p (node) && cgraph_can_remove_if_no_direct_calls_p (node)
/* Inlining might enable more devirtualizing, so we want to remove /* Inlining might enable more devirtualizing, so we want to remove
those only after all devirtualizable virtual calls are processed. those only after all devirtualizable virtual calls are processed.
Lacking may edges in callgraph we just preserve them post Lacking may edges in callgraph we just preserve them post
inlining. */ inlining. */
&& !DECL_VIRTUAL_P (node->symbol.decl) && !DECL_VIRTUAL_P (node->decl)
/* During early inlining some unanalyzed cgraph nodes might be in the /* During early inlining some unanalyzed cgraph nodes might be in the
callgraph and they might reffer the function in question. */ callgraph and they might reffer the function in question. */
&& !cgraph_new_nodes); && !cgraph_new_nodes);
@ -112,10 +112,10 @@ can_remove_node_now_p (struct cgraph_node *node, struct cgraph_edge *e)
/* When we see same comdat group, we need to be sure that all /* When we see same comdat group, we need to be sure that all
items can be removed. */ items can be removed. */
if (!node->symbol.same_comdat_group) if (!node->same_comdat_group)
return true; return true;
for (next = cgraph (node->symbol.same_comdat_group); for (next = cgraph (node->same_comdat_group);
next != node; next = cgraph (next->symbol.same_comdat_group)) next != node; next = cgraph (next->same_comdat_group))
if ((next->callers && next->callers != e) if ((next->callers && next->callers != e)
|| !can_remove_node_now_p_1 (next)) || !can_remove_node_now_p_1 (next))
return false; return false;
@ -161,28 +161,28 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
For now we keep the ohter functions in the group in program until For now we keep the ohter functions in the group in program until
cgraph_remove_unreachable_functions gets rid of them. */ cgraph_remove_unreachable_functions gets rid of them. */
gcc_assert (!e->callee->global.inlined_to); gcc_assert (!e->callee->global.inlined_to);
symtab_dissolve_same_comdat_group_list ((symtab_node) e->callee); symtab_dissolve_same_comdat_group_list (e->callee);
if (e->callee->symbol.definition && !DECL_EXTERNAL (e->callee->symbol.decl)) if (e->callee->definition && !DECL_EXTERNAL (e->callee->decl))
{ {
if (overall_size) if (overall_size)
*overall_size -= inline_summary (e->callee)->size; *overall_size -= inline_summary (e->callee)->size;
nfunctions_inlined++; nfunctions_inlined++;
} }
duplicate = false; duplicate = false;
e->callee->symbol.externally_visible = false; e->callee->externally_visible = false;
update_noncloned_frequencies (e->callee, e->frequency); update_noncloned_frequencies (e->callee, e->frequency);
} }
else else
{ {
struct cgraph_node *n; struct cgraph_node *n;
n = cgraph_clone_node (e->callee, e->callee->symbol.decl, n = cgraph_clone_node (e->callee, e->callee->decl,
e->count, e->frequency, update_original, e->count, e->frequency, update_original,
vNULL, true, inlining_into); vNULL, true, inlining_into);
cgraph_redirect_edge_callee (e, n); cgraph_redirect_edge_callee (e, n);
} }
} }
else else
symtab_dissolve_same_comdat_group_list ((symtab_node) e->callee); symtab_dissolve_same_comdat_group_list (e->callee);
e->callee->global.inlined_to = inlining_into; e->callee->global.inlined_to = inlining_into;
@ -234,7 +234,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
gcc_assert (!callee->global.inlined_to); gcc_assert (!callee->global.inlined_to);
e->inline_failed = CIF_OK; e->inline_failed = CIF_OK;
DECL_POSSIBLY_INLINED (callee->symbol.decl) = true; DECL_POSSIBLY_INLINED (callee->decl) = true;
to = e->caller; to = e->caller;
if (to->global.inlined_to) if (to->global.inlined_to)
@ -286,7 +286,7 @@ inline_call (struct cgraph_edge *e, bool update_original,
/* Account the change of overall unit size; external functions will be /* Account the change of overall unit size; external functions will be
removed and are thus not accounted. */ removed and are thus not accounted. */
if (overall_size if (overall_size
&& !DECL_EXTERNAL (to->symbol.decl)) && !DECL_EXTERNAL (to->decl))
*overall_size += new_size - old_size; *overall_size += new_size - old_size;
ncalls_inlined++; ncalls_inlined++;
@ -312,13 +312,13 @@ save_inline_function_body (struct cgraph_node *node)
fprintf (dump_file, "\nSaving body of %s for later reuse\n", fprintf (dump_file, "\nSaving body of %s for later reuse\n",
cgraph_node_name (node)); cgraph_node_name (node));
gcc_assert (node == cgraph_get_node (node->symbol.decl)); gcc_assert (node == cgraph_get_node (node->decl));
/* first_clone will be turned into real function. */ /* first_clone will be turned into real function. */
first_clone = node->clones; first_clone = node->clones;
first_clone->symbol.decl = copy_node (node->symbol.decl); first_clone->decl = copy_node (node->decl);
symtab_insert_node_to_hashtable ((symtab_node) first_clone); symtab_insert_node_to_hashtable (first_clone);
gcc_assert (first_clone == cgraph_get_node (first_clone->symbol.decl)); gcc_assert (first_clone == cgraph_get_node (first_clone->decl));
/* Now reshape the clone tree, so all other clones descends from /* Now reshape the clone tree, so all other clones descends from
first_clone. */ first_clone. */
@ -346,8 +346,8 @@ save_inline_function_body (struct cgraph_node *node)
if (first_clone->clones) if (first_clone->clones)
for (n = first_clone->clones; n != first_clone;) for (n = first_clone->clones; n != first_clone;)
{ {
gcc_assert (n->symbol.decl == node->symbol.decl); gcc_assert (n->decl == node->decl);
n->symbol.decl = first_clone->symbol.decl; n->decl = first_clone->decl;
if (n->clones) if (n->clones)
n = n->clones; n = n->clones;
else if (n->next_sibling_clone) else if (n->next_sibling_clone)
@ -362,16 +362,16 @@ save_inline_function_body (struct cgraph_node *node)
} }
/* Copy the OLD_VERSION_NODE function tree to the new version. */ /* Copy the OLD_VERSION_NODE function tree to the new version. */
tree_function_versioning (node->symbol.decl, first_clone->symbol.decl, tree_function_versioning (node->decl, first_clone->decl,
NULL, true, NULL, false, NULL, true, NULL, false,
NULL, NULL); NULL, NULL);
/* The function will be short lived and removed after we inline all the clones, /* The function will be short lived and removed after we inline all the clones,
but make it internal so we won't confuse ourself. */ but make it internal so we won't confuse ourself. */
DECL_EXTERNAL (first_clone->symbol.decl) = 0; DECL_EXTERNAL (first_clone->decl) = 0;
DECL_COMDAT_GROUP (first_clone->symbol.decl) = NULL_TREE; DECL_COMDAT_GROUP (first_clone->decl) = NULL_TREE;
TREE_PUBLIC (first_clone->symbol.decl) = 0; TREE_PUBLIC (first_clone->decl) = 0;
DECL_COMDAT (first_clone->symbol.decl) = 0; DECL_COMDAT (first_clone->decl) = 0;
first_clone->ipa_transforms_to_apply.release (); first_clone->ipa_transforms_to_apply.release ();
/* When doing recursive inlining, the clone may become unnecessary. /* When doing recursive inlining, the clone may become unnecessary.
@ -397,7 +397,7 @@ static bool
preserve_function_body_p (struct cgraph_node *node) preserve_function_body_p (struct cgraph_node *node)
{ {
gcc_assert (cgraph_global_info_ready); gcc_assert (cgraph_global_info_ready);
gcc_assert (!node->symbol.alias && !node->thunk.thunk_p); gcc_assert (!node->alias && !node->thunk.thunk_p);
/* Look if there is any clone around. */ /* Look if there is any clone around. */
if (node->clones) if (node->clones)
@ -428,7 +428,7 @@ inline_transform (struct cgraph_node *node)
next = e->next_callee; next = e->next_callee;
cgraph_redirect_edge_call_stmt_to_callee (e); cgraph_redirect_edge_call_stmt_to_callee (e);
} }
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
timevar_push (TV_INTEGRATION); timevar_push (TV_INTEGRATION);
if (node->callees && optimize) if (node->callees && optimize)

View File

@ -221,8 +221,8 @@ report_inline_failed_reason (struct cgraph_edge *e)
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, " not inlinable: %s/%i -> %s/%i, %s\n", fprintf (dump_file, " not inlinable: %s/%i -> %s/%i, %s\n",
xstrdup (cgraph_node_name (e->caller)), e->caller->symbol.order, xstrdup (cgraph_node_name (e->caller)), e->caller->order,
xstrdup (cgraph_node_name (e->callee)), e->callee->symbol.order, xstrdup (cgraph_node_name (e->callee)), e->callee->order,
cgraph_inline_failed_string (e->inline_failed)); cgraph_inline_failed_string (e->inline_failed));
} }
} }
@ -244,22 +244,22 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
enum availability avail; enum availability avail;
struct cgraph_node *callee struct cgraph_node *callee
= cgraph_function_or_thunk_node (e->callee, &avail); = cgraph_function_or_thunk_node (e->callee, &avail);
tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->symbol.decl); tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->decl);
tree callee_tree tree callee_tree
= callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->symbol.decl) : NULL; = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
struct function *caller_cfun = DECL_STRUCT_FUNCTION (e->caller->symbol.decl); struct function *caller_cfun = DECL_STRUCT_FUNCTION (e->caller->decl);
struct function *callee_cfun struct function *callee_cfun
= callee ? DECL_STRUCT_FUNCTION (callee->symbol.decl) : NULL; = callee ? DECL_STRUCT_FUNCTION (callee->decl) : NULL;
if (!caller_cfun && e->caller->clone_of) if (!caller_cfun && e->caller->clone_of)
caller_cfun = DECL_STRUCT_FUNCTION (e->caller->clone_of->symbol.decl); caller_cfun = DECL_STRUCT_FUNCTION (e->caller->clone_of->decl);
if (!callee_cfun && callee && callee->clone_of) if (!callee_cfun && callee && callee->clone_of)
callee_cfun = DECL_STRUCT_FUNCTION (callee->clone_of->symbol.decl); callee_cfun = DECL_STRUCT_FUNCTION (callee->clone_of->decl);
gcc_assert (e->inline_failed); gcc_assert (e->inline_failed);
if (!callee || !callee->symbol.definition) if (!callee || !callee->definition)
{ {
e->inline_failed = CIF_BODY_NOT_AVAILABLE; e->inline_failed = CIF_BODY_NOT_AVAILABLE;
inlinable = false; inlinable = false;
@ -281,18 +281,18 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
inlinable = false; inlinable = false;
} }
/* Don't inline if the functions have different EH personalities. */ /* Don't inline if the functions have different EH personalities. */
else if (DECL_FUNCTION_PERSONALITY (e->caller->symbol.decl) else if (DECL_FUNCTION_PERSONALITY (e->caller->decl)
&& DECL_FUNCTION_PERSONALITY (callee->symbol.decl) && DECL_FUNCTION_PERSONALITY (callee->decl)
&& (DECL_FUNCTION_PERSONALITY (e->caller->symbol.decl) && (DECL_FUNCTION_PERSONALITY (e->caller->decl)
!= DECL_FUNCTION_PERSONALITY (callee->symbol.decl))) != DECL_FUNCTION_PERSONALITY (callee->decl)))
{ {
e->inline_failed = CIF_EH_PERSONALITY; e->inline_failed = CIF_EH_PERSONALITY;
inlinable = false; inlinable = false;
} }
/* TM pure functions should not be inlined into non-TM_pure /* TM pure functions should not be inlined into non-TM_pure
functions. */ functions. */
else if (is_tm_pure (callee->symbol.decl) else if (is_tm_pure (callee->decl)
&& !is_tm_pure (e->caller->symbol.decl)) && !is_tm_pure (e->caller->decl))
{ {
e->inline_failed = CIF_UNSPECIFIED; e->inline_failed = CIF_UNSPECIFIED;
inlinable = false; inlinable = false;
@ -308,20 +308,20 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
inlinable = false; inlinable = false;
} }
/* Check compatibility of target optimization options. */ /* Check compatibility of target optimization options. */
else if (!targetm.target_option.can_inline_p (e->caller->symbol.decl, else if (!targetm.target_option.can_inline_p (e->caller->decl,
callee->symbol.decl)) callee->decl))
{ {
e->inline_failed = CIF_TARGET_OPTION_MISMATCH; e->inline_failed = CIF_TARGET_OPTION_MISMATCH;
inlinable = false; inlinable = false;
} }
/* Check if caller growth allows the inlining. */ /* Check if caller growth allows the inlining. */
else if (!DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl) else if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl)
&& !disregard_limits && !disregard_limits
&& !lookup_attribute ("flatten", && !lookup_attribute ("flatten",
DECL_ATTRIBUTES DECL_ATTRIBUTES
(e->caller->global.inlined_to (e->caller->global.inlined_to
? e->caller->global.inlined_to->symbol.decl ? e->caller->global.inlined_to->decl
: e->caller->symbol.decl)) : e->caller->decl))
&& !caller_growth_limits (e)) && !caller_growth_limits (e))
inlinable = false; inlinable = false;
/* Don't inline a function with a higher optimization level than the /* Don't inline a function with a higher optimization level than the
@ -342,7 +342,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
if (((caller_opt->x_optimize > callee_opt->x_optimize) if (((caller_opt->x_optimize > callee_opt->x_optimize)
|| (caller_opt->x_optimize_size != callee_opt->x_optimize_size)) || (caller_opt->x_optimize_size != callee_opt->x_optimize_size))
/* gcc.dg/pr43564.c. Look at forced inline even in -O0. */ /* gcc.dg/pr43564.c. Look at forced inline even in -O0. */
&& !DECL_DISREGARD_INLINE_LIMITS (e->callee->symbol.decl)) && !DECL_DISREGARD_INLINE_LIMITS (e->callee->decl))
{ {
e->inline_failed = CIF_OPTIMIZATION_MISMATCH; e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
inlinable = false; inlinable = false;
@ -365,7 +365,7 @@ can_early_inline_edge_p (struct cgraph_edge *e)
/* Early inliner might get called at WPA stage when IPA pass adds new /* Early inliner might get called at WPA stage when IPA pass adds new
function. In this case we can not really do any of early inlining function. In this case we can not really do any of early inlining
because function bodies are missing. */ because function bodies are missing. */
if (!gimple_has_body_p (callee->symbol.decl)) if (!gimple_has_body_p (callee->decl))
{ {
e->inline_failed = CIF_BODY_NOT_AVAILABLE; e->inline_failed = CIF_BODY_NOT_AVAILABLE;
return false; return false;
@ -374,8 +374,8 @@ can_early_inline_edge_p (struct cgraph_edge *e)
(i.e. the callgraph is cyclic and we did not process (i.e. the callgraph is cyclic and we did not process
the callee by early inliner, yet). We don't have CIF code for this the callee by early inliner, yet). We don't have CIF code for this
case; later we will re-do the decision in the real inliner. */ case; later we will re-do the decision in the real inliner. */
if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->symbol.decl)) if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
|| !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->symbol.decl))) || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, " edge not inlinable: not in SSA form\n"); fprintf (dump_file, " edge not inlinable: not in SSA form\n");
@ -396,7 +396,7 @@ num_calls (struct cgraph_node *n)
int num = 0; int num = 0;
for (e = n->callees; e; e = e->next_callee) for (e = n->callees; e; e = e->next_callee)
if (!is_inexpensive_builtin (e->callee->symbol.decl)) if (!is_inexpensive_builtin (e->callee->decl))
num++; num++;
return num; return num;
} }
@ -410,9 +410,9 @@ want_early_inline_function_p (struct cgraph_edge *e)
bool want_inline = true; bool want_inline = true;
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
if (DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl)) if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
; ;
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !flag_inline_small_functions) && !flag_inline_small_functions)
{ {
e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE; e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
@ -433,8 +433,8 @@ want_early_inline_function_p (struct cgraph_edge *e)
fprintf (dump_file, " will not early inline: %s/%i->%s/%i, " fprintf (dump_file, " will not early inline: %s/%i->%s/%i, "
"call is cold and code would grow by %i\n", "call is cold and code would grow by %i\n",
xstrdup (cgraph_node_name (e->caller)), xstrdup (cgraph_node_name (e->caller)),
e->caller->symbol.order, e->caller->order,
xstrdup (cgraph_node_name (callee)), callee->symbol.order, xstrdup (cgraph_node_name (callee)), callee->order,
growth); growth);
want_inline = false; want_inline = false;
} }
@ -444,8 +444,8 @@ want_early_inline_function_p (struct cgraph_edge *e)
fprintf (dump_file, " will not early inline: %s/%i->%s/%i, " fprintf (dump_file, " will not early inline: %s/%i->%s/%i, "
"growth %i exceeds --param early-inlining-insns\n", "growth %i exceeds --param early-inlining-insns\n",
xstrdup (cgraph_node_name (e->caller)), xstrdup (cgraph_node_name (e->caller)),
e->caller->symbol.order, e->caller->order,
xstrdup (cgraph_node_name (callee)), callee->symbol.order, xstrdup (cgraph_node_name (callee)), callee->order,
growth); growth);
want_inline = false; want_inline = false;
} }
@ -457,8 +457,8 @@ want_early_inline_function_p (struct cgraph_edge *e)
"growth %i exceeds --param early-inlining-insns " "growth %i exceeds --param early-inlining-insns "
"divided by number of calls\n", "divided by number of calls\n",
xstrdup (cgraph_node_name (e->caller)), xstrdup (cgraph_node_name (e->caller)),
e->caller->symbol.order, e->caller->order,
xstrdup (cgraph_node_name (callee)), callee->symbol.order, xstrdup (cgraph_node_name (callee)), callee->order,
growth); growth);
want_inline = false; want_inline = false;
} }
@ -528,9 +528,9 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
bool want_inline = true; bool want_inline = true;
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
if (DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl)) if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
; ;
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !flag_inline_small_functions) && !flag_inline_small_functions)
{ {
e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE; e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
@ -546,7 +546,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
; ;
/* Apply MAX_INLINE_INSNS_SINGLE limit. Do not do so when /* Apply MAX_INLINE_INSNS_SINGLE limit. Do not do so when
hints suggests that inlining given function is very profitable. */ hints suggests that inlining given function is very profitable. */
else if (DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (DECL_DECLARED_INLINE_P (callee->decl)
&& growth >= MAX_INLINE_INSNS_SINGLE && growth >= MAX_INLINE_INSNS_SINGLE
&& !big_speedup && !big_speedup
&& !(hints & (INLINE_HINT_indirect_call && !(hints & (INLINE_HINT_indirect_call
@ -589,11 +589,11 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
Consequently we ask cgraph_can_remove_if_no_direct_calls_p Consequently we ask cgraph_can_remove_if_no_direct_calls_p
instead of instead of
cgraph_will_be_removed_from_program_if_no_direct_calls */ cgraph_will_be_removed_from_program_if_no_direct_calls */
&& !DECL_EXTERNAL (callee->symbol.decl) && !DECL_EXTERNAL (callee->decl)
&& cgraph_can_remove_if_no_direct_calls_p (callee) && cgraph_can_remove_if_no_direct_calls_p (callee)
&& estimate_growth (callee) <= 0) && estimate_growth (callee) <= 0)
; ;
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !flag_inline_functions) && !flag_inline_functions)
{ {
e->inline_failed = CIF_NOT_DECLARED_INLINED; e->inline_failed = CIF_NOT_DECLARED_INLINED;
@ -602,7 +602,7 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
/* Apply MAX_INLINE_INSNS_AUTO limit for functions not declared inline /* Apply MAX_INLINE_INSNS_AUTO limit for functions not declared inline
Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that
inlining given function is very profitable. */ inlining given function is very profitable. */
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) else if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !big_speedup && !big_speedup
&& growth >= ((hints & (INLINE_HINT_indirect_call && growth >= ((hints & (INLINE_HINT_indirect_call
| INLINE_HINT_loop_iterations | INLINE_HINT_loop_iterations
@ -649,7 +649,7 @@ want_inline_self_recursive_call_p (struct cgraph_edge *edge,
int caller_freq = CGRAPH_FREQ_BASE; int caller_freq = CGRAPH_FREQ_BASE;
int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO); int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
if (DECL_DECLARED_INLINE_P (edge->caller->symbol.decl)) if (DECL_DECLARED_INLINE_P (edge->caller->decl))
max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH); max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
if (!cgraph_maybe_hot_edge_p (edge)) if (!cgraph_maybe_hot_edge_p (edge))
@ -815,8 +815,8 @@ relative_time_benefit (struct inline_summary *callee_info,
/* Inlining into extern inline function is not a win. */ /* Inlining into extern inline function is not a win. */
if (DECL_EXTERNAL (edge->caller->global.inlined_to if (DECL_EXTERNAL (edge->caller->global.inlined_to
? edge->caller->global.inlined_to->symbol.decl ? edge->caller->global.inlined_to->decl
: edge->caller->symbol.decl)) : edge->caller->decl))
return 1; return 1;
/* Watch overflows. */ /* Watch overflows. */
@ -855,7 +855,7 @@ edge_badness (struct cgraph_edge *edge, bool dump)
struct inline_summary *callee_info = inline_summary (callee); struct inline_summary *callee_info = inline_summary (callee);
inline_hints hints; inline_hints hints;
if (DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl)) if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
return INT_MIN; return INT_MIN;
growth = estimate_edge_growth (edge); growth = estimate_edge_growth (edge);
@ -869,9 +869,9 @@ edge_badness (struct cgraph_edge *edge, bool dump)
{ {
fprintf (dump_file, " Badness calculation for %s/%i -> %s/%i\n", fprintf (dump_file, " Badness calculation for %s/%i -> %s/%i\n",
xstrdup (cgraph_node_name (edge->caller)), xstrdup (cgraph_node_name (edge->caller)),
edge->caller->symbol.order, edge->caller->order,
xstrdup (cgraph_node_name (callee)), xstrdup (cgraph_node_name (callee)),
edge->callee->symbol.order); edge->callee->order);
fprintf (dump_file, " size growth %i, time %i ", fprintf (dump_file, " size growth %i, time %i ",
growth, growth,
edge_time); edge_time);
@ -1036,9 +1036,9 @@ update_edge_key (fibheap_t heap, struct cgraph_edge *edge)
fprintf (dump_file, fprintf (dump_file,
" decreasing badness %s/%i -> %s/%i, %i to %i\n", " decreasing badness %s/%i -> %s/%i, %i to %i\n",
xstrdup (cgraph_node_name (edge->caller)), xstrdup (cgraph_node_name (edge->caller)),
edge->caller->symbol.order, edge->caller->order,
xstrdup (cgraph_node_name (edge->callee)), xstrdup (cgraph_node_name (edge->callee)),
edge->callee->symbol.order, edge->callee->order,
(int)n->key, (int)n->key,
badness); badness);
} }
@ -1053,9 +1053,9 @@ update_edge_key (fibheap_t heap, struct cgraph_edge *edge)
fprintf (dump_file, fprintf (dump_file,
" enqueuing call %s/%i -> %s/%i, badness %i\n", " enqueuing call %s/%i -> %s/%i, badness %i\n",
xstrdup (cgraph_node_name (edge->caller)), xstrdup (cgraph_node_name (edge->caller)),
edge->caller->symbol.order, edge->caller->order,
xstrdup (cgraph_node_name (edge->callee)), xstrdup (cgraph_node_name (edge->callee)),
edge->callee->symbol.order, edge->callee->order,
badness); badness);
} }
edge->aux = fibheap_insert (heap, badness, edge); edge->aux = fibheap_insert (heap, badness, edge);
@ -1086,7 +1086,7 @@ reset_edge_caches (struct cgraph_node *node)
for (edge = where->callers; edge; edge = edge->next_caller) for (edge = where->callers; edge; edge = edge->next_caller)
if (edge->inline_failed) if (edge->inline_failed)
reset_edge_growth_cache (edge); reset_edge_growth_cache (edge);
for (i = 0; ipa_ref_list_referring_iterate (&where->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&where->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
reset_edge_caches (ipa_ref_referring_node (ref)); reset_edge_caches (ipa_ref_referring_node (ref));
@ -1131,13 +1131,13 @@ update_caller_keys (fibheap_t heap, struct cgraph_node *node,
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
if ((!node->symbol.alias && !inline_summary (node)->inlinable) if ((!node->alias && !inline_summary (node)->inlinable)
|| node->global.inlined_to) || node->global.inlined_to)
return; return;
if (!bitmap_set_bit (updated_nodes, node->uid)) if (!bitmap_set_bit (updated_nodes, node->uid))
return; return;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
@ -1269,7 +1269,7 @@ recursive_inlining (struct cgraph_edge *edge,
if (node->global.inlined_to) if (node->global.inlined_to)
node = node->global.inlined_to; node = node->global.inlined_to;
if (DECL_DECLARED_INLINE_P (node->symbol.decl)) if (DECL_DECLARED_INLINE_P (node->decl))
limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE); limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
/* Make sure that function is small enough to be considered for inlining. */ /* Make sure that function is small enough to be considered for inlining. */
@ -1318,8 +1318,8 @@ recursive_inlining (struct cgraph_edge *edge,
depth = 1; depth = 1;
for (cnode = curr->caller; for (cnode = curr->caller;
cnode->global.inlined_to; cnode = cnode->callers->caller) cnode->global.inlined_to; cnode = cnode->callers->caller)
if (node->symbol.decl if (node->decl
== cgraph_function_or_thunk_node (curr->callee, NULL)->symbol.decl) == cgraph_function_or_thunk_node (curr->callee, NULL)->decl)
depth++; depth++;
if (!want_inline_self_recursive_call_p (curr, node, false, depth)) if (!want_inline_self_recursive_call_p (curr, node, false, depth))
@ -1343,7 +1343,7 @@ recursive_inlining (struct cgraph_edge *edge,
if (!master_clone) if (!master_clone)
{ {
/* We need original clone to copy around. */ /* We need original clone to copy around. */
master_clone = cgraph_clone_node (node, node->symbol.decl, master_clone = cgraph_clone_node (node, node->decl,
node->count, CGRAPH_FREQ_BASE, node->count, CGRAPH_FREQ_BASE,
false, vNULL, true, NULL); false, vNULL, true, NULL);
for (e = master_clone->callees; e; e = e->next_callee) for (e = master_clone->callees; e; e = e->next_callee)
@ -1455,7 +1455,7 @@ speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining)
else we propagate is useless. */ else we propagate is useless. */
if (avail >= AVAIL_AVAILABLE) if (avail >= AVAIL_AVAILABLE)
{ {
int ecf_flags = flags_from_decl_or_type (target->symbol.decl); int ecf_flags = flags_from_decl_or_type (target->decl);
if (ecf_flags & ECF_CONST) if (ecf_flags & ECF_CONST)
{ {
cgraph_speculative_call_info (e, direct, indirect, ref); cgraph_speculative_call_info (e, direct, indirect, ref);
@ -1545,9 +1545,9 @@ inline_small_functions (void)
|| node->thunk.thunk_p) || node->thunk.thunk_p)
{ {
struct inline_summary *info = inline_summary (node); struct inline_summary *info = inline_summary (node);
struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->symbol.aux; struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux;
if (!DECL_EXTERNAL (node->symbol.decl)) if (!DECL_EXTERNAL (node->decl))
initial_size += info->size; initial_size += info->size;
info->growth = estimate_growth (node); info->growth = estimate_growth (node);
if (dfs && dfs->next_cycle) if (dfs && dfs->next_cycle)
@ -1555,7 +1555,7 @@ inline_small_functions (void)
struct cgraph_node *n2; struct cgraph_node *n2;
int id = dfs->scc_no + 1; int id = dfs->scc_no + 1;
for (n2 = node; n2; for (n2 = node; n2;
n2 = ((struct ipa_dfs_info *) node->symbol.aux)->next_cycle) n2 = ((struct ipa_dfs_info *) node->aux)->next_cycle)
{ {
struct inline_summary *info2 = inline_summary (n2); struct inline_summary *info2 = inline_summary (n2);
if (info2->scc_no) if (info2->scc_no)
@ -1593,7 +1593,7 @@ inline_small_functions (void)
if (dump_file) if (dump_file)
fprintf (dump_file, "Enqueueing calls in %s/%i.\n", fprintf (dump_file, "Enqueueing calls in %s/%i.\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
for (edge = node->callees; edge; edge = next) for (edge = node->callees; edge; edge = next)
{ {
@ -1676,13 +1676,13 @@ inline_small_functions (void)
{ {
fprintf (dump_file, fprintf (dump_file,
"\nConsidering %s/%i with %i size\n", "\nConsidering %s/%i with %i size\n",
cgraph_node_name (callee), callee->symbol.order, cgraph_node_name (callee), callee->order,
inline_summary (callee)->size); inline_summary (callee)->size);
fprintf (dump_file, fprintf (dump_file,
" to be inlined into %s/%i in %s:%i\n" " to be inlined into %s/%i in %s:%i\n"
" Estimated growth after inlined into all is %+i insns.\n" " Estimated growth after inlined into all is %+i insns.\n"
" Estimated badness is %i, frequency %.2f.\n", " Estimated badness is %i, frequency %.2f.\n",
cgraph_node_name (edge->caller), edge->caller->symbol.order, cgraph_node_name (edge->caller), edge->caller->order,
flag_wpa ? "unknown" flag_wpa ? "unknown"
: gimple_filename ((const_gimple) edge->call_stmt), : gimple_filename ((const_gimple) edge->call_stmt),
flag_wpa ? -1 flag_wpa ? -1
@ -1698,7 +1698,7 @@ inline_small_functions (void)
} }
if (overall_size + growth > max_size if (overall_size + growth > max_size
&& !DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl)) && !DECL_DISREGARD_INLINE_LIMITS (callee->decl))
{ {
edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT; edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT;
report_inline_failed_reason (edge); report_inline_failed_reason (edge);
@ -1750,7 +1750,7 @@ inline_small_functions (void)
where = edge->caller; where = edge->caller;
while (where->global.inlined_to) while (where->global.inlined_to)
{ {
if (where->symbol.decl == callee->symbol.decl) if (where->decl == callee->decl)
outer_node = where, depth++; outer_node = where, depth++;
where = where->callers->caller; where = where->callers->caller;
} }
@ -1759,7 +1759,7 @@ inline_small_functions (void)
true, depth)) true, depth))
{ {
edge->inline_failed edge->inline_failed
= (DECL_DISREGARD_INLINE_LIMITS (edge->callee->symbol.decl) = (DECL_DISREGARD_INLINE_LIMITS (edge->callee->decl)
? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED); ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
resolve_noninline_speculation (edge_heap, edge); resolve_noninline_speculation (edge_heap, edge);
continue; continue;
@ -1831,9 +1831,9 @@ flatten_function (struct cgraph_node *node, bool early)
struct cgraph_edge *e; struct cgraph_edge *e;
/* We shouldn't be called recursively when we are being processed. */ /* We shouldn't be called recursively when we are being processed. */
gcc_assert (node->symbol.aux == NULL); gcc_assert (node->aux == NULL);
node->symbol.aux = (void *) node; node->aux = (void *) node;
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
{ {
@ -1841,7 +1841,7 @@ flatten_function (struct cgraph_node *node, bool early)
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
/* We've hit cycle? It is time to give up. */ /* We've hit cycle? It is time to give up. */
if (callee->symbol.aux) if (callee->aux)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
@ -1875,8 +1875,8 @@ flatten_function (struct cgraph_node *node, bool early)
continue; continue;
} }
if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->symbol.decl)) if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
!= gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->symbol.decl))) != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Not inlining: SSA form does not match.\n"); fprintf (dump_file, "Not inlining: SSA form does not match.\n");
@ -1892,13 +1892,13 @@ flatten_function (struct cgraph_node *node, bool early)
orig_callee = callee; orig_callee = callee;
inline_call (e, true, NULL, NULL, false); inline_call (e, true, NULL, NULL, false);
if (e->callee != orig_callee) if (e->callee != orig_callee)
orig_callee->symbol.aux = (void *) node; orig_callee->aux = (void *) node;
flatten_function (e->callee, early); flatten_function (e->callee, early);
if (e->callee != orig_callee) if (e->callee != orig_callee)
orig_callee->symbol.aux = NULL; orig_callee->aux = NULL;
} }
node->symbol.aux = NULL; node->aux = NULL;
if (!node->global.inlined_to) if (!node->global.inlined_to)
inline_update_overall_summary (node); inline_update_overall_summary (node);
} }
@ -1984,7 +1984,7 @@ ipa_inline (void)
nnodes = ipa_reverse_postorder (order); nnodes = ipa_reverse_postorder (order);
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
node->symbol.aux = 0; node->aux = 0;
if (dump_file) if (dump_file)
fprintf (dump_file, "\nFlattening functions:\n"); fprintf (dump_file, "\nFlattening functions:\n");
@ -2001,7 +2001,7 @@ ipa_inline (void)
try to flatten itself turning it into a self-recursive try to flatten itself turning it into a self-recursive
function. */ function. */
if (lookup_attribute ("flatten", if (lookup_attribute ("flatten",
DECL_ATTRIBUTES (node->symbol.decl)) != NULL) DECL_ATTRIBUTES (node->decl)) != NULL)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
@ -2106,7 +2106,7 @@ inline_always_inline_functions (struct cgraph_node *node)
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
{ {
struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL); struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
if (!DECL_DISREGARD_INLINE_LIMITS (callee->symbol.decl)) if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl))
continue; continue;
if (cgraph_edge_recursive_p (e)) if (cgraph_edge_recursive_p (e))
@ -2124,7 +2124,7 @@ inline_always_inline_functions (struct cgraph_node *node)
is not inlinable. This will allow flagging an error later in is not inlinable. This will allow flagging an error later in
expand_call_inline in tree-inline.c. */ expand_call_inline in tree-inline.c. */
if (lookup_attribute ("always_inline", if (lookup_attribute ("always_inline",
DECL_ATTRIBUTES (callee->symbol.decl)) != NULL) DECL_ATTRIBUTES (callee->decl)) != NULL)
inlined = true; inlined = true;
continue; continue;
} }
@ -2159,7 +2159,7 @@ early_inline_small_functions (struct cgraph_node *node)
continue; continue;
/* Do not consider functions not declared inline. */ /* Do not consider functions not declared inline. */
if (!DECL_DECLARED_INLINE_P (callee->symbol.decl) if (!DECL_DECLARED_INLINE_P (callee->decl)
&& !flag_inline_small_functions && !flag_inline_small_functions
&& !flag_inline_functions) && !flag_inline_functions)
continue; continue;
@ -2219,7 +2219,7 @@ early_inliner (void)
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
verify_cgraph_node (node); verify_cgraph_node (node);
#endif #endif
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
/* Even when not optimizing or not inlining inline always-inline /* Even when not optimizing or not inlining inline always-inline
functions. */ functions. */
@ -2236,10 +2236,10 @@ early_inliner (void)
cycles of edges to be always inlined in the callgraph. cycles of edges to be always inlined in the callgraph.
We might want to be smarter and just avoid this type of inlining. */ We might want to be smarter and just avoid this type of inlining. */
|| DECL_DISREGARD_INLINE_LIMITS (node->symbol.decl)) || DECL_DISREGARD_INLINE_LIMITS (node->decl))
; ;
else if (lookup_attribute ("flatten", else if (lookup_attribute ("flatten",
DECL_ATTRIBUTES (node->symbol.decl)) != NULL) DECL_ATTRIBUTES (node->decl)) != NULL)
{ {
/* When the function is marked to be flattened, recursively inline /* When the function is marked to be flattened, recursively inline
all calls in it. */ all calls in it. */
@ -2270,9 +2270,9 @@ early_inliner (void)
= estimate_num_insns (edge->call_stmt, &eni_size_weights); = estimate_num_insns (edge->call_stmt, &eni_size_weights);
es->call_stmt_time es->call_stmt_time
= estimate_num_insns (edge->call_stmt, &eni_time_weights); = estimate_num_insns (edge->call_stmt, &eni_time_weights);
if (edge->callee->symbol.decl if (edge->callee->decl
&& !gimple_check_call_matching_types ( && !gimple_check_call_matching_types (
edge->call_stmt, edge->callee->symbol.decl, false)) edge->call_stmt, edge->callee->decl, false))
edge->call_stmt_cannot_inline_p = true; edge->call_stmt_cannot_inline_p = true;
} }
timevar_pop (TV_INTEGRATION); timevar_pop (TV_INTEGRATION);

View File

@ -185,7 +185,7 @@ ipa_profile_generate_summary (void)
10); 10);
FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node) FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (node->symbol.decl)) FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (node->decl))
{ {
int time = 0; int time = 0;
int size = 0; int size = 0;
@ -197,7 +197,7 @@ ipa_profile_generate_summary (void)
{ {
histogram_value h; histogram_value h;
h = gimple_histogram_value_of_type h = gimple_histogram_value_of_type
(DECL_STRUCT_FUNCTION (node->symbol.decl), (DECL_STRUCT_FUNCTION (node->decl),
stmt, HIST_TYPE_INDIR_CALL); stmt, HIST_TYPE_INDIR_CALL);
/* No need to do sanity check: gimple_ic_transform already /* No need to do sanity check: gimple_ic_transform already
takes away bad histograms. */ takes away bad histograms. */
@ -219,7 +219,7 @@ ipa_profile_generate_summary (void)
e->indirect_info->common_target_probability = REG_BR_PROB_BASE; e->indirect_info->common_target_probability = REG_BR_PROB_BASE;
} }
} }
gimple_remove_histogram_value (DECL_STRUCT_FUNCTION (node->symbol.decl), gimple_remove_histogram_value (DECL_STRUCT_FUNCTION (node->decl),
stmt, h); stmt, h);
} }
} }
@ -325,7 +325,7 @@ ipa_propagate_frequency_1 (struct cgraph_node *node, void *data)
/* It makes sense to put main() together with the static constructors. /* It makes sense to put main() together with the static constructors.
It will be executed for sure, but rest of functions called from It will be executed for sure, but rest of functions called from
main are definitely not at startup only. */ main are definitely not at startup only. */
if (MAIN_NAME_P (DECL_NAME (edge->caller->symbol.decl))) if (MAIN_NAME_P (DECL_NAME (edge->caller->decl)))
d->only_called_at_startup = 0; d->only_called_at_startup = 0;
d->only_called_at_exit &= edge->caller->only_called_at_exit; d->only_called_at_exit &= edge->caller->only_called_at_exit;
} }
@ -401,10 +401,10 @@ ipa_propagate_frequency (struct cgraph_node *node)
/* We can not propagate anything useful about externally visible functions /* We can not propagate anything useful about externally visible functions
nor about virtuals. */ nor about virtuals. */
if (!node->local.local if (!node->local.local
|| node->symbol.alias || node->alias
|| (flag_devirtualize && DECL_VIRTUAL_P (node->symbol.decl))) || (flag_devirtualize && DECL_VIRTUAL_P (node->decl)))
return false; return false;
gcc_assert (node->symbol.analyzed); gcc_assert (node->analyzed);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Processing frequency %s\n", cgraph_node_name (node)); fprintf (dump_file, "Processing frequency %s\n", cgraph_node_name (node));
@ -589,8 +589,8 @@ ipa_profile (void)
{ {
fprintf (dump_file, "Indirect call -> direct call from" fprintf (dump_file, "Indirect call -> direct call from"
" other module %s/%i => %s/%i, prob %3.2f\n", " other module %s/%i => %s/%i, prob %3.2f\n",
xstrdup (cgraph_node_name (n)), n->symbol.order, xstrdup (cgraph_node_name (n)), n->order,
xstrdup (cgraph_node_name (n2)), n2->symbol.order, xstrdup (cgraph_node_name (n2)), n2->order,
e->indirect_info->common_target_probability e->indirect_info->common_target_probability
/ (float)REG_BR_PROB_BASE); / (float)REG_BR_PROB_BASE);
} }
@ -611,7 +611,7 @@ ipa_profile (void)
} }
else if (cgraph_function_body_availability (n2) else if (cgraph_function_body_availability (n2)
<= AVAIL_OVERWRITABLE <= AVAIL_OVERWRITABLE
&& symtab_can_be_discarded ((symtab_node) n2)) && symtab_can_be_discarded (n2))
{ {
nuseless++; nuseless++;
if (dump_file) if (dump_file)
@ -625,11 +625,11 @@ ipa_profile (void)
control flow goes to this particular implementation control flow goes to this particular implementation
of N2. Speculate on the local alias to allow inlining. of N2. Speculate on the local alias to allow inlining.
*/ */
if (!symtab_can_be_discarded ((symtab_node) n2)) if (!symtab_can_be_discarded (n2))
{ {
cgraph_node *alias; cgraph_node *alias;
alias = cgraph (symtab_nonoverwritable_alias alias = cgraph (symtab_nonoverwritable_alias
((symtab_node)n2)); (n2));
if (alias) if (alias)
n2 = alias; n2 = alias;
} }
@ -677,13 +677,13 @@ ipa_profile (void)
if (order[i]->local.local && ipa_propagate_frequency (order[i])) if (order[i]->local.local && ipa_propagate_frequency (order[i]))
{ {
for (e = order[i]->callees; e; e = e->next_callee) for (e = order[i]->callees; e; e = e->next_callee)
if (e->callee->local.local && !e->callee->symbol.aux) if (e->callee->local.local && !e->callee->aux)
{ {
something_changed = true; something_changed = true;
e->callee->symbol.aux = (void *)1; e->callee->aux = (void *)1;
} }
} }
order[i]->symbol.aux = NULL; order[i]->aux = NULL;
} }
while (something_changed) while (something_changed)
@ -691,16 +691,16 @@ ipa_profile (void)
something_changed = false; something_changed = false;
for (i = order_pos - 1; i >= 0; i--) for (i = order_pos - 1; i >= 0; i--)
{ {
if (order[i]->symbol.aux && ipa_propagate_frequency (order[i])) if (order[i]->aux && ipa_propagate_frequency (order[i]))
{ {
for (e = order[i]->callees; e; e = e->next_callee) for (e = order[i]->callees; e; e = e->next_callee)
if (e->callee->local.local && !e->callee->symbol.aux) if (e->callee->local.local && !e->callee->aux)
{ {
something_changed = true; something_changed = true;
e->callee->symbol.aux = (void *)1; e->callee->aux = (void *)1;
} }
} }
order[i]->symbol.aux = NULL; order[i]->aux = NULL;
} }
} }
free (order); free (order);

View File

@ -90,7 +90,7 @@ static alloc_pool ipa_refdesc_pool;
static bool static bool
ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node *node) ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node *node)
{ {
tree fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node->symbol.decl); tree fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node->decl);
struct cl_optimization *os; struct cl_optimization *os;
if (!fs_opts) if (!fs_opts)
@ -136,7 +136,7 @@ ipa_populate_param_decls (struct cgraph_node *node,
tree parm; tree parm;
int param_num; int param_num;
fndecl = node->symbol.decl; fndecl = node->decl;
gcc_assert (gimple_has_body_p (fndecl)); gcc_assert (gimple_has_body_p (fndecl));
fnargs = DECL_ARGUMENTS (fndecl); fnargs = DECL_ARGUMENTS (fndecl);
param_num = 0; param_num = 0;
@ -201,7 +201,7 @@ ipa_initialize_node_params (struct cgraph_node *node)
if (!info->descriptors.exists ()) if (!info->descriptors.exists ())
{ {
ipa_alloc_node_params (node, count_formal_params (node->symbol.decl)); ipa_alloc_node_params (node, count_formal_params (node->decl));
ipa_populate_param_decls (node, info->descriptors); ipa_populate_param_decls (node, info->descriptors);
} }
} }
@ -315,16 +315,16 @@ ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
struct cgraph_edge *cs; struct cgraph_edge *cs;
fprintf (f, " Jump functions of caller %s/%i:\n", cgraph_node_name (node), fprintf (f, " Jump functions of caller %s/%i:\n", cgraph_node_name (node),
node->symbol.order); node->order);
for (cs = node->callees; cs; cs = cs->next_callee) for (cs = node->callees; cs; cs = cs->next_callee)
{ {
if (!ipa_edge_args_info_available_for_edge_p (cs)) if (!ipa_edge_args_info_available_for_edge_p (cs))
continue; continue;
fprintf (f, " callsite %s/%i -> %s/%i : \n", fprintf (f, " callsite %s/%i -> %s/%i : \n",
xstrdup (cgraph_node_name (node)), node->symbol.order, xstrdup (cgraph_node_name (node)), node->order,
xstrdup (cgraph_node_name (cs->callee)), xstrdup (cgraph_node_name (cs->callee)),
cs->callee->symbol.order); cs->callee->order);
ipa_print_node_jump_functions_for_edge (f, cs); ipa_print_node_jump_functions_for_edge (f, cs);
} }
@ -1513,7 +1513,7 @@ ipa_get_callee_param_type (struct cgraph_edge *e, int i)
{ {
int n; int n;
tree type = (e->callee tree type = (e->callee
? TREE_TYPE (e->callee->symbol.decl) ? TREE_TYPE (e->callee->decl)
: gimple_call_fntype (e->call_stmt)); : gimple_call_fntype (e->call_stmt));
tree t = TYPE_ARG_TYPES (type); tree t = TYPE_ARG_TYPES (type);
@ -1527,7 +1527,7 @@ ipa_get_callee_param_type (struct cgraph_edge *e, int i)
return TREE_VALUE (t); return TREE_VALUE (t);
if (!e->callee) if (!e->callee)
return NULL; return NULL;
t = DECL_ARGUMENTS (e->callee->symbol.decl); t = DECL_ARGUMENTS (e->callee->decl);
for (n = 0; n < i; n++) for (n = 0; n < i; n++)
{ {
if (!t) if (!t)
@ -1647,7 +1647,7 @@ ipa_compute_jump_functions (struct cgraph_node *node,
NULL); NULL);
/* We do not need to bother analyzing calls to unknown /* We do not need to bother analyzing calls to unknown
functions unless they may become known during lto/whopr. */ functions unless they may become known during lto/whopr. */
if (!callee->symbol.definition && !flag_lto) if (!callee->definition && !flag_lto)
continue; continue;
ipa_compute_jump_functions_for_edge (parms_ainfo, cs); ipa_compute_jump_functions_for_edge (parms_ainfo, cs);
} }
@ -2056,7 +2056,7 @@ static void
ipa_analyze_params_uses (struct cgraph_node *node, ipa_analyze_params_uses (struct cgraph_node *node,
struct param_analysis_info *parms_ainfo) struct param_analysis_info *parms_ainfo)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
basic_block bb; basic_block bb;
struct function *func; struct function *func;
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
@ -2086,7 +2086,7 @@ ipa_analyze_params_uses (struct cgraph_node *node,
the flag during modification analysis. */ the flag during modification analysis. */
if (is_gimple_reg (parm)) if (is_gimple_reg (parm))
{ {
tree ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->symbol.decl), tree ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->decl),
parm); parm);
if (ddef && !has_zero_uses (ddef)) if (ddef && !has_zero_uses (ddef))
{ {
@ -2165,7 +2165,7 @@ ipa_analyze_node (struct cgraph_node *node)
ipa_check_create_node_params (); ipa_check_create_node_params ();
ipa_check_create_edge_args (); ipa_check_create_edge_args ();
info = IPA_NODE_REF (node); info = IPA_NODE_REF (node);
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
ipa_initialize_node_params (node); ipa_initialize_node_params (node);
param_count = ipa_get_param_count (info); param_count = ipa_get_param_count (info);
@ -2418,7 +2418,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
if (dump_file) if (dump_file)
fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" fprintf (dump_file, "ipa-prop: Discovered direct call to non-function"
" in %s/%i, making it unreachable.\n", " in %s/%i, making it unreachable.\n",
cgraph_node_name (ie->caller), ie->caller->symbol.order); cgraph_node_name (ie->caller), ie->caller->order);
target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
callee = cgraph_get_create_node (target); callee = cgraph_get_create_node (target);
unreachable = true; unreachable = true;
@ -2445,9 +2445,9 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
fprintf (dump_file, "ipa-prop: Discovered call to a known target " fprintf (dump_file, "ipa-prop: Discovered call to a known target "
"(%s/%i -> %s/%i) but can not refer to it. Giving up.\n", "(%s/%i -> %s/%i) but can not refer to it. Giving up.\n",
xstrdup (cgraph_node_name (ie->caller)), xstrdup (cgraph_node_name (ie->caller)),
ie->caller->symbol.order, ie->caller->order,
xstrdup (cgraph_node_name (ie->callee)), xstrdup (cgraph_node_name (ie->callee)),
ie->callee->symbol.order); ie->callee->order);
return NULL; return NULL;
} }
callee = cgraph_get_create_real_symbol_node (target); callee = cgraph_get_create_real_symbol_node (target);
@ -2464,9 +2464,9 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
"(%s/%i -> %s/%i), for stmt ", "(%s/%i -> %s/%i), for stmt ",
ie->indirect_info->polymorphic ? "a virtual" : "an indirect", ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
xstrdup (cgraph_node_name (ie->caller)), xstrdup (cgraph_node_name (ie->caller)),
ie->caller->symbol.order, ie->caller->order,
xstrdup (cgraph_node_name (callee)), xstrdup (cgraph_node_name (callee)),
callee->symbol.order); callee->order);
if (ie->call_stmt) if (ie->call_stmt)
print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM); print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
else else
@ -2520,7 +2520,7 @@ remove_described_reference (symtab_node symbol, struct ipa_cst_ref_desc *rdesc)
origin = rdesc->cs; origin = rdesc->cs;
if (!origin) if (!origin)
return false; return false;
to_del = ipa_find_reference ((symtab_node) origin->caller, symbol, to_del = ipa_find_reference (origin->caller, symbol,
origin->call_stmt, origin->lto_stmt_uid); origin->call_stmt, origin->lto_stmt_uid);
if (!to_del) if (!to_del)
return false; return false;
@ -2529,7 +2529,7 @@ remove_described_reference (symtab_node symbol, struct ipa_cst_ref_desc *rdesc)
if (dump_file) if (dump_file)
fprintf (dump_file, "ipa-prop: Removed a reference from %s/%i to %s.\n", fprintf (dump_file, "ipa-prop: Removed a reference from %s/%i to %s.\n",
xstrdup (cgraph_node_name (origin->caller)), xstrdup (cgraph_node_name (origin->caller)),
origin->caller->symbol.order, xstrdup (symtab_node_name (symbol))); origin->caller->order, xstrdup (symtab_node_name (symbol)));
return true; return true;
} }
@ -2577,7 +2577,7 @@ try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
&& (rdesc = jfunc_rdesc_usable (jfunc)) && (rdesc = jfunc_rdesc_usable (jfunc))
&& --rdesc->refcount == 0) && --rdesc->refcount == 0)
{ {
symtab_node symbol = (symtab_node) cgraph_node_for_jfunc (jfunc); symtab_node symbol = cgraph_node_for_jfunc (jfunc);
if (!symbol) if (!symbol)
return false; return false;
@ -2737,7 +2737,7 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
new_direct_edge->call_stmt_cannot_inline_p new_direct_edge->call_stmt_cannot_inline_p
= !gimple_check_call_matching_types ( = !gimple_check_call_matching_types (
new_direct_edge->call_stmt, new_direct_edge->call_stmt,
new_direct_edge->callee->symbol.decl, false); new_direct_edge->callee->decl, false);
if (new_edges) if (new_edges)
{ {
new_edges->safe_push (new_direct_edge); new_edges->safe_push (new_direct_edge);
@ -2853,15 +2853,15 @@ propagate_controlled_uses (struct cgraph_edge *cs)
if (t && TREE_CODE (t) == ADDR_EXPR if (t && TREE_CODE (t) == ADDR_EXPR
&& TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL && TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
&& (n = cgraph_get_node (TREE_OPERAND (t, 0))) && (n = cgraph_get_node (TREE_OPERAND (t, 0)))
&& (ref = ipa_find_reference ((symtab_node) new_root, && (ref = ipa_find_reference (new_root,
(symtab_node) n, NULL, 0))) n, NULL, 0)))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "ipa-prop: Removing cloning-created " fprintf (dump_file, "ipa-prop: Removing cloning-created "
"reference from %s/%i to %s/%i.\n", "reference from %s/%i to %s/%i.\n",
xstrdup (cgraph_node_name (new_root)), xstrdup (cgraph_node_name (new_root)),
new_root->symbol.order, new_root->order,
xstrdup (cgraph_node_name (n)), n->symbol.order); xstrdup (cgraph_node_name (n)), n->order);
ipa_remove_reference (ref); ipa_remove_reference (ref);
} }
} }
@ -2884,7 +2884,7 @@ propagate_controlled_uses (struct cgraph_edge *cs)
{ {
struct cgraph_node *clone; struct cgraph_node *clone;
bool ok; bool ok;
ok = remove_described_reference ((symtab_node) n, rdesc); ok = remove_described_reference (n, rdesc);
gcc_checking_assert (ok); gcc_checking_assert (ok);
clone = cs->caller; clone = cs->caller;
@ -2893,8 +2893,8 @@ propagate_controlled_uses (struct cgraph_edge *cs)
&& IPA_NODE_REF (clone)->ipcp_orig_node) && IPA_NODE_REF (clone)->ipcp_orig_node)
{ {
struct ipa_ref *ref; struct ipa_ref *ref;
ref = ipa_find_reference ((symtab_node) clone, ref = ipa_find_reference (clone,
(symtab_node) n, NULL, 0); n, NULL, 0);
if (ref) if (ref)
{ {
if (dump_file) if (dump_file)
@ -2902,9 +2902,9 @@ propagate_controlled_uses (struct cgraph_edge *cs)
"cloning-created reference " "cloning-created reference "
"from %s/%i to %s/%i.\n", "from %s/%i to %s/%i.\n",
xstrdup (cgraph_node_name (clone)), xstrdup (cgraph_node_name (clone)),
clone->symbol.order, clone->order,
xstrdup (cgraph_node_name (n)), xstrdup (cgraph_node_name (n)),
n->symbol.order); n->order);
ipa_remove_reference (ref); ipa_remove_reference (ref);
} }
clone = clone->callers->caller; clone = clone->callers->caller;
@ -3097,12 +3097,12 @@ ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
else if (src->caller == dst->caller) else if (src->caller == dst->caller)
{ {
struct ipa_ref *ref; struct ipa_ref *ref;
symtab_node n = (symtab_node) cgraph_node_for_jfunc (src_jf); symtab_node n = cgraph_node_for_jfunc (src_jf);
gcc_checking_assert (n); gcc_checking_assert (n);
ref = ipa_find_reference ((symtab_node) src->caller, n, ref = ipa_find_reference (src->caller, n,
src->call_stmt, src->lto_stmt_uid); src->call_stmt, src->lto_stmt_uid);
gcc_checking_assert (ref); gcc_checking_assert (ref);
ipa_clone_ref (ref, (symtab_node) dst->caller, ref->stmt); ipa_clone_ref (ref, dst->caller, ref->stmt);
gcc_checking_assert (ipa_refdesc_pool); gcc_checking_assert (ipa_refdesc_pool);
struct ipa_cst_ref_desc *dst_rdesc struct ipa_cst_ref_desc *dst_rdesc
@ -3283,11 +3283,11 @@ ipa_print_node_params (FILE *f, struct cgraph_node *node)
int i, count; int i, count;
struct ipa_node_params *info; struct ipa_node_params *info;
if (!node->symbol.definition) if (!node->definition)
return; return;
info = IPA_NODE_REF (node); info = IPA_NODE_REF (node);
fprintf (f, " function %s/%i parameter descriptors:\n", fprintf (f, " function %s/%i parameter descriptors:\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
count = ipa_get_param_count (info); count = ipa_get_param_count (info);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
@ -3530,8 +3530,8 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
len = adjustments.length (); len = adjustments.length ();
vargs.create (len); vargs.create (len);
callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->symbol.decl; callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
ipa_remove_stmt_references ((symtab_node) current_node, stmt); ipa_remove_stmt_references (current_node, stmt);
gsi = gsi_for_stmt (stmt); gsi = gsi_for_stmt (stmt);
prev_gsi = gsi; prev_gsi = gsi;
@ -4123,7 +4123,7 @@ ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
struct bitpack_d bp; struct bitpack_d bp;
encoder = ob->decl_state->symtab_node_encoder; encoder = ob->decl_state->symtab_node_encoder;
node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node); node_ref = lto_symtab_encoder_encode (encoder, node);
streamer_write_uhwi (ob, node_ref); streamer_write_uhwi (ob, node_ref);
streamer_write_uhwi (ob, ipa_get_param_count (info)); streamer_write_uhwi (ob, ipa_get_param_count (info));
@ -4287,7 +4287,7 @@ ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
index = streamer_read_uhwi (&ib_main); index = streamer_read_uhwi (&ib_main);
encoder = file_data->symtab_node_encoder; encoder = file_data->symtab_node_encoder;
node = cgraph (lto_symtab_encoder_deref (encoder, index)); node = cgraph (lto_symtab_encoder_deref (encoder, index));
gcc_assert (node->symbol.definition); gcc_assert (node->definition);
ipa_read_node_info (&ib_main, node, data_in); ipa_read_node_info (&ib_main, node, data_in);
} }
lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data, lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
@ -4339,7 +4339,7 @@ write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
aggvals = ipa_get_agg_replacements_for_node (node); aggvals = ipa_get_agg_replacements_for_node (node);
encoder = ob->decl_state->symtab_node_encoder; encoder = ob->decl_state->symtab_node_encoder;
node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node); node_ref = lto_symtab_encoder_encode (encoder, node);
streamer_write_uhwi (ob, node_ref); streamer_write_uhwi (ob, node_ref);
for (av = aggvals; av; av = av->next) for (av = aggvals; av; av = av->next)
@ -4463,7 +4463,7 @@ read_replacements_section (struct lto_file_decl_data *file_data,
index = streamer_read_uhwi (&ib_main); index = streamer_read_uhwi (&ib_main);
encoder = file_data->symtab_node_encoder; encoder = file_data->symtab_node_encoder;
node = cgraph (lto_symtab_encoder_deref (encoder, index)); node = cgraph (lto_symtab_encoder_deref (encoder, index));
gcc_assert (node->symbol.definition); gcc_assert (node->definition);
read_agg_replacement_chain (&ib_main, node, data_in); read_agg_replacement_chain (&ib_main, node, data_in);
} }
lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data, lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
@ -4545,12 +4545,12 @@ ipcp_transform_function (struct cgraph_node *node)
if (dump_file) if (dump_file)
fprintf (dump_file, "Modification phase of node %s/%i\n", fprintf (dump_file, "Modification phase of node %s/%i\n",
cgraph_node_name (node), node->symbol.order); cgraph_node_name (node), node->order);
aggval = ipa_get_agg_replacements_for_node (node); aggval = ipa_get_agg_replacements_for_node (node);
if (!aggval) if (!aggval)
return 0; return 0;
param_count = count_formal_params (node->symbol.decl); param_count = count_formal_params (node->decl);
if (param_count == 0) if (param_count == 0)
return 0; return 0;
adjust_agg_replacement_values (node, aggval); adjust_agg_replacement_values (node, aggval);

View File

@ -716,7 +716,7 @@ check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa)
static funct_state static funct_state
analyze_function (struct cgraph_node *fn, bool ipa) analyze_function (struct cgraph_node *fn, bool ipa)
{ {
tree decl = fn->symbol.decl; tree decl = fn->decl;
funct_state l; funct_state l;
basic_block this_block; basic_block this_block;
@ -727,10 +727,10 @@ analyze_function (struct cgraph_node *fn, bool ipa)
l->looping = false; l->looping = false;
l->can_throw = false; l->can_throw = false;
state_from_flags (&l->state_previously_known, &l->looping_previously_known, state_from_flags (&l->state_previously_known, &l->looping_previously_known,
flags_from_decl_or_type (fn->symbol.decl), flags_from_decl_or_type (fn->decl),
cgraph_node_cannot_return (fn)); cgraph_node_cannot_return (fn));
if (fn->thunk.thunk_p || fn->symbol.alias) if (fn->thunk.thunk_p || fn->alias)
{ {
/* Thunk gets propagated through, so nothing interesting happens. */ /* Thunk gets propagated through, so nothing interesting happens. */
gcc_assert (ipa); gcc_assert (ipa);
@ -943,7 +943,7 @@ pure_const_write_summary (void)
lsei_next_function_in_partition (&lsei)) lsei_next_function_in_partition (&lsei))
{ {
node = lsei_cgraph_node (lsei); node = lsei_cgraph_node (lsei);
if (node->symbol.definition && has_function_state (node)) if (node->definition && has_function_state (node))
count++; count++;
} }
@ -954,7 +954,7 @@ pure_const_write_summary (void)
lsei_next_function_in_partition (&lsei)) lsei_next_function_in_partition (&lsei))
{ {
node = lsei_cgraph_node (lsei); node = lsei_cgraph_node (lsei);
if (node->symbol.definition && has_function_state (node)) if (node->definition && has_function_state (node))
{ {
struct bitpack_d bp; struct bitpack_d bp;
funct_state fs; funct_state fs;
@ -964,7 +964,7 @@ pure_const_write_summary (void)
fs = get_function_state (node); fs = get_function_state (node);
encoder = ob->decl_state->symtab_node_encoder; encoder = ob->decl_state->symtab_node_encoder;
node_ref = lto_symtab_encoder_encode (encoder, (symtab_node)node); node_ref = lto_symtab_encoder_encode (encoder, node);
streamer_write_uhwi_stream (ob->main_stream, node_ref); streamer_write_uhwi_stream (ob->main_stream, node_ref);
/* Note that flags will need to be read in the opposite /* Note that flags will need to be read in the opposite
@ -1033,10 +1033,10 @@ pure_const_read_summary (void)
fs->can_throw = bp_unpack_value (&bp, 1); fs->can_throw = bp_unpack_value (&bp, 1);
if (dump_file) if (dump_file)
{ {
int flags = flags_from_decl_or_type (node->symbol.decl); int flags = flags_from_decl_or_type (node->decl);
fprintf (dump_file, "Read info for %s/%i ", fprintf (dump_file, "Read info for %s/%i ",
cgraph_node_name (node), cgraph_node_name (node),
node->symbol.order); node->order);
if (flags & ECF_CONST) if (flags & ECF_CONST)
fprintf (dump_file, " const"); fprintf (dump_file, " const");
if (flags & ECF_PURE) if (flags & ECF_PURE)
@ -1117,7 +1117,7 @@ propagate_pure_const (void)
int count = 0; int count = 0;
node = order[i]; node = order[i];
if (node->symbol.alias) if (node->alias)
continue; continue;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
@ -1136,7 +1136,7 @@ propagate_pure_const (void)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " Visiting %s/%i state:%s looping %i\n", fprintf (dump_file, " Visiting %s/%i state:%s looping %i\n",
cgraph_node_name (w), cgraph_node_name (w),
w->symbol.order, w->order,
pure_const_names[w_l->pure_const_state], pure_const_names[w_l->pure_const_state],
w_l->looping); w_l->looping);
@ -1183,7 +1183,7 @@ propagate_pure_const (void)
fprintf (dump_file, fprintf (dump_file,
" Call to %s/%i", " Call to %s/%i",
cgraph_node_name (e->callee), cgraph_node_name (e->callee),
e->callee->symbol.order); e->callee->order);
} }
if (avail > AVAIL_OVERWRITABLE) if (avail > AVAIL_OVERWRITABLE)
{ {
@ -1212,11 +1212,11 @@ propagate_pure_const (void)
} }
} }
else if (special_builtin_state (&edge_state, &edge_looping, else if (special_builtin_state (&edge_state, &edge_looping,
y->symbol.decl)) y->decl))
; ;
else else
state_from_flags (&edge_state, &edge_looping, state_from_flags (&edge_state, &edge_looping,
flags_from_decl_or_type (y->symbol.decl), flags_from_decl_or_type (y->decl),
cgraph_edge_cannot_lead_to_return (e)); cgraph_edge_cannot_lead_to_return (e));
/* Merge the results with what we already know. */ /* Merge the results with what we already know. */
@ -1255,7 +1255,7 @@ propagate_pure_const (void)
break; break;
/* And finally all loads and stores. */ /* And finally all loads and stores. */
for (i = 0; ipa_ref_list_reference_iterate (&w->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_reference_iterate (&w->ref_list, i, ref); i++)
{ {
enum pure_const_state_e ref_state = IPA_CONST; enum pure_const_state_e ref_state = IPA_CONST;
bool ref_looping = false; bool ref_looping = false;
@ -1263,7 +1263,7 @@ propagate_pure_const (void)
{ {
case IPA_REF_LOAD: case IPA_REF_LOAD:
/* readonly reads are safe. */ /* readonly reads are safe. */
if (TREE_READONLY (ipa_ref_varpool_node (ref)->symbol.decl)) if (TREE_READONLY (ipa_ref_varpool_node (ref)->decl))
break; break;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " nonreadonly global var read\n"); fprintf (dump_file, " nonreadonly global var read\n");
@ -1287,7 +1287,7 @@ propagate_pure_const (void)
if (pure_const_state == IPA_NEITHER) if (pure_const_state == IPA_NEITHER)
break; break;
} }
w_info = (struct ipa_dfs_info *) w->symbol.aux; w_info = (struct ipa_dfs_info *) w->aux;
w = w_info->next_cycle; w = w_info->next_cycle;
} }
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
@ -1322,9 +1322,9 @@ propagate_pure_const (void)
switch (this_state) switch (this_state)
{ {
case IPA_CONST: case IPA_CONST:
if (!TREE_READONLY (w->symbol.decl)) if (!TREE_READONLY (w->decl))
{ {
warn_function_const (w->symbol.decl, !this_looping); warn_function_const (w->decl, !this_looping);
if (dump_file) if (dump_file)
fprintf (dump_file, "Function found to be %sconst: %s\n", fprintf (dump_file, "Function found to be %sconst: %s\n",
this_looping ? "looping " : "", this_looping ? "looping " : "",
@ -1334,9 +1334,9 @@ propagate_pure_const (void)
break; break;
case IPA_PURE: case IPA_PURE:
if (!DECL_PURE_P (w->symbol.decl)) if (!DECL_PURE_P (w->decl))
{ {
warn_function_pure (w->symbol.decl, !this_looping); warn_function_pure (w->decl, !this_looping);
if (dump_file) if (dump_file)
fprintf (dump_file, "Function found to be %spure: %s\n", fprintf (dump_file, "Function found to be %spure: %s\n",
this_looping ? "looping " : "", this_looping ? "looping " : "",
@ -1348,7 +1348,7 @@ propagate_pure_const (void)
default: default:
break; break;
} }
w_info = (struct ipa_dfs_info *) w->symbol.aux; w_info = (struct ipa_dfs_info *) w->aux;
w = w_info->next_cycle; w = w_info->next_cycle;
} }
} }
@ -1387,7 +1387,7 @@ propagate_nothrow (void)
bool can_throw = false; bool can_throw = false;
node = order[i]; node = order[i];
if (node->symbol.alias) if (node->alias)
continue; continue;
/* Find the worst state for any node in the cycle. */ /* Find the worst state for any node in the cycle. */
@ -1415,11 +1415,11 @@ propagate_nothrow (void)
if (can_throw) if (can_throw)
break; break;
if (y_l->can_throw && !TREE_NOTHROW (w->symbol.decl) if (y_l->can_throw && !TREE_NOTHROW (w->decl)
&& e->can_throw_external) && e->can_throw_external)
can_throw = true; can_throw = true;
} }
else if (e->can_throw_external && !TREE_NOTHROW (y->symbol.decl)) else if (e->can_throw_external && !TREE_NOTHROW (y->decl))
can_throw = true; can_throw = true;
} }
for (ie = node->indirect_calls; ie; ie = ie->next_callee) for (ie = node->indirect_calls; ie; ie = ie->next_callee)
@ -1428,7 +1428,7 @@ propagate_nothrow (void)
can_throw = true; can_throw = true;
break; break;
} }
w_info = (struct ipa_dfs_info *) w->symbol.aux; w_info = (struct ipa_dfs_info *) w->aux;
w = w_info->next_cycle; w = w_info->next_cycle;
} }
@ -1438,16 +1438,16 @@ propagate_nothrow (void)
while (w) while (w)
{ {
funct_state w_l = get_function_state (w); funct_state w_l = get_function_state (w);
if (!can_throw && !TREE_NOTHROW (w->symbol.decl)) if (!can_throw && !TREE_NOTHROW (w->decl))
{ {
cgraph_set_nothrow_flag (w, true); cgraph_set_nothrow_flag (w, true);
if (dump_file) if (dump_file)
fprintf (dump_file, "Function found to be nothrow: %s\n", fprintf (dump_file, "Function found to be nothrow: %s\n",
cgraph_node_name (w)); cgraph_node_name (w));
} }
else if (can_throw && !TREE_NOTHROW (w->symbol.decl)) else if (can_throw && !TREE_NOTHROW (w->decl))
w_l->can_throw = true; w_l->can_throw = true;
w_info = (struct ipa_dfs_info *) w->symbol.aux; w_info = (struct ipa_dfs_info *) w->aux;
w = w_info->next_cycle; w = w_info->next_cycle;
} }
} }

View File

@ -54,7 +54,7 @@ ipa_ref_referring_varpool_node (struct ipa_ref *ref)
static inline struct ipa_ref_list * static inline struct ipa_ref_list *
ipa_ref_referring_ref_list (struct ipa_ref *ref) ipa_ref_referring_ref_list (struct ipa_ref *ref)
{ {
return &ref->referring->symbol.ref_list; return &ref->referring->ref_list;
} }
/* Return reference list REF is in. */ /* Return reference list REF is in. */
@ -62,7 +62,7 @@ ipa_ref_referring_ref_list (struct ipa_ref *ref)
static inline struct ipa_ref_list * static inline struct ipa_ref_list *
ipa_ref_referred_ref_list (struct ipa_ref *ref) ipa_ref_referred_ref_list (struct ipa_ref *ref)
{ {
return &ref->referred->symbol.ref_list; return &ref->referred->ref_list;
} }
/* Return first reference in LIST or NULL if empty. */ /* Return first reference in LIST or NULL if empty. */

View File

@ -45,12 +45,12 @@ ipa_record_reference (symtab_node referring_node,
gcc_checking_assert (!stmt || is_a <cgraph_node> (referring_node)); gcc_checking_assert (!stmt || is_a <cgraph_node> (referring_node));
gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt); gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt);
list = &referring_node->symbol.ref_list; list = &referring_node->ref_list;
old_references = vec_safe_address (list->references); old_references = vec_safe_address (list->references);
vec_safe_grow (list->references, vec_safe_length (list->references) + 1); vec_safe_grow (list->references, vec_safe_length (list->references) + 1);
ref = &list->references->last (); ref = &list->references->last ();
list2 = &referred_node->symbol.ref_list; list2 = &referred_node->ref_list;
list2->referring.safe_push (ref); list2->referring.safe_push (ref);
ref->referred_index = list2->referring.length () - 1; ref->referred_index = list2->referring.length () - 1;
ref->referring = referring_node; ref->referring = referring_node;
@ -155,7 +155,7 @@ ipa_dump_references (FILE * file, struct ipa_ref_list *list)
{ {
fprintf (file, "%s/%i (%s)", fprintf (file, "%s/%i (%s)",
symtab_node_asm_name (ref->referred), symtab_node_asm_name (ref->referred),
ref->referred->symbol.order, ref->referred->order,
ipa_ref_use_name [ref->use]); ipa_ref_use_name [ref->use]);
if (ref->speculative) if (ref->speculative)
fprintf (file, " (speculative)"); fprintf (file, " (speculative)");
@ -174,7 +174,7 @@ ipa_dump_referring (FILE * file, struct ipa_ref_list *list)
{ {
fprintf (file, "%s/%i (%s)", fprintf (file, "%s/%i (%s)",
symtab_node_asm_name (ref->referring), symtab_node_asm_name (ref->referring),
ref->referring->symbol.order, ref->referring->order,
ipa_ref_use_name [ref->use]); ipa_ref_use_name [ref->use]);
if (ref->speculative) if (ref->speculative)
fprintf (file, " (speculative)"); fprintf (file, " (speculative)");
@ -274,7 +274,7 @@ ipa_find_reference (symtab_node referring_node, symtab_node referred_node,
struct ipa_ref *r = NULL; struct ipa_ref *r = NULL;
int i; int i;
for (i = 0; ipa_ref_list_reference_iterate (&referring_node->symbol.ref_list, i, r); i++) for (i = 0; ipa_ref_list_reference_iterate (&referring_node->ref_list, i, r); i++)
if (r->referred == referred_node if (r->referred == referred_node
&& !r->speculative && !r->speculative
&& ((stmt && r->stmt == stmt) && ((stmt && r->stmt == stmt)
@ -293,7 +293,7 @@ ipa_remove_stmt_references (symtab_node referring_node, gimple stmt)
struct ipa_ref *r = NULL; struct ipa_ref *r = NULL;
int i; int i;
for (i = 0; ipa_ref_list_reference_iterate (&referring_node->symbol.ref_list, i, r); i++) for (i = 0; ipa_ref_list_reference_iterate (&referring_node->ref_list, i, r); i++)
if (r->stmt == stmt) if (r->stmt == stmt)
ipa_remove_reference (r); ipa_remove_reference (r);
} }
@ -309,7 +309,7 @@ ipa_clear_stmts_in_references (symtab_node referring_node)
struct ipa_ref *r = NULL; struct ipa_ref *r = NULL;
int i; int i;
for (i = 0; ipa_ref_list_reference_iterate (&referring_node->symbol.ref_list, i, r); i++) for (i = 0; ipa_ref_list_reference_iterate (&referring_node->ref_list, i, r); i++)
if (!r->speculative) if (!r->speculative)
{ {
r->stmt = NULL; r->stmt = NULL;

View File

@ -178,7 +178,7 @@ ipa_reference_get_not_read_global (struct cgraph_node *fn)
get_reference_optimization_summary (cgraph_function_node (fn, NULL)); get_reference_optimization_summary (cgraph_function_node (fn, NULL));
if (info) if (info)
return info->statics_not_read; return info->statics_not_read;
else if (flags_from_decl_or_type (fn->symbol.decl) & ECF_LEAF) else if (flags_from_decl_or_type (fn->decl) & ECF_LEAF)
return all_module_statics; return all_module_statics;
else else
return NULL; return NULL;
@ -196,7 +196,7 @@ ipa_reference_get_not_written_global (struct cgraph_node *fn)
get_reference_optimization_summary (fn); get_reference_optimization_summary (fn);
if (info) if (info)
return info->statics_not_written; return info->statics_not_written;
else if (flags_from_decl_or_type (fn->symbol.decl) & ECF_LEAF) else if (flags_from_decl_or_type (fn->decl) & ECF_LEAF)
return all_module_statics; return all_module_statics;
else else
return NULL; return NULL;
@ -365,7 +365,7 @@ propagate_bits (ipa_reference_global_vars_info_t x_global, struct cgraph_node *x
continue; continue;
/* Only look into nodes we can propagate something. */ /* Only look into nodes we can propagate something. */
int flags = flags_from_decl_or_type (y->symbol.decl); int flags = flags_from_decl_or_type (y->decl);
if (avail > AVAIL_OVERWRITABLE if (avail > AVAIL_OVERWRITABLE
|| (avail == AVAIL_OVERWRITABLE && (flags & ECF_LEAF))) || (avail == AVAIL_OVERWRITABLE && (flags & ECF_LEAF)))
{ {
@ -460,11 +460,11 @@ analyze_function (struct cgraph_node *fn)
tree var; tree var;
local = init_function_info (fn); local = init_function_info (fn);
for (i = 0; ipa_ref_list_reference_iterate (&fn->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_reference_iterate (&fn->ref_list, i, ref); i++)
{ {
if (!is_a <varpool_node> (ref->referred)) if (!is_a <varpool_node> (ref->referred))
continue; continue;
var = ipa_ref_varpool_node (ref)->symbol.decl; var = ipa_ref_varpool_node (ref)->decl;
if (!is_proper_for_analysis (var)) if (!is_proper_for_analysis (var))
continue; continue;
switch (ref->use) switch (ref->use)
@ -562,7 +562,7 @@ generate_summary (void)
l = &get_reference_vars_info (node)->local; l = &get_reference_vars_info (node)->local;
fprintf (dump_file, fprintf (dump_file,
"\nFunction name:%s/%i:", "\nFunction name:%s/%i:",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
fprintf (dump_file, "\n locals read: "); fprintf (dump_file, "\n locals read: ");
if (l->statics_read) if (l->statics_read)
EXECUTE_IF_SET_IN_BITMAP (l->statics_read, EXECUTE_IF_SET_IN_BITMAP (l->statics_read,
@ -587,7 +587,7 @@ static void
read_write_all_from_decl (struct cgraph_node *node, read_write_all_from_decl (struct cgraph_node *node,
bool &read_all, bool &write_all) bool &read_all, bool &write_all)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
int flags = flags_from_decl_or_type (decl); int flags = flags_from_decl_or_type (decl);
if ((flags & ECF_LEAF) if ((flags & ECF_LEAF)
&& cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE) && cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
@ -600,7 +600,7 @@ read_write_all_from_decl (struct cgraph_node *node,
read_all = true; read_all = true;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " %s/%i -> read all\n", fprintf (dump_file, " %s/%i -> read all\n",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
} }
else else
{ {
@ -610,7 +610,7 @@ read_write_all_from_decl (struct cgraph_node *node,
write_all = true; write_all = true;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " %s/%i -> read all, write all\n", fprintf (dump_file, " %s/%i -> read all, write all\n",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
} }
} }
@ -677,12 +677,12 @@ propagate (void)
/* Now we know what vars are really statics; prune out those that aren't. */ /* Now we know what vars are really statics; prune out those that aren't. */
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
if (vnode->symbol.externally_visible if (vnode->externally_visible
|| TREE_ADDRESSABLE (vnode->symbol.decl) || TREE_ADDRESSABLE (vnode->decl)
|| TREE_READONLY (vnode->symbol.decl) || TREE_READONLY (vnode->decl)
|| !is_proper_for_analysis (vnode->symbol.decl) || !is_proper_for_analysis (vnode->decl)
|| !vnode->symbol.definition) || !vnode->definition)
bitmap_clear_bit (all_module_statics, DECL_UID (vnode->symbol.decl)); bitmap_clear_bit (all_module_statics, DECL_UID (vnode->decl));
/* Forget info we collected "just for fun" on variables that turned out to be /* Forget info we collected "just for fun" on variables that turned out to be
non-local. */ non-local. */
@ -713,7 +713,7 @@ propagate (void)
bool write_all = false; bool write_all = false;
node = order[i]; node = order[i];
if (node->symbol.alias) if (node->alias)
continue; continue;
node_info = get_reference_vars_info (node); node_info = get_reference_vars_info (node);
@ -723,7 +723,7 @@ propagate (void)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Starting cycle with %s/%i\n", fprintf (dump_file, "Starting cycle with %s/%i\n",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
vec<cgraph_node_ptr> cycle_nodes = ipa_get_nodes_in_cycle (node); vec<cgraph_node_ptr> cycle_nodes = ipa_get_nodes_in_cycle (node);
@ -732,7 +732,7 @@ propagate (void)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " Visiting %s/%i\n", fprintf (dump_file, " Visiting %s/%i\n",
cgraph_node_asm_name (w), w->symbol.order); cgraph_node_asm_name (w), w->order);
get_read_write_all_from_node (w, read_all, write_all); get_read_write_all_from_node (w, read_all, write_all);
if (read_all && write_all) if (read_all && write_all)
break; break;
@ -759,7 +759,7 @@ propagate (void)
{ {
ipa_reference_vars_info_t w_ri = get_reference_vars_info (w); ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
ipa_reference_local_vars_info_t w_l = &w_ri->local; ipa_reference_local_vars_info_t w_l = &w_ri->local;
int flags = flags_from_decl_or_type (w->symbol.decl); int flags = flags_from_decl_or_type (w->decl);
if (!(flags & ECF_CONST)) if (!(flags & ECF_CONST))
read_all = union_static_var_sets (node_g->statics_read, read_all = union_static_var_sets (node_g->statics_read,
@ -791,12 +791,12 @@ propagate (void)
struct cgraph_node *w; struct cgraph_node *w;
node = order[i]; node = order[i];
if (node->symbol.alias) if (node->alias)
continue; continue;
fprintf (dump_file, fprintf (dump_file,
"\nFunction name:%s/%i:", "\nFunction name:%s/%i:",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
ipa_reference_vars_info_t node_info = get_reference_vars_info (node); ipa_reference_vars_info_t node_info = get_reference_vars_info (node);
ipa_reference_global_vars_info_t node_g = &node_info->global; ipa_reference_global_vars_info_t node_g = &node_info->global;
@ -808,7 +808,7 @@ propagate (void)
ipa_reference_local_vars_info_t w_l = &w_ri->local; ipa_reference_local_vars_info_t w_l = &w_ri->local;
if (w != node) if (w != node)
fprintf (dump_file, "\n next cycle: %s/%i ", fprintf (dump_file, "\n next cycle: %s/%i ",
cgraph_node_asm_name (w), w->symbol.order); cgraph_node_asm_name (w), w->order);
fprintf (dump_file, "\n locals read: "); fprintf (dump_file, "\n locals read: ");
dump_static_vars_set_to_file (dump_file, w_l->statics_read); dump_static_vars_set_to_file (dump_file, w_l->statics_read);
fprintf (dump_file, "\n locals written: "); fprintf (dump_file, "\n locals written: ");
@ -832,9 +832,9 @@ propagate (void)
ipa_reference_optimization_summary_t opt; ipa_reference_optimization_summary_t opt;
node_info = get_reference_vars_info (node); node_info = get_reference_vars_info (node);
if (!node->symbol.alias if (!node->alias
&& (cgraph_function_body_availability (node) > AVAIL_OVERWRITABLE && (cgraph_function_body_availability (node) > AVAIL_OVERWRITABLE
|| (flags_from_decl_or_type (node->symbol.decl) & ECF_LEAF))) || (flags_from_decl_or_type (node->decl) & ECF_LEAF)))
{ {
node_g = &node_info->global; node_g = &node_info->global;
@ -891,7 +891,7 @@ write_node_summary_p (struct cgraph_node *node,
ipa_reference_optimization_summary_t info; ipa_reference_optimization_summary_t info;
/* See if we have (non-empty) info. */ /* See if we have (non-empty) info. */
if (!node->symbol.definition || node->global.inlined_to) if (!node->definition || node->global.inlined_to)
return false; return false;
info = get_reference_optimization_summary (node); info = get_reference_optimization_summary (node);
if (!info || (bitmap_empty_p (info->statics_not_read) if (!info || (bitmap_empty_p (info->statics_not_read)
@ -905,7 +905,7 @@ write_node_summary_p (struct cgraph_node *node,
In future we might also want to include summaries of functions references In future we might also want to include summaries of functions references
by initializers of constant variables references in current unit. */ by initializers of constant variables references in current unit. */
if (!reachable_from_this_partition_p (node, encoder) if (!reachable_from_this_partition_p (node, encoder)
&& !referenced_from_this_partition_p (&node->symbol.ref_list, encoder)) && !referenced_from_this_partition_p (&node->ref_list, encoder))
return false; return false;
/* See if the info has non-empty intersections with vars we want to encode. */ /* See if the info has non-empty intersections with vars we want to encode. */
@ -971,10 +971,10 @@ ipa_reference_write_optimization_summary (void)
symtab_node snode = lto_symtab_encoder_deref (encoder, i); symtab_node snode = lto_symtab_encoder_deref (encoder, i);
varpool_node *vnode = dyn_cast <varpool_node> (snode); varpool_node *vnode = dyn_cast <varpool_node> (snode);
if (vnode if (vnode
&& bitmap_bit_p (all_module_statics, DECL_UID (vnode->symbol.decl)) && bitmap_bit_p (all_module_statics, DECL_UID (vnode->decl))
&& referenced_from_this_partition_p (&vnode->symbol.ref_list, encoder)) && referenced_from_this_partition_p (&vnode->ref_list, encoder))
{ {
tree decl = vnode->symbol.decl; tree decl = vnode->decl;
bitmap_set_bit (ltrans_statics, DECL_UID (decl)); bitmap_set_bit (ltrans_statics, DECL_UID (decl));
splay_tree_insert (reference_vars_to_consider, splay_tree_insert (reference_vars_to_consider,
DECL_UID (decl), (splay_tree_value)decl); DECL_UID (decl), (splay_tree_value)decl);
@ -1086,7 +1086,7 @@ ipa_reference_read_optimization_summary (void)
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
"\nFunction name:%s/%i:\n static not read:", "\nFunction name:%s/%i:\n static not read:",
cgraph_node_asm_name (node), node->symbol.order); cgraph_node_asm_name (node), node->order);
/* Set the statics not read. */ /* Set the statics not read. */
v_count = streamer_read_hwi (ib); v_count = streamer_read_hwi (ib);

View File

@ -1223,20 +1223,20 @@ split_function (struct split_point *split_point)
/* For usual cloning it is enough to clear builtin only when signature /* For usual cloning it is enough to clear builtin only when signature
changes. For partial inlining we however can not expect the part changes. For partial inlining we however can not expect the part
of builtin implementation to have same semantic as the whole. */ of builtin implementation to have same semantic as the whole. */
if (DECL_BUILT_IN (node->symbol.decl)) if (DECL_BUILT_IN (node->decl))
{ {
DECL_BUILT_IN_CLASS (node->symbol.decl) = NOT_BUILT_IN; DECL_BUILT_IN_CLASS (node->decl) = NOT_BUILT_IN;
DECL_FUNCTION_CODE (node->symbol.decl) = (enum built_in_function) 0; DECL_FUNCTION_CODE (node->decl) = (enum built_in_function) 0;
} }
/* If the original function is declared inline, there is no point in issuing /* If the original function is declared inline, there is no point in issuing
a warning for the non-inlinable part. */ a warning for the non-inlinable part. */
DECL_NO_INLINE_WARNING_P (node->symbol.decl) = 1; DECL_NO_INLINE_WARNING_P (node->decl) = 1;
cgraph_node_remove_callees (cur_node); cgraph_node_remove_callees (cur_node);
ipa_remove_all_references (&cur_node->symbol.ref_list); ipa_remove_all_references (&cur_node->ref_list);
if (!split_part_return_p) if (!split_part_return_p)
TREE_THIS_VOLATILE (node->symbol.decl) = 1; TREE_THIS_VOLATILE (node->decl) = 1;
if (dump_file) if (dump_file)
dump_function_to_file (node->symbol.decl, dump_file, dump_flags); dump_function_to_file (node->decl, dump_file, dump_flags);
/* Create the basic block we place call into. It is the entry basic block /* Create the basic block we place call into. It is the entry basic block
split after last label. */ split after last label. */
@ -1261,7 +1261,7 @@ split_function (struct split_point *split_point)
false, GSI_CONTINUE_LINKING); false, GSI_CONTINUE_LINKING);
args_to_pass[i] = arg; args_to_pass[i] = arg;
} }
call = gimple_build_call_vec (node->symbol.decl, args_to_pass); call = gimple_build_call_vec (node->decl, args_to_pass);
gimple_set_block (call, DECL_INITIAL (current_function_decl)); gimple_set_block (call, DECL_INITIAL (current_function_decl));
args_to_pass.release (); args_to_pass.release ();
@ -1288,7 +1288,7 @@ split_function (struct split_point *split_point)
continue; continue;
if (debug_args == NULL) if (debug_args == NULL)
debug_args = decl_debug_args_insert (node->symbol.decl); debug_args = decl_debug_args_insert (node->decl);
ddecl = make_node (DEBUG_EXPR_DECL); ddecl = make_node (DEBUG_EXPR_DECL);
DECL_ARTIFICIAL (ddecl) = 1; DECL_ARTIFICIAL (ddecl) = 1;
TREE_TYPE (ddecl) = TREE_TYPE (parm); TREE_TYPE (ddecl) = TREE_TYPE (parm);
@ -1314,8 +1314,8 @@ split_function (struct split_point *split_point)
gimple_stmt_iterator cgsi; gimple_stmt_iterator cgsi;
gimple def_temp; gimple def_temp;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
var = BLOCK_VARS (DECL_INITIAL (node->symbol.decl)); var = BLOCK_VARS (DECL_INITIAL (node->decl));
i = vec_safe_length (*debug_args); i = vec_safe_length (*debug_args);
cgsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR)); cgsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR));
do do
@ -1515,7 +1515,7 @@ execute_split_functions (void)
fprintf (dump_file, "Not splitting: not inlinable.\n"); fprintf (dump_file, "Not splitting: not inlinable.\n");
return 0; return 0;
} }
if (DECL_DISREGARD_INLINE_LIMITS (node->symbol.decl)) if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Not splitting: disregarding inline limits.\n"); fprintf (dump_file, "Not splitting: disregarding inline limits.\n");
@ -1549,8 +1549,8 @@ execute_split_functions (void)
if ((!node->callers if ((!node->callers
/* Local functions called once will be completely inlined most of time. */ /* Local functions called once will be completely inlined most of time. */
|| (!node->callers->next_caller && node->local.local)) || (!node->callers->next_caller && node->local.local))
&& !node->symbol.address_taken && !node->address_taken
&& (!flag_lto || !node->symbol.externally_visible)) && (!flag_lto || !node->externally_visible))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Not splitting: not called directly " fprintf (dump_file, "Not splitting: not called directly "

View File

@ -84,7 +84,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v,
bool (*ignore_edge) (struct cgraph_edge *)) bool (*ignore_edge) (struct cgraph_edge *))
{ {
struct cgraph_edge *edge; struct cgraph_edge *edge;
struct ipa_dfs_info *v_info = (struct ipa_dfs_info *) v->symbol.aux; struct ipa_dfs_info *v_info = (struct ipa_dfs_info *) v->aux;
/* mark node as old */ /* mark node as old */
v_info->new_node = false; v_info->new_node = false;
@ -105,11 +105,11 @@ searchc (struct searchc_env* env, struct cgraph_node *v,
if (!w || (ignore_edge && ignore_edge (edge))) if (!w || (ignore_edge && ignore_edge (edge)))
continue; continue;
if (w->symbol.aux if (w->aux
&& (avail > AVAIL_OVERWRITABLE && (avail > AVAIL_OVERWRITABLE
|| (env->allow_overwritable && avail == AVAIL_OVERWRITABLE))) || (env->allow_overwritable && avail == AVAIL_OVERWRITABLE)))
{ {
w_info = (struct ipa_dfs_info *) w->symbol.aux; w_info = (struct ipa_dfs_info *) w->aux;
if (w_info->new_node) if (w_info->new_node)
{ {
searchc (env, w, ignore_edge); searchc (env, w, ignore_edge);
@ -134,7 +134,7 @@ searchc (struct searchc_env* env, struct cgraph_node *v,
struct ipa_dfs_info *x_info; struct ipa_dfs_info *x_info;
do { do {
x = env->stack[--(env->stack_size)]; x = env->stack[--(env->stack_size)];
x_info = (struct ipa_dfs_info *) x->symbol.aux; x_info = (struct ipa_dfs_info *) x->aux;
x_info->on_stack = false; x_info->on_stack = false;
x_info->scc_no = v_info->dfn_number; x_info->scc_no = v_info->dfn_number;
@ -188,20 +188,20 @@ ipa_reduced_postorder (struct cgraph_node **order,
&& (avail == AVAIL_OVERWRITABLE))) && (avail == AVAIL_OVERWRITABLE)))
{ {
/* Reuse the info if it is already there. */ /* Reuse the info if it is already there. */
struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->symbol.aux; struct ipa_dfs_info *info = (struct ipa_dfs_info *) node->aux;
if (!info) if (!info)
info = XCNEW (struct ipa_dfs_info); info = XCNEW (struct ipa_dfs_info);
info->new_node = true; info->new_node = true;
info->on_stack = false; info->on_stack = false;
info->next_cycle = NULL; info->next_cycle = NULL;
node->symbol.aux = info; node->aux = info;
splay_tree_insert (env.nodes_marked_new, splay_tree_insert (env.nodes_marked_new,
(splay_tree_key)node->uid, (splay_tree_key)node->uid,
(splay_tree_value)node); (splay_tree_value)node);
} }
else else
node->symbol.aux = NULL; node->aux = NULL;
} }
result = splay_tree_min (env.nodes_marked_new); result = splay_tree_min (env.nodes_marked_new);
while (result) while (result)
@ -226,10 +226,10 @@ ipa_free_postorder_info (void)
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
{ {
/* Get rid of the aux information. */ /* Get rid of the aux information. */
if (node->symbol.aux) if (node->aux)
{ {
free (node->symbol.aux); free (node->aux);
node->symbol.aux = NULL; node->aux = NULL;
} }
} }
} }
@ -245,7 +245,7 @@ ipa_get_nodes_in_cycle (struct cgraph_node *node)
while (node) while (node)
{ {
v.safe_push (node); v.safe_push (node);
node_dfs_info = (struct ipa_dfs_info *) node->symbol.aux; node_dfs_info = (struct ipa_dfs_info *) node->aux;
node = node_dfs_info->next_cycle; node = node_dfs_info->next_cycle;
} }
return v; return v;
@ -257,11 +257,11 @@ ipa_get_nodes_in_cycle (struct cgraph_node *node)
bool bool
ipa_edge_within_scc (struct cgraph_edge *cs) ipa_edge_within_scc (struct cgraph_edge *cs)
{ {
struct ipa_dfs_info *caller_dfs = (struct ipa_dfs_info *) cs->caller->symbol.aux; struct ipa_dfs_info *caller_dfs = (struct ipa_dfs_info *) cs->caller->aux;
struct ipa_dfs_info *callee_dfs; struct ipa_dfs_info *callee_dfs;
struct cgraph_node *callee = cgraph_function_node (cs->callee, NULL); struct cgraph_node *callee = cgraph_function_node (cs->callee, NULL);
callee_dfs = (struct ipa_dfs_info *) callee->symbol.aux; callee_dfs = (struct ipa_dfs_info *) callee->aux;
return (caller_dfs return (caller_dfs
&& callee_dfs && callee_dfs
&& caller_dfs->scc_no == callee_dfs->scc_no); && caller_dfs->scc_no == callee_dfs->scc_no);
@ -296,21 +296,21 @@ ipa_reverse_postorder (struct cgraph_node **order)
to be output and put them into order as well, so we get dependencies to be output and put them into order as well, so we get dependencies
right through inline functions. */ right through inline functions. */
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
node->symbol.aux = NULL; node->aux = NULL;
for (pass = 0; pass < 2; pass++) for (pass = 0; pass < 2; pass++)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
if (!node->symbol.aux if (!node->aux
&& (pass && (pass
|| (!node->symbol.address_taken || (!node->address_taken
&& !node->global.inlined_to && !node->global.inlined_to
&& !node->symbol.alias && !node->thunk.thunk_p && !node->alias && !node->thunk.thunk_p
&& !cgraph_only_called_directly_p (node)))) && !cgraph_only_called_directly_p (node))))
{ {
stack_size = 0; stack_size = 0;
stack[stack_size].node = node; stack[stack_size].node = node;
stack[stack_size].edge = node->callers; stack[stack_size].edge = node->callers;
stack[stack_size].ref = 0; stack[stack_size].ref = 0;
node->symbol.aux = (void *)(size_t)1; node->aux = (void *)(size_t)1;
while (stack_size >= 0) while (stack_size >= 0)
{ {
while (true) while (true)
@ -324,12 +324,12 @@ ipa_reverse_postorder (struct cgraph_node **order)
/* Break possible cycles involving always-inline /* Break possible cycles involving always-inline
functions by ignoring edges from always-inline functions by ignoring edges from always-inline
functions to non-always-inline functions. */ functions to non-always-inline functions. */
if (DECL_DISREGARD_INLINE_LIMITS (edge->caller->symbol.decl) if (DECL_DISREGARD_INLINE_LIMITS (edge->caller->decl)
&& !DECL_DISREGARD_INLINE_LIMITS && !DECL_DISREGARD_INLINE_LIMITS
(cgraph_function_node (edge->callee, NULL)->symbol.decl)) (cgraph_function_node (edge->callee, NULL)->decl))
node2 = NULL; node2 = NULL;
} }
for (;ipa_ref_list_referring_iterate (&stack[stack_size].node->symbol.ref_list, for (;ipa_ref_list_referring_iterate (&stack[stack_size].node->ref_list,
stack[stack_size].ref, stack[stack_size].ref,
ref) && !node2; ref) && !node2;
stack[stack_size].ref++) stack[stack_size].ref++)
@ -339,12 +339,12 @@ ipa_reverse_postorder (struct cgraph_node **order)
} }
if (!node2) if (!node2)
break; break;
if (!node2->symbol.aux) if (!node2->aux)
{ {
stack[++stack_size].node = node2; stack[++stack_size].node = node2;
stack[stack_size].edge = node2->callers; stack[stack_size].edge = node2->callers;
stack[stack_size].ref = 0; stack[stack_size].ref = 0;
node2->symbol.aux = (void *)(size_t)1; node2->aux = (void *)(size_t)1;
} }
} }
order[order_pos++] = stack[stack_size--].node; order[order_pos++] = stack[stack_size--].node;
@ -352,7 +352,7 @@ ipa_reverse_postorder (struct cgraph_node **order)
} }
free (stack); free (stack);
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
node->symbol.aux = NULL; node->aux = NULL;
return order_pos; return order_pos;
} }
@ -481,7 +481,7 @@ dump_cgraph_node_set (FILE *f, cgraph_node_set set)
for (iter = csi_start (set); !csi_end_p (iter); csi_next (&iter)) for (iter = csi_start (set); !csi_end_p (iter); csi_next (&iter))
{ {
struct cgraph_node *node = csi_node (iter); struct cgraph_node *node = csi_node (iter);
fprintf (f, " %s/%i", cgraph_node_name (node), node->symbol.order); fprintf (f, " %s/%i", cgraph_node_name (node), node->order);
} }
fprintf (f, "\n"); fprintf (f, "\n");
} }
@ -643,12 +643,12 @@ void
ipa_merge_profiles (struct cgraph_node *dst, ipa_merge_profiles (struct cgraph_node *dst,
struct cgraph_node *src) struct cgraph_node *src)
{ {
tree oldsrcdecl = src->symbol.decl; tree oldsrcdecl = src->decl;
struct function *srccfun, *dstcfun; struct function *srccfun, *dstcfun;
bool match = true; bool match = true;
if (!src->symbol.definition if (!src->definition
|| !dst->symbol.definition) || !dst->definition)
return; return;
if (src->frequency < dst->frequency) if (src->frequency < dst->frequency)
src->frequency = dst->frequency; src->frequency = dst->frequency;
@ -657,8 +657,8 @@ ipa_merge_profiles (struct cgraph_node *dst,
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
fprintf (cgraph_dump_file, "Merging profiles of %s/%i to %s/%i\n", fprintf (cgraph_dump_file, "Merging profiles of %s/%i to %s/%i\n",
xstrdup (cgraph_node_name (src)), src->symbol.order, xstrdup (cgraph_node_name (src)), src->order,
xstrdup (cgraph_node_name (dst)), dst->symbol.order); xstrdup (cgraph_node_name (dst)), dst->order);
} }
dst->count += src->count; dst->count += src->count;
@ -666,7 +666,7 @@ ipa_merge_profiles (struct cgraph_node *dst,
If declaration is merged, we need to duplicate it to be able If declaration is merged, we need to duplicate it to be able
to load body that is being replaced. This makes symbol table to load body that is being replaced. This makes symbol table
temporarily inconsistent. */ temporarily inconsistent. */
if (src->symbol.decl == dst->symbol.decl) if (src->decl == dst->decl)
{ {
void **slot; void **slot;
struct lto_in_decl_state temp; struct lto_in_decl_state temp;
@ -674,32 +674,32 @@ ipa_merge_profiles (struct cgraph_node *dst,
/* We are going to move the decl, we want to remove its file decl data. /* We are going to move the decl, we want to remove its file decl data.
and link these with the new decl. */ and link these with the new decl. */
temp.fn_decl = src->symbol.decl; temp.fn_decl = src->decl;
slot = htab_find_slot (src->symbol.lto_file_data->function_decl_states, slot = htab_find_slot (src->lto_file_data->function_decl_states,
&temp, NO_INSERT); &temp, NO_INSERT);
state = (lto_in_decl_state *)*slot; state = (lto_in_decl_state *)*slot;
htab_clear_slot (src->symbol.lto_file_data->function_decl_states, slot); htab_clear_slot (src->lto_file_data->function_decl_states, slot);
gcc_assert (state); gcc_assert (state);
/* Duplicate the decl and be sure it does not link into body of DST. */ /* Duplicate the decl and be sure it does not link into body of DST. */
src->symbol.decl = copy_node (src->symbol.decl); src->decl = copy_node (src->decl);
DECL_STRUCT_FUNCTION (src->symbol.decl) = NULL; DECL_STRUCT_FUNCTION (src->decl) = NULL;
DECL_ARGUMENTS (src->symbol.decl) = NULL; DECL_ARGUMENTS (src->decl) = NULL;
DECL_INITIAL (src->symbol.decl) = NULL; DECL_INITIAL (src->decl) = NULL;
DECL_RESULT (src->symbol.decl) = NULL; DECL_RESULT (src->decl) = NULL;
/* Associate the decl state with new declaration, so LTO streamer /* Associate the decl state with new declaration, so LTO streamer
can look it up. */ can look it up. */
state->fn_decl = src->symbol.decl; state->fn_decl = src->decl;
slot = htab_find_slot (src->symbol.lto_file_data->function_decl_states, slot = htab_find_slot (src->lto_file_data->function_decl_states,
state, INSERT); state, INSERT);
gcc_assert (!*slot); gcc_assert (!*slot);
*slot = state; *slot = state;
} }
cgraph_get_body (src); cgraph_get_body (src);
cgraph_get_body (dst); cgraph_get_body (dst);
srccfun = DECL_STRUCT_FUNCTION (src->symbol.decl); srccfun = DECL_STRUCT_FUNCTION (src->decl);
dstcfun = DECL_STRUCT_FUNCTION (dst->symbol.decl); dstcfun = DECL_STRUCT_FUNCTION (dst->decl);
if (n_basic_blocks_for_function (srccfun) if (n_basic_blocks_for_function (srccfun)
!= n_basic_blocks_for_function (dstcfun)) != n_basic_blocks_for_function (dstcfun))
{ {
@ -787,7 +787,7 @@ ipa_merge_profiles (struct cgraph_node *dst,
gcc_assert (!e->speculative); gcc_assert (!e->speculative);
e->count = gimple_bb (e->call_stmt)->count; e->count = gimple_bb (e->call_stmt)->count;
e->frequency = compute_call_stmt_bb_frequency e->frequency = compute_call_stmt_bb_frequency
(dst->symbol.decl, (dst->decl,
gimple_bb (e->call_stmt)); gimple_bb (e->call_stmt));
} }
for (e = dst->indirect_calls; e; e = e->next_callee) for (e = dst->indirect_calls; e; e = e->next_callee)
@ -795,14 +795,14 @@ ipa_merge_profiles (struct cgraph_node *dst,
gcc_assert (!e->speculative); gcc_assert (!e->speculative);
e->count = gimple_bb (e->call_stmt)->count; e->count = gimple_bb (e->call_stmt)->count;
e->frequency = compute_call_stmt_bb_frequency e->frequency = compute_call_stmt_bb_frequency
(dst->symbol.decl, (dst->decl,
gimple_bb (e->call_stmt)); gimple_bb (e->call_stmt));
} }
cgraph_release_function_body (src); cgraph_release_function_body (src);
inline_update_overall_summary (dst); inline_update_overall_summary (dst);
} }
/* TODO: if there is no match, we can scale up. */ /* TODO: if there is no match, we can scale up. */
src->symbol.decl = oldsrcdecl; src->decl = oldsrcdecl;
} }
/* Return true if call to DEST is known to be self-recusive call withing FUNC. */ /* Return true if call to DEST is known to be self-recusive call withing FUNC. */
@ -813,6 +813,6 @@ recursive_call_p (tree func, tree dest)
struct cgraph_node *dest_node = cgraph_get_create_node (dest); struct cgraph_node *dest_node = cgraph_get_create_node (dest);
struct cgraph_node *cnode = cgraph_get_create_node (func); struct cgraph_node *cnode = cgraph_get_create_node (func);
return symtab_semantically_equivalent_p ((symtab_node)dest_node, return symtab_semantically_equivalent_p (dest_node,
(symtab_node)cnode); cnode);
} }

428
gcc/ipa.c
View File

@ -43,12 +43,12 @@ cgraph_non_local_node_p_1 (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED
{ {
/* FIXME: Aliases can be local, but i386 gets thunks wrong then. */ /* FIXME: Aliases can be local, but i386 gets thunks wrong then. */
return !(cgraph_only_called_directly_or_aliased_p (node) return !(cgraph_only_called_directly_or_aliased_p (node)
&& !ipa_ref_has_aliases_p (&node->symbol.ref_list) && !ipa_ref_has_aliases_p (&node->ref_list)
&& node->symbol.definition && node->definition
&& !DECL_EXTERNAL (node->symbol.decl) && !DECL_EXTERNAL (node->decl)
&& !node->symbol.externally_visible && !node->externally_visible
&& !node->symbol.used_from_other_partition && !node->used_from_other_partition
&& !node->symbol.in_other_partition); && !node->in_other_partition);
} }
/* Return true when function can be marked local. */ /* Return true when function can be marked local. */
@ -76,7 +76,7 @@ has_addr_references_p (struct cgraph_node *node,
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use == IPA_REF_ADDR) if (ref->use == IPA_REF_ADDR)
return true; return true;
@ -111,13 +111,13 @@ enqueue_node (symtab_node node, symtab_node *first,
struct pointer_set_t *reachable) struct pointer_set_t *reachable)
{ {
/* Node is still in queue; do nothing. */ /* Node is still in queue; do nothing. */
if (node->symbol.aux && node->symbol.aux != (void *) 2) if (node->aux && node->aux != (void *) 2)
return; return;
/* Node was already processed as unreachable, re-enqueue /* Node was already processed as unreachable, re-enqueue
only if it became reachable now. */ only if it became reachable now. */
if (node->symbol.aux == (void *)2 && !pointer_set_contains (reachable, node)) if (node->aux == (void *)2 && !pointer_set_contains (reachable, node))
return; return;
node->symbol.aux = *first; node->aux = *first;
*first = node; *first = node;
} }
@ -135,18 +135,18 @@ process_references (struct ipa_ref_list *list,
{ {
symtab_node node = ref->referred; symtab_node node = ref->referred;
if (node->symbol.definition && !node->symbol.in_other_partition if (node->definition && !node->in_other_partition
&& ((!DECL_EXTERNAL (node->symbol.decl) || node->symbol.alias) && ((!DECL_EXTERNAL (node->decl) || node->alias)
|| (before_inlining_p || (before_inlining_p
/* We use variable constructors during late complation for /* We use variable constructors during late complation for
constant folding. Keep references alive so partitioning constant folding. Keep references alive so partitioning
knows about potential references. */ knows about potential references. */
|| (TREE_CODE (node->symbol.decl) == VAR_DECL || (TREE_CODE (node->decl) == VAR_DECL
&& flag_wpa && flag_wpa
&& ctor_for_folding (node->symbol.decl) && ctor_for_folding (node->decl)
!= error_mark_node)))) != error_mark_node))))
pointer_set_insert (reachable, node); pointer_set_insert (reachable, node);
enqueue_node ((symtab_node) node, first, reachable); enqueue_node (node, first, reachable);
} }
} }
@ -181,21 +181,21 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
/* Do not bother to mark virtual methods in anonymous namespace; /* Do not bother to mark virtual methods in anonymous namespace;
either we will find use of virtual table defining it, or it is either we will find use of virtual table defining it, or it is
unused. */ unused. */
if (TREE_CODE (TREE_TYPE (n->symbol.decl)) == METHOD_TYPE if (TREE_CODE (TREE_TYPE (n->decl)) == METHOD_TYPE
&& type_in_anonymous_namespace_p && type_in_anonymous_namespace_p
(method_class_type (TREE_TYPE (n->symbol.decl)))) (method_class_type (TREE_TYPE (n->decl))))
continue; continue;
/* Prior inlining, keep alive bodies of possible targets for /* Prior inlining, keep alive bodies of possible targets for
devirtualization. */ devirtualization. */
if (n->symbol.definition if (n->definition
&& before_inlining_p) && before_inlining_p)
pointer_set_insert (reachable, n); pointer_set_insert (reachable, n);
/* Even after inlining we want to keep the possible targets in the /* Even after inlining we want to keep the possible targets in the
boundary, so late passes can still produce direct call even if boundary, so late passes can still produce direct call even if
the chance for inlining is lost. */ the chance for inlining is lost. */
enqueue_node ((symtab_node) n, first, reachable); enqueue_node (n, first, reachable);
} }
} }
@ -218,8 +218,8 @@ walk_polymorphic_call_targets (pointer_set_t *reachable_call_targets,
fprintf (dump_file, fprintf (dump_file,
"Devirtualizing call in %s/%i to %s/%i\n", "Devirtualizing call in %s/%i to %s/%i\n",
cgraph_node_name (edge->caller), cgraph_node_name (edge->caller),
edge->caller->symbol.order, edge->caller->order,
cgraph_node_name (target), target->symbol.order); cgraph_node_name (target), target->order);
edge = cgraph_make_edge_direct (edge, target); edge = cgraph_make_edge_direct (edge, target);
if (!inline_summary_vec && edge->call_stmt) if (!inline_summary_vec && edge->call_stmt)
cgraph_redirect_edge_call_stmt_to_callee (edge); cgraph_redirect_edge_call_stmt_to_callee (edge);
@ -305,9 +305,9 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
fprintf (file, "\nReclaiming functions:"); fprintf (file, "\nReclaiming functions:");
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
gcc_assert (!node->symbol.aux); gcc_assert (!node->aux);
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
gcc_assert (!vnode->symbol.aux); gcc_assert (!vnode->aux);
#endif #endif
/* Mark functions whose bodies are obviously needed. /* Mark functions whose bodies are obviously needed.
This is mostly when they can be referenced externally. Inline clones This is mostly when they can be referenced externally. Inline clones
@ -316,26 +316,26 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
node->used_as_abstract_origin = false; node->used_as_abstract_origin = false;
if (node->symbol.definition if (node->definition
&& !node->global.inlined_to && !node->global.inlined_to
&& !node->symbol.in_other_partition && !node->in_other_partition
&& !cgraph_can_remove_if_no_direct_calls_and_refs_p (node)) && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node))
{ {
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
pointer_set_insert (reachable, node); pointer_set_insert (reachable, node);
enqueue_node ((symtab_node)node, &first, reachable); enqueue_node (node, &first, reachable);
} }
else else
gcc_assert (!node->symbol.aux); gcc_assert (!node->aux);
} }
/* Mark variables that are obviously needed. */ /* Mark variables that are obviously needed. */
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
if (!varpool_can_remove_if_no_refs (vnode) if (!varpool_can_remove_if_no_refs (vnode)
&& !vnode->symbol.in_other_partition) && !vnode->in_other_partition)
{ {
pointer_set_insert (reachable, vnode); pointer_set_insert (reachable, vnode);
enqueue_node ((symtab_node)vnode, &first, reachable); enqueue_node (vnode, &first, reachable);
} }
/* Perform reachability analysis. */ /* Perform reachability analysis. */
@ -344,34 +344,34 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
bool in_boundary_p = !pointer_set_contains (reachable, first); bool in_boundary_p = !pointer_set_contains (reachable, first);
symtab_node node = first; symtab_node node = first;
first = (symtab_node)first->symbol.aux; first = (symtab_node)first->aux;
/* If we are processing symbol in boundary, mark its AUX pointer for /* If we are processing symbol in boundary, mark its AUX pointer for
possible later re-processing in enqueue_node. */ possible later re-processing in enqueue_node. */
if (in_boundary_p) if (in_boundary_p)
node->symbol.aux = (void *)2; node->aux = (void *)2;
else else
{ {
if (DECL_ABSTRACT_ORIGIN (node->symbol.decl)) if (DECL_ABSTRACT_ORIGIN (node->decl))
{ {
struct cgraph_node *origin_node struct cgraph_node *origin_node
= cgraph_get_create_real_symbol_node (DECL_ABSTRACT_ORIGIN (node->symbol.decl)); = cgraph_get_create_real_symbol_node (DECL_ABSTRACT_ORIGIN (node->decl));
origin_node->used_as_abstract_origin = true; origin_node->used_as_abstract_origin = true;
enqueue_node ((symtab_node) origin_node, &first, reachable); enqueue_node (origin_node, &first, reachable);
} }
/* If any symbol in a comdat group is reachable, force /* If any symbol in a comdat group is reachable, force
all other in the same comdat group to be also reachable. */ all other in the same comdat group to be also reachable. */
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node next; symtab_node next;
for (next = node->symbol.same_comdat_group; for (next = node->same_comdat_group;
next != node; next != node;
next = next->symbol.same_comdat_group) next = next->same_comdat_group)
if (!pointer_set_insert (reachable, next)) if (!pointer_set_insert (reachable, next))
enqueue_node ((symtab_node) next, &first, reachable); enqueue_node (next, &first, reachable);
} }
/* Mark references as reachable. */ /* Mark references as reachable. */
process_references (&node->symbol.ref_list, &first, process_references (&node->ref_list, &first,
before_inlining_p, reachable); before_inlining_p, reachable);
} }
@ -397,31 +397,31 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
} }
for (e = cnode->callees; e; e = e->next_callee) for (e = cnode->callees; e; e = e->next_callee)
{ {
if (e->callee->symbol.definition if (e->callee->definition
&& !e->callee->symbol.in_other_partition && !e->callee->in_other_partition
&& (!e->inline_failed && (!e->inline_failed
|| !DECL_EXTERNAL (e->callee->symbol.decl) || !DECL_EXTERNAL (e->callee->decl)
|| e->callee->symbol.alias || e->callee->alias
|| before_inlining_p)) || before_inlining_p))
pointer_set_insert (reachable, e->callee); pointer_set_insert (reachable, e->callee);
enqueue_node ((symtab_node) e->callee, &first, reachable); enqueue_node (e->callee, &first, reachable);
} }
/* When inline clone exists, mark body to be preserved so when removing /* When inline clone exists, mark body to be preserved so when removing
offline copy of the function we don't kill it. */ offline copy of the function we don't kill it. */
if (cnode->global.inlined_to) if (cnode->global.inlined_to)
pointer_set_insert (body_needed_for_clonning, cnode->symbol.decl); pointer_set_insert (body_needed_for_clonning, cnode->decl);
/* For non-inline clones, force their origins to the boundary and ensure /* For non-inline clones, force their origins to the boundary and ensure
that body is not removed. */ that body is not removed. */
while (cnode->clone_of) while (cnode->clone_of)
{ {
bool noninline = cnode->clone_of->symbol.decl != cnode->symbol.decl; bool noninline = cnode->clone_of->decl != cnode->decl;
cnode = cnode->clone_of; cnode = cnode->clone_of;
if (noninline) if (noninline)
{ {
pointer_set_insert (body_needed_for_clonning, cnode->symbol.decl); pointer_set_insert (body_needed_for_clonning, cnode->decl);
enqueue_node ((symtab_node)cnode, &first, reachable); enqueue_node (cnode, &first, reachable);
} }
} }
} }
@ -431,12 +431,12 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
refers to. */ refers to. */
varpool_node *vnode = dyn_cast <varpool_node> (node); varpool_node *vnode = dyn_cast <varpool_node> (node);
if (vnode if (vnode
&& DECL_EXTERNAL (node->symbol.decl) && DECL_EXTERNAL (node->decl)
&& !vnode->symbol.alias && !vnode->alias
&& in_boundary_p) && in_boundary_p)
{ {
struct ipa_ref *ref; struct ipa_ref *ref;
for (int i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++) for (int i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
enqueue_node (ref->referred, &first, reachable); enqueue_node (ref->referred, &first, reachable);
} }
} }
@ -447,7 +447,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
next = cgraph_next_function (node); next = cgraph_next_function (node);
/* If node is not needed at all, remove it. */ /* If node is not needed at all, remove it. */
if (!node->symbol.aux) if (!node->aux)
{ {
if (file) if (file)
fprintf (file, " %s", cgraph_node_name (node)); fprintf (file, " %s", cgraph_node_name (node));
@ -457,29 +457,29 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
/* If node is unreachable, remove its body. */ /* If node is unreachable, remove its body. */
else if (!pointer_set_contains (reachable, node)) else if (!pointer_set_contains (reachable, node))
{ {
if (!pointer_set_contains (body_needed_for_clonning, node->symbol.decl)) if (!pointer_set_contains (body_needed_for_clonning, node->decl))
cgraph_release_function_body (node); cgraph_release_function_body (node);
else if (!node->clone_of) else if (!node->clone_of)
gcc_assert (in_lto_p || DECL_RESULT (node->symbol.decl)); gcc_assert (in_lto_p || DECL_RESULT (node->decl));
if (node->symbol.definition) if (node->definition)
{ {
if (file) if (file)
fprintf (file, " %s", cgraph_node_name (node)); fprintf (file, " %s", cgraph_node_name (node));
node->symbol.analyzed = false; node->analyzed = false;
node->symbol.definition = false; node->definition = false;
node->symbol.cpp_implicit_alias = false; node->cpp_implicit_alias = false;
node->symbol.alias = false; node->alias = false;
node->symbol.weakref = false; node->weakref = false;
if (!node->symbol.in_other_partition) if (!node->in_other_partition)
node->local.local = false; node->local.local = false;
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
changed = true; changed = true;
} }
} }
else else
gcc_assert (node->clone_of || !cgraph_function_with_gimple_body_p (node) gcc_assert (node->clone_of || !cgraph_function_with_gimple_body_p (node)
|| in_lto_p || DECL_RESULT (node->symbol.decl)); || in_lto_p || DECL_RESULT (node->decl));
} }
/* Inline clones might be kept around so their materializing allows further /* Inline clones might be kept around so their materializing allows further
@ -494,7 +494,7 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
node->global.inlined_to = NULL; node->global.inlined_to = NULL;
update_inlined_to_pointer (node, node); update_inlined_to_pointer (node, node);
} }
node->symbol.aux = NULL; node->aux = NULL;
} }
/* Remove unreachable variables. */ /* Remove unreachable variables. */
@ -503,11 +503,11 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
for (vnode = varpool_first_variable (); vnode; vnode = vnext) for (vnode = varpool_first_variable (); vnode; vnode = vnext)
{ {
vnext = varpool_next_variable (vnode); vnext = varpool_next_variable (vnode);
if (!vnode->symbol.aux if (!vnode->aux
/* For can_refer_decl_in_current_unit_p we want to track for /* For can_refer_decl_in_current_unit_p we want to track for
all external variables if they are defined in other partition all external variables if they are defined in other partition
or not. */ or not. */
&& (!flag_ltrans || !DECL_EXTERNAL (vnode->symbol.decl))) && (!flag_ltrans || !DECL_EXTERNAL (vnode->decl)))
{ {
if (file) if (file)
fprintf (file, " %s", varpool_node_name (vnode)); fprintf (file, " %s", varpool_node_name (vnode));
@ -517,25 +517,25 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
else if (!pointer_set_contains (reachable, vnode)) else if (!pointer_set_contains (reachable, vnode))
{ {
tree init; tree init;
if (vnode->symbol.definition) if (vnode->definition)
{ {
if (file) if (file)
fprintf (file, " %s", varpool_node_name (vnode)); fprintf (file, " %s", varpool_node_name (vnode));
changed = true; changed = true;
} }
vnode->symbol.definition = false; vnode->definition = false;
vnode->symbol.analyzed = false; vnode->analyzed = false;
vnode->symbol.aux = NULL; vnode->aux = NULL;
/* Keep body if it may be useful for constant folding. */ /* Keep body if it may be useful for constant folding. */
if ((init = ctor_for_folding (vnode->symbol.decl)) == error_mark_node) if ((init = ctor_for_folding (vnode->decl)) == error_mark_node)
varpool_remove_initializer (vnode); varpool_remove_initializer (vnode);
else else
DECL_INITIAL (vnode->symbol.decl) = init; DECL_INITIAL (vnode->decl) = init;
ipa_remove_all_references (&vnode->symbol.ref_list); ipa_remove_all_references (&vnode->ref_list);
} }
else else
vnode->symbol.aux = NULL; vnode->aux = NULL;
} }
pointer_set_destroy (reachable); pointer_set_destroy (reachable);
@ -546,14 +546,14 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
if (file) if (file)
fprintf (file, "\nClearing address taken flags:"); fprintf (file, "\nClearing address taken flags:");
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (node->symbol.address_taken if (node->address_taken
&& !node->symbol.used_from_other_partition) && !node->used_from_other_partition)
{ {
if (!cgraph_for_node_and_aliases (node, has_addr_references_p, NULL, true)) if (!cgraph_for_node_and_aliases (node, has_addr_references_p, NULL, true))
{ {
if (file) if (file)
fprintf (file, " %s", cgraph_node_name (node)); fprintf (file, " %s", cgraph_node_name (node));
node->symbol.address_taken = false; node->address_taken = false;
changed = true; changed = true;
if (cgraph_local_node_p (node)) if (cgraph_local_node_p (node))
{ {
@ -595,15 +595,15 @@ ipa_discover_readonly_nonaddressable_vars (void)
if (dump_file) if (dump_file)
fprintf (dump_file, "Clearing variable flags:"); fprintf (dump_file, "Clearing variable flags:");
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
if (vnode->symbol.definition && varpool_all_refs_explicit_p (vnode) if (vnode->definition && varpool_all_refs_explicit_p (vnode)
&& (TREE_ADDRESSABLE (vnode->symbol.decl) && (TREE_ADDRESSABLE (vnode->decl)
|| !TREE_READONLY (vnode->symbol.decl))) || !TREE_READONLY (vnode->decl)))
{ {
bool written = false; bool written = false;
bool address_taken = false; bool address_taken = false;
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (&vnode->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&vnode->ref_list,
i, ref) i, ref)
&& (!written || !address_taken); i++) && (!written || !address_taken); i++)
switch (ref->use) switch (ref->use)
@ -617,21 +617,21 @@ ipa_discover_readonly_nonaddressable_vars (void)
written = true; written = true;
break; break;
} }
if (TREE_ADDRESSABLE (vnode->symbol.decl) && !address_taken) if (TREE_ADDRESSABLE (vnode->decl) && !address_taken)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, " %s (addressable)", varpool_node_name (vnode)); fprintf (dump_file, " %s (addressable)", varpool_node_name (vnode));
TREE_ADDRESSABLE (vnode->symbol.decl) = 0; TREE_ADDRESSABLE (vnode->decl) = 0;
} }
if (!TREE_READONLY (vnode->symbol.decl) && !address_taken && !written if (!TREE_READONLY (vnode->decl) && !address_taken && !written
/* Making variable in explicit section readonly can cause section /* Making variable in explicit section readonly can cause section
type conflict. type conflict.
See e.g. gcc.c-torture/compile/pr23237.c */ See e.g. gcc.c-torture/compile/pr23237.c */
&& DECL_SECTION_NAME (vnode->symbol.decl) == NULL) && DECL_SECTION_NAME (vnode->decl) == NULL)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, " %s (read-only)", varpool_node_name (vnode)); fprintf (dump_file, " %s (read-only)", varpool_node_name (vnode));
TREE_READONLY (vnode->symbol.decl) = 1; TREE_READONLY (vnode->decl) = 1;
} }
} }
if (dump_file) if (dump_file)
@ -644,7 +644,7 @@ address_taken_from_non_vtable_p (symtab_node node)
{ {
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
if (ref->use == IPA_REF_ADDR) if (ref->use == IPA_REF_ADDR)
{ {
@ -652,7 +652,7 @@ address_taken_from_non_vtable_p (symtab_node node)
if (is_a <cgraph_node> (ref->referring)) if (is_a <cgraph_node> (ref->referring))
return true; return true;
node = ipa_ref_referring_varpool_node (ref); node = ipa_ref_referring_varpool_node (ref);
if (!DECL_VIRTUAL_P (node->symbol.decl)) if (!DECL_VIRTUAL_P (node->decl))
return true; return true;
} }
return false; return false;
@ -667,29 +667,29 @@ comdat_can_be_unshared_p_1 (symtab_node node)
break eventually. Exception are virutal functions, C++ break eventually. Exception are virutal functions, C++
constructors/destructors and vtables, where this is not possible by constructors/destructors and vtables, where this is not possible by
language standard. */ language standard. */
if (!DECL_VIRTUAL_P (node->symbol.decl) if (!DECL_VIRTUAL_P (node->decl)
&& (TREE_CODE (node->symbol.decl) != FUNCTION_DECL && (TREE_CODE (node->decl) != FUNCTION_DECL
|| (!DECL_CXX_CONSTRUCTOR_P (node->symbol.decl) || (!DECL_CXX_CONSTRUCTOR_P (node->decl)
&& !DECL_CXX_DESTRUCTOR_P (node->symbol.decl))) && !DECL_CXX_DESTRUCTOR_P (node->decl)))
&& address_taken_from_non_vtable_p (node)) && address_taken_from_non_vtable_p (node))
return false; return false;
/* If the symbol is used in some weird way, better to not touch it. */ /* If the symbol is used in some weird way, better to not touch it. */
if (node->symbol.force_output) if (node->force_output)
return false; return false;
/* Explicit instantiations needs to be output when possibly /* Explicit instantiations needs to be output when possibly
used externally. */ used externally. */
if (node->symbol.forced_by_abi if (node->forced_by_abi
&& TREE_PUBLIC (node->symbol.decl) && TREE_PUBLIC (node->decl)
&& (node->symbol.resolution != LDPR_PREVAILING_DEF_IRONLY && (node->resolution != LDPR_PREVAILING_DEF_IRONLY
&& !flag_whole_program)) && !flag_whole_program))
return false; return false;
/* Non-readonly and volatile variables can not be duplicated. */ /* Non-readonly and volatile variables can not be duplicated. */
if (is_a <varpool_node> (node) if (is_a <varpool_node> (node)
&& (!TREE_READONLY (node->symbol.decl) && (!TREE_READONLY (node->decl)
|| TREE_THIS_VOLATILE (node->symbol.decl))) || TREE_THIS_VOLATILE (node->decl)))
return false; return false;
return true; return true;
} }
@ -708,15 +708,15 @@ comdat_can_be_unshared_p (symtab_node node)
{ {
if (!comdat_can_be_unshared_p_1 (node)) if (!comdat_can_be_unshared_p_1 (node))
return false; return false;
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node next; symtab_node next;
/* If more than one function is in the same COMDAT group, it must /* If more than one function is in the same COMDAT group, it must
be shared even if just one function in the comdat group has be shared even if just one function in the comdat group has
address taken. */ address taken. */
for (next = node->symbol.same_comdat_group; for (next = node->same_comdat_group;
next != node; next = next->symbol.same_comdat_group) next != node; next = next->same_comdat_group)
if (!comdat_can_be_unshared_p_1 (next)) if (!comdat_can_be_unshared_p_1 (next))
return false; return false;
} }
@ -729,10 +729,10 @@ static bool
cgraph_externally_visible_p (struct cgraph_node *node, cgraph_externally_visible_p (struct cgraph_node *node,
bool whole_program) bool whole_program)
{ {
if (!node->symbol.definition) if (!node->definition)
return false; return false;
if (!TREE_PUBLIC (node->symbol.decl) if (!TREE_PUBLIC (node->decl)
|| DECL_EXTERNAL (node->symbol.decl)) || DECL_EXTERNAL (node->decl))
return false; return false;
/* Do not try to localize built-in functions yet. One of problems is that we /* Do not try to localize built-in functions yet. One of problems is that we
@ -740,44 +740,44 @@ cgraph_externally_visible_p (struct cgraph_node *node,
using the implicit built-in declarations anymore. Similarly this enables using the implicit built-in declarations anymore. Similarly this enables
us to remove them as unreachable before actual calls may appear during us to remove them as unreachable before actual calls may appear during
expansion or folding. */ expansion or folding. */
if (DECL_BUILT_IN (node->symbol.decl)) if (DECL_BUILT_IN (node->decl))
return true; return true;
/* If linker counts on us, we must preserve the function. */ /* If linker counts on us, we must preserve the function. */
if (symtab_used_from_object_file_p ((symtab_node) node)) if (symtab_used_from_object_file_p (node))
return true; return true;
if (DECL_PRESERVE_P (node->symbol.decl)) if (DECL_PRESERVE_P (node->decl))
return true; return true;
if (lookup_attribute ("externally_visible", if (lookup_attribute ("externally_visible",
DECL_ATTRIBUTES (node->symbol.decl))) DECL_ATTRIBUTES (node->decl)))
return true; return true;
if (TARGET_DLLIMPORT_DECL_ATTRIBUTES if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
&& lookup_attribute ("dllexport", && lookup_attribute ("dllexport",
DECL_ATTRIBUTES (node->symbol.decl))) DECL_ATTRIBUTES (node->decl)))
return true; return true;
if (node->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY) if (node->resolution == LDPR_PREVAILING_DEF_IRONLY)
return false; return false;
/* When doing LTO or whole program, we can bring COMDAT functoins static. /* When doing LTO or whole program, we can bring COMDAT functoins static.
This improves code quality and we know we will duplicate them at most twice This improves code quality and we know we will duplicate them at most twice
(in the case that we are not using plugin and link with object file (in the case that we are not using plugin and link with object file
implementing same COMDAT) */ implementing same COMDAT) */
if ((in_lto_p || whole_program) if ((in_lto_p || whole_program)
&& DECL_COMDAT (node->symbol.decl) && DECL_COMDAT (node->decl)
&& comdat_can_be_unshared_p ((symtab_node) node)) && comdat_can_be_unshared_p (node))
return false; return false;
/* When doing link time optimizations, hidden symbols become local. */ /* When doing link time optimizations, hidden symbols become local. */
if (in_lto_p if (in_lto_p
&& (DECL_VISIBILITY (node->symbol.decl) == VISIBILITY_HIDDEN && (DECL_VISIBILITY (node->decl) == VISIBILITY_HIDDEN
|| DECL_VISIBILITY (node->symbol.decl) == VISIBILITY_INTERNAL) || DECL_VISIBILITY (node->decl) == VISIBILITY_INTERNAL)
/* Be sure that node is defined in IR file, not in other object /* Be sure that node is defined in IR file, not in other object
file. In that case we don't set used_from_other_object_file. */ file. In that case we don't set used_from_other_object_file. */
&& node->symbol.definition) && node->definition)
; ;
else if (!whole_program) else if (!whole_program)
return true; return true;
if (MAIN_NAME_P (DECL_NAME (node->symbol.decl))) if (MAIN_NAME_P (DECL_NAME (node->decl)))
return true; return true;
return false; return false;
@ -788,26 +788,26 @@ cgraph_externally_visible_p (struct cgraph_node *node,
bool bool
varpool_externally_visible_p (struct varpool_node *vnode) varpool_externally_visible_p (struct varpool_node *vnode)
{ {
if (DECL_EXTERNAL (vnode->symbol.decl)) if (DECL_EXTERNAL (vnode->decl))
return true; return true;
if (!TREE_PUBLIC (vnode->symbol.decl)) if (!TREE_PUBLIC (vnode->decl))
return false; return false;
/* If linker counts on us, we must preserve the function. */ /* If linker counts on us, we must preserve the function. */
if (symtab_used_from_object_file_p ((symtab_node) vnode)) if (symtab_used_from_object_file_p (vnode))
return true; return true;
if (DECL_HARD_REGISTER (vnode->symbol.decl)) if (DECL_HARD_REGISTER (vnode->decl))
return true; return true;
if (DECL_PRESERVE_P (vnode->symbol.decl)) if (DECL_PRESERVE_P (vnode->decl))
return true; return true;
if (lookup_attribute ("externally_visible", if (lookup_attribute ("externally_visible",
DECL_ATTRIBUTES (vnode->symbol.decl))) DECL_ATTRIBUTES (vnode->decl)))
return true; return true;
if (TARGET_DLLIMPORT_DECL_ATTRIBUTES if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
&& lookup_attribute ("dllexport", && lookup_attribute ("dllexport",
DECL_ATTRIBUTES (vnode->symbol.decl))) DECL_ATTRIBUTES (vnode->decl)))
return true; return true;
/* See if we have linker information about symbol not being used or /* See if we have linker information about symbol not being used or
@ -816,9 +816,9 @@ varpool_externally_visible_p (struct varpool_node *vnode)
Even if the linker clams the symbol is unused, never bring internal Even if the linker clams the symbol is unused, never bring internal
symbols that are declared by user as used or externally visible. symbols that are declared by user as used or externally visible.
This is needed for i.e. references from asm statements. */ This is needed for i.e. references from asm statements. */
if (symtab_used_from_object_file_p ((symtab_node) vnode)) if (symtab_used_from_object_file_p (vnode))
return true; return true;
if (vnode->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY) if (vnode->resolution == LDPR_PREVAILING_DEF_IRONLY)
return false; return false;
/* As a special case, the COMDAT virtual tables can be unshared. /* As a special case, the COMDAT virtual tables can be unshared.
@ -827,17 +827,17 @@ varpool_externally_visible_p (struct varpool_node *vnode)
is faster for dynamic linking. Also this match logic hidding vtables is faster for dynamic linking. Also this match logic hidding vtables
from LTO symbol tables. */ from LTO symbol tables. */
if ((in_lto_p || flag_whole_program) if ((in_lto_p || flag_whole_program)
&& DECL_COMDAT (vnode->symbol.decl) && DECL_COMDAT (vnode->decl)
&& comdat_can_be_unshared_p ((symtab_node) vnode)) && comdat_can_be_unshared_p (vnode))
return false; return false;
/* When doing link time optimizations, hidden symbols become local. */ /* When doing link time optimizations, hidden symbols become local. */
if (in_lto_p if (in_lto_p
&& (DECL_VISIBILITY (vnode->symbol.decl) == VISIBILITY_HIDDEN && (DECL_VISIBILITY (vnode->decl) == VISIBILITY_HIDDEN
|| DECL_VISIBILITY (vnode->symbol.decl) == VISIBILITY_INTERNAL) || DECL_VISIBILITY (vnode->decl) == VISIBILITY_INTERNAL)
/* Be sure that node is defined in IR file, not in other object /* Be sure that node is defined in IR file, not in other object
file. In that case we don't set used_from_other_object_file. */ file. In that case we don't set used_from_other_object_file. */
&& vnode->symbol.definition) && vnode->definition)
; ;
else if (!flag_whole_program) else if (!flag_whole_program)
return true; return true;
@ -849,7 +849,7 @@ varpool_externally_visible_p (struct varpool_node *vnode)
FIXME: We can do so for readonly vars with no address taken and FIXME: We can do so for readonly vars with no address taken and
possibly also for vtables since no direct pointer comparsion is done. possibly also for vtables since no direct pointer comparsion is done.
It might be interesting to do so to reduce linking overhead. */ It might be interesting to do so to reduce linking overhead. */
if (DECL_COMDAT (vnode->symbol.decl) || DECL_WEAK (vnode->symbol.decl)) if (DECL_COMDAT (vnode->decl) || DECL_WEAK (vnode->decl))
return true; return true;
return false; return false;
} }
@ -887,85 +887,85 @@ function_and_variable_visibility (bool whole_program)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
int flags = flags_from_decl_or_type (node->symbol.decl); int flags = flags_from_decl_or_type (node->decl);
/* Optimize away PURE and CONST constructors and destructors. */ /* Optimize away PURE and CONST constructors and destructors. */
if (optimize if (optimize
&& (flags & (ECF_CONST | ECF_PURE)) && (flags & (ECF_CONST | ECF_PURE))
&& !(flags & ECF_LOOPING_CONST_OR_PURE)) && !(flags & ECF_LOOPING_CONST_OR_PURE))
{ {
DECL_STATIC_CONSTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_CONSTRUCTOR (node->decl) = 0;
DECL_STATIC_DESTRUCTOR (node->symbol.decl) = 0; DECL_STATIC_DESTRUCTOR (node->decl) = 0;
} }
/* Frontends and alias code marks nodes as needed before parsing is finished. /* Frontends and alias code marks nodes as needed before parsing is finished.
We may end up marking as node external nodes where this flag is meaningless We may end up marking as node external nodes where this flag is meaningless
strip it. */ strip it. */
if (DECL_EXTERNAL (node->symbol.decl) || !node->symbol.definition) if (DECL_EXTERNAL (node->decl) || !node->definition)
{ {
node->symbol.force_output = 0; node->force_output = 0;
node->symbol.forced_by_abi = 0; node->forced_by_abi = 0;
} }
/* C++ FE on lack of COMDAT support create local COMDAT functions /* C++ FE on lack of COMDAT support create local COMDAT functions
(that ought to be shared but can not due to object format (that ought to be shared but can not due to object format
limitations). It is necessary to keep the flag to make rest of C++ FE limitations). It is necessary to keep the flag to make rest of C++ FE
happy. Clear the flag here to avoid confusion in middle-end. */ happy. Clear the flag here to avoid confusion in middle-end. */
if (DECL_COMDAT (node->symbol.decl) && !TREE_PUBLIC (node->symbol.decl)) if (DECL_COMDAT (node->decl) && !TREE_PUBLIC (node->decl))
DECL_COMDAT (node->symbol.decl) = 0; DECL_COMDAT (node->decl) = 0;
/* For external decls stop tracking same_comdat_group. It doesn't matter /* For external decls stop tracking same_comdat_group. It doesn't matter
what comdat group they are in when they won't be emitted in this TU. */ what comdat group they are in when they won't be emitted in this TU. */
if (node->symbol.same_comdat_group && DECL_EXTERNAL (node->symbol.decl)) if (node->same_comdat_group && DECL_EXTERNAL (node->decl))
{ {
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
symtab_node n; symtab_node n;
for (n = node->symbol.same_comdat_group; for (n = node->same_comdat_group;
n != (symtab_node)node; n != node;
n = n->symbol.same_comdat_group) n = n->same_comdat_group)
/* If at least one of same comdat group functions is external, /* If at least one of same comdat group functions is external,
all of them have to be, otherwise it is a front-end bug. */ all of them have to be, otherwise it is a front-end bug. */
gcc_assert (DECL_EXTERNAL (n->symbol.decl)); gcc_assert (DECL_EXTERNAL (n->decl));
#endif #endif
symtab_dissolve_same_comdat_group_list ((symtab_node) node); symtab_dissolve_same_comdat_group_list (node);
} }
gcc_assert ((!DECL_WEAK (node->symbol.decl) gcc_assert ((!DECL_WEAK (node->decl)
&& !DECL_COMDAT (node->symbol.decl)) && !DECL_COMDAT (node->decl))
|| TREE_PUBLIC (node->symbol.decl) || TREE_PUBLIC (node->decl)
|| node->symbol.weakref || node->weakref
|| DECL_EXTERNAL (node->symbol.decl)); || DECL_EXTERNAL (node->decl));
if (cgraph_externally_visible_p (node, whole_program)) if (cgraph_externally_visible_p (node, whole_program))
{ {
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
node->symbol.externally_visible = true; node->externally_visible = true;
} }
else else
{ {
node->symbol.externally_visible = false; node->externally_visible = false;
node->symbol.forced_by_abi = false; node->forced_by_abi = false;
} }
if (!node->symbol.externally_visible if (!node->externally_visible
&& node->symbol.definition && !node->symbol.weakref && node->definition && !node->weakref
&& !DECL_EXTERNAL (node->symbol.decl)) && !DECL_EXTERNAL (node->decl))
{ {
gcc_assert (whole_program || in_lto_p gcc_assert (whole_program || in_lto_p
|| !TREE_PUBLIC (node->symbol.decl)); || !TREE_PUBLIC (node->decl));
node->symbol.unique_name = ((node->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY node->unique_name = ((node->resolution == LDPR_PREVAILING_DEF_IRONLY
|| node->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) || node->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
&& TREE_PUBLIC (node->symbol.decl)); && TREE_PUBLIC (node->decl));
symtab_make_decl_local (node->symbol.decl); symtab_make_decl_local (node->decl);
node->symbol.resolution = LDPR_PREVAILING_DEF_IRONLY; node->resolution = LDPR_PREVAILING_DEF_IRONLY;
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
/* cgraph_externally_visible_p has already checked all other nodes /* cgraph_externally_visible_p has already checked all other nodes
in the group and they will all be made local. We need to in the group and they will all be made local. We need to
dissolve the group at once so that the predicate does not dissolve the group at once so that the predicate does not
segfault though. */ segfault though. */
symtab_dissolve_same_comdat_group_list ((symtab_node) node); symtab_dissolve_same_comdat_group_list (node);
} }
if (node->thunk.thunk_p if (node->thunk.thunk_p
&& TREE_PUBLIC (node->symbol.decl)) && TREE_PUBLIC (node->decl))
{ {
struct cgraph_node *decl_node = node; struct cgraph_node *decl_node = node;
@ -973,16 +973,16 @@ function_and_variable_visibility (bool whole_program)
/* Thunks have the same visibility as function they are attached to. /* Thunks have the same visibility as function they are attached to.
Make sure the C++ front end set this up properly. */ Make sure the C++ front end set this up properly. */
if (DECL_ONE_ONLY (decl_node->symbol.decl)) if (DECL_ONE_ONLY (decl_node->decl))
{ {
gcc_checking_assert (DECL_COMDAT (node->symbol.decl) gcc_checking_assert (DECL_COMDAT (node->decl)
== DECL_COMDAT (decl_node->symbol.decl)); == DECL_COMDAT (decl_node->decl));
gcc_checking_assert (DECL_COMDAT_GROUP (node->symbol.decl) gcc_checking_assert (DECL_COMDAT_GROUP (node->decl)
== DECL_COMDAT_GROUP (decl_node->symbol.decl)); == DECL_COMDAT_GROUP (decl_node->decl));
gcc_checking_assert (node->symbol.same_comdat_group); gcc_checking_assert (node->same_comdat_group);
} }
if (DECL_EXTERNAL (decl_node->symbol.decl)) if (DECL_EXTERNAL (decl_node->decl))
DECL_EXTERNAL (node->symbol.decl) = 1; DECL_EXTERNAL (node->decl) = 1;
} }
} }
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
@ -995,9 +995,9 @@ function_and_variable_visibility (bool whole_program)
cheaper and enable more optimization. cheaper and enable more optimization.
TODO: We can also update virtual tables. */ TODO: We can also update virtual tables. */
if (node->callers && can_replace_by_local_alias ((symtab_node)node)) if (node->callers && can_replace_by_local_alias (node))
{ {
struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias ((symtab_node) node)); struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias (node));
if (alias && alias != node) if (alias && alias != node)
{ {
@ -1006,9 +1006,9 @@ function_and_variable_visibility (bool whole_program)
struct cgraph_edge *e = node->callers; struct cgraph_edge *e = node->callers;
cgraph_redirect_edge_callee (e, alias); cgraph_redirect_edge_callee (e, alias);
if (gimple_has_body_p (e->caller->symbol.decl)) if (gimple_has_body_p (e->caller->decl))
{ {
push_cfun (DECL_STRUCT_FUNCTION (e->caller->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (e->caller->decl));
cgraph_redirect_edge_call_stmt_to_callee (e); cgraph_redirect_edge_call_stmt_to_callee (e);
pop_cfun (); pop_cfun ();
} }
@ -1019,10 +1019,10 @@ function_and_variable_visibility (bool whole_program)
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
{ {
/* weak flag makes no sense on local variables. */ /* weak flag makes no sense on local variables. */
gcc_assert (!DECL_WEAK (vnode->symbol.decl) gcc_assert (!DECL_WEAK (vnode->decl)
|| vnode->symbol.weakref || vnode->weakref
|| TREE_PUBLIC (vnode->symbol.decl) || TREE_PUBLIC (vnode->decl)
|| DECL_EXTERNAL (vnode->symbol.decl)); || DECL_EXTERNAL (vnode->decl));
/* In several cases declarations can not be common: /* In several cases declarations can not be common:
- when declaration has initializer - when declaration has initializer
@ -1036,39 +1036,39 @@ function_and_variable_visibility (bool whole_program)
static int a __attribute__ ((common)) static int a __attribute__ ((common))
Canonicalize things here and clear the redundant flag. */ Canonicalize things here and clear the redundant flag. */
if (DECL_COMMON (vnode->symbol.decl) if (DECL_COMMON (vnode->decl)
&& (!(TREE_PUBLIC (vnode->symbol.decl) && (!(TREE_PUBLIC (vnode->decl)
|| DECL_EXTERNAL (vnode->symbol.decl)) || DECL_EXTERNAL (vnode->decl))
|| (DECL_INITIAL (vnode->symbol.decl) || (DECL_INITIAL (vnode->decl)
&& DECL_INITIAL (vnode->symbol.decl) != error_mark_node) && DECL_INITIAL (vnode->decl) != error_mark_node)
|| DECL_WEAK (vnode->symbol.decl) || DECL_WEAK (vnode->decl)
|| DECL_SECTION_NAME (vnode->symbol.decl) != NULL || DECL_SECTION_NAME (vnode->decl) != NULL
|| ! (ADDR_SPACE_GENERIC_P || ! (ADDR_SPACE_GENERIC_P
(TYPE_ADDR_SPACE (TREE_TYPE (vnode->symbol.decl)))))) (TYPE_ADDR_SPACE (TREE_TYPE (vnode->decl))))))
DECL_COMMON (vnode->symbol.decl) = 0; DECL_COMMON (vnode->decl) = 0;
} }
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
{ {
if (!vnode->symbol.definition) if (!vnode->definition)
continue; continue;
if (varpool_externally_visible_p (vnode)) if (varpool_externally_visible_p (vnode))
vnode->symbol.externally_visible = true; vnode->externally_visible = true;
else else
{ {
vnode->symbol.externally_visible = false; vnode->externally_visible = false;
vnode->symbol.forced_by_abi = false; vnode->forced_by_abi = false;
} }
if (!vnode->symbol.externally_visible if (!vnode->externally_visible
&& !vnode->symbol.weakref) && !vnode->weakref)
{ {
gcc_assert (in_lto_p || whole_program || !TREE_PUBLIC (vnode->symbol.decl)); gcc_assert (in_lto_p || whole_program || !TREE_PUBLIC (vnode->decl));
vnode->symbol.unique_name = ((vnode->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY vnode->unique_name = ((vnode->resolution == LDPR_PREVAILING_DEF_IRONLY
|| vnode->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP) || vnode->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP)
&& TREE_PUBLIC (vnode->symbol.decl)); && TREE_PUBLIC (vnode->decl));
symtab_make_decl_local (vnode->symbol.decl); symtab_make_decl_local (vnode->decl);
if (vnode->symbol.same_comdat_group) if (vnode->same_comdat_group)
symtab_dissolve_same_comdat_group_list ((symtab_node) vnode); symtab_dissolve_same_comdat_group_list (vnode);
vnode->symbol.resolution = LDPR_PREVAILING_DEF_IRONLY; vnode->resolution = LDPR_PREVAILING_DEF_IRONLY;
} }
} }
@ -1081,12 +1081,12 @@ function_and_variable_visibility (bool whole_program)
fprintf (dump_file, "\n\n"); fprintf (dump_file, "\n\n");
fprintf (dump_file, "\nMarking externally visible functions:"); fprintf (dump_file, "\nMarking externally visible functions:");
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (node->symbol.externally_visible) if (node->externally_visible)
fprintf (dump_file, " %s", cgraph_node_name (node)); fprintf (dump_file, " %s", cgraph_node_name (node));
fprintf (dump_file, "\n\n"); fprintf (dump_file, "\n\n");
fprintf (dump_file, "\nMarking externally visible variables:"); fprintf (dump_file, "\nMarking externally visible variables:");
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
if (vnode->symbol.externally_visible) if (vnode->externally_visible)
fprintf (dump_file, " %s", varpool_node_name (vnode)); fprintf (dump_file, " %s", varpool_node_name (vnode));
fprintf (dump_file, "\n\n"); fprintf (dump_file, "\n\n");
} }
@ -1363,12 +1363,12 @@ static vec<tree> static_dtors;
static void static void
record_cdtor_fn (struct cgraph_node *node) record_cdtor_fn (struct cgraph_node *node)
{ {
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl)) if (DECL_STATIC_CONSTRUCTOR (node->decl))
static_ctors.safe_push (node->symbol.decl); static_ctors.safe_push (node->decl);
if (DECL_STATIC_DESTRUCTOR (node->symbol.decl)) if (DECL_STATIC_DESTRUCTOR (node->decl))
static_dtors.safe_push (node->symbol.decl); static_dtors.safe_push (node->decl);
node = cgraph_get_node (node->symbol.decl); node = cgraph_get_node (node->decl);
DECL_DISREGARD_INLINE_LIMITS (node->symbol.decl) = 1; DECL_DISREGARD_INLINE_LIMITS (node->decl) = 1;
} }
/* Define global constructors/destructor functions for the CDTORS, of /* Define global constructors/destructor functions for the CDTORS, of
@ -1522,8 +1522,8 @@ ipa_cdtor_merge (void)
{ {
struct cgraph_node *node; struct cgraph_node *node;
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl) if (DECL_STATIC_CONSTRUCTOR (node->decl)
|| DECL_STATIC_DESTRUCTOR (node->symbol.decl)) || DECL_STATIC_DESTRUCTOR (node->decl))
record_cdtor_fn (node); record_cdtor_fn (node);
build_cdtor_fns (); build_cdtor_fns ();
static_ctors.release (); static_ctors.release ();

View File

@ -112,7 +112,7 @@ example,
inline bool inline bool
is_a_helper <cgraph_node>::test (symtab_node_base *p) is_a_helper <cgraph_node>::test (symtab_node_base *p)
{ {
return p->symbol.type == SYMTAB_FUNCTION; return p->type == SYMTAB_FUNCTION;
} }
If a simple reinterpret_cast between the pointer types is incorrect, then you If a simple reinterpret_cast between the pointer types is incorrect, then you

View File

@ -1,3 +1,12 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* decl.c (java_mark_decl_local): Update for conversion of symtab types
to a true class hierarchy.
2013-10-14 David Malcolm <dmalcolm@redhat.com> 2013-10-14 David Malcolm <dmalcolm@redhat.com>
* lang.c (java_handle_option): Update for introduction of * lang.c (java_handle_option): Update for introduction of

View File

@ -1904,7 +1904,7 @@ java_mark_decl_local (tree decl)
if (TREE_CODE (decl) == FUNCTION_DECL) if (TREE_CODE (decl) == FUNCTION_DECL)
{ {
struct cgraph_node *node = cgraph_get_node (decl); struct cgraph_node *node = cgraph_get_node (decl);
gcc_assert (!node || !node->symbol.definition); gcc_assert (!node || !node->definition);
} }
#endif #endif
gcc_assert (!DECL_RTL_SET_P (decl)); gcc_assert (!DECL_RTL_SET_P (decl));

View File

@ -183,7 +183,7 @@ bool
lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder, lto_symtab_encoder_encode_body_p (lto_symtab_encoder_t encoder,
struct cgraph_node *node) struct cgraph_node *node)
{ {
int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); int index = lto_symtab_encoder_lookup (encoder, node);
return encoder->nodes[index].body; return encoder->nodes[index].body;
} }
@ -193,8 +193,8 @@ static void
lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder, lto_set_symtab_encoder_encode_body (lto_symtab_encoder_t encoder,
struct cgraph_node *node) struct cgraph_node *node)
{ {
int index = lto_symtab_encoder_encode (encoder, (symtab_node)node); int index = lto_symtab_encoder_encode (encoder, node);
gcc_checking_assert (encoder->nodes[index].node == (symtab_node)node); gcc_checking_assert (encoder->nodes[index].node == node);
encoder->nodes[index].body = true; encoder->nodes[index].body = true;
} }
@ -204,7 +204,7 @@ bool
lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder, lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t encoder,
struct varpool_node *node) struct varpool_node *node)
{ {
int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); int index = lto_symtab_encoder_lookup (encoder, node);
if (index == LCC_NOT_FOUND) if (index == LCC_NOT_FOUND)
return false; return false;
return encoder->nodes[index].initializer; return encoder->nodes[index].initializer;
@ -216,7 +216,7 @@ static void
lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder, lto_set_symtab_encoder_encode_initializer (lto_symtab_encoder_t encoder,
struct varpool_node *node) struct varpool_node *node)
{ {
int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); int index = lto_symtab_encoder_lookup (encoder, node);
encoder->nodes[index].initializer = true; encoder->nodes[index].initializer = true;
} }
@ -226,7 +226,7 @@ bool
lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder, lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t encoder,
symtab_node node) symtab_node node)
{ {
int index = lto_symtab_encoder_lookup (encoder, (symtab_node)node); int index = lto_symtab_encoder_lookup (encoder, node);
if (index == LCC_NOT_FOUND) if (index == LCC_NOT_FOUND)
return false; return false;
return encoder->nodes[index].in_partition; return encoder->nodes[index].in_partition;
@ -238,7 +238,7 @@ void
lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder, lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
symtab_node node) symtab_node node)
{ {
int index = lto_symtab_encoder_encode (encoder, (symtab_node)node); int index = lto_symtab_encoder_encode (encoder, node);
encoder->nodes[index].in_partition = true; encoder->nodes[index].in_partition = true;
} }
@ -259,13 +259,13 @@ lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
LTO_symtab_edge); LTO_symtab_edge);
ref = lto_symtab_encoder_lookup (encoder, (symtab_node)edge->caller); ref = lto_symtab_encoder_lookup (encoder, edge->caller);
gcc_assert (ref != LCC_NOT_FOUND); gcc_assert (ref != LCC_NOT_FOUND);
streamer_write_hwi_stream (ob->main_stream, ref); streamer_write_hwi_stream (ob->main_stream, ref);
if (!edge->indirect_unknown_callee) if (!edge->indirect_unknown_callee)
{ {
ref = lto_symtab_encoder_lookup (encoder, (symtab_node)edge->callee); ref = lto_symtab_encoder_lookup (encoder, edge->callee);
gcc_assert (ref != LCC_NOT_FOUND); gcc_assert (ref != LCC_NOT_FOUND);
streamer_write_hwi_stream (ob->main_stream, ref); streamer_write_hwi_stream (ob->main_stream, ref);
} }
@ -273,7 +273,7 @@ lto_output_edge (struct lto_simple_output_block *ob, struct cgraph_edge *edge,
streamer_write_gcov_count_stream (ob->main_stream, edge->count); streamer_write_gcov_count_stream (ob->main_stream, edge->count);
bp = bitpack_create (ob->main_stream); bp = bitpack_create (ob->main_stream);
uid = (!gimple_has_body_p (edge->caller->symbol.decl) uid = (!gimple_has_body_p (edge->caller->decl)
? edge->lto_stmt_uid : gimple_uid (edge->call_stmt) + 1); ? edge->lto_stmt_uid : gimple_uid (edge->call_stmt) + 1);
bp_pack_enum (&bp, cgraph_inline_failed_enum, bp_pack_enum (&bp, cgraph_inline_failed_enum,
CIF_N_REASONS, edge->inline_failed); CIF_N_REASONS, edge->inline_failed);
@ -319,7 +319,7 @@ referenced_from_other_partition_p (struct ipa_ref_list *list, lto_symtab_encoder
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (list, i, ref); i++)
{ {
if (ref->referring->symbol.in_other_partition if (ref->referring->in_other_partition
|| !lto_symtab_encoder_in_partition_p (encoder, ref->referring)) || !lto_symtab_encoder_in_partition_p (encoder, ref->referring))
return true; return true;
} }
@ -332,13 +332,13 @@ bool
reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder) reachable_from_other_partition_p (struct cgraph_node *node, lto_symtab_encoder_t encoder)
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
if (!node->symbol.definition) if (!node->definition)
return false; return false;
if (node->global.inlined_to) if (node->global.inlined_to)
return false; return false;
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
if (e->caller->symbol.in_other_partition if (e->caller->in_other_partition
|| !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)e->caller)) || !lto_symtab_encoder_in_partition_p (encoder, e->caller))
return true; return true;
return false; return false;
} }
@ -364,7 +364,7 @@ reachable_from_this_partition_p (struct cgraph_node *node, lto_symtab_encoder_t
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
if (lto_symtab_encoder_in_partition_p (encoder, (symtab_node)e->caller)) if (lto_symtab_encoder_in_partition_p (encoder, e->caller))
return true; return true;
return false; return false;
} }
@ -391,16 +391,16 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
int i; int i;
bool alias_p; bool alias_p;
boundary_p = !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)node); boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
if (node->symbol.analyzed && !boundary_p) if (node->analyzed && !boundary_p)
tag = LTO_symtab_analyzed_node; tag = LTO_symtab_analyzed_node;
else else
tag = LTO_symtab_unavail_node; tag = LTO_symtab_unavail_node;
streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
tag); tag);
streamer_write_hwi_stream (ob->main_stream, node->symbol.order); streamer_write_hwi_stream (ob->main_stream, node->order);
/* In WPA mode, we only output part of the call-graph. Also, we /* In WPA mode, we only output part of the call-graph. Also, we
fake cgraph node attributes. There are two cases that we care. fake cgraph node attributes. There are two cases that we care.
@ -412,7 +412,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
Cherry-picked nodes: These are nodes we pulled from other Cherry-picked nodes: These are nodes we pulled from other
translation units into SET during IPA-inlining. We make them as translation units into SET during IPA-inlining. We make them as
local static nodes to prevent clashes with other local statics. */ local static nodes to prevent clashes with other local statics. */
if (boundary_p && node->symbol.analyzed && !DECL_EXTERNAL (node->symbol.decl)) if (boundary_p && node->analyzed && !DECL_EXTERNAL (node->decl))
{ {
/* Inline clones can not be part of boundary. /* Inline clones can not be part of boundary.
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
@ -427,7 +427,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
clone_of = node->clone_of; clone_of = node->clone_of;
while (clone_of while (clone_of
&& (ref = lto_symtab_encoder_lookup (encoder, (symtab_node)clone_of)) == LCC_NOT_FOUND) && (ref = lto_symtab_encoder_lookup (encoder, clone_of)) == LCC_NOT_FOUND)
if (clone_of->prev_sibling_clone) if (clone_of->prev_sibling_clone)
clone_of = clone_of->prev_sibling_clone; clone_of = clone_of->prev_sibling_clone;
else else
@ -450,7 +450,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
streamer_write_hwi_stream (ob->main_stream, ref); streamer_write_hwi_stream (ob->main_stream, ref);
lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->symbol.decl); lto_output_fn_decl_index (ob->decl_state, ob->main_stream, node->decl);
streamer_write_gcov_count_stream (ob->main_stream, node->count); streamer_write_gcov_count_stream (ob->main_stream, node->count);
streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale); streamer_write_hwi_stream (ob->main_stream, node->count_materialization_scale);
@ -463,7 +463,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
{ {
if (node->global.inlined_to) if (node->global.inlined_to)
{ {
ref = lto_symtab_encoder_lookup (encoder, (symtab_node)node->global.inlined_to); ref = lto_symtab_encoder_lookup (encoder, node->global.inlined_to);
gcc_assert (ref != LCC_NOT_FOUND); gcc_assert (ref != LCC_NOT_FOUND);
} }
else else
@ -472,10 +472,10 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
streamer_write_hwi_stream (ob->main_stream, ref); streamer_write_hwi_stream (ob->main_stream, ref);
} }
if (node->symbol.same_comdat_group && !boundary_p) if (node->same_comdat_group && !boundary_p)
{ {
ref = lto_symtab_encoder_lookup (encoder, ref = lto_symtab_encoder_lookup (encoder,
node->symbol.same_comdat_group); node->same_comdat_group);
gcc_assert (ref != LCC_NOT_FOUND); gcc_assert (ref != LCC_NOT_FOUND);
} }
else else
@ -484,20 +484,20 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
bp = bitpack_create (ob->main_stream); bp = bitpack_create (ob->main_stream);
bp_pack_value (&bp, node->local.local, 1); bp_pack_value (&bp, node->local.local, 1);
bp_pack_value (&bp, node->symbol.externally_visible, 1); bp_pack_value (&bp, node->externally_visible, 1);
bp_pack_value (&bp, node->symbol.definition, 1); bp_pack_value (&bp, node->definition, 1);
bp_pack_value (&bp, node->local.versionable, 1); bp_pack_value (&bp, node->local.versionable, 1);
bp_pack_value (&bp, node->local.can_change_signature, 1); bp_pack_value (&bp, node->local.can_change_signature, 1);
bp_pack_value (&bp, node->local.redefined_extern_inline, 1); bp_pack_value (&bp, node->local.redefined_extern_inline, 1);
bp_pack_value (&bp, node->symbol.force_output, 1); bp_pack_value (&bp, node->force_output, 1);
bp_pack_value (&bp, node->symbol.forced_by_abi, 1); bp_pack_value (&bp, node->forced_by_abi, 1);
bp_pack_value (&bp, node->symbol.unique_name, 1); bp_pack_value (&bp, node->unique_name, 1);
bp_pack_value (&bp, node->symbol.address_taken, 1); bp_pack_value (&bp, node->address_taken, 1);
bp_pack_value (&bp, tag == LTO_symtab_analyzed_node bp_pack_value (&bp, tag == LTO_symtab_analyzed_node
&& !DECL_EXTERNAL (node->symbol.decl) && !DECL_EXTERNAL (node->decl)
&& !DECL_COMDAT (node->symbol.decl) && !DECL_COMDAT (node->decl)
&& (reachable_from_other_partition_p (node, encoder) && (reachable_from_other_partition_p (node, encoder)
|| referenced_from_other_partition_p (&node->symbol.ref_list, || referenced_from_other_partition_p (&node->ref_list,
encoder)), 1); encoder)), 1);
bp_pack_value (&bp, node->lowered, 1); bp_pack_value (&bp, node->lowered, 1);
bp_pack_value (&bp, in_other_partition, 1); bp_pack_value (&bp, in_other_partition, 1);
@ -507,16 +507,16 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
defined in other unit, we may use the info on aliases to resolve defined in other unit, we may use the info on aliases to resolve
symbol1 != symbol2 type tests that we can do only for locally defined objects symbol1 != symbol2 type tests that we can do only for locally defined objects
otherwise. */ otherwise. */
alias_p = node->symbol.alias && (!boundary_p || node->symbol.weakref); alias_p = node->alias && (!boundary_p || node->weakref);
bp_pack_value (&bp, alias_p, 1); bp_pack_value (&bp, alias_p, 1);
bp_pack_value (&bp, node->symbol.weakref, 1); bp_pack_value (&bp, node->weakref, 1);
bp_pack_value (&bp, node->frequency, 2); bp_pack_value (&bp, node->frequency, 2);
bp_pack_value (&bp, node->only_called_at_startup, 1); bp_pack_value (&bp, node->only_called_at_startup, 1);
bp_pack_value (&bp, node->only_called_at_exit, 1); bp_pack_value (&bp, node->only_called_at_exit, 1);
bp_pack_value (&bp, node->tm_clone, 1); bp_pack_value (&bp, node->tm_clone, 1);
bp_pack_value (&bp, node->thunk.thunk_p && !boundary_p, 1); bp_pack_value (&bp, node->thunk.thunk_p && !boundary_p, 1);
bp_pack_enum (&bp, ld_plugin_symbol_resolution, bp_pack_enum (&bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN, node->symbol.resolution); LDPR_NUM_KNOWN, node->resolution);
streamer_write_bitpack (&bp); streamer_write_bitpack (&bp);
if (node->thunk.thunk_p && !boundary_p) if (node->thunk.thunk_p && !boundary_p)
@ -538,57 +538,57 @@ static void
lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node, lto_output_varpool_node (struct lto_simple_output_block *ob, struct varpool_node *node,
lto_symtab_encoder_t encoder) lto_symtab_encoder_t encoder)
{ {
bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, (symtab_node)node); bool boundary_p = !lto_symtab_encoder_in_partition_p (encoder, node);
struct bitpack_d bp; struct bitpack_d bp;
int ref; int ref;
bool alias_p; bool alias_p;
streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag, streamer_write_enum (ob->main_stream, LTO_symtab_tags, LTO_symtab_last_tag,
LTO_symtab_variable); LTO_symtab_variable);
streamer_write_hwi_stream (ob->main_stream, node->symbol.order); streamer_write_hwi_stream (ob->main_stream, node->order);
lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->symbol.decl); lto_output_var_decl_index (ob->decl_state, ob->main_stream, node->decl);
bp = bitpack_create (ob->main_stream); bp = bitpack_create (ob->main_stream);
bp_pack_value (&bp, node->symbol.externally_visible, 1); bp_pack_value (&bp, node->externally_visible, 1);
bp_pack_value (&bp, node->symbol.force_output, 1); bp_pack_value (&bp, node->force_output, 1);
bp_pack_value (&bp, node->symbol.forced_by_abi, 1); bp_pack_value (&bp, node->forced_by_abi, 1);
bp_pack_value (&bp, node->symbol.unique_name, 1); bp_pack_value (&bp, node->unique_name, 1);
bp_pack_value (&bp, node->symbol.definition, 1); bp_pack_value (&bp, node->definition, 1);
alias_p = node->symbol.alias && (!boundary_p || node->symbol.weakref); alias_p = node->alias && (!boundary_p || node->weakref);
bp_pack_value (&bp, alias_p, 1); bp_pack_value (&bp, alias_p, 1);
bp_pack_value (&bp, node->symbol.weakref, 1); bp_pack_value (&bp, node->weakref, 1);
bp_pack_value (&bp, node->symbol.analyzed && !boundary_p, 1); bp_pack_value (&bp, node->analyzed && !boundary_p, 1);
gcc_assert (node->symbol.definition || !node->symbol.analyzed); gcc_assert (node->definition || !node->analyzed);
/* Constant pool initializers can be de-unified into individual ltrans units. /* Constant pool initializers can be de-unified into individual ltrans units.
FIXME: Alternatively at -Os we may want to avoid generating for them the local FIXME: Alternatively at -Os we may want to avoid generating for them the local
labels and share them across LTRANS partitions. */ labels and share them across LTRANS partitions. */
if (DECL_IN_CONSTANT_POOL (node->symbol.decl) if (DECL_IN_CONSTANT_POOL (node->decl)
&& !DECL_EXTERNAL (node->symbol.decl) && !DECL_EXTERNAL (node->decl)
&& !DECL_COMDAT (node->symbol.decl)) && !DECL_COMDAT (node->decl))
{ {
bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */ bp_pack_value (&bp, 0, 1); /* used_from_other_parition. */
bp_pack_value (&bp, 0, 1); /* in_other_partition. */ bp_pack_value (&bp, 0, 1); /* in_other_partition. */
} }
else else
{ {
bp_pack_value (&bp, node->symbol.definition bp_pack_value (&bp, node->definition
&& referenced_from_other_partition_p (&node->symbol.ref_list, && referenced_from_other_partition_p (&node->ref_list,
encoder), 1); encoder), 1);
bp_pack_value (&bp, node->symbol.analyzed bp_pack_value (&bp, node->analyzed
&& boundary_p && !DECL_EXTERNAL (node->symbol.decl), 1); && boundary_p && !DECL_EXTERNAL (node->decl), 1);
/* in_other_partition. */ /* in_other_partition. */
} }
streamer_write_bitpack (&bp); streamer_write_bitpack (&bp);
if (node->symbol.same_comdat_group && !boundary_p) if (node->same_comdat_group && !boundary_p)
{ {
ref = lto_symtab_encoder_lookup (encoder, ref = lto_symtab_encoder_lookup (encoder,
node->symbol.same_comdat_group); node->same_comdat_group);
gcc_assert (ref != LCC_NOT_FOUND); gcc_assert (ref != LCC_NOT_FOUND);
} }
else else
ref = LCC_NOT_FOUND; ref = LCC_NOT_FOUND;
streamer_write_hwi_stream (ob->main_stream, ref); streamer_write_hwi_stream (ob->main_stream, ref);
streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution, streamer_write_enum (ob->main_stream, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN, node->symbol.resolution); LDPR_NUM_KNOWN, node->resolution);
} }
/* Output the varpool NODE to OB. /* Output the varpool NODE to OB.
@ -705,13 +705,13 @@ output_refs (lto_symtab_encoder_t encoder)
{ {
symtab_node node = lsei_node (lsei); symtab_node node = lsei_node (lsei);
count = ipa_ref_list_nreferences (&node->symbol.ref_list); count = ipa_ref_list_nreferences (&node->ref_list);
if (count) if (count)
{ {
streamer_write_gcov_count_stream (ob->main_stream, count); streamer_write_gcov_count_stream (ob->main_stream, count);
streamer_write_uhwi_stream (ob->main_stream, streamer_write_uhwi_stream (ob->main_stream,
lto_symtab_encoder_lookup (encoder, node)); lto_symtab_encoder_lookup (encoder, node));
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
lto_output_ref (ob, ref, encoder); lto_output_ref (ob, ref, encoder);
} }
@ -733,7 +733,7 @@ add_node_to (lto_symtab_encoder_t encoder, struct cgraph_node *node,
add_node_to (encoder, node->clone_of, include_body); add_node_to (encoder, node->clone_of, include_body);
else if (include_body) else if (include_body)
lto_set_symtab_encoder_encode_body (encoder, node); lto_set_symtab_encoder_encode_body (encoder, node);
lto_symtab_encoder_encode (encoder, (symtab_node)node); lto_symtab_encoder_encode (encoder, node);
} }
/* Add all references in LIST to encoders. */ /* Add all references in LIST to encoders. */
@ -779,13 +779,13 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{ {
node = lsei_cgraph_node (lsei); node = lsei_cgraph_node (lsei);
add_node_to (encoder, node, true); add_node_to (encoder, node, true);
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node); lto_set_symtab_encoder_in_partition (encoder, node);
add_references (encoder, &node->symbol.ref_list); add_references (encoder, &node->ref_list);
/* For proper debug info, we need to ship the origins, too. */ /* For proper debug info, we need to ship the origins, too. */
if (DECL_ABSTRACT_ORIGIN (node->symbol.decl)) if (DECL_ABSTRACT_ORIGIN (node->decl))
{ {
struct cgraph_node *origin_node struct cgraph_node *origin_node
= cgraph_get_node (DECL_ABSTRACT_ORIGIN (node->symbol.decl)); = cgraph_get_node (DECL_ABSTRACT_ORIGIN (node->decl));
add_node_to (encoder, origin_node, true); add_node_to (encoder, origin_node, true);
} }
} }
@ -794,15 +794,15 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{ {
struct varpool_node *vnode = lsei_varpool_node (lsei); struct varpool_node *vnode = lsei_varpool_node (lsei);
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode); lto_set_symtab_encoder_in_partition (encoder, vnode);
lto_set_symtab_encoder_encode_initializer (encoder, vnode); lto_set_symtab_encoder_encode_initializer (encoder, vnode);
add_references (encoder, &vnode->symbol.ref_list); add_references (encoder, &vnode->ref_list);
/* For proper debug info, we need to ship the origins, too. */ /* For proper debug info, we need to ship the origins, too. */
if (DECL_ABSTRACT_ORIGIN (vnode->symbol.decl)) if (DECL_ABSTRACT_ORIGIN (vnode->decl))
{ {
struct varpool_node *origin_node struct varpool_node *origin_node
= varpool_get_node (DECL_ABSTRACT_ORIGIN (node->symbol.decl)); = varpool_get_node (DECL_ABSTRACT_ORIGIN (node->decl));
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)origin_node); lto_set_symtab_encoder_in_partition (encoder, origin_node);
} }
} }
/* Pickle in also the initializer of all referenced readonly variables /* Pickle in also the initializer of all referenced readonly variables
@ -815,10 +815,10 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
{ {
if (!lto_symtab_encoder_encode_initializer_p (encoder, if (!lto_symtab_encoder_encode_initializer_p (encoder,
vnode) vnode)
&& ctor_for_folding (vnode->symbol.decl) != error_mark_node) && ctor_for_folding (vnode->decl) != error_mark_node)
{ {
lto_set_symtab_encoder_encode_initializer (encoder, vnode); lto_set_symtab_encoder_encode_initializer (encoder, vnode);
add_references (encoder, &vnode->symbol.ref_list); add_references (encoder, &vnode->ref_list);
} }
} }
} }
@ -832,7 +832,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
for (edge = node->callees; edge; edge = edge->next_callee) for (edge = node->callees; edge; edge = edge->next_callee)
{ {
struct cgraph_node *callee = edge->callee; struct cgraph_node *callee = edge->callee;
if (!lto_symtab_encoder_in_partition_p (encoder, (symtab_node)callee)) if (!lto_symtab_encoder_in_partition_p (encoder, callee))
{ {
/* We should have moved all the inlines. */ /* We should have moved all the inlines. */
gcc_assert (!callee->global.inlined_to); gcc_assert (!callee->global.inlined_to);
@ -859,9 +859,9 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
/* Adding an external declarations into the unit serves /* Adding an external declarations into the unit serves
no purpose and just increases its boundary. */ no purpose and just increases its boundary. */
if (callee->symbol.definition if (callee->definition
&& !lto_symtab_encoder_in_partition_p && !lto_symtab_encoder_in_partition_p
(encoder, (symtab_node)callee)) (encoder, callee))
{ {
gcc_assert (!callee->global.inlined_to); gcc_assert (!callee->global.inlined_to);
add_node_to (encoder, callee, false); add_node_to (encoder, callee, false);
@ -952,24 +952,24 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
enum LTO_symtab_tags tag, enum LTO_symtab_tags tag,
struct bitpack_d *bp) struct bitpack_d *bp)
{ {
node->symbol.aux = (void *) tag; node->aux = (void *) tag;
node->symbol.lto_file_data = file_data; node->lto_file_data = file_data;
node->local.local = bp_unpack_value (bp, 1); node->local.local = bp_unpack_value (bp, 1);
node->symbol.externally_visible = bp_unpack_value (bp, 1); node->externally_visible = bp_unpack_value (bp, 1);
node->symbol.definition = bp_unpack_value (bp, 1); node->definition = bp_unpack_value (bp, 1);
node->local.versionable = bp_unpack_value (bp, 1); node->local.versionable = bp_unpack_value (bp, 1);
node->local.can_change_signature = bp_unpack_value (bp, 1); node->local.can_change_signature = bp_unpack_value (bp, 1);
node->local.redefined_extern_inline = bp_unpack_value (bp, 1); node->local.redefined_extern_inline = bp_unpack_value (bp, 1);
node->symbol.force_output = bp_unpack_value (bp, 1); node->force_output = bp_unpack_value (bp, 1);
node->symbol.forced_by_abi = bp_unpack_value (bp, 1); node->forced_by_abi = bp_unpack_value (bp, 1);
node->symbol.unique_name = bp_unpack_value (bp, 1); node->unique_name = bp_unpack_value (bp, 1);
node->symbol.address_taken = bp_unpack_value (bp, 1); node->address_taken = bp_unpack_value (bp, 1);
node->symbol.used_from_other_partition = bp_unpack_value (bp, 1); node->used_from_other_partition = bp_unpack_value (bp, 1);
node->lowered = bp_unpack_value (bp, 1); node->lowered = bp_unpack_value (bp, 1);
node->symbol.analyzed = tag == LTO_symtab_analyzed_node; node->analyzed = tag == LTO_symtab_analyzed_node;
node->symbol.in_other_partition = bp_unpack_value (bp, 1); node->in_other_partition = bp_unpack_value (bp, 1);
if (node->symbol.in_other_partition if (node->in_other_partition
/* Avoid updating decl when we are seeing just inline clone. /* Avoid updating decl when we are seeing just inline clone.
When inlining function that has functions already inlined into it, When inlining function that has functions already inlined into it,
we produce clones of inline clones. we produce clones of inline clones.
@ -978,19 +978,19 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
we might end up streaming inline clone from other partition we might end up streaming inline clone from other partition
to support clone we are interested in. */ to support clone we are interested in. */
&& (!node->clone_of && (!node->clone_of
|| node->clone_of->symbol.decl != node->symbol.decl)) || node->clone_of->decl != node->decl))
{ {
DECL_EXTERNAL (node->symbol.decl) = 1; DECL_EXTERNAL (node->decl) = 1;
TREE_STATIC (node->symbol.decl) = 0; TREE_STATIC (node->decl) = 0;
} }
node->symbol.alias = bp_unpack_value (bp, 1); node->alias = bp_unpack_value (bp, 1);
node->symbol.weakref = bp_unpack_value (bp, 1); node->weakref = bp_unpack_value (bp, 1);
node->frequency = (enum node_frequency)bp_unpack_value (bp, 2); node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
node->only_called_at_startup = bp_unpack_value (bp, 1); node->only_called_at_startup = bp_unpack_value (bp, 1);
node->only_called_at_exit = bp_unpack_value (bp, 1); node->only_called_at_exit = bp_unpack_value (bp, 1);
node->tm_clone = bp_unpack_value (bp, 1); node->tm_clone = bp_unpack_value (bp, 1);
node->thunk.thunk_p = bp_unpack_value (bp, 1); node->thunk.thunk_p = bp_unpack_value (bp, 1);
node->symbol.resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution, node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
} }
@ -1041,11 +1041,11 @@ input_node (struct lto_file_decl_data *file_data,
from other input file. We keep cgraph unmerged until after streaming from other input file. We keep cgraph unmerged until after streaming
of ipa passes is done. Alays forcingly create a fresh node. */ of ipa passes is done. Alays forcingly create a fresh node. */
node = cgraph_create_empty_node (); node = cgraph_create_empty_node ();
node->symbol.decl = fn_decl; node->decl = fn_decl;
symtab_register_node ((symtab_node)node); symtab_register_node (node);
} }
node->symbol.order = order; node->order = order;
if (order >= symtab_order) if (order >= symtab_order)
symtab_order = order + 1; symtab_order = order + 1;
@ -1073,7 +1073,7 @@ input_node (struct lto_file_decl_data *file_data,
have already been read will have their tag stored in the 'aux' have already been read will have their tag stored in the 'aux'
field. Since built-in functions can be referenced in multiple field. Since built-in functions can be referenced in multiple
functions, they are expected to be read more than once. */ functions, they are expected to be read more than once. */
if (node->symbol.aux && !DECL_BUILT_IN (node->symbol.decl)) if (node->aux && !DECL_BUILT_IN (node->decl))
internal_error ("bytecode stream: found multiple instances of cgraph " internal_error ("bytecode stream: found multiple instances of cgraph "
"node with uid %d", node->uid); "node with uid %d", node->uid);
@ -1084,7 +1084,7 @@ input_node (struct lto_file_decl_data *file_data,
node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref; node->global.inlined_to = (cgraph_node_ptr) (intptr_t) ref;
/* Store a reference for now, and fix up later to be a pointer. */ /* Store a reference for now, and fix up later to be a pointer. */
node->symbol.same_comdat_group = (symtab_node) (intptr_t) ref2; node->same_comdat_group = (symtab_node) (intptr_t) ref2;
if (node->thunk.thunk_p) if (node->thunk.thunk_p)
{ {
@ -1097,8 +1097,8 @@ input_node (struct lto_file_decl_data *file_data,
node->thunk.virtual_value = virtual_value; node->thunk.virtual_value = virtual_value;
node->thunk.virtual_offset_p = (type & 4); node->thunk.virtual_offset_p = (type & 4);
} }
if (node->symbol.alias && !node->symbol.analyzed && node->symbol.weakref) if (node->alias && !node->analyzed && node->weakref)
node->symbol.alias_target = get_alias_symbol (node->symbol.decl); node->alias_target = get_alias_symbol (node->decl);
node->profile_id = streamer_read_hwi (ib); node->profile_id = streamer_read_hwi (ib);
return node; return node;
} }
@ -1125,36 +1125,36 @@ input_varpool_node (struct lto_file_decl_data *file_data,
from other input file. We keep cgraph unmerged until after streaming from other input file. We keep cgraph unmerged until after streaming
of ipa passes is done. Alays forcingly create a fresh node. */ of ipa passes is done. Alays forcingly create a fresh node. */
node = varpool_create_empty_node (); node = varpool_create_empty_node ();
node->symbol.decl = var_decl; node->decl = var_decl;
symtab_register_node ((symtab_node)node); symtab_register_node (node);
node->symbol.order = order; node->order = order;
if (order >= symtab_order) if (order >= symtab_order)
symtab_order = order + 1; symtab_order = order + 1;
node->symbol.lto_file_data = file_data; node->lto_file_data = file_data;
bp = streamer_read_bitpack (ib); bp = streamer_read_bitpack (ib);
node->symbol.externally_visible = bp_unpack_value (&bp, 1); node->externally_visible = bp_unpack_value (&bp, 1);
node->symbol.force_output = bp_unpack_value (&bp, 1); node->force_output = bp_unpack_value (&bp, 1);
node->symbol.forced_by_abi = bp_unpack_value (&bp, 1); node->forced_by_abi = bp_unpack_value (&bp, 1);
node->symbol.unique_name = bp_unpack_value (&bp, 1); node->unique_name = bp_unpack_value (&bp, 1);
node->symbol.definition = bp_unpack_value (&bp, 1); node->definition = bp_unpack_value (&bp, 1);
node->symbol.alias = bp_unpack_value (&bp, 1); node->alias = bp_unpack_value (&bp, 1);
node->symbol.weakref = bp_unpack_value (&bp, 1); node->weakref = bp_unpack_value (&bp, 1);
node->symbol.analyzed = bp_unpack_value (&bp, 1); node->analyzed = bp_unpack_value (&bp, 1);
node->symbol.used_from_other_partition = bp_unpack_value (&bp, 1); node->used_from_other_partition = bp_unpack_value (&bp, 1);
node->symbol.in_other_partition = bp_unpack_value (&bp, 1); node->in_other_partition = bp_unpack_value (&bp, 1);
if (node->symbol.in_other_partition) if (node->in_other_partition)
{ {
DECL_EXTERNAL (node->symbol.decl) = 1; DECL_EXTERNAL (node->decl) = 1;
TREE_STATIC (node->symbol.decl) = 0; TREE_STATIC (node->decl) = 0;
} }
if (node->symbol.alias && !node->symbol.analyzed && node->symbol.weakref) if (node->alias && !node->analyzed && node->weakref)
node->symbol.alias_target = get_alias_symbol (node->symbol.decl); node->alias_target = get_alias_symbol (node->decl);
ref = streamer_read_hwi (ib); ref = streamer_read_hwi (ib);
/* Store a reference for now, and fix up later to be a pointer. */ /* Store a reference for now, and fix up later to be a pointer. */
node->symbol.same_comdat_group = (symtab_node) (intptr_t) ref; node->same_comdat_group = (symtab_node) (intptr_t) ref;
node->symbol.resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN); LDPR_NUM_KNOWN);
return node; return node;
@ -1203,13 +1203,13 @@ input_edge (struct lto_input_block *ib, vec<symtab_node> nodes,
int ecf_flags = 0; int ecf_flags = 0;
caller = cgraph (nodes[streamer_read_hwi (ib)]); caller = cgraph (nodes[streamer_read_hwi (ib)]);
if (caller == NULL || caller->symbol.decl == NULL_TREE) if (caller == NULL || caller->decl == NULL_TREE)
internal_error ("bytecode stream: no caller found while reading edge"); internal_error ("bytecode stream: no caller found while reading edge");
if (!indirect) if (!indirect)
{ {
callee = cgraph (nodes[streamer_read_hwi (ib)]); callee = cgraph (nodes[streamer_read_hwi (ib)]);
if (callee == NULL || callee->symbol.decl == NULL_TREE) if (callee == NULL || callee->decl == NULL_TREE)
internal_error ("bytecode stream: no callee found while reading edge"); internal_error ("bytecode stream: no callee found while reading edge");
} }
else else
@ -1276,14 +1276,14 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
input_edge (ib, nodes, true); input_edge (ib, nodes, true);
else if (tag == LTO_symtab_variable) else if (tag == LTO_symtab_variable)
{ {
node = (symtab_node)input_varpool_node (file_data, ib); node = input_varpool_node (file_data, ib);
nodes.safe_push (node); nodes.safe_push (node);
lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
} }
else else
{ {
node = (symtab_node)input_node (file_data, ib, tag, nodes); node = input_node (file_data, ib, tag, nodes);
if (node == NULL || node->symbol.decl == NULL_TREE) if (node == NULL || node->decl == NULL_TREE)
internal_error ("bytecode stream: found empty cgraph node"); internal_error ("bytecode stream: found empty cgraph node");
nodes.safe_push (node); nodes.safe_push (node);
lto_symtab_encoder_encode (file_data->symtab_node_encoder, node); lto_symtab_encoder_encode (file_data->symtab_node_encoder, node);
@ -1297,7 +1297,7 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
/* AUX pointers should be all non-zero for function nodes read from the stream. */ /* AUX pointers should be all non-zero for function nodes read from the stream. */
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
FOR_EACH_VEC_ELT (nodes, i, node) FOR_EACH_VEC_ELT (nodes, i, node)
gcc_assert (node->symbol.aux || !is_a <cgraph_node> (node)); gcc_assert (node->aux || !is_a <cgraph_node> (node));
#endif #endif
FOR_EACH_VEC_ELT (nodes, i, node) FOR_EACH_VEC_ELT (nodes, i, node)
{ {
@ -1307,9 +1307,9 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
ref = (int) (intptr_t) cnode->global.inlined_to; ref = (int) (intptr_t) cnode->global.inlined_to;
/* We share declaration of builtins, so we may read same node twice. */ /* We share declaration of builtins, so we may read same node twice. */
if (!node->symbol.aux) if (!node->aux)
continue; continue;
node->symbol.aux = NULL; node->aux = NULL;
/* Fixup inlined_to from reference to pointer. */ /* Fixup inlined_to from reference to pointer. */
if (ref != LCC_NOT_FOUND) if (ref != LCC_NOT_FOUND)
@ -1318,16 +1318,16 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
cnode->global.inlined_to = NULL; cnode->global.inlined_to = NULL;
} }
ref = (int) (intptr_t) node->symbol.same_comdat_group; ref = (int) (intptr_t) node->same_comdat_group;
/* Fixup same_comdat_group from reference to pointer. */ /* Fixup same_comdat_group from reference to pointer. */
if (ref != LCC_NOT_FOUND) if (ref != LCC_NOT_FOUND)
node->symbol.same_comdat_group = nodes[ref]; node->same_comdat_group = nodes[ref];
else else
node->symbol.same_comdat_group = NULL; node->same_comdat_group = NULL;
} }
FOR_EACH_VEC_ELT (nodes, i, node) FOR_EACH_VEC_ELT (nodes, i, node)
node->symbol.aux = is_a <cgraph_node> (node) ? (void *)1 : NULL; node->aux = is_a <cgraph_node> (node) ? (void *)1 : NULL;
return nodes; return nodes;
} }
@ -1509,13 +1509,13 @@ merge_profile_summaries (struct lto_file_decl_data **file_data_vec)
During LTRANS we already have values of count_materialization_scale During LTRANS we already have values of count_materialization_scale
computed, so just update them. */ computed, so just update them. */
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
if (node->symbol.lto_file_data if (node->lto_file_data
&& node->symbol.lto_file_data->profile_info.runs) && node->lto_file_data->profile_info.runs)
{ {
int scale; int scale;
scale = RDIV (node->count_materialization_scale * max_runs, scale = RDIV (node->count_materialization_scale * max_runs,
node->symbol.lto_file_data->profile_info.runs); node->lto_file_data->profile_info.runs);
node->count_materialization_scale = scale; node->count_materialization_scale = scale;
if (scale < 0) if (scale < 0)
fatal_error ("Profile information in %s corrupted", fatal_error ("Profile information in %s corrupted",
@ -1583,8 +1583,8 @@ input_symtab (void)
node for the parent function was never emitted to the gimple node for the parent function was never emitted to the gimple
file, cgraph_node will create a node for it when setting the file, cgraph_node will create a node for it when setting the
context of the nested function. */ context of the nested function. */
if (node->symbol.lto_file_data) if (node->lto_file_data)
node->symbol.aux = NULL; node->aux = NULL;
} }
} }
@ -1651,7 +1651,7 @@ output_node_opt_summary (struct output_block *ob,
streamer_write_bitpack (&bp); streamer_write_bitpack (&bp);
} }
if (lto_symtab_encoder_in_partition_p (encoder, (symtab_node) node)) if (lto_symtab_encoder_in_partition_p (encoder, node))
{ {
for (e = node->callees; e; e = e->next_callee) for (e = node->callees; e; e = e->next_callee)
output_edge_opt_summary (ob, e); output_edge_opt_summary (ob, e);

View File

@ -433,19 +433,19 @@ lto_free_function_in_decl_state_for_node (symtab_node node)
struct lto_in_decl_state temp; struct lto_in_decl_state temp;
void **slot; void **slot;
if (!node->symbol.lto_file_data) if (!node->lto_file_data)
return; return;
temp.fn_decl = node->symbol.decl; temp.fn_decl = node->decl;
slot = htab_find_slot (node->symbol.lto_file_data->function_decl_states, slot = htab_find_slot (node->lto_file_data->function_decl_states,
&temp, NO_INSERT); &temp, NO_INSERT);
if (slot && *slot) if (slot && *slot)
{ {
lto_free_function_in_decl_state ((struct lto_in_decl_state*) *slot); lto_free_function_in_decl_state ((struct lto_in_decl_state*) *slot);
htab_clear_slot (node->symbol.lto_file_data->function_decl_states, htab_clear_slot (node->lto_file_data->function_decl_states,
slot); slot);
} }
node->symbol.lto_file_data = NULL; node->lto_file_data = NULL;
} }

View File

@ -784,7 +784,7 @@ fixup_call_stmt_edges_1 (struct cgraph_node *node, gimple *stmts,
fatal_error ("Cgraph edge statement index not found"); fatal_error ("Cgraph edge statement index not found");
} }
for (i = 0; for (i = 0;
ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); ipa_ref_list_reference_iterate (&node->ref_list, i, ref);
i++) i++)
if (ref->lto_stmt_uid) if (ref->lto_stmt_uid)
{ {
@ -807,7 +807,7 @@ fixup_call_stmt_edges (struct cgraph_node *orig, gimple *stmts)
while (orig->clone_of) while (orig->clone_of)
orig = orig->clone_of; orig = orig->clone_of;
fn = DECL_STRUCT_FUNCTION (orig->symbol.decl); fn = DECL_STRUCT_FUNCTION (orig->decl);
fixup_call_stmt_edges_1 (orig, stmts, fn); fixup_call_stmt_edges_1 (orig, stmts, fn);
if (orig->clones) if (orig->clones)
@ -1024,7 +1024,7 @@ lto_read_body (struct lto_file_decl_data *file_data, struct cgraph_node *node,
int string_offset; int string_offset;
struct lto_input_block ib_cfg; struct lto_input_block ib_cfg;
struct lto_input_block ib_main; struct lto_input_block ib_main;
tree fn_decl = node->symbol.decl; tree fn_decl = node->decl;
header = (const struct lto_function_header *) data; header = (const struct lto_function_header *) data;
cfg_offset = sizeof (struct lto_function_header); cfg_offset = sizeof (struct lto_function_header);

View File

@ -1751,7 +1751,7 @@ output_function (struct cgraph_node *node)
basic_block bb; basic_block bb;
struct output_block *ob; struct output_block *ob;
function = node->symbol.decl; function = node->decl;
fn = DECL_STRUCT_FUNCTION (function); fn = DECL_STRUCT_FUNCTION (function);
ob = create_output_block (LTO_section_function_body); ob = create_output_block (LTO_section_function_body);
@ -1910,8 +1910,8 @@ lto_output_toplevel_asms (void)
static void static void
copy_function (struct cgraph_node *node) copy_function (struct cgraph_node *node)
{ {
tree function = node->symbol.decl; tree function = node->decl;
struct lto_file_decl_data *file_data = node->symbol.lto_file_data; struct lto_file_decl_data *file_data = node->lto_file_data;
struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream); struct lto_output_stream *output_stream = XCNEW (struct lto_output_stream);
const char *data; const char *data;
size_t len; size_t len;
@ -1938,7 +1938,7 @@ copy_function (struct cgraph_node *node)
/* Copy decls. */ /* Copy decls. */
in_state = in_state =
lto_get_function_in_decl_state (node->symbol.lto_file_data, function); lto_get_function_in_decl_state (node->lto_file_data, function);
gcc_assert (in_state); gcc_assert (in_state);
for (i = 0; i < LTO_N_DECL_STREAMS; i++) for (i = 0; i < LTO_N_DECL_STREAMS; i++)
@ -1986,21 +1986,21 @@ lto_output (void)
cgraph_node *node = dyn_cast <cgraph_node> (snode); cgraph_node *node = dyn_cast <cgraph_node> (snode);
if (node if (node
&& lto_symtab_encoder_encode_body_p (encoder, node) && lto_symtab_encoder_encode_body_p (encoder, node)
&& !node->symbol.alias) && !node->alias)
{ {
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
gcc_assert (!bitmap_bit_p (output, DECL_UID (node->symbol.decl))); gcc_assert (!bitmap_bit_p (output, DECL_UID (node->decl)));
bitmap_set_bit (output, DECL_UID (node->symbol.decl)); bitmap_set_bit (output, DECL_UID (node->decl));
#endif #endif
decl_state = lto_new_out_decl_state (); decl_state = lto_new_out_decl_state ();
lto_push_out_decl_state (decl_state); lto_push_out_decl_state (decl_state);
if (gimple_has_body_p (node->symbol.decl) || !flag_wpa) if (gimple_has_body_p (node->decl) || !flag_wpa)
output_function (node); output_function (node);
else else
copy_function (node); copy_function (node);
gcc_assert (lto_get_out_decl_state () == decl_state); gcc_assert (lto_get_out_decl_state () == decl_state);
lto_pop_out_decl_state (); lto_pop_out_decl_state ();
lto_record_function_out_decl_state (node->symbol.decl, decl_state); lto_record_function_out_decl_state (node->decl, decl_state);
} }
} }
@ -2232,10 +2232,10 @@ write_symbol (struct streamer_tree_cache_d *cache,
/* When something is defined, it should have node attached. */ /* When something is defined, it should have node attached. */
gcc_assert (alias || TREE_CODE (t) != VAR_DECL gcc_assert (alias || TREE_CODE (t) != VAR_DECL
|| varpool_get_node (t)->symbol.definition); || varpool_get_node (t)->definition);
gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL gcc_assert (alias || TREE_CODE (t) != FUNCTION_DECL
|| (cgraph_get_node (t) || (cgraph_get_node (t)
&& cgraph_get_node (t)->symbol.definition)); && cgraph_get_node (t)->definition));
} }
/* Imitate what default_elf_asm_output_external do. /* Imitate what default_elf_asm_output_external do.
@ -2299,7 +2299,7 @@ output_symbol_p (symtab_node node)
and devirtualization. We do not want to see them in symbol table as and devirtualization. We do not want to see them in symbol table as
references unless they are really used. */ references unless they are really used. */
cnode = dyn_cast <cgraph_node> (node); cnode = dyn_cast <cgraph_node> (node);
if (cnode && (!node->symbol.definition || DECL_EXTERNAL (cnode->symbol.decl)) if (cnode && (!node->definition || DECL_EXTERNAL (cnode->decl))
&& cnode->callers) && cnode->callers)
return true; return true;
@ -2307,18 +2307,18 @@ output_symbol_p (symtab_node node)
part of the compilation unit until they are used by folding. Some symbols, part of the compilation unit until they are used by folding. Some symbols,
like references to external construction vtables can not be referred to at all. like references to external construction vtables can not be referred to at all.
We decide this at can_refer_decl_in_current_unit_p. */ We decide this at can_refer_decl_in_current_unit_p. */
if (!node->symbol.definition || DECL_EXTERNAL (node->symbol.decl)) if (!node->definition || DECL_EXTERNAL (node->decl))
{ {
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list,
i, ref); i++) i, ref); i++)
{ {
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
continue; continue;
if (is_a <cgraph_node> (ref->referring)) if (is_a <cgraph_node> (ref->referring))
return true; return true;
if (!DECL_EXTERNAL (ref->referring->symbol.decl)) if (!DECL_EXTERNAL (ref->referring->decl))
return true; return true;
} }
return false; return false;
@ -2354,18 +2354,18 @@ produce_symtab (struct output_block *ob)
{ {
symtab_node node = lsei_node (lsei); symtab_node node = lsei_node (lsei);
if (!output_symbol_p (node) || DECL_EXTERNAL (node->symbol.decl)) if (!output_symbol_p (node) || DECL_EXTERNAL (node->decl))
continue; continue;
write_symbol (cache, &stream, node->symbol.decl, seen, false); write_symbol (cache, &stream, node->decl, seen, false);
} }
for (lsei = lsei_start (encoder); for (lsei = lsei_start (encoder);
!lsei_end_p (lsei); lsei_next (&lsei)) !lsei_end_p (lsei); lsei_next (&lsei))
{ {
symtab_node node = lsei_node (lsei); symtab_node node = lsei_node (lsei);
if (!output_symbol_p (node) || !DECL_EXTERNAL (node->symbol.decl)) if (!output_symbol_p (node) || !DECL_EXTERNAL (node->decl))
continue; continue;
write_symbol (cache, &stream, node->symbol.decl, seen, false); write_symbol (cache, &stream, node->decl, seen, false);
} }
lto_write_stream (&stream); lto_write_stream (&stream);

View File

@ -1,3 +1,47 @@
2013-10-29 David Malcolm <dmalcolm@redhat.com>
Patch autogenerated by refactor_symtab.py from
https://github.com/davidmalcolm/gcc-refactoring-scripts
revision 58bb219cc090b2f4516a9297d868c245495ee622
* lto-partition.c (lto_promote_cross_file_statics): Update for
conversion of symtab types to a true class hierarchy.
(rename_statics): Likewise.
(promote_symbol): Likewise.
(privatize_symbol_name): Likewise.
(lto_balanced_map): Likewise.
(varpool_node_cmp): Likewise.
(node_cmp): Likewise.
(lto_1_to_1_map): Likewise.
(undo_partition): Likewise.
(add_symbol_to_partition): Likewise.
(contained_in_symbol): Likewise.
(add_symbol_to_partition_1): Likewise.
(add_references_to_partition): Likewise.
(symbol_partitioned_p): Likewise.
(get_symbol_class): Likewise.
(lto_max_map): Likewise.
* lto-symtab.c (lto_symtab_prevailing_decl): Likewise.
(lto_symtab_merge_symbols): Likewise.
(lto_symtab_merge_symbols_1): Likewise.
(lto_symtab_merge_decls): Likewise.
(lto_symtab_merge_decls_1): Likewise.
(lto_symtab_merge_decls_2): Likewise.
(lto_symtab_resolve_symbols): Likewise.
(lto_symtab_resolve_can_prevail_p): Likewise.
(lto_symtab_symbol_p): Likewise.
(lto_symtab_resolve_replaceable_p): Likewise.
(lto_symtab_merge): Likewise.
(lto_varpool_replace_node): Likewise.
(lto_cgraph_replace_node): Likewise.
* lto.c (lto_main): Likewise.
(do_whole_program_analysis): Likewise.
(materialize_cgraph): Likewise.
(read_cgraph_and_symbols): Likewise.
(cmp_partitions_order): Likewise.
(lto_materialize_function): Likewise.
(has_analyzed_clone_p): Likewise.
2013-10-29 Andrew MacLeod <amacleod@redhat.com> 2013-10-29 Andrew MacLeod <amacleod@redhat.com>
* lto/lto-object.c: Add gimple.h to include list. * lto/lto-object.c: Add gimple.h to include list.

View File

@ -58,18 +58,18 @@ get_symbol_class (symtab_node node)
This include external delcarations. */ This include external delcarations. */
cgraph_node *cnode = dyn_cast <cgraph_node> (node); cgraph_node *cnode = dyn_cast <cgraph_node> (node);
if (DECL_ABSTRACT (node->symbol.decl)) if (DECL_ABSTRACT (node->decl))
return SYMBOL_EXTERNAL; return SYMBOL_EXTERNAL;
if (cnode && cnode->global.inlined_to) if (cnode && cnode->global.inlined_to)
return SYMBOL_DUPLICATE; return SYMBOL_DUPLICATE;
/* Weakref aliases are always duplicated. */ /* Weakref aliases are always duplicated. */
if (node->symbol.weakref) if (node->weakref)
return SYMBOL_DUPLICATE; return SYMBOL_DUPLICATE;
/* External declarations are external. */ /* External declarations are external. */
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
return SYMBOL_EXTERNAL; return SYMBOL_EXTERNAL;
if (varpool_node *vnode = dyn_cast <varpool_node> (node)) if (varpool_node *vnode = dyn_cast <varpool_node> (node))
@ -77,22 +77,22 @@ get_symbol_class (symtab_node node)
/* Constant pool references use local symbol names that can not /* Constant pool references use local symbol names that can not
be promoted global. We should never put into a constant pool be promoted global. We should never put into a constant pool
objects that can not be duplicated across partitions. */ objects that can not be duplicated across partitions. */
if (DECL_IN_CONSTANT_POOL (node->symbol.decl)) if (DECL_IN_CONSTANT_POOL (node->decl))
return SYMBOL_DUPLICATE; return SYMBOL_DUPLICATE;
gcc_checking_assert (vnode->symbol.definition); gcc_checking_assert (vnode->definition);
} }
/* Functions that are cloned may stay in callgraph even if they are unused. /* Functions that are cloned may stay in callgraph even if they are unused.
Handle them as external; compute_ltrans_boundary take care to make Handle them as external; compute_ltrans_boundary take care to make
proper things to happen (i.e. to make them appear in the boundary but proper things to happen (i.e. to make them appear in the boundary but
with body streamed, so clone can me materialized). */ with body streamed, so clone can me materialized). */
else if (!cgraph (node)->symbol.definition) else if (!cgraph (node)->definition)
return SYMBOL_EXTERNAL; return SYMBOL_EXTERNAL;
/* Comdats are duplicated to every use unless they are keyed. /* Comdats are duplicated to every use unless they are keyed.
Those do not need duplication. */ Those do not need duplication. */
if (DECL_COMDAT (node->symbol.decl) if (DECL_COMDAT (node->decl)
&& !node->symbol.force_output && !node->force_output
&& !symtab_used_from_object_file_p ((symtab_node) node)) && !symtab_used_from_object_file_p (node))
return SYMBOL_DUPLICATE; return SYMBOL_DUPLICATE;
return SYMBOL_PARTITION; return SYMBOL_PARTITION;
@ -133,7 +133,7 @@ free_ltrans_partitions (void)
static inline bool static inline bool
symbol_partitioned_p (symtab_node node) symbol_partitioned_p (symtab_node node)
{ {
return node->symbol.aux; return node->aux;
} }
/* Add references into the partition. */ /* Add references into the partition. */
@ -144,14 +144,14 @@ add_references_to_partition (ltrans_partition part, symtab_node node)
struct ipa_ref *ref; struct ipa_ref *ref;
/* Add all duplicated references to the partition. */ /* Add all duplicated references to the partition. */
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
if (get_symbol_class (ref->referred) == SYMBOL_DUPLICATE) if (get_symbol_class (ref->referred) == SYMBOL_DUPLICATE)
add_symbol_to_partition (part, ref->referred); add_symbol_to_partition (part, ref->referred);
/* References to a readonly variable may be constant foled into its value. /* References to a readonly variable may be constant foled into its value.
Recursively look into the initializers of the constant variable and add Recursively look into the initializers of the constant variable and add
references, too. */ references, too. */
else if (is_a <varpool_node> (ref->referred) else if (is_a <varpool_node> (ref->referred)
&& ctor_for_folding (ref->referred->symbol.decl) != error_mark_node && ctor_for_folding (ref->referred->decl) != error_mark_node
&& !lto_symtab_encoder_in_partition_p (part->encoder, ref->referred)) && !lto_symtab_encoder_in_partition_p (part->encoder, ref->referred))
{ {
if (!part->initializers_visited) if (!part->initializers_visited)
@ -173,7 +173,7 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
symtab_node node1; symtab_node node1;
/* If NODE is already there, we have nothing to do. */ /* If NODE is already there, we have nothing to do. */
if (lto_symtab_encoder_in_partition_p (part->encoder, (symtab_node) node)) if (lto_symtab_encoder_in_partition_p (part->encoder, node))
return true; return true;
/* non-duplicated aliases or tunks of a duplicated symbol needs to be output /* non-duplicated aliases or tunks of a duplicated symbol needs to be output
@ -181,7 +181,7 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
Be lax about comdats; they may or may not be duplicated and we may Be lax about comdats; they may or may not be duplicated and we may
end up in need to duplicate keyed comdat because it has unkeyed alias. */ end up in need to duplicate keyed comdat because it has unkeyed alias. */
if (c == SYMBOL_PARTITION && !DECL_COMDAT (node->symbol.decl) if (c == SYMBOL_PARTITION && !DECL_COMDAT (node->decl)
&& symbol_partitioned_p (node)) && symbol_partitioned_p (node))
return false; return false;
@ -190,16 +190,16 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
gcc_assert (c != SYMBOL_EXTERNAL gcc_assert (c != SYMBOL_EXTERNAL
&& (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node))); && (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node)));
lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node); lto_set_symtab_encoder_in_partition (part->encoder, node);
if (symbol_partitioned_p (node)) if (symbol_partitioned_p (node))
{ {
node->symbol.in_other_partition = 1; node->in_other_partition = 1;
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, "Symbol node %s now used in multiple partitions\n", fprintf (cgraph_dump_file, "Symbol node %s now used in multiple partitions\n",
symtab_node_name (node)); symtab_node_name (node));
} }
node->symbol.aux = (void *)((size_t)node->symbol.aux + 1); node->aux = (void *)((size_t)node->aux + 1);
if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
{ {
@ -209,27 +209,27 @@ add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
/* Add all inline clones and callees that are duplicated. */ /* Add all inline clones and callees that are duplicated. */
for (e = cnode->callees; e; e = e->next_callee) for (e = cnode->callees; e; e = e->next_callee)
if (!e->inline_failed) if (!e->inline_failed)
add_symbol_to_partition_1 (part, (symtab_node) e->callee); add_symbol_to_partition_1 (part, e->callee);
else if (get_symbol_class ((symtab_node) e->callee) == SYMBOL_DUPLICATE) else if (get_symbol_class (e->callee) == SYMBOL_DUPLICATE)
add_symbol_to_partition (part, (symtab_node) e->callee); add_symbol_to_partition (part, e->callee);
/* Add all thunks associated with the function. */ /* Add all thunks associated with the function. */
for (e = cnode->callers; e; e = e->next_caller) for (e = cnode->callers; e; e = e->next_caller)
if (e->caller->thunk.thunk_p) if (e->caller->thunk.thunk_p)
add_symbol_to_partition_1 (part, (symtab_node) e->caller); add_symbol_to_partition_1 (part, e->caller);
} }
add_references_to_partition (part, node); add_references_to_partition (part, node);
/* Add all aliases associated with the symbol. */ /* Add all aliases associated with the symbol. */
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS && !node->symbol.weakref) if (ref->use == IPA_REF_ALIAS && !node->weakref)
add_symbol_to_partition_1 (part, ref->referring); add_symbol_to_partition_1 (part, ref->referring);
/* Ensure that SAME_COMDAT_GROUP lists all allways added in a group. */ /* Ensure that SAME_COMDAT_GROUP lists all allways added in a group. */
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
for (node1 = node->symbol.same_comdat_group; for (node1 = node->same_comdat_group;
node1 != node; node1 = node1->symbol.same_comdat_group) node1 != node; node1 = node1->same_comdat_group)
{ {
bool added = add_symbol_to_partition_1 (part, node1); bool added = add_symbol_to_partition_1 (part, node1);
gcc_assert (added); gcc_assert (added);
@ -245,17 +245,17 @@ static symtab_node
contained_in_symbol (symtab_node node) contained_in_symbol (symtab_node node)
{ {
/* Weakrefs are never contained in anything. */ /* Weakrefs are never contained in anything. */
if (node->symbol.weakref) if (node->weakref)
return node; return node;
if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
{ {
cnode = cgraph_function_node (cnode, NULL); cnode = cgraph_function_node (cnode, NULL);
if (cnode->global.inlined_to) if (cnode->global.inlined_to)
cnode = cnode->global.inlined_to; cnode = cnode->global.inlined_to;
return (symtab_node) cnode; return cnode;
} }
else if (varpool_node *vnode = dyn_cast <varpool_node> (node)) else if (varpool_node *vnode = dyn_cast <varpool_node> (node))
return (symtab_node) varpool_variable_node (vnode, NULL); return varpool_variable_node (vnode, NULL);
return node; return node;
} }
@ -281,7 +281,7 @@ add_symbol_to_partition (ltrans_partition part, symtab_node node)
Be lax about comdats; they may or may not be duplicated and we may Be lax about comdats; they may or may not be duplicated and we may
end up in need to duplicate keyed comdat because it has unkeyed alias. */ end up in need to duplicate keyed comdat because it has unkeyed alias. */
gcc_assert (get_symbol_class (node) == SYMBOL_DUPLICATE gcc_assert (get_symbol_class (node) == SYMBOL_DUPLICATE
|| DECL_COMDAT (node->symbol.decl) || DECL_COMDAT (node->decl)
|| !symbol_partitioned_p (node)); || !symbol_partitioned_p (node));
add_symbol_to_partition_1 (part, node); add_symbol_to_partition_1 (part, node);
} }
@ -305,7 +305,7 @@ undo_partition (ltrans_partition partition, unsigned int n_nodes)
if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
partition->insns -= inline_summary (cnode)->self_size; partition->insns -= inline_summary (cnode)->self_size;
lto_symtab_encoder_delete_node (partition->encoder, node); lto_symtab_encoder_delete_node (partition->encoder, node);
node->symbol.aux = (void *)((size_t)node->symbol.aux - 1); node->aux = (void *)((size_t)node->aux - 1);
} }
} }
@ -330,7 +330,7 @@ lto_1_to_1_map (void)
|| symbol_partitioned_p (node)) || symbol_partitioned_p (node))
continue; continue;
file_data = node->symbol.lto_file_data; file_data = node->lto_file_data;
if (file_data) if (file_data)
{ {
@ -355,7 +355,7 @@ lto_1_to_1_map (void)
npartitions++; npartitions++;
} }
add_symbol_to_partition (partition, (symtab_node) node); add_symbol_to_partition (partition, node);
} }
/* If the cgraph is empty, create one cgraph node set so that there is still /* If the cgraph is empty, create one cgraph node set so that there is still
@ -382,7 +382,7 @@ lto_max_map (void)
|| symbol_partitioned_p (node)) || symbol_partitioned_p (node))
continue; continue;
partition = new_partition (symtab_node_asm_name (node)); partition = new_partition (symtab_node_asm_name (node));
add_symbol_to_partition (partition, (symtab_node) node); add_symbol_to_partition (partition, node);
npartitions++; npartitions++;
} }
if (!npartitions) if (!npartitions)
@ -395,7 +395,7 @@ node_cmp (const void *pa, const void *pb)
{ {
const struct cgraph_node *a = *(const struct cgraph_node * const *) pa; const struct cgraph_node *a = *(const struct cgraph_node * const *) pa;
const struct cgraph_node *b = *(const struct cgraph_node * const *) pb; const struct cgraph_node *b = *(const struct cgraph_node * const *) pb;
return b->symbol.order - a->symbol.order; return b->order - a->order;
} }
/* Helper function for qsort; sort nodes by order. */ /* Helper function for qsort; sort nodes by order. */
@ -404,7 +404,7 @@ varpool_node_cmp (const void *pa, const void *pb)
{ {
const struct varpool_node *a = *(const struct varpool_node * const *) pa; const struct varpool_node *a = *(const struct varpool_node * const *) pa;
const struct varpool_node *b = *(const struct varpool_node * const *) pb; const struct varpool_node *b = *(const struct varpool_node * const *) pb;
return b->symbol.order - a->symbol.order; return b->order - a->order;
} }
/* Group cgraph nodes into equally-sized partitions. /* Group cgraph nodes into equally-sized partitions.
@ -466,10 +466,10 @@ lto_balanced_map (void)
int current_order = -1; int current_order = -1;
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
gcc_assert (!vnode->symbol.aux); gcc_assert (!vnode->aux);
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (get_symbol_class ((symtab_node) node) == SYMBOL_PARTITION) if (get_symbol_class (node) == SYMBOL_PARTITION)
{ {
order[n_nodes++] = node; order[n_nodes++] = node;
total_size += inline_summary (node)->size; total_size += inline_summary (node)->size;
@ -486,13 +486,13 @@ lto_balanced_map (void)
qsort (order, n_nodes, sizeof (struct cgraph_node *), node_cmp); qsort (order, n_nodes, sizeof (struct cgraph_node *), node_cmp);
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION) if (get_symbol_class (vnode) == SYMBOL_PARTITION)
n_varpool_nodes++; n_varpool_nodes++;
varpool_order = XNEWVEC (struct varpool_node *, n_varpool_nodes); varpool_order = XNEWVEC (struct varpool_node *, n_varpool_nodes);
n_varpool_nodes = 0; n_varpool_nodes = 0;
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION) if (get_symbol_class (vnode) == SYMBOL_PARTITION)
varpool_order[n_varpool_nodes++] = vnode; varpool_order[n_varpool_nodes++] = vnode;
qsort (varpool_order, n_varpool_nodes, sizeof (struct varpool_node *), qsort (varpool_order, n_varpool_nodes, sizeof (struct varpool_node *),
varpool_node_cmp); varpool_node_cmp);
@ -510,21 +510,21 @@ lto_balanced_map (void)
for (i = 0; i < n_nodes; i++) for (i = 0; i < n_nodes; i++)
{ {
if (symbol_partitioned_p ((symtab_node) order[i])) if (symbol_partitioned_p (order[i]))
continue; continue;
current_order = order[i]->symbol.order; current_order = order[i]->order;
if (!flag_toplevel_reorder) if (!flag_toplevel_reorder)
while (varpool_pos < n_varpool_nodes while (varpool_pos < n_varpool_nodes
&& varpool_order[varpool_pos]->symbol.order < current_order) && varpool_order[varpool_pos]->order < current_order)
{ {
if (!symbol_partitioned_p ((symtab_node) varpool_order[varpool_pos])) if (!symbol_partitioned_p (varpool_order[varpool_pos]))
add_symbol_to_partition (partition, (symtab_node) varpool_order[varpool_pos]); add_symbol_to_partition (partition, varpool_order[varpool_pos]);
varpool_pos++; varpool_pos++;
} }
add_symbol_to_partition (partition, (symtab_node) order[i]); add_symbol_to_partition (partition, order[i]);
total_size -= inline_summary (order[i])->size; total_size -= inline_summary (order[i])->size;
@ -552,15 +552,15 @@ lto_balanced_map (void)
{ {
struct cgraph_edge *edge; struct cgraph_edge *edge;
refs = &node->symbol.ref_list; refs = &node->ref_list;
last_visited_node++; last_visited_node++;
gcc_assert (node->symbol.definition || node->symbol.weakref); gcc_assert (node->definition || node->weakref);
/* Compute boundary cost of callgraph edges. */ /* Compute boundary cost of callgraph edges. */
for (edge = node->callees; edge; edge = edge->next_callee) for (edge = node->callees; edge; edge = edge->next_callee)
if (edge->callee->symbol.definition) if (edge->callee->definition)
{ {
int edge_cost = edge->frequency; int edge_cost = edge->frequency;
int index; int index;
@ -569,7 +569,7 @@ lto_balanced_map (void)
edge_cost = 1; edge_cost = 1;
gcc_assert (edge_cost > 0); gcc_assert (edge_cost > 0);
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)edge->callee); edge->callee);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost -= edge_cost, internal += edge_cost; cost -= edge_cost, internal += edge_cost;
@ -581,12 +581,12 @@ lto_balanced_map (void)
int edge_cost = edge->frequency; int edge_cost = edge->frequency;
int index; int index;
gcc_assert (edge->caller->symbol.definition); gcc_assert (edge->caller->definition);
if (!edge_cost) if (!edge_cost)
edge_cost = 1; edge_cost = 1;
gcc_assert (edge_cost > 0); gcc_assert (edge_cost > 0);
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)edge->caller); edge->caller);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost -= edge_cost; cost -= edge_cost;
@ -596,7 +596,7 @@ lto_balanced_map (void)
} }
else else
{ {
refs = &snode->symbol.ref_list; refs = &snode->ref_list;
last_visited_node++; last_visited_node++;
} }
@ -608,13 +608,13 @@ lto_balanced_map (void)
int index; int index;
vnode = ipa_ref_varpool_node (ref); vnode = ipa_ref_varpool_node (ref);
if (!vnode->symbol.definition) if (!vnode->definition)
continue; continue;
if (!symbol_partitioned_p ((symtab_node) vnode) && flag_toplevel_reorder if (!symbol_partitioned_p (vnode) && flag_toplevel_reorder
&& get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION) && get_symbol_class (vnode) == SYMBOL_PARTITION)
add_symbol_to_partition (partition, (symtab_node) vnode); add_symbol_to_partition (partition, vnode);
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)vnode); vnode);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost--, internal++; cost--, internal++;
@ -626,10 +626,10 @@ lto_balanced_map (void)
int index; int index;
node = ipa_ref_node (ref); node = ipa_ref_node (ref);
if (!node->symbol.definition) if (!node->definition)
continue; continue;
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)node); node);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost--, internal++; cost--, internal++;
@ -642,12 +642,12 @@ lto_balanced_map (void)
int index; int index;
vnode = ipa_ref_referring_varpool_node (ref); vnode = ipa_ref_referring_varpool_node (ref);
gcc_assert (vnode->symbol.definition); gcc_assert (vnode->definition);
if (!symbol_partitioned_p ((symtab_node) vnode) && flag_toplevel_reorder if (!symbol_partitioned_p (vnode) && flag_toplevel_reorder
&& get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION) && get_symbol_class (vnode) == SYMBOL_PARTITION)
add_symbol_to_partition (partition, (symtab_node) vnode); add_symbol_to_partition (partition, vnode);
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)vnode); vnode);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost--; cost--;
@ -659,9 +659,9 @@ lto_balanced_map (void)
int index; int index;
node = ipa_ref_referring_node (ref); node = ipa_ref_referring_node (ref);
gcc_assert (node->symbol.definition); gcc_assert (node->definition);
index = lto_symtab_encoder_lookup (partition->encoder, index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)node); node);
if (index != LCC_NOT_FOUND if (index != LCC_NOT_FOUND
&& index < last_visited_node - 1) && index < last_visited_node - 1)
cost--; cost--;
@ -688,7 +688,7 @@ lto_balanced_map (void)
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, "Step %i: added %s/%i, size %i, cost %i/%i " fprintf (cgraph_dump_file, "Step %i: added %s/%i, size %i, cost %i/%i "
"best %i/%i, step %i\n", i, "best %i/%i, step %i\n", i,
cgraph_node_name (order[i]), order[i]->symbol.order, cgraph_node_name (order[i]), order[i]->order,
partition->insns, cost, internal, partition->insns, cost, internal,
best_cost, best_internal, best_i); best_cost, best_internal, best_i);
/* Partition is too large, unwind into step when best cost was reached and /* Partition is too large, unwind into step when best cost was reached and
@ -705,7 +705,7 @@ lto_balanced_map (void)
} }
i = best_i; i = best_i;
/* When we are finished, avoid creating empty partition. */ /* When we are finished, avoid creating empty partition. */
while (i < n_nodes - 1 && symbol_partitioned_p ((symtab_node) order[i + 1])) while (i < n_nodes - 1 && symbol_partitioned_p (order[i + 1]))
i++; i++;
if (i == n_nodes - 1) if (i == n_nodes - 1)
break; break;
@ -737,16 +737,16 @@ lto_balanced_map (void)
if (flag_toplevel_reorder) if (flag_toplevel_reorder)
{ {
FOR_EACH_VARIABLE (vnode) FOR_EACH_VARIABLE (vnode)
if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION if (get_symbol_class (vnode) == SYMBOL_PARTITION
&& !symbol_partitioned_p ((symtab_node) vnode)) && !symbol_partitioned_p (vnode))
add_symbol_to_partition (partition, (symtab_node) vnode); add_symbol_to_partition (partition, vnode);
} }
else else
{ {
while (varpool_pos < n_varpool_nodes) while (varpool_pos < n_varpool_nodes)
{ {
if (!symbol_partitioned_p ((symtab_node) varpool_order[varpool_pos])) if (!symbol_partitioned_p (varpool_order[varpool_pos]))
add_symbol_to_partition (partition, (symtab_node) varpool_order[varpool_pos]); add_symbol_to_partition (partition, varpool_order[varpool_pos]);
varpool_pos++; varpool_pos++;
} }
free (varpool_order); free (varpool_order);
@ -765,13 +765,13 @@ lto_balanced_map (void)
static bool static bool
privatize_symbol_name (symtab_node node) privatize_symbol_name (symtab_node node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
/* Our renaming machinery do not handle more than one change of assembler name. /* Our renaming machinery do not handle more than one change of assembler name.
We should not need more than one anyway. */ We should not need more than one anyway. */
if (node->symbol.lto_file_data if (node->lto_file_data
&& lto_get_decl_name_mapping (node->symbol.lto_file_data, name) != name) && lto_get_decl_name_mapping (node->lto_file_data, name) != name)
{ {
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, fprintf (cgraph_dump_file,
@ -783,7 +783,7 @@ privatize_symbol_name (symtab_node node)
??? should have a flag whether a symbol has a 'private' name already, ??? should have a flag whether a symbol has a 'private' name already,
since we produce some symbols like that i.e. for global constructors since we produce some symbols like that i.e. for global constructors
that are not really clones. */ that are not really clones. */
if (node->symbol.unique_name) if (node->unique_name)
{ {
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, fprintf (cgraph_dump_file,
@ -792,8 +792,8 @@ privatize_symbol_name (symtab_node node)
return false; return false;
} }
change_decl_assembler_name (decl, clone_function_name (decl, "lto_priv")); change_decl_assembler_name (decl, clone_function_name (decl, "lto_priv"));
if (node->symbol.lto_file_data) if (node->lto_file_data)
lto_record_renamed_decl (node->symbol.lto_file_data, name, lto_record_renamed_decl (node->lto_file_data, name,
IDENTIFIER_POINTER IDENTIFIER_POINTER
(DECL_ASSEMBLER_NAME (decl))); (DECL_ASSEMBLER_NAME (decl)));
if (cgraph_dump_file) if (cgraph_dump_file)
@ -809,19 +809,19 @@ static void
promote_symbol (symtab_node node) promote_symbol (symtab_node node)
{ {
/* We already promoted ... */ /* We already promoted ... */
if (DECL_VISIBILITY (node->symbol.decl) == VISIBILITY_HIDDEN if (DECL_VISIBILITY (node->decl) == VISIBILITY_HIDDEN
&& DECL_VISIBILITY_SPECIFIED (node->symbol.decl) && DECL_VISIBILITY_SPECIFIED (node->decl)
&& TREE_PUBLIC (node->symbol.decl)) && TREE_PUBLIC (node->decl))
return; return;
gcc_checking_assert (!TREE_PUBLIC (node->symbol.decl) gcc_checking_assert (!TREE_PUBLIC (node->decl)
&& !DECL_EXTERNAL (node->symbol.decl)); && !DECL_EXTERNAL (node->decl));
/* Be sure that newly public symbol does not conflict with anything already /* Be sure that newly public symbol does not conflict with anything already
defined by the non-LTO part. */ defined by the non-LTO part. */
privatize_symbol_name (node); privatize_symbol_name (node);
TREE_PUBLIC (node->symbol.decl) = 1; TREE_PUBLIC (node->decl) = 1;
DECL_VISIBILITY (node->symbol.decl) = VISIBILITY_HIDDEN; DECL_VISIBILITY (node->decl) = VISIBILITY_HIDDEN;
DECL_VISIBILITY_SPECIFIED (node->symbol.decl) = true; DECL_VISIBILITY_SPECIFIED (node->decl) = true;
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, fprintf (cgraph_dump_file,
"Promoting as hidden: %s\n", symtab_node_name (node)); "Promoting as hidden: %s\n", symtab_node_name (node));
@ -854,16 +854,16 @@ may_need_named_section_p (lto_symtab_encoder_t encoder, symtab_node node)
static void static void
rename_statics (lto_symtab_encoder_t encoder, symtab_node node) rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
symtab_node s; symtab_node s;
tree name = DECL_ASSEMBLER_NAME (decl); tree name = DECL_ASSEMBLER_NAME (decl);
/* See if this is static symbol. */ /* See if this is static symbol. */
if ((node->symbol.externally_visible if ((node->externally_visible
/* FIXME: externally_visible is somewhat illogically not set for /* FIXME: externally_visible is somewhat illogically not set for
external symbols (i.e. those not defined). Remove this test external symbols (i.e. those not defined). Remove this test
once this is fixed. */ once this is fixed. */
|| DECL_EXTERNAL (node->symbol.decl) || DECL_EXTERNAL (node->decl)
|| !symtab_real_symbol_p (node)) || !symtab_real_symbol_p (node))
&& !may_need_named_section_p (encoder, node)) && !may_need_named_section_p (encoder, node))
return; return;
@ -872,9 +872,9 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
(all types of symbols counts here, since we can not have static of the (all types of symbols counts here, since we can not have static of the
same name as external or public symbol.) */ same name as external or public symbol.) */
for (s = symtab_node_for_asm (name); for (s = symtab_node_for_asm (name);
s; s = s->symbol.next_sharing_asm_name) s; s = s->next_sharing_asm_name)
if ((symtab_real_symbol_p (s) || may_need_named_section_p (encoder, s)) if ((symtab_real_symbol_p (s) || may_need_named_section_p (encoder, s))
&& s->symbol.decl != node->symbol.decl && s->decl != node->decl
&& (!encoder && (!encoder
|| lto_symtab_encoder_lookup (encoder, s) != LCC_NOT_FOUND)) || lto_symtab_encoder_lookup (encoder, s) != LCC_NOT_FOUND))
break; break;
@ -890,10 +890,10 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
/* Assign every symbol in the set that shares the same ASM name an unique /* Assign every symbol in the set that shares the same ASM name an unique
mangled name. */ mangled name. */
for (s = symtab_node_for_asm (name); s;) for (s = symtab_node_for_asm (name); s;)
if (!s->symbol.externally_visible if (!s->externally_visible
&& ((symtab_real_symbol_p (s) && ((symtab_real_symbol_p (s)
&& !DECL_EXTERNAL (node->symbol.decl) && !DECL_EXTERNAL (node->decl)
&& !TREE_PUBLIC (node->symbol.decl)) && !TREE_PUBLIC (node->decl))
|| may_need_named_section_p (encoder, s)) || may_need_named_section_p (encoder, s))
&& (!encoder && (!encoder
|| lto_symtab_encoder_lookup (encoder, s) != LCC_NOT_FOUND)) || lto_symtab_encoder_lookup (encoder, s) != LCC_NOT_FOUND))
@ -901,9 +901,9 @@ rename_statics (lto_symtab_encoder_t encoder, symtab_node node)
if (privatize_symbol_name (s)) if (privatize_symbol_name (s))
/* Re-start from beginning since we do not know how many symbols changed a name. */ /* Re-start from beginning since we do not know how many symbols changed a name. */
s = symtab_node_for_asm (name); s = symtab_node_for_asm (name);
else s = s->symbol.next_sharing_asm_name; else s = s->next_sharing_asm_name;
} }
else s = s->symbol.next_sharing_asm_name; else s = s->next_sharing_asm_name;
} }
/* Find out all static decls that need to be promoted to global because /* Find out all static decls that need to be promoted to global because
@ -942,12 +942,12 @@ lto_promote_cross_file_statics (void)
rename_statics (encoder, node); rename_statics (encoder, node);
/* No need to promote if symbol already is externally visible ... */ /* No need to promote if symbol already is externally visible ... */
if (node->symbol.externally_visible if (node->externally_visible
/* ... or if it is part of current partition ... */ /* ... or if it is part of current partition ... */
|| lto_symtab_encoder_in_partition_p (encoder, node) || lto_symtab_encoder_in_partition_p (encoder, node)
/* ... or if we do not partition it. This mean that it will /* ... or if we do not partition it. This mean that it will
appear in every partition refernecing it. */ appear in every partition refernecing it. */
|| get_symbol_class ((symtab_node) node) != SYMBOL_PARTITION) || get_symbol_class (node) != SYMBOL_PARTITION)
continue; continue;
promote_symbol (node); promote_symbol (node);

View File

@ -44,17 +44,17 @@ lto_cgraph_replace_node (struct cgraph_node *node,
{ {
fprintf (cgraph_dump_file, "Replacing cgraph node %s/%i by %s/%i" fprintf (cgraph_dump_file, "Replacing cgraph node %s/%i by %s/%i"
" for symbol %s\n", " for symbol %s\n",
cgraph_node_name (node), node->symbol.order, cgraph_node_name (node), node->order,
cgraph_node_name (prevailing_node), cgraph_node_name (prevailing_node),
prevailing_node->symbol.order, prevailing_node->order,
IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name) IDENTIFIER_POINTER ((*targetm.asm_out.mangle_assembler_name)
(IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->symbol.decl))))); (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl)))));
} }
/* Merge node flags. */ /* Merge node flags. */
if (node->symbol.force_output) if (node->force_output)
cgraph_mark_force_output_node (prevailing_node); cgraph_mark_force_output_node (prevailing_node);
if (node->symbol.address_taken) if (node->address_taken)
{ {
gcc_assert (!prevailing_node->global.inlined_to); gcc_assert (!prevailing_node->global.inlined_to);
cgraph_mark_address_taken_node (prevailing_node); cgraph_mark_address_taken_node (prevailing_node);
@ -62,8 +62,8 @@ lto_cgraph_replace_node (struct cgraph_node *node,
/* Redirect all incoming edges. */ /* Redirect all incoming edges. */
compatible_p compatible_p
= types_compatible_p (TREE_TYPE (TREE_TYPE (prevailing_node->symbol.decl)), = types_compatible_p (TREE_TYPE (TREE_TYPE (prevailing_node->decl)),
TREE_TYPE (TREE_TYPE (node->symbol.decl))); TREE_TYPE (TREE_TYPE (node->decl)));
for (e = node->callers; e; e = next) for (e = node->callers; e; e = next)
{ {
next = e->next_caller; next = e->next_caller;
@ -76,12 +76,12 @@ lto_cgraph_replace_node (struct cgraph_node *node,
e->call_stmt_cannot_inline_p = 1; e->call_stmt_cannot_inline_p = 1;
} }
/* Redirect incomming references. */ /* Redirect incomming references. */
ipa_clone_referring ((symtab_node)prevailing_node, &node->symbol.ref_list); ipa_clone_referring (prevailing_node, &node->ref_list);
ipa_merge_profiles (prevailing_node, node); ipa_merge_profiles (prevailing_node, node);
lto_free_function_in_decl_state_for_node ((symtab_node)node); lto_free_function_in_decl_state_for_node (node);
if (node->symbol.decl != prevailing_node->symbol.decl) if (node->decl != prevailing_node->decl)
cgraph_release_function_body (node); cgraph_release_function_body (node);
/* Finally remove the replaced node. */ /* Finally remove the replaced node. */
@ -95,15 +95,15 @@ static void
lto_varpool_replace_node (struct varpool_node *vnode, lto_varpool_replace_node (struct varpool_node *vnode,
struct varpool_node *prevailing_node) struct varpool_node *prevailing_node)
{ {
gcc_assert (!vnode->symbol.definition || prevailing_node->symbol.definition); gcc_assert (!vnode->definition || prevailing_node->definition);
gcc_assert (!vnode->symbol.analyzed || prevailing_node->symbol.analyzed); gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
ipa_clone_referring ((symtab_node)prevailing_node, &vnode->symbol.ref_list); ipa_clone_referring (prevailing_node, &vnode->ref_list);
/* Be sure we can garbage collect the initializer. */ /* Be sure we can garbage collect the initializer. */
if (DECL_INITIAL (vnode->symbol.decl) if (DECL_INITIAL (vnode->decl)
&& vnode->symbol.decl != prevailing_node->symbol.decl) && vnode->decl != prevailing_node->decl)
DECL_INITIAL (vnode->symbol.decl) = error_mark_node; DECL_INITIAL (vnode->decl) = error_mark_node;
/* Finally remove the replaced node. */ /* Finally remove the replaced node. */
varpool_remove_node (vnode); varpool_remove_node (vnode);
} }
@ -115,8 +115,8 @@ lto_varpool_replace_node (struct varpool_node *vnode,
static bool static bool
lto_symtab_merge (symtab_node prevailing, symtab_node entry) lto_symtab_merge (symtab_node prevailing, symtab_node entry)
{ {
tree prevailing_decl = prevailing->symbol.decl; tree prevailing_decl = prevailing->decl;
tree decl = entry->symbol.decl; tree decl = entry->decl;
tree prevailing_type, type; tree prevailing_type, type;
if (prevailing_decl == decl) if (prevailing_decl == decl)
@ -218,15 +218,15 @@ lto_symtab_merge (symtab_node prevailing, symtab_node entry)
static bool static bool
lto_symtab_resolve_replaceable_p (symtab_node e) lto_symtab_resolve_replaceable_p (symtab_node e)
{ {
if (DECL_EXTERNAL (e->symbol.decl) if (DECL_EXTERNAL (e->decl)
|| DECL_COMDAT (e->symbol.decl) || DECL_COMDAT (e->decl)
|| DECL_ONE_ONLY (e->symbol.decl) || DECL_ONE_ONLY (e->decl)
|| DECL_WEAK (e->symbol.decl)) || DECL_WEAK (e->decl))
return true; return true;
if (TREE_CODE (e->symbol.decl) == VAR_DECL) if (TREE_CODE (e->decl) == VAR_DECL)
return (DECL_COMMON (e->symbol.decl) return (DECL_COMMON (e->decl)
|| (!flag_no_common && !DECL_INITIAL (e->symbol.decl))); || (!flag_no_common && !DECL_INITIAL (e->decl)));
return false; return false;
} }
@ -238,7 +238,7 @@ lto_symtab_resolve_replaceable_p (symtab_node e)
static bool static bool
lto_symtab_symbol_p (symtab_node e) lto_symtab_symbol_p (symtab_node e)
{ {
if (!TREE_PUBLIC (e->symbol.decl) && !DECL_EXTERNAL (e->symbol.decl)) if (!TREE_PUBLIC (e->decl) && !DECL_EXTERNAL (e->decl))
return false; return false;
return symtab_real_symbol_p (e); return symtab_real_symbol_p (e);
} }
@ -254,10 +254,10 @@ lto_symtab_resolve_can_prevail_p (symtab_node e)
/* The C++ frontend ends up neither setting TREE_STATIC nor /* The C++ frontend ends up neither setting TREE_STATIC nor
DECL_EXTERNAL on virtual methods but only TREE_PUBLIC. DECL_EXTERNAL on virtual methods but only TREE_PUBLIC.
So do not reject !TREE_STATIC here but only DECL_EXTERNAL. */ So do not reject !TREE_STATIC here but only DECL_EXTERNAL. */
if (DECL_EXTERNAL (e->symbol.decl)) if (DECL_EXTERNAL (e->decl))
return false; return false;
return e->symbol.definition; return e->definition;
} }
/* Resolve the symbol with the candidates in the chain *SLOT and store /* Resolve the symbol with the candidates in the chain *SLOT and store
@ -270,11 +270,11 @@ lto_symtab_resolve_symbols (symtab_node first)
symtab_node prevailing = NULL; symtab_node prevailing = NULL;
/* Always set e->node so that edges are updated to reflect decl merging. */ /* Always set e->node so that edges are updated to reflect decl merging. */
for (e = first; e; e = e->symbol.next_sharing_asm_name) for (e = first; e; e = e->next_sharing_asm_name)
if (lto_symtab_symbol_p (e) if (lto_symtab_symbol_p (e)
&& (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY && (e->resolution == LDPR_PREVAILING_DEF_IRONLY
|| e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP || e->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
|| e->symbol.resolution == LDPR_PREVAILING_DEF)) || e->resolution == LDPR_PREVAILING_DEF))
{ {
prevailing = e; prevailing = e;
break; break;
@ -284,19 +284,19 @@ lto_symtab_resolve_symbols (symtab_node first)
if (prevailing) if (prevailing)
{ {
/* Assert it's the only one. */ /* Assert it's the only one. */
for (e = prevailing->symbol.next_sharing_asm_name; e; e = e->symbol.next_sharing_asm_name) for (e = prevailing->next_sharing_asm_name; e; e = e->next_sharing_asm_name)
if (lto_symtab_symbol_p (e) if (lto_symtab_symbol_p (e)
&& (e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY && (e->resolution == LDPR_PREVAILING_DEF_IRONLY
|| e->symbol.resolution == LDPR_PREVAILING_DEF_IRONLY_EXP || e->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP
|| e->symbol.resolution == LDPR_PREVAILING_DEF)) || e->resolution == LDPR_PREVAILING_DEF))
fatal_error ("multiple prevailing defs for %qE", fatal_error ("multiple prevailing defs for %qE",
DECL_NAME (prevailing->symbol.decl)); DECL_NAME (prevailing->decl));
return prevailing; return prevailing;
} }
/* Find the single non-replaceable prevailing symbol and /* Find the single non-replaceable prevailing symbol and
diagnose ODR violations. */ diagnose ODR violations. */
for (e = first; e; e = e->symbol.next_sharing_asm_name) for (e = first; e; e = e->next_sharing_asm_name)
{ {
if (!lto_symtab_resolve_can_prevail_p (e)) if (!lto_symtab_resolve_can_prevail_p (e))
continue; continue;
@ -306,9 +306,9 @@ lto_symtab_resolve_symbols (symtab_node first)
{ {
if (prevailing) if (prevailing)
{ {
error_at (DECL_SOURCE_LOCATION (e->symbol.decl), error_at (DECL_SOURCE_LOCATION (e->decl),
"%qD has already been defined", e->symbol.decl); "%qD has already been defined", e->decl);
inform (DECL_SOURCE_LOCATION (prevailing->symbol.decl), inform (DECL_SOURCE_LOCATION (prevailing->decl),
"previously defined here"); "previously defined here");
} }
prevailing = e; prevailing = e;
@ -318,13 +318,13 @@ lto_symtab_resolve_symbols (symtab_node first)
return prevailing; return prevailing;
/* Do a second round choosing one from the replaceable prevailing decls. */ /* Do a second round choosing one from the replaceable prevailing decls. */
for (e = first; e; e = e->symbol.next_sharing_asm_name) for (e = first; e; e = e->next_sharing_asm_name)
{ {
if (!lto_symtab_resolve_can_prevail_p (e)) if (!lto_symtab_resolve_can_prevail_p (e))
continue; continue;
/* Choose the first function that can prevail as prevailing. */ /* Choose the first function that can prevail as prevailing. */
if (TREE_CODE (e->symbol.decl) == FUNCTION_DECL) if (TREE_CODE (e->decl) == FUNCTION_DECL)
{ {
prevailing = e; prevailing = e;
break; break;
@ -332,8 +332,8 @@ lto_symtab_resolve_symbols (symtab_node first)
/* From variables that can prevail choose the largest one. */ /* From variables that can prevail choose the largest one. */
if (!prevailing if (!prevailing
|| tree_int_cst_lt (DECL_SIZE (prevailing->symbol.decl), || tree_int_cst_lt (DECL_SIZE (prevailing->decl),
DECL_SIZE (e->symbol.decl)) DECL_SIZE (e->decl))
/* When variables are equivalent try to chose one that has useful /* When variables are equivalent try to chose one that has useful
DECL_INITIAL. This makes sense for keyed vtables that are DECL_INITIAL. This makes sense for keyed vtables that are
DECL_EXTERNAL but initialized. In units that do not need them DECL_EXTERNAL but initialized. In units that do not need them
@ -343,11 +343,11 @@ lto_symtab_resolve_symbols (symtab_node first)
We know that the vtable is keyed outside the LTO unit - otherwise We know that the vtable is keyed outside the LTO unit - otherwise
the keyed instance would prevail. We still can preserve useful the keyed instance would prevail. We still can preserve useful
info in the initializer. */ info in the initializer. */
|| (DECL_SIZE (prevailing->symbol.decl) == DECL_SIZE (e->symbol.decl) || (DECL_SIZE (prevailing->decl) == DECL_SIZE (e->decl)
&& (DECL_INITIAL (e->symbol.decl) && (DECL_INITIAL (e->decl)
&& DECL_INITIAL (e->symbol.decl) != error_mark_node) && DECL_INITIAL (e->decl) != error_mark_node)
&& (!DECL_INITIAL (prevailing->symbol.decl) && (!DECL_INITIAL (prevailing->decl)
|| DECL_INITIAL (prevailing->symbol.decl) == error_mark_node))) || DECL_INITIAL (prevailing->decl) == error_mark_node)))
prevailing = e; prevailing = e;
} }
@ -368,17 +368,17 @@ lto_symtab_merge_decls_2 (symtab_node first, bool diagnosed_p)
/* Nothing to do for a single entry. */ /* Nothing to do for a single entry. */
prevailing = first; prevailing = first;
if (!prevailing->symbol.next_sharing_asm_name) if (!prevailing->next_sharing_asm_name)
return; return;
/* Try to merge each entry with the prevailing one. */ /* Try to merge each entry with the prevailing one. */
for (e = prevailing->symbol.next_sharing_asm_name; for (e = prevailing->next_sharing_asm_name;
e; e = e->symbol.next_sharing_asm_name) e; e = e->next_sharing_asm_name)
if (TREE_PUBLIC (e->symbol.decl)) if (TREE_PUBLIC (e->decl))
{ {
if (!lto_symtab_merge (prevailing, e) if (!lto_symtab_merge (prevailing, e)
&& !diagnosed_p) && !diagnosed_p)
mismatches.safe_push (e->symbol.decl); mismatches.safe_push (e->decl);
} }
if (mismatches.is_empty ()) if (mismatches.is_empty ())
return; return;
@ -386,15 +386,15 @@ lto_symtab_merge_decls_2 (symtab_node first, bool diagnosed_p)
/* Diagnose all mismatched re-declarations. */ /* Diagnose all mismatched re-declarations. */
FOR_EACH_VEC_ELT (mismatches, i, decl) FOR_EACH_VEC_ELT (mismatches, i, decl)
{ {
if (!types_compatible_p (TREE_TYPE (prevailing->symbol.decl), if (!types_compatible_p (TREE_TYPE (prevailing->decl),
TREE_TYPE (decl))) TREE_TYPE (decl)))
diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl), 0, diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl), 0,
"type of %qD does not match original " "type of %qD does not match original "
"declaration", decl); "declaration", decl);
else if ((DECL_USER_ALIGN (prevailing->symbol.decl) else if ((DECL_USER_ALIGN (prevailing->decl)
&& DECL_USER_ALIGN (decl)) && DECL_USER_ALIGN (decl))
&& DECL_ALIGN (prevailing->symbol.decl) < DECL_ALIGN (decl)) && DECL_ALIGN (prevailing->decl) < DECL_ALIGN (decl))
{ {
diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl), 0, diagnosed_p |= warning_at (DECL_SOURCE_LOCATION (decl), 0,
"alignment of %qD is bigger than " "alignment of %qD is bigger than "
@ -402,7 +402,7 @@ lto_symtab_merge_decls_2 (symtab_node first, bool diagnosed_p)
} }
} }
if (diagnosed_p) if (diagnosed_p)
inform (DECL_SOURCE_LOCATION (prevailing->symbol.decl), inform (DECL_SOURCE_LOCATION (prevailing->decl),
"previously declared here"); "previously declared here");
mismatches.release (); mismatches.release ();
@ -420,8 +420,8 @@ lto_symtab_merge_decls_1 (symtab_node first)
{ {
fprintf (cgraph_dump_file, "Merging nodes for %s. Candidates:\n", fprintf (cgraph_dump_file, "Merging nodes for %s. Candidates:\n",
symtab_node_asm_name (first)); symtab_node_asm_name (first));
for (e = first; e; e = e->symbol.next_sharing_asm_name) for (e = first; e; e = e->next_sharing_asm_name)
if (TREE_PUBLIC (e->symbol.decl)) if (TREE_PUBLIC (e->decl))
dump_symtab_node (cgraph_dump_file, e); dump_symtab_node (cgraph_dump_file, e);
} }
@ -442,21 +442,21 @@ lto_symtab_merge_decls_1 (symtab_node first)
This is needed for C++ typeinfos, for example in This is needed for C++ typeinfos, for example in
lto/20081204-1 there are typeifos in both units, just lto/20081204-1 there are typeifos in both units, just
one of them do have size. */ one of them do have size. */
if (TREE_CODE (prevailing->symbol.decl) == VAR_DECL) if (TREE_CODE (prevailing->decl) == VAR_DECL)
{ {
for (e = prevailing->symbol.next_sharing_asm_name; for (e = prevailing->next_sharing_asm_name;
e; e = e->symbol.next_sharing_asm_name) e; e = e->next_sharing_asm_name)
if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->symbol.decl)) if (!COMPLETE_TYPE_P (TREE_TYPE (prevailing->decl))
&& COMPLETE_TYPE_P (TREE_TYPE (e->symbol.decl)) && COMPLETE_TYPE_P (TREE_TYPE (e->decl))
&& lto_symtab_symbol_p (e)) && lto_symtab_symbol_p (e))
prevailing = e; prevailing = e;
} }
/* For variables prefer the non-builtin if one is available. */ /* For variables prefer the non-builtin if one is available. */
else if (TREE_CODE (prevailing->symbol.decl) == FUNCTION_DECL) else if (TREE_CODE (prevailing->decl) == FUNCTION_DECL)
{ {
for (e = first; e; e = e->symbol.next_sharing_asm_name) for (e = first; e; e = e->next_sharing_asm_name)
if (TREE_CODE (e->symbol.decl) == FUNCTION_DECL if (TREE_CODE (e->decl) == FUNCTION_DECL
&& !DECL_BUILT_IN (e->symbol.decl) && !DECL_BUILT_IN (e->decl)
&& lto_symtab_symbol_p (e)) && lto_symtab_symbol_p (e))
{ {
prevailing = e; prevailing = e;
@ -468,29 +468,29 @@ lto_symtab_merge_decls_1 (symtab_node first)
symtab_prevail_in_asm_name_hash (prevailing); symtab_prevail_in_asm_name_hash (prevailing);
/* Diagnose mismatched objects. */ /* Diagnose mismatched objects. */
for (e = prevailing->symbol.next_sharing_asm_name; for (e = prevailing->next_sharing_asm_name;
e; e = e->symbol.next_sharing_asm_name) e; e = e->next_sharing_asm_name)
{ {
if (TREE_CODE (prevailing->symbol.decl) if (TREE_CODE (prevailing->decl)
== TREE_CODE (e->symbol.decl)) == TREE_CODE (e->decl))
continue; continue;
if (!lto_symtab_symbol_p (e)) if (!lto_symtab_symbol_p (e))
continue; continue;
switch (TREE_CODE (prevailing->symbol.decl)) switch (TREE_CODE (prevailing->decl))
{ {
case VAR_DECL: case VAR_DECL:
gcc_assert (TREE_CODE (e->symbol.decl) == FUNCTION_DECL); gcc_assert (TREE_CODE (e->decl) == FUNCTION_DECL);
error_at (DECL_SOURCE_LOCATION (e->symbol.decl), error_at (DECL_SOURCE_LOCATION (e->decl),
"variable %qD redeclared as function", "variable %qD redeclared as function",
prevailing->symbol.decl); prevailing->decl);
break; break;
case FUNCTION_DECL: case FUNCTION_DECL:
gcc_assert (TREE_CODE (e->symbol.decl) == VAR_DECL); gcc_assert (TREE_CODE (e->decl) == VAR_DECL);
error_at (DECL_SOURCE_LOCATION (e->symbol.decl), error_at (DECL_SOURCE_LOCATION (e->decl),
"function %qD redeclared as variable", "function %qD redeclared as variable",
prevailing->symbol.decl); prevailing->decl);
break; break;
default: default:
@ -500,7 +500,7 @@ lto_symtab_merge_decls_1 (symtab_node first)
diagnosed_p = true; diagnosed_p = true;
} }
if (diagnosed_p) if (diagnosed_p)
inform (DECL_SOURCE_LOCATION (prevailing->symbol.decl), inform (DECL_SOURCE_LOCATION (prevailing->decl),
"previously declared here"); "previously declared here");
/* Merge the chain to the single prevailing decl and diagnose /* Merge the chain to the single prevailing decl and diagnose
@ -510,7 +510,7 @@ lto_symtab_merge_decls_1 (symtab_node first)
if (cgraph_dump_file) if (cgraph_dump_file)
{ {
fprintf (cgraph_dump_file, "After resolution:\n"); fprintf (cgraph_dump_file, "After resolution:\n");
for (e = prevailing; e; e = e->symbol.next_sharing_asm_name) for (e = prevailing; e; e = e->next_sharing_asm_name)
dump_symtab_node (cgraph_dump_file, e); dump_symtab_node (cgraph_dump_file, e);
} }
} }
@ -526,8 +526,8 @@ lto_symtab_merge_decls (void)
symtab_initialize_asm_name_hash (); symtab_initialize_asm_name_hash ();
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (!node->symbol.previous_sharing_asm_name if (!node->previous_sharing_asm_name
&& node->symbol.next_sharing_asm_name) && node->next_sharing_asm_name)
lto_symtab_merge_decls_1 (node); lto_symtab_merge_decls_1 (node);
} }
@ -539,15 +539,15 @@ lto_symtab_merge_symbols_1 (symtab_node prevailing)
symtab_node e, next; symtab_node e, next;
/* Replace the cgraph node of each entry with the prevailing one. */ /* Replace the cgraph node of each entry with the prevailing one. */
for (e = prevailing->symbol.next_sharing_asm_name; e; for (e = prevailing->next_sharing_asm_name; e;
e = next) e = next)
{ {
next = e->symbol.next_sharing_asm_name; next = e->next_sharing_asm_name;
if (!lto_symtab_symbol_p (e)) if (!lto_symtab_symbol_p (e))
continue; continue;
cgraph_node *ce = dyn_cast <cgraph_node> (e); cgraph_node *ce = dyn_cast <cgraph_node> (e);
if (ce && !DECL_BUILT_IN (e->symbol.decl)) if (ce && !DECL_BUILT_IN (e->decl))
lto_cgraph_replace_node (ce, cgraph (prevailing)); lto_cgraph_replace_node (ce, cgraph (prevailing));
if (varpool_node *ve = dyn_cast <varpool_node> (e)) if (varpool_node *ve = dyn_cast <varpool_node> (e))
lto_varpool_replace_node (ve, varpool (prevailing)); lto_varpool_replace_node (ve, varpool (prevailing));
@ -574,8 +574,8 @@ lto_symtab_merge_symbols (void)
updated to the ohter dupliate. */ updated to the ohter dupliate. */
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
if (lto_symtab_symbol_p (node) if (lto_symtab_symbol_p (node)
&& node->symbol.next_sharing_asm_name && node->next_sharing_asm_name
&& !node->symbol.previous_sharing_asm_name) && !node->previous_sharing_asm_name)
lto_symtab_merge_symbols_1 (node); lto_symtab_merge_symbols_1 (node);
/* Resolve weakref aliases whose target are now in the compilation unit. /* Resolve weakref aliases whose target are now in the compilation unit.
@ -586,24 +586,24 @@ lto_symtab_merge_symbols (void)
varpool_node *vnode; varpool_node *vnode;
symtab_node node2; symtab_node node2;
if (!node->symbol.analyzed && node->symbol.alias_target) if (!node->analyzed && node->alias_target)
{ {
symtab_node tgt = symtab_node_for_asm (node->symbol.alias_target); symtab_node tgt = symtab_node_for_asm (node->alias_target);
gcc_assert (node->symbol.weakref); gcc_assert (node->weakref);
if (tgt) if (tgt)
symtab_resolve_alias (node, tgt); symtab_resolve_alias (node, tgt);
} }
node->symbol.aux = NULL; node->aux = NULL;
if (!(cnode = dyn_cast <cgraph_node> (node)) if (!(cnode = dyn_cast <cgraph_node> (node))
|| !cnode->clone_of || !cnode->clone_of
|| cnode->clone_of->symbol.decl != cnode->symbol.decl) || cnode->clone_of->decl != cnode->decl)
{ {
/* Builtins are not merged via decl merging. It is however /* Builtins are not merged via decl merging. It is however
possible that tree merging unified the declaration. We possible that tree merging unified the declaration. We
do not want duplicate entries in symbol table. */ do not want duplicate entries in symbol table. */
if (cnode && DECL_BUILT_IN (node->symbol.decl) if (cnode && DECL_BUILT_IN (node->decl)
&& (cnode2 = cgraph_get_node (node->symbol.decl)) && (cnode2 = cgraph_get_node (node->decl))
&& cnode2 != cnode) && cnode2 != cnode)
lto_cgraph_replace_node (cnode2, cnode); lto_cgraph_replace_node (cnode2, cnode);
@ -611,8 +611,8 @@ lto_symtab_merge_symbols (void)
symbol name (since it is irrelevant), but we need to unify symbol symbol name (since it is irrelevant), but we need to unify symbol
nodes if tree merging occured. */ nodes if tree merging occured. */
if ((vnode = dyn_cast <varpool_node> (node)) if ((vnode = dyn_cast <varpool_node> (node))
&& DECL_HARD_REGISTER (vnode->symbol.decl) && DECL_HARD_REGISTER (vnode->decl)
&& (node2 = symtab_get_node (vnode->symbol.decl)) && (node2 = symtab_get_node (vnode->decl))
&& node2 != node) && node2 != node)
lto_varpool_replace_node (dyn_cast <varpool_node> (node2), lto_varpool_replace_node (dyn_cast <varpool_node> (node2),
vnode); vnode);
@ -620,12 +620,12 @@ lto_symtab_merge_symbols (void)
/* Abstract functions may have duplicated cgraph nodes attached; /* Abstract functions may have duplicated cgraph nodes attached;
remove them. */ remove them. */
else if (cnode && DECL_ABSTRACT (cnode->symbol.decl) else if (cnode && DECL_ABSTRACT (cnode->decl)
&& (cnode2 = cgraph_get_node (node->symbol.decl)) && (cnode2 = cgraph_get_node (node->decl))
&& cnode2 != cnode) && cnode2 != cnode)
cgraph_remove_node (cnode2); cgraph_remove_node (cnode2);
symtab_insert_node_to_hashtable ((symtab_node)node); symtab_insert_node_to_hashtable (node);
} }
} }
} }
@ -659,5 +659,5 @@ lto_symtab_prevailing_decl (tree decl)
if (!ret) if (!ret)
return decl; return decl;
return ret->symbol.decl; return ret->decl;
} }

View File

@ -171,7 +171,7 @@ has_analyzed_clone_p (struct cgraph_node *node)
if (node) if (node)
while (node != orig) while (node != orig)
{ {
if (node->symbol.analyzed) if (node->analyzed)
return true; return true;
if (node->clones) if (node->clones)
node = node->clones; node = node->clones;
@ -195,10 +195,10 @@ lto_materialize_function (struct cgraph_node *node)
{ {
tree decl; tree decl;
decl = node->symbol.decl; decl = node->decl;
/* Read in functions with body (analyzed nodes) /* Read in functions with body (analyzed nodes)
and also functions that are needed to produce virtual clones. */ and also functions that are needed to produce virtual clones. */
if ((cgraph_function_with_gimple_body_p (node) && node->symbol.analyzed) if ((cgraph_function_with_gimple_body_p (node) && node->analyzed)
|| node->used_as_abstract_origin || node->used_as_abstract_origin
|| has_analyzed_clone_p (node)) || has_analyzed_clone_p (node))
{ {
@ -2398,9 +2398,9 @@ cmp_partitions_order (const void *a, const void *b)
int ordera = -1, orderb = -1; int ordera = -1, orderb = -1;
if (lto_symtab_encoder_size (pa->encoder)) if (lto_symtab_encoder_size (pa->encoder))
ordera = lto_symtab_encoder_deref (pa->encoder, 0)->symbol.order; ordera = lto_symtab_encoder_deref (pa->encoder, 0)->order;
if (lto_symtab_encoder_size (pb->encoder)) if (lto_symtab_encoder_size (pb->encoder))
orderb = lto_symtab_encoder_deref (pb->encoder, 0)->symbol.order; orderb = lto_symtab_encoder_deref (pb->encoder, 0)->order;
return orderb - ordera; return orderb - ordera;
} }
@ -2873,11 +2873,11 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
FOR_EACH_SYMBOL (snode) FOR_EACH_SYMBOL (snode)
if (symtab_real_symbol_p (snode) if (symtab_real_symbol_p (snode)
&& snode->symbol.lto_file_data && snode->lto_file_data
&& snode->symbol.lto_file_data->resolution_map && snode->lto_file_data->resolution_map
&& (res = pointer_map_contains (snode->symbol.lto_file_data->resolution_map, && (res = pointer_map_contains (snode->lto_file_data->resolution_map,
snode->symbol.decl))) snode->decl)))
snode->symbol.resolution snode->resolution
= (enum ld_plugin_symbol_resolution)(size_t)*res; = (enum ld_plugin_symbol_resolution)(size_t)*res;
for (i = 0; all_file_decl_data[i]; i++) for (i = 0; all_file_decl_data[i]; i++)
if (all_file_decl_data[i]->resolution_map) if (all_file_decl_data[i]->resolution_map)
@ -2979,7 +2979,7 @@ materialize_cgraph (void)
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
{ {
if (node->symbol.lto_file_data) if (node->lto_file_data)
{ {
lto_materialize_function (node); lto_materialize_function (node);
lto_stats.num_input_cgraph_nodes++; lto_stats.num_input_cgraph_nodes++;
@ -3126,7 +3126,7 @@ do_whole_program_analysis (void)
/* AUX pointers are used by partitioning code to bookkeep number of /* AUX pointers are used by partitioning code to bookkeep number of
partitions symbol is in. This is no longer needed. */ partitions symbol is in. This is no longer needed. */
FOR_EACH_SYMBOL (node) FOR_EACH_SYMBOL (node)
node->symbol.aux = NULL; node->aux = NULL;
lto_stats.num_cgraph_partitions += ltrans_partitions.length (); lto_stats.num_cgraph_partitions += ltrans_partitions.length ();
timevar_pop (TV_WHOPR_PARTITIONING); timevar_pop (TV_WHOPR_PARTITIONING);
@ -3288,7 +3288,7 @@ lto_main (void)
/* Record the global variables. */ /* Record the global variables. */
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
vec_safe_push (lto_global_var_decls, vnode->symbol.decl); vec_safe_push (lto_global_var_decls, vnode->decl);
} }
} }

View File

@ -893,7 +893,7 @@ pass_manager::dump_passes () const
create_pass_tab (); create_pass_tab ();
FOR_EACH_FUNCTION (n) FOR_EACH_FUNCTION (n)
if (DECL_STRUCT_FUNCTION (n->symbol.decl)) if (DECL_STRUCT_FUNCTION (n->decl))
{ {
node = n; node = n;
break; break;
@ -902,7 +902,7 @@ pass_manager::dump_passes () const
if (!node) if (!node)
return; return;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
dump_pass_list (all_lowering_passes, 1); dump_pass_list (all_lowering_passes, 1);
dump_pass_list (all_small_ipa_passes, 1); dump_pass_list (all_small_ipa_passes, 1);
@ -1577,10 +1577,10 @@ do_per_function (void (*callback) (void *data), void *data)
{ {
struct cgraph_node *node; struct cgraph_node *node;
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (node->symbol.analyzed && gimple_has_body_p (node->symbol.decl) if (node->analyzed && gimple_has_body_p (node->decl)
&& (!node->clone_of || node->symbol.decl != node->clone_of->symbol.decl)) && (!node->clone_of || node->decl != node->clone_of->decl))
{ {
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
callback (data); callback (data);
if (!flag_wpa) if (!flag_wpa)
{ {
@ -1627,7 +1627,7 @@ do_per_function_toporder (void (*callback) (void *data), void *data)
if (cgraph_function_with_gimple_body_p (node)) if (cgraph_function_with_gimple_body_p (node))
{ {
cgraph_get_body (node); cgraph_get_body (node);
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
callback (data); callback (data);
free_dominance_info (CDI_DOMINATORS); free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS); free_dominance_info (CDI_POST_DOMINATORS);
@ -2368,19 +2368,19 @@ ipa_write_summaries (void)
ordering then matches the one IPA-passes get in their stmt_fixup ordering then matches the one IPA-passes get in their stmt_fixup
hooks. */ hooks. */
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
renumber_gimple_stmt_uids (); renumber_gimple_stmt_uids ();
pop_cfun (); pop_cfun ();
} }
if (node->symbol.definition) if (node->definition)
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node); lto_set_symtab_encoder_in_partition (encoder, node);
} }
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (node->symbol.alias) if (node->alias)
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node); lto_set_symtab_encoder_in_partition (encoder, node);
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode); lto_set_symtab_encoder_in_partition (encoder, vnode);
ipa_write_summaries_1 (compute_ltrans_boundary (encoder)); ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
@ -2446,10 +2446,10 @@ ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
For functions newly born at WPA stage we need to initialize For functions newly born at WPA stage we need to initialize
the uids here. */ the uids here. */
if (node->symbol.definition if (node->definition
&& gimple_has_body_p (node->symbol.decl)) && gimple_has_body_p (node->decl))
{ {
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
renumber_gimple_stmt_uids (); renumber_gimple_stmt_uids ();
pop_cfun (); pop_cfun ();
} }
@ -2691,11 +2691,11 @@ function_called_by_processed_nodes_p (void)
e; e;
e = e->next_caller) e = e->next_caller)
{ {
if (e->caller->symbol.decl == current_function_decl) if (e->caller->decl == current_function_decl)
continue; continue;
if (!cgraph_function_with_gimple_body_p (e->caller)) if (!cgraph_function_with_gimple_body_p (e->caller))
continue; continue;
if (TREE_ASM_WRITTEN (e->caller->symbol.decl)) if (TREE_ASM_WRITTEN (e->caller->decl))
continue; continue;
if (!e->caller->process && !e->caller->global.inlined_to) if (!e->caller->process && !e->caller->global.inlined_to)
break; break;

View File

@ -67,7 +67,7 @@ static hashval_t
hash_node (const void *p) hash_node (const void *p)
{ {
const_symtab_node n = (const_symtab_node ) p; const_symtab_node n = (const_symtab_node ) p;
return (hashval_t) DECL_UID (n->symbol.decl); return (hashval_t) DECL_UID (n->decl);
} }
@ -78,7 +78,7 @@ eq_node (const void *p1, const void *p2)
{ {
const_symtab_node n1 = (const_symtab_node) p1; const_symtab_node n1 = (const_symtab_node) p1;
const_symtab_node n2 = (const_symtab_node) p2; const_symtab_node n2 = (const_symtab_node) p2;
return DECL_UID (n1->symbol.decl) == DECL_UID (n2->symbol.decl); return DECL_UID (n1->decl) == DECL_UID (n2->decl);
} }
/* Returns a hash code for P. */ /* Returns a hash code for P. */
@ -87,7 +87,7 @@ static hashval_t
hash_node_by_assembler_name (const void *p) hash_node_by_assembler_name (const void *p)
{ {
const_symtab_node n = (const_symtab_node) p; const_symtab_node n = (const_symtab_node) p;
return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->symbol.decl)); return (hashval_t) decl_assembler_name_hash (DECL_ASSEMBLER_NAME (n->decl));
} }
/* Returns nonzero if P1 and P2 are equal. */ /* Returns nonzero if P1 and P2 are equal. */
@ -97,7 +97,7 @@ eq_assembler_name (const void *p1, const void *p2)
{ {
const_symtab_node n1 = (const_symtab_node) p1; const_symtab_node n1 = (const_symtab_node) p1;
const_tree name = (const_tree)p2; const_tree name = (const_tree)p2;
return (decl_assembler_name_equal (n1->symbol.decl, name)); return (decl_assembler_name_equal (n1->decl, name));
} }
/* Insert NODE to assembler name hash. */ /* Insert NODE to assembler name hash. */
@ -105,33 +105,33 @@ eq_assembler_name (const void *p1, const void *p2)
static void static void
insert_to_assembler_name_hash (symtab_node node, bool with_clones) insert_to_assembler_name_hash (symtab_node node, bool with_clones)
{ {
if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->symbol.decl)) if (is_a <varpool_node> (node) && DECL_HARD_REGISTER (node->decl))
return; return;
gcc_checking_assert (!node->symbol.previous_sharing_asm_name gcc_checking_assert (!node->previous_sharing_asm_name
&& !node->symbol.next_sharing_asm_name); && !node->next_sharing_asm_name);
if (assembler_name_hash) if (assembler_name_hash)
{ {
void **aslot; void **aslot;
struct cgraph_node *cnode; struct cgraph_node *cnode;
tree decl = node->symbol.decl; tree decl = node->decl;
tree name = DECL_ASSEMBLER_NAME (node->symbol.decl); tree name = DECL_ASSEMBLER_NAME (node->decl);
aslot = htab_find_slot_with_hash (assembler_name_hash, name, aslot = htab_find_slot_with_hash (assembler_name_hash, name,
decl_assembler_name_hash (name), decl_assembler_name_hash (name),
INSERT); INSERT);
gcc_assert (*aslot != node); gcc_assert (*aslot != node);
node->symbol.next_sharing_asm_name = (symtab_node)*aslot; node->next_sharing_asm_name = (symtab_node)*aslot;
if (*aslot != NULL) if (*aslot != NULL)
((symtab_node)*aslot)->symbol.previous_sharing_asm_name = node; ((symtab_node)*aslot)->previous_sharing_asm_name = node;
*aslot = node; *aslot = node;
/* Update also possible inline clones sharing a decl. */ /* Update also possible inline clones sharing a decl. */
cnode = dyn_cast <cgraph_node> (node); cnode = dyn_cast <cgraph_node> (node);
if (cnode && cnode->clones && with_clones) if (cnode && cnode->clones && with_clones)
for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone) for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
if (cnode->symbol.decl == decl) if (cnode->decl == decl)
insert_to_assembler_name_hash ((symtab_node) cnode, true); insert_to_assembler_name_hash (cnode, true);
} }
} }
@ -144,38 +144,38 @@ unlink_from_assembler_name_hash (symtab_node node, bool with_clones)
if (assembler_name_hash) if (assembler_name_hash)
{ {
struct cgraph_node *cnode; struct cgraph_node *cnode;
tree decl = node->symbol.decl; tree decl = node->decl;
if (node->symbol.next_sharing_asm_name) if (node->next_sharing_asm_name)
node->symbol.next_sharing_asm_name->symbol.previous_sharing_asm_name node->next_sharing_asm_name->previous_sharing_asm_name
= node->symbol.previous_sharing_asm_name; = node->previous_sharing_asm_name;
if (node->symbol.previous_sharing_asm_name) if (node->previous_sharing_asm_name)
{ {
node->symbol.previous_sharing_asm_name->symbol.next_sharing_asm_name node->previous_sharing_asm_name->next_sharing_asm_name
= node->symbol.next_sharing_asm_name; = node->next_sharing_asm_name;
} }
else else
{ {
tree name = DECL_ASSEMBLER_NAME (node->symbol.decl); tree name = DECL_ASSEMBLER_NAME (node->decl);
void **slot; void **slot;
slot = htab_find_slot_with_hash (assembler_name_hash, name, slot = htab_find_slot_with_hash (assembler_name_hash, name,
decl_assembler_name_hash (name), decl_assembler_name_hash (name),
NO_INSERT); NO_INSERT);
gcc_assert (*slot == node); gcc_assert (*slot == node);
if (!node->symbol.next_sharing_asm_name) if (!node->next_sharing_asm_name)
htab_clear_slot (assembler_name_hash, slot); htab_clear_slot (assembler_name_hash, slot);
else else
*slot = node->symbol.next_sharing_asm_name; *slot = node->next_sharing_asm_name;
} }
node->symbol.next_sharing_asm_name = NULL; node->next_sharing_asm_name = NULL;
node->symbol.previous_sharing_asm_name = NULL; node->previous_sharing_asm_name = NULL;
/* Update also possible inline clones sharing a decl. */ /* Update also possible inline clones sharing a decl. */
cnode = dyn_cast <cgraph_node> (node); cnode = dyn_cast <cgraph_node> (node);
if (cnode && cnode->clones && with_clones) if (cnode && cnode->clones && with_clones)
for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone) for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
if (cnode->symbol.decl == decl) if (cnode->decl == decl)
unlink_from_assembler_name_hash ((symtab_node) cnode, true); unlink_from_assembler_name_hash (cnode, true);
} }
} }
@ -198,22 +198,22 @@ symtab_register_node (symtab_node node)
struct symtab_node_base key; struct symtab_node_base key;
symtab_node *slot; symtab_node *slot;
node->symbol.next = symtab_nodes; node->next = symtab_nodes;
node->symbol.previous = NULL; node->previous = NULL;
if (symtab_nodes) if (symtab_nodes)
symtab_nodes->symbol.previous = node; symtab_nodes->previous = node;
symtab_nodes = node; symtab_nodes = node;
if (!symtab_hash) if (!symtab_hash)
symtab_hash = htab_create_ggc (10, hash_node, eq_node, NULL); symtab_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
key.decl = node->symbol.decl; key.decl = node->decl;
slot = (symtab_node *) htab_find_slot (symtab_hash, &key, INSERT); slot = (symtab_node *) htab_find_slot (symtab_hash, &key, INSERT);
if (*slot == NULL) if (*slot == NULL)
*slot = node; *slot = node;
ipa_empty_ref_list (&node->symbol.ref_list); ipa_empty_ref_list (&node->ref_list);
node->symbol.order = symtab_order++; node->order = symtab_order++;
/* Be sure to do this last; C++ FE might create new nodes via /* Be sure to do this last; C++ FE might create new nodes via
DECL_ASSEMBLER_NAME langhook! */ DECL_ASSEMBLER_NAME langhook! */
@ -231,7 +231,7 @@ symtab_insert_node_to_hashtable (symtab_node node)
if (!symtab_hash) if (!symtab_hash)
symtab_hash = htab_create_ggc (10, hash_node, eq_node, NULL); symtab_hash = htab_create_ggc (10, hash_node, eq_node, NULL);
key.decl = node->symbol.decl; key.decl = node->decl;
slot = (symtab_node *) htab_find_slot (symtab_hash, &key, INSERT); slot = (symtab_node *) htab_find_slot (symtab_hash, &key, INSERT);
*slot = node; *slot = node;
} }
@ -243,31 +243,31 @@ void
symtab_unregister_node (symtab_node node) symtab_unregister_node (symtab_node node)
{ {
void **slot; void **slot;
ipa_remove_all_references (&node->symbol.ref_list); ipa_remove_all_references (&node->ref_list);
ipa_remove_all_referring (&node->symbol.ref_list); ipa_remove_all_referring (&node->ref_list);
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node prev; symtab_node prev;
for (prev = node->symbol.same_comdat_group; for (prev = node->same_comdat_group;
prev->symbol.same_comdat_group != node; prev->same_comdat_group != node;
prev = prev->symbol.same_comdat_group) prev = prev->same_comdat_group)
; ;
if (node->symbol.same_comdat_group == prev) if (node->same_comdat_group == prev)
prev->symbol.same_comdat_group = NULL; prev->same_comdat_group = NULL;
else else
prev->symbol.same_comdat_group = node->symbol.same_comdat_group; prev->same_comdat_group = node->same_comdat_group;
node->symbol.same_comdat_group = NULL; node->same_comdat_group = NULL;
} }
if (node->symbol.previous) if (node->previous)
node->symbol.previous->symbol.next = node->symbol.next; node->previous->next = node->next;
else else
symtab_nodes = node->symbol.next; symtab_nodes = node->next;
if (node->symbol.next) if (node->next)
node->symbol.next->symbol.previous = node->symbol.previous; node->next->previous = node->previous;
node->symbol.next = NULL; node->next = NULL;
node->symbol.previous = NULL; node->previous = NULL;
slot = htab_find_slot (symtab_hash, node, NO_INSERT); slot = htab_find_slot (symtab_hash, node, NO_INSERT);
@ -278,13 +278,13 @@ symtab_unregister_node (symtab_node node)
{ {
symtab_node replacement_node = NULL; symtab_node replacement_node = NULL;
if (cgraph_node *cnode = dyn_cast <cgraph_node> (node)) if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
replacement_node = (symtab_node)cgraph_find_replacement_node (cnode); replacement_node = cgraph_find_replacement_node (cnode);
if (!replacement_node) if (!replacement_node)
htab_clear_slot (symtab_hash, slot); htab_clear_slot (symtab_hash, slot);
else else
*slot = replacement_node; *slot = replacement_node;
} }
if (!is_a <varpool_node> (node) || !DECL_HARD_REGISTER (node->symbol.decl)) if (!is_a <varpool_node> (node) || !DECL_HARD_REGISTER (node->decl))
unlink_from_assembler_name_hash (node, false); unlink_from_assembler_name_hash (node, false);
} }
@ -418,22 +418,22 @@ void
symtab_add_to_same_comdat_group (symtab_node new_node, symtab_add_to_same_comdat_group (symtab_node new_node,
symtab_node old_node) symtab_node old_node)
{ {
gcc_assert (DECL_ONE_ONLY (old_node->symbol.decl)); gcc_assert (DECL_ONE_ONLY (old_node->decl));
gcc_assert (!new_node->symbol.same_comdat_group); gcc_assert (!new_node->same_comdat_group);
gcc_assert (new_node != old_node); gcc_assert (new_node != old_node);
DECL_COMDAT_GROUP (new_node->symbol.decl) = DECL_COMDAT_GROUP (old_node->symbol.decl); DECL_COMDAT_GROUP (new_node->decl) = DECL_COMDAT_GROUP (old_node->decl);
new_node->symbol.same_comdat_group = old_node; new_node->same_comdat_group = old_node;
if (!old_node->symbol.same_comdat_group) if (!old_node->same_comdat_group)
old_node->symbol.same_comdat_group = new_node; old_node->same_comdat_group = new_node;
else else
{ {
symtab_node n; symtab_node n;
for (n = old_node->symbol.same_comdat_group; for (n = old_node->same_comdat_group;
n->symbol.same_comdat_group != old_node; n->same_comdat_group != old_node;
n = n->symbol.same_comdat_group) n = n->same_comdat_group)
; ;
n->symbol.same_comdat_group = new_node; n->same_comdat_group = new_node;
} }
} }
@ -444,12 +444,12 @@ symtab_dissolve_same_comdat_group_list (symtab_node node)
{ {
symtab_node n = node, next; symtab_node n = node, next;
if (!node->symbol.same_comdat_group) if (!node->same_comdat_group)
return; return;
do do
{ {
next = n->symbol.same_comdat_group; next = n->same_comdat_group;
n->symbol.same_comdat_group = NULL; n->same_comdat_group = NULL;
n = next; n = next;
} }
while (n != node); while (n != node);
@ -462,9 +462,9 @@ symtab_dissolve_same_comdat_group_list (symtab_node node)
const char * const char *
symtab_node_asm_name (symtab_node node) symtab_node_asm_name (symtab_node node)
{ {
if (!DECL_ASSEMBLER_NAME_SET_P (node->symbol.decl)) if (!DECL_ASSEMBLER_NAME_SET_P (node->decl))
return lang_hooks.decl_printable_name (node->symbol.decl, 2); return lang_hooks.decl_printable_name (node->decl, 2);
return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->symbol.decl)); return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl));
} }
/* Return printable identifier name. */ /* Return printable identifier name. */
@ -472,7 +472,7 @@ symtab_node_asm_name (symtab_node node)
const char * const char *
symtab_node_name (symtab_node node) symtab_node_name (symtab_node node)
{ {
return lang_hooks.decl_printable_name (node->symbol.decl, 2); return lang_hooks.decl_printable_name (node->decl, 2);
} }
static const char * const symtab_type_names[] = {"symbol", "function", "variable"}; static const char * const symtab_type_names[] = {"symbol", "function", "variable"};
@ -488,107 +488,107 @@ dump_symtab_base (FILE *f, symtab_node node)
fprintf (f, "%s/%i (%s)", fprintf (f, "%s/%i (%s)",
symtab_node_asm_name (node), symtab_node_asm_name (node),
node->symbol.order, node->order,
symtab_node_name (node)); symtab_node_name (node));
dump_addr (f, " @", (void *)node); dump_addr (f, " @", (void *)node);
fprintf (f, "\n Type: %s", symtab_type_names[node->symbol.type]); fprintf (f, "\n Type: %s", symtab_type_names[node->type]);
if (node->symbol.definition) if (node->definition)
fprintf (f, " definition"); fprintf (f, " definition");
if (node->symbol.analyzed) if (node->analyzed)
fprintf (f, " analyzed"); fprintf (f, " analyzed");
if (node->symbol.alias) if (node->alias)
fprintf (f, " alias"); fprintf (f, " alias");
if (node->symbol.weakref) if (node->weakref)
fprintf (f, " weakref"); fprintf (f, " weakref");
if (node->symbol.cpp_implicit_alias) if (node->cpp_implicit_alias)
fprintf (f, " cpp_implicit_alias"); fprintf (f, " cpp_implicit_alias");
if (node->symbol.alias_target) if (node->alias_target)
fprintf (f, " target:%s", fprintf (f, " target:%s",
DECL_P (node->symbol.alias_target) DECL_P (node->alias_target)
? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME
(node->symbol.alias_target)) (node->alias_target))
: IDENTIFIER_POINTER (node->symbol.alias_target)); : IDENTIFIER_POINTER (node->alias_target));
fprintf (f, "\n Visibility:"); fprintf (f, "\n Visibility:");
if (node->symbol.in_other_partition) if (node->in_other_partition)
fprintf (f, " in_other_partition"); fprintf (f, " in_other_partition");
if (node->symbol.used_from_other_partition) if (node->used_from_other_partition)
fprintf (f, " used_from_other_partition"); fprintf (f, " used_from_other_partition");
if (node->symbol.force_output) if (node->force_output)
fprintf (f, " force_output"); fprintf (f, " force_output");
if (node->symbol.forced_by_abi) if (node->forced_by_abi)
fprintf (f, " forced_by_abi"); fprintf (f, " forced_by_abi");
if (node->symbol.externally_visible) if (node->externally_visible)
fprintf (f, " externally_visible"); fprintf (f, " externally_visible");
if (node->symbol.resolution != LDPR_UNKNOWN) if (node->resolution != LDPR_UNKNOWN)
fprintf (f, " %s", fprintf (f, " %s",
ld_plugin_symbol_resolution_names[(int)node->symbol.resolution]); ld_plugin_symbol_resolution_names[(int)node->resolution]);
if (TREE_ASM_WRITTEN (node->symbol.decl)) if (TREE_ASM_WRITTEN (node->decl))
fprintf (f, " asm_written"); fprintf (f, " asm_written");
if (DECL_EXTERNAL (node->symbol.decl)) if (DECL_EXTERNAL (node->decl))
fprintf (f, " external"); fprintf (f, " external");
if (TREE_PUBLIC (node->symbol.decl)) if (TREE_PUBLIC (node->decl))
fprintf (f, " public"); fprintf (f, " public");
if (DECL_COMMON (node->symbol.decl)) if (DECL_COMMON (node->decl))
fprintf (f, " common"); fprintf (f, " common");
if (DECL_WEAK (node->symbol.decl)) if (DECL_WEAK (node->decl))
fprintf (f, " weak"); fprintf (f, " weak");
if (DECL_DLLIMPORT_P (node->symbol.decl)) if (DECL_DLLIMPORT_P (node->decl))
fprintf (f, " dll_import"); fprintf (f, " dll_import");
if (DECL_COMDAT (node->symbol.decl)) if (DECL_COMDAT (node->decl))
fprintf (f, " comdat"); fprintf (f, " comdat");
if (DECL_COMDAT_GROUP (node->symbol.decl)) if (DECL_COMDAT_GROUP (node->decl))
fprintf (f, " comdat_group:%s", fprintf (f, " comdat_group:%s",
IDENTIFIER_POINTER (DECL_COMDAT_GROUP (node->symbol.decl))); IDENTIFIER_POINTER (DECL_COMDAT_GROUP (node->decl)));
if (DECL_ONE_ONLY (node->symbol.decl)) if (DECL_ONE_ONLY (node->decl))
fprintf (f, " one_only"); fprintf (f, " one_only");
if (DECL_SECTION_NAME (node->symbol.decl)) if (DECL_SECTION_NAME (node->decl))
fprintf (f, " section_name:%s", fprintf (f, " section_name:%s",
TREE_STRING_POINTER (DECL_SECTION_NAME (node->symbol.decl))); TREE_STRING_POINTER (DECL_SECTION_NAME (node->decl)));
if (DECL_VISIBILITY_SPECIFIED (node->symbol.decl)) if (DECL_VISIBILITY_SPECIFIED (node->decl))
fprintf (f, " visibility_specified"); fprintf (f, " visibility_specified");
if (DECL_VISIBILITY (node->symbol.decl)) if (DECL_VISIBILITY (node->decl))
fprintf (f, " visibility:%s", fprintf (f, " visibility:%s",
visibility_types [DECL_VISIBILITY (node->symbol.decl)]); visibility_types [DECL_VISIBILITY (node->decl)]);
if (DECL_VIRTUAL_P (node->symbol.decl)) if (DECL_VIRTUAL_P (node->decl))
fprintf (f, " virtual"); fprintf (f, " virtual");
if (DECL_ARTIFICIAL (node->symbol.decl)) if (DECL_ARTIFICIAL (node->decl))
fprintf (f, " artificial"); fprintf (f, " artificial");
if (TREE_CODE (node->symbol.decl) == FUNCTION_DECL) if (TREE_CODE (node->decl) == FUNCTION_DECL)
{ {
if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl)) if (DECL_STATIC_CONSTRUCTOR (node->decl))
fprintf (f, " constructor"); fprintf (f, " constructor");
if (DECL_STATIC_DESTRUCTOR (node->symbol.decl)) if (DECL_STATIC_DESTRUCTOR (node->decl))
fprintf (f, " destructor"); fprintf (f, " destructor");
} }
fprintf (f, "\n"); fprintf (f, "\n");
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
fprintf (f, " Same comdat group as: %s/%i\n", fprintf (f, " Same comdat group as: %s/%i\n",
symtab_node_asm_name (node->symbol.same_comdat_group), symtab_node_asm_name (node->same_comdat_group),
node->symbol.same_comdat_group->symbol.order); node->same_comdat_group->order);
if (node->symbol.next_sharing_asm_name) if (node->next_sharing_asm_name)
fprintf (f, " next sharing asm name: %i\n", fprintf (f, " next sharing asm name: %i\n",
node->symbol.next_sharing_asm_name->symbol.order); node->next_sharing_asm_name->order);
if (node->symbol.previous_sharing_asm_name) if (node->previous_sharing_asm_name)
fprintf (f, " previous sharing asm name: %i\n", fprintf (f, " previous sharing asm name: %i\n",
node->symbol.previous_sharing_asm_name->symbol.order); node->previous_sharing_asm_name->order);
if (node->symbol.address_taken) if (node->address_taken)
fprintf (f, " Address is taken.\n"); fprintf (f, " Address is taken.\n");
if (node->symbol.aux) if (node->aux)
{ {
fprintf (f, " Aux:"); fprintf (f, " Aux:");
dump_addr (f, " @", (void *)node->symbol.aux); dump_addr (f, " @", (void *)node->aux);
} }
fprintf (f, " References: "); fprintf (f, " References: ");
ipa_dump_references (f, &node->symbol.ref_list); ipa_dump_references (f, &node->ref_list);
fprintf (f, " Referring: "); fprintf (f, " Referring: ");
ipa_dump_referring (f, &node->symbol.ref_list); ipa_dump_referring (f, &node->ref_list);
if (node->symbol.lto_file_data) if (node->lto_file_data)
fprintf (f, " Read from file: %s\n", fprintf (f, " Read from file: %s\n",
node->symbol.lto_file_data->file_name); node->lto_file_data->file_name);
} }
/* Dump symtab node. */ /* Dump symtab node. */
@ -639,7 +639,7 @@ verify_symtab_base (symtab_node node)
if (is_a <cgraph_node> (node)) if (is_a <cgraph_node> (node))
{ {
if (TREE_CODE (node->symbol.decl) != FUNCTION_DECL) if (TREE_CODE (node->decl) != FUNCTION_DECL)
{ {
error ("function symbol is not function"); error ("function symbol is not function");
error_found = true; error_found = true;
@ -647,7 +647,7 @@ verify_symtab_base (symtab_node node)
} }
else if (is_a <varpool_node> (node)) else if (is_a <varpool_node> (node))
{ {
if (TREE_CODE (node->symbol.decl) != VAR_DECL) if (TREE_CODE (node->decl) != VAR_DECL)
{ {
error ("variable symbol is not variable"); error ("variable symbol is not variable");
error_found = true; error_found = true;
@ -661,7 +661,7 @@ verify_symtab_base (symtab_node node)
if (cgraph_state != CGRAPH_LTO_STREAMING) if (cgraph_state != CGRAPH_LTO_STREAMING)
{ {
hashed_node = symtab_get_node (node->symbol.decl); hashed_node = symtab_get_node (node->decl);
if (!hashed_node) if (!hashed_node)
{ {
error ("node not found in symtab decl hashtable"); error ("node not found in symtab decl hashtable");
@ -670,8 +670,8 @@ verify_symtab_base (symtab_node node)
if (hashed_node != node if (hashed_node != node
&& (!is_a <cgraph_node> (node) && (!is_a <cgraph_node> (node)
|| !dyn_cast <cgraph_node> (node)->clone_of || !dyn_cast <cgraph_node> (node)->clone_of
|| dyn_cast <cgraph_node> (node)->clone_of->symbol.decl || dyn_cast <cgraph_node> (node)->clone_of->decl
!= node->symbol.decl)) != node->decl))
{ {
error ("node differs from symtab decl hashtable"); error ("node differs from symtab decl hashtable");
error_found = true; error_found = true;
@ -679,8 +679,8 @@ verify_symtab_base (symtab_node node)
} }
if (assembler_name_hash) if (assembler_name_hash)
{ {
hashed_node = symtab_node_for_asm (DECL_ASSEMBLER_NAME (node->symbol.decl)); hashed_node = symtab_node_for_asm (DECL_ASSEMBLER_NAME (node->decl));
if (hashed_node && hashed_node->symbol.previous_sharing_asm_name) if (hashed_node && hashed_node->previous_sharing_asm_name)
{ {
error ("assembler name hash list corrupted"); error ("assembler name hash list corrupted");
error_found = true; error_found = true;
@ -689,53 +689,53 @@ verify_symtab_base (symtab_node node)
{ {
if (hashed_node == node) if (hashed_node == node)
break; break;
hashed_node = hashed_node->symbol.next_sharing_asm_name; hashed_node = hashed_node->next_sharing_asm_name;
} }
if (!hashed_node if (!hashed_node
&& !(is_a <varpool_node> (node) && !(is_a <varpool_node> (node)
|| DECL_HARD_REGISTER (node->symbol.decl))) || DECL_HARD_REGISTER (node->decl)))
{ {
error ("node not found in symtab assembler name hash"); error ("node not found in symtab assembler name hash");
error_found = true; error_found = true;
} }
} }
if (node->symbol.previous_sharing_asm_name if (node->previous_sharing_asm_name
&& node->symbol.previous_sharing_asm_name->symbol.next_sharing_asm_name != node) && node->previous_sharing_asm_name->next_sharing_asm_name != node)
{ {
error ("double linked list of assembler names corrupted"); error ("double linked list of assembler names corrupted");
error_found = true; error_found = true;
} }
if (node->symbol.analyzed && !node->symbol.definition) if (node->analyzed && !node->definition)
{ {
error ("node is analyzed byt it is not a definition"); error ("node is analyzed byt it is not a definition");
error_found = true; error_found = true;
} }
if (node->symbol.cpp_implicit_alias && !node->symbol.alias) if (node->cpp_implicit_alias && !node->alias)
{ {
error ("node is alias but not implicit alias"); error ("node is alias but not implicit alias");
error_found = true; error_found = true;
} }
if (node->symbol.alias && !node->symbol.definition if (node->alias && !node->definition
&& !node->symbol.weakref) && !node->weakref)
{ {
error ("node is alias but not definition"); error ("node is alias but not definition");
error_found = true; error_found = true;
} }
if (node->symbol.weakref && !node->symbol.alias) if (node->weakref && !node->alias)
{ {
error ("node is weakref but not an alias"); error ("node is weakref but not an alias");
error_found = true; error_found = true;
} }
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node n = node->symbol.same_comdat_group; symtab_node n = node->same_comdat_group;
if (!DECL_ONE_ONLY (n->symbol.decl)) if (!DECL_ONE_ONLY (n->decl))
{ {
error ("non-DECL_ONE_ONLY node in a same_comdat_group list"); error ("non-DECL_ONE_ONLY node in a same_comdat_group list");
error_found = true; error_found = true;
} }
if (n->symbol.type != node->symbol.type) if (n->type != node->type)
{ {
error ("mixing different types of symbol in same comdat groups is not supported"); error ("mixing different types of symbol in same comdat groups is not supported");
error_found = true; error_found = true;
@ -747,13 +747,13 @@ verify_symtab_base (symtab_node node)
} }
do do
{ {
if (!n->symbol.same_comdat_group) if (!n->same_comdat_group)
{ {
error ("same_comdat_group is not a circular list"); error ("same_comdat_group is not a circular list");
error_found = true; error_found = true;
break; break;
} }
n = n->symbol.same_comdat_group; n = n->same_comdat_group;
} }
while (n != node); while (n != node);
} }
@ -808,9 +808,9 @@ resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution)
bool bool
symtab_used_from_object_file_p (symtab_node node) symtab_used_from_object_file_p (symtab_node node)
{ {
if (!TREE_PUBLIC (node->symbol.decl) || DECL_EXTERNAL (node->symbol.decl)) if (!TREE_PUBLIC (node->decl) || DECL_EXTERNAL (node->decl))
return false; return false;
if (resolution_used_from_other_file_p (node->symbol.resolution)) if (resolution_used_from_other_file_p (node->resolution))
return true; return true;
return false; return false;
} }
@ -875,7 +875,7 @@ symtab_alias_ultimate_target (symtab_node node, enum availability *availability)
{ {
bool weakref_p = false; bool weakref_p = false;
if (!node->symbol.alias) if (!node->alias)
{ {
if (availability) if (availability)
*availability = symtab_node_availability (node); *availability = symtab_node_availability (node);
@ -898,7 +898,7 @@ symtab_alias_ultimate_target (symtab_node node, enum availability *availability)
if (availability) if (availability)
{ {
weakref_p = node->symbol.weakref; weakref_p = node->weakref;
if (!weakref_p) if (!weakref_p)
*availability = symtab_node_availability (node); *availability = symtab_node_availability (node);
else else
@ -906,13 +906,13 @@ symtab_alias_ultimate_target (symtab_node node, enum availability *availability)
} }
while (node) while (node)
{ {
if (node->symbol.alias && node->symbol.analyzed) if (node->alias && node->analyzed)
node = symtab_alias_target (node); node = symtab_alias_target (node);
else else
{ {
if (!availability) if (!availability)
; ;
else if (node->symbol.analyzed) else if (node->analyzed)
{ {
if (weakref_p) if (weakref_p)
{ {
@ -930,7 +930,7 @@ symtab_alias_ultimate_target (symtab_node node, enum availability *availability)
enum availability a = symtab_node_availability (node); enum availability a = symtab_node_availability (node);
if (a < *availability) if (a < *availability)
*availability = a; *availability = a;
weakref_p = node->symbol.weakref; weakref_p = node->weakref;
} }
} }
if (availability) if (availability)
@ -950,31 +950,31 @@ fixup_same_cpp_alias_visibility (symtab_node node, symtab_node target)
{ {
if (is_a <cgraph_node> (node)) if (is_a <cgraph_node> (node))
{ {
DECL_DECLARED_INLINE_P (node->symbol.decl) DECL_DECLARED_INLINE_P (node->decl)
= DECL_DECLARED_INLINE_P (target->symbol.decl); = DECL_DECLARED_INLINE_P (target->decl);
DECL_DISREGARD_INLINE_LIMITS (node->symbol.decl) DECL_DISREGARD_INLINE_LIMITS (node->decl)
= DECL_DISREGARD_INLINE_LIMITS (target->symbol.decl); = DECL_DISREGARD_INLINE_LIMITS (target->decl);
} }
/* FIXME: It is not really clear why those flags should not be copied for /* FIXME: It is not really clear why those flags should not be copied for
functions, too. */ functions, too. */
else else
{ {
DECL_WEAK (node->symbol.decl) = DECL_WEAK (target->symbol.decl); DECL_WEAK (node->decl) = DECL_WEAK (target->decl);
DECL_EXTERNAL (node->symbol.decl) = DECL_EXTERNAL (target->symbol.decl); DECL_EXTERNAL (node->decl) = DECL_EXTERNAL (target->decl);
DECL_VISIBILITY (node->symbol.decl) = DECL_VISIBILITY (target->symbol.decl); DECL_VISIBILITY (node->decl) = DECL_VISIBILITY (target->decl);
} }
DECL_VIRTUAL_P (node->symbol.decl) = DECL_VIRTUAL_P (target->symbol.decl); DECL_VIRTUAL_P (node->decl) = DECL_VIRTUAL_P (target->decl);
if (TREE_PUBLIC (node->symbol.decl)) if (TREE_PUBLIC (node->decl))
{ {
DECL_EXTERNAL (node->symbol.decl) = DECL_EXTERNAL (target->symbol.decl); DECL_EXTERNAL (node->decl) = DECL_EXTERNAL (target->decl);
DECL_COMDAT (node->symbol.decl) = DECL_COMDAT (target->symbol.decl); DECL_COMDAT (node->decl) = DECL_COMDAT (target->decl);
DECL_COMDAT_GROUP (node->symbol.decl) DECL_COMDAT_GROUP (node->decl)
= DECL_COMDAT_GROUP (target->symbol.decl); = DECL_COMDAT_GROUP (target->decl);
if (DECL_ONE_ONLY (target->symbol.decl) if (DECL_ONE_ONLY (target->decl)
&& !node->symbol.same_comdat_group) && !node->same_comdat_group)
symtab_add_to_same_comdat_group ((symtab_node)node, (symtab_node)target); symtab_add_to_same_comdat_group (node, target);
} }
node->symbol.externally_visible = target->symbol.externally_visible; node->externally_visible = target->externally_visible;
} }
/* Add reference recording that NODE is alias of TARGET. /* Add reference recording that NODE is alias of TARGET.
@ -986,42 +986,42 @@ symtab_resolve_alias (symtab_node node, symtab_node target)
{ {
symtab_node n; symtab_node n;
gcc_assert (!node->symbol.analyzed gcc_assert (!node->analyzed
&& !vec_safe_length (node->symbol.ref_list.references)); && !vec_safe_length (node->ref_list.references));
/* Never let cycles to creep into the symbol table alias references; /* Never let cycles to creep into the symbol table alias references;
those will make alias walkers to be infinite. */ those will make alias walkers to be infinite. */
for (n = target; n && n->symbol.alias; for (n = target; n && n->alias;
n = n->symbol.analyzed ? symtab_alias_target (n) : NULL) n = n->analyzed ? symtab_alias_target (n) : NULL)
if (n == node) if (n == node)
{ {
if (is_a <cgraph_node> (node)) if (is_a <cgraph_node> (node))
error ("function %q+D part of alias cycle", node->symbol.decl); error ("function %q+D part of alias cycle", node->decl);
else if (is_a <varpool_node> (node)) else if (is_a <varpool_node> (node))
error ("variable %q+D part of alias cycle", node->symbol.decl); error ("variable %q+D part of alias cycle", node->decl);
else else
gcc_unreachable (); gcc_unreachable ();
node->symbol.alias = false; node->alias = false;
return false; return false;
} }
/* "analyze" the node - i.e. mark the reference. */ /* "analyze" the node - i.e. mark the reference. */
node->symbol.definition = true; node->definition = true;
node->symbol.alias = true; node->alias = true;
node->symbol.analyzed = true; node->analyzed = true;
ipa_record_reference (node, target, IPA_REF_ALIAS, NULL); ipa_record_reference (node, target, IPA_REF_ALIAS, NULL);
/* Alias targets become reudndant after alias is resolved into an reference. /* Alias targets become reudndant after alias is resolved into an reference.
We do not want to keep it around or we would have to mind updating them We do not want to keep it around or we would have to mind updating them
when renaming symbols. */ when renaming symbols. */
node->symbol.alias_target = NULL; node->alias_target = NULL;
if (node->symbol.cpp_implicit_alias && cgraph_state >= CGRAPH_STATE_CONSTRUCTION) if (node->cpp_implicit_alias && cgraph_state >= CGRAPH_STATE_CONSTRUCTION)
fixup_same_cpp_alias_visibility (node, target); fixup_same_cpp_alias_visibility (node, target);
/* If alias has address taken, so does the target. */ /* If alias has address taken, so does the target. */
if (node->symbol.address_taken) if (node->address_taken)
symtab_alias_ultimate_target (target, NULL)->symbol.address_taken = true; symtab_alias_ultimate_target (target, NULL)->address_taken = true;
return true; return true;
} }
@ -1040,7 +1040,7 @@ symtab_for_node_and_aliases (symtab_node node,
if (callback (node, data)) if (callback (node, data))
return true; return true;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
symtab_node alias = ref->referring; symtab_node alias = ref->referring;
@ -1058,7 +1058,7 @@ symtab_for_node_and_aliases (symtab_node node,
static bool static bool
symtab_nonoverwritable_alias_1 (symtab_node node, void *data) symtab_nonoverwritable_alias_1 (symtab_node node, void *data)
{ {
if (decl_binds_to_current_def_p (node->symbol.decl)) if (decl_binds_to_current_def_p (node->decl))
{ {
*(symtab_node *)data = node; *(symtab_node *)data = node;
return true; return true;
@ -1079,7 +1079,7 @@ symtab_nonoverwritable_alias (symtab_node node)
/* First try to look up existing alias or base object /* First try to look up existing alias or base object
(if that is already non-overwritable). */ (if that is already non-overwritable). */
node = symtab_alias_ultimate_target (node, NULL); node = symtab_alias_ultimate_target (node, NULL);
gcc_assert (!node->symbol.alias && !node->symbol.weakref); gcc_assert (!node->alias && !node->weakref);
symtab_for_node_and_aliases (node, symtab_nonoverwritable_alias_1, symtab_for_node_and_aliases (node, symtab_nonoverwritable_alias_1,
(void *)&new_node, true); (void *)&new_node, true);
if (new_node) if (new_node)
@ -1090,8 +1090,8 @@ symtab_nonoverwritable_alias (symtab_node node)
#endif #endif
/* Otherwise create a new one. */ /* Otherwise create a new one. */
new_decl = copy_node (node->symbol.decl); new_decl = copy_node (node->decl);
DECL_NAME (new_decl) = clone_function_name (node->symbol.decl, "localalias"); DECL_NAME (new_decl) = clone_function_name (node->decl, "localalias");
if (TREE_CODE (new_decl) == FUNCTION_DECL) if (TREE_CODE (new_decl) == FUNCTION_DECL)
DECL_STRUCT_FUNCTION (new_decl) = NULL; DECL_STRUCT_FUNCTION (new_decl) = NULL;
DECL_INITIAL (new_decl) = NULL; DECL_INITIAL (new_decl) = NULL;
@ -1100,7 +1100,7 @@ symtab_nonoverwritable_alias (symtab_node node)
/* Update the properties. */ /* Update the properties. */
DECL_EXTERNAL (new_decl) = 0; DECL_EXTERNAL (new_decl) = 0;
if (DECL_ONE_ONLY (node->symbol.decl)) if (DECL_ONE_ONLY (node->decl))
DECL_SECTION_NAME (new_decl) = NULL; DECL_SECTION_NAME (new_decl) = NULL;
DECL_COMDAT_GROUP (new_decl) = 0; DECL_COMDAT_GROUP (new_decl) = 0;
TREE_PUBLIC (new_decl) = 0; TREE_PUBLIC (new_decl) = 0;
@ -1111,12 +1111,12 @@ symtab_nonoverwritable_alias (symtab_node node)
{ {
DECL_STATIC_CONSTRUCTOR (new_decl) = 0; DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
DECL_STATIC_DESTRUCTOR (new_decl) = 0; DECL_STATIC_DESTRUCTOR (new_decl) = 0;
new_node = (symtab_node) cgraph_create_function_alias new_node = cgraph_create_function_alias
(new_decl, node->symbol.decl); (new_decl, node->decl);
} }
else else
new_node = (symtab_node) varpool_create_variable_alias (new_decl, new_node = varpool_create_variable_alias (new_decl,
node->symbol.decl); node->decl);
symtab_resolve_alias (new_node, node); symtab_resolve_alias (new_node, node);
gcc_assert (decl_binds_to_current_def_p (new_decl)); gcc_assert (decl_binds_to_current_def_p (new_decl));
return new_node; return new_node;
@ -1132,7 +1132,7 @@ symtab_semantically_equivalent_p (symtab_node a,
symtab_node ba, bb; symtab_node ba, bb;
/* Equivalent functions are equivalent. */ /* Equivalent functions are equivalent. */
if (a->symbol.decl == b->symbol.decl) if (a->decl == b->decl)
return true; return true;
/* If symbol is not overwritable by different implementation, /* If symbol is not overwritable by different implementation,

View File

@ -394,15 +394,15 @@ wrapup_global_declaration_2 (tree decl)
if (!node && flag_ltrans) if (!node && flag_ltrans)
needed = false; needed = false;
else if (node && node->symbol.definition) else if (node && node->definition)
needed = false; needed = false;
else if (node && node->symbol.alias) else if (node && node->alias)
needed = false; needed = false;
else if (!cgraph_global_info_ready else if (!cgraph_global_info_ready
&& (TREE_USED (decl) && (TREE_USED (decl)
|| TREE_USED (DECL_ASSEMBLER_NAME (decl)))) || TREE_USED (DECL_ASSEMBLER_NAME (decl))))
/* needed */; /* needed */;
else if (node && node->symbol.analyzed) else if (node && node->analyzed)
/* needed */; /* needed */;
else if (DECL_COMDAT (decl)) else if (DECL_COMDAT (decl))
needed = false; needed = false;

View File

@ -4040,16 +4040,16 @@ get_cg_data (struct cgraph_node **node, bool traverse_aliases)
{ {
struct tm_ipa_cg_data *d; struct tm_ipa_cg_data *d;
if (traverse_aliases && (*node)->symbol.alias) if (traverse_aliases && (*node)->alias)
*node = cgraph_alias_target (*node); *node = cgraph_alias_target (*node);
d = (struct tm_ipa_cg_data *) (*node)->symbol.aux; d = (struct tm_ipa_cg_data *) (*node)->aux;
if (d == NULL) if (d == NULL)
{ {
d = (struct tm_ipa_cg_data *) d = (struct tm_ipa_cg_data *)
obstack_alloc (&tm_obstack.obstack, sizeof (*d)); obstack_alloc (&tm_obstack.obstack, sizeof (*d));
(*node)->symbol.aux = (void *) d; (*node)->aux = (void *) d;
memset (d, 0, sizeof (*d)); memset (d, 0, sizeof (*d));
} }
@ -4192,7 +4192,7 @@ static void
ipa_tm_scan_calls_clone (struct cgraph_node *node, ipa_tm_scan_calls_clone (struct cgraph_node *node,
cgraph_node_queue *callees_p) cgraph_node_queue *callees_p)
{ {
struct function *fn = DECL_STRUCT_FUNCTION (node->symbol.decl); struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
basic_block bb; basic_block bb;
FOR_EACH_BB_FN (bb, fn) FOR_EACH_BB_FN (bb, fn)
@ -4221,7 +4221,7 @@ ipa_tm_note_irrevocable (struct cgraph_node *node,
continue; continue;
/* Even if we think we can go irrevocable, believe the user /* Even if we think we can go irrevocable, believe the user
above all. */ above all. */
if (is_tm_safe_or_pure (e->caller->symbol.decl)) if (is_tm_safe_or_pure (e->caller->decl))
continue; continue;
caller = e->caller; caller = e->caller;
@ -4493,11 +4493,11 @@ ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone)
bool ret = false; bool ret = false;
/* Builtin operators (operator new, and such). */ /* Builtin operators (operator new, and such). */
if (DECL_STRUCT_FUNCTION (node->symbol.decl) == NULL if (DECL_STRUCT_FUNCTION (node->decl) == NULL
|| DECL_STRUCT_FUNCTION (node->symbol.decl)->cfg == NULL) || DECL_STRUCT_FUNCTION (node->decl)->cfg == NULL)
return false; return false;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
@ -4583,7 +4583,7 @@ ipa_tm_mayenterirr_function (struct cgraph_node *node)
unsigned flags; unsigned flags;
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
decl = node->symbol.decl; decl = node->decl;
flags = flags_from_decl_or_type (decl); flags = flags_from_decl_or_type (decl);
/* Handle some TM builtins. Ordinarily these aren't actually generated /* Handle some TM builtins. Ordinarily these aren't actually generated
@ -4626,7 +4626,7 @@ ipa_tm_mayenterirr_function (struct cgraph_node *node)
/* Recurse on the main body for aliases. In general, this will /* Recurse on the main body for aliases. In general, this will
result in one of the bits above being set so that we will not result in one of the bits above being set so that we will not
have to recurse next time. */ have to recurse next time. */
if (node->symbol.alias) if (node->alias)
return ipa_tm_mayenterirr_function (cgraph_get_node (node->thunk.alias)); return ipa_tm_mayenterirr_function (cgraph_get_node (node->thunk.alias));
/* What remains is unmarked local functions without items that force /* What remains is unmarked local functions without items that force
@ -4643,11 +4643,11 @@ ipa_tm_diagnose_tm_safe (struct cgraph_node *node)
struct cgraph_edge *e; struct cgraph_edge *e;
for (e = node->callees; e ; e = e->next_callee) for (e = node->callees; e ; e = e->next_callee)
if (!is_tm_callable (e->callee->symbol.decl) if (!is_tm_callable (e->callee->decl)
&& e->callee->local.tm_may_enter_irr) && e->callee->local.tm_may_enter_irr)
error_at (gimple_location (e->call_stmt), error_at (gimple_location (e->call_stmt),
"unsafe function call %qD within " "unsafe function call %qD within "
"%<transaction_safe%> function", e->callee->symbol.decl); "%<transaction_safe%> function", e->callee->decl);
} }
/* Diagnose call from atomic transactions to unmarked functions /* Diagnose call from atomic transactions to unmarked functions
@ -4786,14 +4786,14 @@ static inline void
ipa_tm_mark_force_output_node (struct cgraph_node *node) ipa_tm_mark_force_output_node (struct cgraph_node *node)
{ {
cgraph_mark_force_output_node (node); cgraph_mark_force_output_node (node);
node->symbol.analyzed = true; node->analyzed = true;
} }
static inline void static inline void
ipa_tm_mark_forced_by_abi_node (struct cgraph_node *node) ipa_tm_mark_forced_by_abi_node (struct cgraph_node *node)
{ {
node->symbol.forced_by_abi = true; node->forced_by_abi = true;
node->symbol.analyzed = true; node->analyzed = true;
} }
/* Callback data for ipa_tm_create_version_alias. */ /* Callback data for ipa_tm_create_version_alias. */
@ -4814,10 +4814,10 @@ ipa_tm_create_version_alias (struct cgraph_node *node, void *data)
tree old_decl, new_decl, tm_name; tree old_decl, new_decl, tm_name;
struct cgraph_node *new_node; struct cgraph_node *new_node;
if (!node->symbol.cpp_implicit_alias) if (!node->cpp_implicit_alias)
return false; return false;
old_decl = node->symbol.decl; old_decl = node->decl;
tm_name = tm_mangle (DECL_ASSEMBLER_NAME (old_decl)); tm_name = tm_mangle (DECL_ASSEMBLER_NAME (old_decl));
new_decl = build_decl (DECL_SOURCE_LOCATION (old_decl), new_decl = build_decl (DECL_SOURCE_LOCATION (old_decl),
TREE_CODE (old_decl), tm_name, TREE_CODE (old_decl), tm_name,
@ -4843,16 +4843,16 @@ ipa_tm_create_version_alias (struct cgraph_node *node, void *data)
new_node = cgraph_same_body_alias (NULL, new_decl, info->new_decl); new_node = cgraph_same_body_alias (NULL, new_decl, info->new_decl);
new_node->tm_clone = true; new_node->tm_clone = true;
new_node->symbol.externally_visible = info->old_node->symbol.externally_visible; new_node->externally_visible = info->old_node->externally_visible;
/* ?? Do not traverse aliases here. */ /* ?? Do not traverse aliases here. */
get_cg_data (&node, false)->clone = new_node; get_cg_data (&node, false)->clone = new_node;
record_tm_clone_pair (old_decl, new_decl); record_tm_clone_pair (old_decl, new_decl);
if (info->old_node->symbol.force_output if (info->old_node->force_output
|| ipa_ref_list_first_referring (&info->old_node->symbol.ref_list)) || ipa_ref_list_first_referring (&info->old_node->ref_list))
ipa_tm_mark_force_output_node (new_node); ipa_tm_mark_force_output_node (new_node);
if (info->old_node->symbol.forced_by_abi) if (info->old_node->forced_by_abi)
ipa_tm_mark_forced_by_abi_node (new_node); ipa_tm_mark_forced_by_abi_node (new_node);
return false; return false;
} }
@ -4866,7 +4866,7 @@ ipa_tm_create_version (struct cgraph_node *old_node)
tree new_decl, old_decl, tm_name; tree new_decl, old_decl, tm_name;
struct cgraph_node *new_node; struct cgraph_node *new_node;
old_decl = old_node->symbol.decl; old_decl = old_node->decl;
new_decl = copy_node (old_decl); new_decl = copy_node (old_decl);
/* DECL_ASSEMBLER_NAME needs to be set before we call /* DECL_ASSEMBLER_NAME needs to be set before we call
@ -4883,7 +4883,7 @@ ipa_tm_create_version (struct cgraph_node *old_node)
new_node = cgraph_copy_node_for_versioning (old_node, new_decl, vNULL, NULL); new_node = cgraph_copy_node_for_versioning (old_node, new_decl, vNULL, NULL);
new_node->local.local = false; new_node->local.local = false;
new_node->symbol.externally_visible = old_node->symbol.externally_visible; new_node->externally_visible = old_node->externally_visible;
new_node->lowered = true; new_node->lowered = true;
new_node->tm_clone = 1; new_node->tm_clone = 1;
get_cg_data (&old_node, true)->clone = new_node; get_cg_data (&old_node, true)->clone = new_node;
@ -4907,10 +4907,10 @@ ipa_tm_create_version (struct cgraph_node *old_node)
record_tm_clone_pair (old_decl, new_decl); record_tm_clone_pair (old_decl, new_decl);
cgraph_call_function_insertion_hooks (new_node); cgraph_call_function_insertion_hooks (new_node);
if (old_node->symbol.force_output if (old_node->force_output
|| ipa_ref_list_first_referring (&old_node->symbol.ref_list)) || ipa_ref_list_first_referring (&old_node->ref_list))
ipa_tm_mark_force_output_node (new_node); ipa_tm_mark_force_output_node (new_node);
if (old_node->symbol.forced_by_abi) if (old_node->forced_by_abi)
ipa_tm_mark_forced_by_abi_node (new_node); ipa_tm_mark_forced_by_abi_node (new_node);
/* Do the same thing, but for any aliases of the original node. */ /* Do the same thing, but for any aliases of the original node. */
@ -4945,7 +4945,7 @@ ipa_tm_insert_irr_call (struct cgraph_node *node, struct tm_region *region,
cgraph_get_create_node cgraph_get_create_node
(builtin_decl_explicit (BUILT_IN_TM_IRREVOCABLE)), (builtin_decl_explicit (BUILT_IN_TM_IRREVOCABLE)),
g, 0, g, 0,
compute_call_stmt_bb_frequency (node->symbol.decl, compute_call_stmt_bb_frequency (node->decl,
gimple_bb (g))); gimple_bb (g)));
} }
@ -4995,7 +4995,7 @@ ipa_tm_insert_gettmclone_call (struct cgraph_node *node,
gsi_insert_before (gsi, g, GSI_SAME_STMT); gsi_insert_before (gsi, g, GSI_SAME_STMT);
cgraph_create_edge (node, cgraph_get_create_node (gettm_fn), g, 0, cgraph_create_edge (node, cgraph_get_create_node (gettm_fn), g, 0,
compute_call_stmt_bb_frequency (node->symbol.decl, compute_call_stmt_bb_frequency (node->decl,
gimple_bb (g))); gimple_bb (g)));
/* Cast return value from tm_gettmclone* into appropriate function /* Cast return value from tm_gettmclone* into appropriate function
@ -5122,7 +5122,7 @@ ipa_tm_transform_calls_redirect (struct cgraph_node *node,
return; return;
} }
fndecl = new_node->symbol.decl; fndecl = new_node->decl;
} }
cgraph_redirect_edge_callee (e, new_node); cgraph_redirect_edge_callee (e, new_node);
@ -5216,7 +5216,7 @@ ipa_tm_transform_transaction (struct cgraph_node *node)
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
for (region = d->all_tm_regions; region; region = region->next) for (region = d->all_tm_regions; region; region = region->next)
@ -5259,7 +5259,7 @@ ipa_tm_transform_clone (struct cgraph_node *node)
if (!node->callees && !node->indirect_calls && !d->irrevocable_blocks_clone) if (!node->callees && !node->indirect_calls && !d->irrevocable_blocks_clone)
return; return;
push_cfun (DECL_STRUCT_FUNCTION (d->clone->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (d->clone->decl));
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
need_ssa_rename = need_ssa_rename =
@ -5295,7 +5295,7 @@ ipa_tm_execute (void)
/* For all local functions marked tm_callable, queue them. */ /* For all local functions marked tm_callable, queue them. */
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
if (is_tm_callable (node->symbol.decl) if (is_tm_callable (node->decl)
&& cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE) && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
{ {
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
@ -5310,14 +5310,14 @@ ipa_tm_execute (void)
/* ... marked tm_pure, record that fact for the runtime by /* ... marked tm_pure, record that fact for the runtime by
indicating that the pure function is its own tm_callable. indicating that the pure function is its own tm_callable.
No need to do this if the function's address can't be taken. */ No need to do this if the function's address can't be taken. */
if (is_tm_pure (node->symbol.decl)) if (is_tm_pure (node->decl))
{ {
if (!node->local.local) if (!node->local.local)
record_tm_clone_pair (node->symbol.decl, node->symbol.decl); record_tm_clone_pair (node->decl, node->decl);
continue; continue;
} }
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
tm_region_init (NULL); tm_region_init (NULL);
@ -5355,20 +5355,20 @@ ipa_tm_execute (void)
/* Some callees cannot be arbitrarily cloned. These will always be /* Some callees cannot be arbitrarily cloned. These will always be
irrevocable. Mark these now, so that we need not scan them. */ irrevocable. Mark these now, so that we need not scan them. */
if (is_tm_irrevocable (node->symbol.decl)) if (is_tm_irrevocable (node->decl))
ipa_tm_note_irrevocable (node, &irr_worklist); ipa_tm_note_irrevocable (node, &irr_worklist);
else if (a <= AVAIL_NOT_AVAILABLE else if (a <= AVAIL_NOT_AVAILABLE
&& !is_tm_safe_or_pure (node->symbol.decl)) && !is_tm_safe_or_pure (node->decl))
ipa_tm_note_irrevocable (node, &irr_worklist); ipa_tm_note_irrevocable (node, &irr_worklist);
else if (a >= AVAIL_OVERWRITABLE) else if (a >= AVAIL_OVERWRITABLE)
{ {
if (!tree_versionable_function_p (node->symbol.decl)) if (!tree_versionable_function_p (node->decl))
ipa_tm_note_irrevocable (node, &irr_worklist); ipa_tm_note_irrevocable (node, &irr_worklist);
else if (!d->is_irrevocable) else if (!d->is_irrevocable)
{ {
/* If this is an alias, make sure its base is queued as well. /* If this is an alias, make sure its base is queued as well.
we need not scan the callees now, as the base will do. */ we need not scan the callees now, as the base will do. */
if (node->symbol.alias) if (node->alias)
{ {
node = cgraph_get_node (node->thunk.alias); node = cgraph_get_node (node->thunk.alias);
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
@ -5446,7 +5446,7 @@ ipa_tm_execute (void)
for (e = node->callers; e ; e = e->next_caller) for (e = node->callers; e ; e = e->next_caller)
{ {
caller = e->caller; caller = e->caller;
if (!is_tm_safe_or_pure (caller->symbol.decl) if (!is_tm_safe_or_pure (caller->decl)
&& !caller->local.tm_may_enter_irr) && !caller->local.tm_may_enter_irr)
{ {
d = get_cg_data (&caller, true); d = get_cg_data (&caller, true);
@ -5455,7 +5455,7 @@ ipa_tm_execute (void)
} }
/* Propagate back to referring aliases as well. */ /* Propagate back to referring aliases as well. */
for (j = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, j, ref); j++) for (j = 0; ipa_ref_list_referring_iterate (&node->ref_list, j, ref); j++)
{ {
caller = cgraph (ref->referring); caller = cgraph (ref->referring);
if (ref->use == IPA_REF_ALIAS if (ref->use == IPA_REF_ALIAS
@ -5475,7 +5475,7 @@ ipa_tm_execute (void)
&& cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE) && cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
{ {
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
if (is_tm_safe (node->symbol.decl)) if (is_tm_safe (node->decl))
ipa_tm_diagnose_tm_safe (node); ipa_tm_diagnose_tm_safe (node);
else if (d->all_tm_regions) else if (d->all_tm_regions)
ipa_tm_diagnose_transaction (node, d->all_tm_regions); ipa_tm_diagnose_transaction (node, d->all_tm_regions);
@ -5489,15 +5489,15 @@ ipa_tm_execute (void)
bool doit = false; bool doit = false;
node = tm_callees[i]; node = tm_callees[i];
if (node->symbol.cpp_implicit_alias) if (node->cpp_implicit_alias)
continue; continue;
a = cgraph_function_body_availability (node); a = cgraph_function_body_availability (node);
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
if (a <= AVAIL_NOT_AVAILABLE) if (a <= AVAIL_NOT_AVAILABLE)
doit = is_tm_callable (node->symbol.decl); doit = is_tm_callable (node->decl);
else if (a <= AVAIL_AVAILABLE && is_tm_callable (node->symbol.decl)) else if (a <= AVAIL_AVAILABLE && is_tm_callable (node->decl))
doit = true; doit = true;
else if (!d->is_irrevocable else if (!d->is_irrevocable
&& d->tm_callers_normal + d->tm_callers_clone > 0) && d->tm_callers_normal + d->tm_callers_clone > 0)
@ -5511,7 +5511,7 @@ ipa_tm_execute (void)
for (i = 0; i < tm_callees.length (); ++i) for (i = 0; i < tm_callees.length (); ++i)
{ {
node = tm_callees[i]; node = tm_callees[i];
if (node->symbol.analyzed) if (node->analyzed)
{ {
d = get_cg_data (&node, true); d = get_cg_data (&node, true);
if (d->clone) if (d->clone)
@ -5534,7 +5534,7 @@ ipa_tm_execute (void)
free_original_copy_tables (); free_original_copy_tables ();
FOR_EACH_FUNCTION (node) FOR_EACH_FUNCTION (node)
node->symbol.aux = NULL; node->aux = NULL;
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
verify_cgraph (); verify_cgraph ();

View File

@ -2602,7 +2602,7 @@ tree_could_trap_p (tree expr)
if (!DECL_EXTERNAL (expr)) if (!DECL_EXTERNAL (expr))
return false; return false;
node = cgraph_function_node (cgraph_get_node (expr), NULL); node = cgraph_function_node (cgraph_get_node (expr), NULL);
if (node && node->symbol.in_other_partition) if (node && node->in_other_partition)
return false; return false;
return true; return true;
} }
@ -2618,7 +2618,7 @@ tree_could_trap_p (tree expr)
if (!DECL_EXTERNAL (expr)) if (!DECL_EXTERNAL (expr))
return false; return false;
node = varpool_variable_node (varpool_get_node (expr), NULL); node = varpool_variable_node (varpool_get_node (expr), NULL);
if (node && node->symbol.in_other_partition) if (node && node->in_other_partition)
return false; return false;
return true; return true;
} }

View File

@ -340,7 +340,7 @@ new_emutls_decl (tree decl, tree alias_of)
else else
varpool_create_variable_alias (to, varpool_create_variable_alias (to,
varpool_node_for_asm varpool_node_for_asm
(DECL_ASSEMBLER_NAME (DECL_VALUE_EXPR (alias_of)))->symbol.decl); (DECL_ASSEMBLER_NAME (DECL_VALUE_EXPR (alias_of)))->decl);
return to; return to;
} }
@ -368,7 +368,7 @@ emutls_decl (tree decl)
i = emutls_index (decl); i = emutls_index (decl);
var = control_vars[i]; var = control_vars[i];
return var->symbol.decl; return var->decl;
} }
/* Generate a call statement to initialize CONTROL_DECL for TLS_DECL. /* Generate a call statement to initialize CONTROL_DECL for TLS_DECL.
@ -430,7 +430,7 @@ gen_emutls_addr (tree decl, struct lower_emutls_data *d)
gimple x; gimple x;
cvar = control_vars[index]; cvar = control_vars[index];
cdecl = cvar->symbol.decl; cdecl = cvar->decl;
TREE_ADDRESSABLE (cdecl) = 1; TREE_ADDRESSABLE (cdecl) = 1;
addr = create_tmp_var (build_pointer_type (TREE_TYPE (decl)), NULL); addr = create_tmp_var (build_pointer_type (TREE_TYPE (decl)), NULL);
@ -447,7 +447,7 @@ gen_emutls_addr (tree decl, struct lower_emutls_data *d)
/* We may be adding a new reference to a new variable to the function. /* We may be adding a new reference to a new variable to the function.
This means we have to play with the ipa-reference web. */ This means we have to play with the ipa-reference web. */
ipa_record_reference ((symtab_node)d->cfun_node, (symtab_node)cvar, IPA_REF_ADDR, x); ipa_record_reference (d->cfun_node, cvar, IPA_REF_ADDR, x);
/* Record this ssa_name for possible use later in the basic block. */ /* Record this ssa_name for possible use later in the basic block. */
access_vars[index] = addr; access_vars[index] = addr;
@ -620,7 +620,7 @@ lower_emutls_function_body (struct cgraph_node *node)
struct lower_emutls_data d; struct lower_emutls_data d;
bool any_edge_inserts = false; bool any_edge_inserts = false;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
d.cfun_node = node; d.cfun_node = node;
d.builtin_decl = builtin_decl_explicit (BUILT_IN_EMUTLS_GET_ADDRESS); d.builtin_decl = builtin_decl_explicit (BUILT_IN_EMUTLS_GET_ADDRESS);
@ -702,29 +702,29 @@ create_emultls_var (struct varpool_node *var, void *data)
tree cdecl; tree cdecl;
struct varpool_node *cvar; struct varpool_node *cvar;
cdecl = new_emutls_decl (var->symbol.decl, cdecl = new_emutls_decl (var->decl,
var->symbol.alias && var->symbol.analyzed var->alias && var->analyzed
? varpool_alias_target (var)->symbol.decl : NULL); ? varpool_alias_target (var)->decl : NULL);
cvar = varpool_get_node (cdecl); cvar = varpool_get_node (cdecl);
control_vars.quick_push (cvar); control_vars.quick_push (cvar);
if (!var->symbol.alias) if (!var->alias)
{ {
/* Make sure the COMMON block control variable gets initialized. /* Make sure the COMMON block control variable gets initialized.
Note that there's no point in doing this for aliases; we only Note that there's no point in doing this for aliases; we only
need to do this once for the main variable. */ need to do this once for the main variable. */
emutls_common_1 (var->symbol.decl, cdecl, (tree *)data); emutls_common_1 (var->decl, cdecl, (tree *)data);
} }
if (var->symbol.alias && !var->symbol.analyzed) if (var->alias && !var->analyzed)
cvar->symbol.alias = true; cvar->alias = true;
/* Indicate that the value of the TLS variable may be found elsewhere, /* Indicate that the value of the TLS variable may be found elsewhere,
preventing the variable from re-appearing in the GIMPLE. We cheat preventing the variable from re-appearing in the GIMPLE. We cheat
and use the control variable here (rather than a full call_expr), and use the control variable here (rather than a full call_expr),
which is special-cased inside the DWARF2 output routines. */ which is special-cased inside the DWARF2 output routines. */
SET_DECL_VALUE_EXPR (var->symbol.decl, cdecl); SET_DECL_VALUE_EXPR (var->decl, cdecl);
DECL_HAS_VALUE_EXPR_P (var->symbol.decl) = 1; DECL_HAS_VALUE_EXPR_P (var->decl) = 1;
return false; return false;
} }
@ -743,12 +743,12 @@ ipa_lower_emutls (void)
/* Examine all global variables for TLS variables. */ /* Examine all global variables for TLS variables. */
FOR_EACH_VARIABLE (var) FOR_EACH_VARIABLE (var)
if (DECL_THREAD_LOCAL_P (var->symbol.decl)) if (DECL_THREAD_LOCAL_P (var->decl))
{ {
gcc_checking_assert (TREE_STATIC (var->symbol.decl) gcc_checking_assert (TREE_STATIC (var->decl)
|| DECL_EXTERNAL (var->symbol.decl)); || DECL_EXTERNAL (var->decl));
varpool_node_set_add (tls_vars, var); varpool_node_set_add (tls_vars, var);
if (var->symbol.alias && var->symbol.definition) if (var->alias && var->definition)
varpool_node_set_add (tls_vars, varpool_variable_node (var, NULL)); varpool_node_set_add (tls_vars, varpool_variable_node (var, NULL));
} }
@ -772,9 +772,9 @@ ipa_lower_emutls (void)
{ {
var = tls_vars->nodes[i]; var = tls_vars->nodes[i];
if (var->symbol.alias && !var->symbol.analyzed) if (var->alias && !var->analyzed)
any_aliases = true; any_aliases = true;
else if (!var->symbol.alias) else if (!var->alias)
varpool_for_node_and_aliases (var, create_emultls_var, &ctor_body, true); varpool_for_node_and_aliases (var, create_emultls_var, &ctor_body, true);
} }

View File

@ -1746,7 +1746,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
/* We could also just rescale the frequency, but /* We could also just rescale the frequency, but
doing so would introduce roundoff errors and make doing so would introduce roundoff errors and make
verifier unhappy. */ verifier unhappy. */
new_freq = compute_call_stmt_bb_frequency (id->dst_node->symbol.decl, new_freq = compute_call_stmt_bb_frequency (id->dst_node->decl,
copy_basic_block); copy_basic_block);
/* Speculative calls consist of two edges - direct and indirect. /* Speculative calls consist of two edges - direct and indirect.
@ -1771,7 +1771,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
(old_edge->frequency + indirect->frequency)), (old_edge->frequency + indirect->frequency)),
CGRAPH_FREQ_MAX); CGRAPH_FREQ_MAX);
} }
ipa_clone_ref (ref, (symtab_node)id->dst_node, stmt); ipa_clone_ref (ref, id->dst_node, stmt);
} }
else else
{ {
@ -1816,7 +1816,7 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
if ((!edge if ((!edge
|| (edge->indirect_inlining_edge || (edge->indirect_inlining_edge
&& id->transform_call_graph_edges == CB_CGE_MOVE_CLONES)) && id->transform_call_graph_edges == CB_CGE_MOVE_CLONES))
&& id->dst_node->symbol.definition && id->dst_node->definition
&& (fn = gimple_call_fndecl (stmt)) != NULL) && (fn = gimple_call_fndecl (stmt)) != NULL)
{ {
struct cgraph_node *dest = cgraph_get_node (fn); struct cgraph_node *dest = cgraph_get_node (fn);
@ -1827,21 +1827,21 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
producing dead clone (for further cloning). In all producing dead clone (for further cloning). In all
other cases we hit a bug (incorrect node sharing is the other cases we hit a bug (incorrect node sharing is the
most common reason for missing edges). */ most common reason for missing edges). */
gcc_assert (!dest->symbol.definition gcc_assert (!dest->definition
|| dest->symbol.address_taken || dest->address_taken
|| !id->src_node->symbol.definition || !id->src_node->definition
|| !id->dst_node->symbol.definition); || !id->dst_node->definition);
if (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES) if (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES)
cgraph_create_edge_including_clones cgraph_create_edge_including_clones
(id->dst_node, dest, orig_stmt, stmt, bb->count, (id->dst_node, dest, orig_stmt, stmt, bb->count,
compute_call_stmt_bb_frequency (id->dst_node->symbol.decl, compute_call_stmt_bb_frequency (id->dst_node->decl,
copy_basic_block), copy_basic_block),
CIF_ORIGINALLY_INDIRECT_CALL); CIF_ORIGINALLY_INDIRECT_CALL);
else else
cgraph_create_edge (id->dst_node, dest, stmt, cgraph_create_edge (id->dst_node, dest, stmt,
bb->count, bb->count,
compute_call_stmt_bb_frequency compute_call_stmt_bb_frequency
(id->dst_node->symbol.decl, (id->dst_node->decl,
copy_basic_block))->inline_failed copy_basic_block))->inline_failed
= CIF_ORIGINALLY_INDIRECT_CALL; = CIF_ORIGINALLY_INDIRECT_CALL;
if (dump_file) if (dump_file)
@ -3745,7 +3745,7 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
/* Do not special case builtins where we see the body. /* Do not special case builtins where we see the body.
This just confuse inliner. */ This just confuse inliner. */
if (!decl || !(node = cgraph_get_node (decl)) || node->symbol.definition) if (!decl || !(node = cgraph_get_node (decl)) || node->definition)
; ;
/* For buitins that are likely expanded to nothing or /* For buitins that are likely expanded to nothing or
inlined do not account operand costs. */ inlined do not account operand costs. */
@ -4017,7 +4017,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
If we cannot, then there is no hope of inlining the function. */ If we cannot, then there is no hope of inlining the function. */
if (cg_edge->indirect_unknown_callee) if (cg_edge->indirect_unknown_callee)
goto egress; goto egress;
fn = cg_edge->callee->symbol.decl; fn = cg_edge->callee->decl;
gcc_checking_assert (fn); gcc_checking_assert (fn);
/* If FN is a declaration of a function in a nested scope that was /* If FN is a declaration of a function in a nested scope that was
@ -4077,11 +4077,11 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
} }
goto egress; goto egress;
} }
fn = cg_edge->callee->symbol.decl; fn = cg_edge->callee->decl;
cgraph_get_body (cg_edge->callee); cgraph_get_body (cg_edge->callee);
#ifdef ENABLE_CHECKING #ifdef ENABLE_CHECKING
if (cg_edge->callee->symbol.decl != id->dst_node->symbol.decl) if (cg_edge->callee->decl != id->dst_node->decl)
verify_cgraph_node (cg_edge->callee); verify_cgraph_node (cg_edge->callee);
#endif #endif
@ -4089,9 +4089,9 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
id->eh_lp_nr = lookup_stmt_eh_lp (stmt); id->eh_lp_nr = lookup_stmt_eh_lp (stmt);
/* Update the callers EH personality. */ /* Update the callers EH personality. */
if (DECL_FUNCTION_PERSONALITY (cg_edge->callee->symbol.decl)) if (DECL_FUNCTION_PERSONALITY (cg_edge->callee->decl))
DECL_FUNCTION_PERSONALITY (cg_edge->caller->symbol.decl) DECL_FUNCTION_PERSONALITY (cg_edge->caller->decl)
= DECL_FUNCTION_PERSONALITY (cg_edge->callee->symbol.decl); = DECL_FUNCTION_PERSONALITY (cg_edge->callee->decl);
/* Split the block holding the GIMPLE_CALL. */ /* Split the block holding the GIMPLE_CALL. */
e = split_block (bb, stmt); e = split_block (bb, stmt);
@ -4339,7 +4339,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
variables in the function when the blocks get blown away as soon as we variables in the function when the blocks get blown away as soon as we
remove the cgraph node. */ remove the cgraph node. */
if (gimple_block (stmt)) if (gimple_block (stmt))
(*debug_hooks->outlining_inline_function) (cg_edge->callee->symbol.decl); (*debug_hooks->outlining_inline_function) (cg_edge->callee->decl);
/* Update callgraph if needed. */ /* Update callgraph if needed. */
cgraph_remove_node (cg_edge->callee); cgraph_remove_node (cg_edge->callee);
@ -4491,7 +4491,7 @@ optimize_inline_calls (tree fn)
memset (&id, 0, sizeof (id)); memset (&id, 0, sizeof (id));
id.src_node = id.dst_node = cgraph_get_node (fn); id.src_node = id.dst_node = cgraph_get_node (fn);
gcc_assert (id.dst_node->symbol.definition); gcc_assert (id.dst_node->definition);
id.dst_fn = fn; id.dst_fn = fn;
/* Or any functions that aren't finished yet. */ /* Or any functions that aren't finished yet. */
if (current_function_decl) if (current_function_decl)
@ -5077,7 +5077,7 @@ delete_unreachable_blocks_update_callgraph (copy_body_data *id)
struct cgraph_edge *e; struct cgraph_edge *e;
struct cgraph_node *node; struct cgraph_node *node;
ipa_remove_stmt_references ((symtab_node)id->dst_node, gsi_stmt (bsi)); ipa_remove_stmt_references (id->dst_node, gsi_stmt (bsi));
if (gimple_code (gsi_stmt (bsi)) == GIMPLE_CALL if (gimple_code (gsi_stmt (bsi)) == GIMPLE_CALL
&&(e = cgraph_edge (id->dst_node, gsi_stmt (bsi))) != NULL) &&(e = cgraph_edge (id->dst_node, gsi_stmt (bsi))) != NULL)
@ -5091,7 +5091,7 @@ delete_unreachable_blocks_update_callgraph (copy_body_data *id)
&& id->dst_node->clones) && id->dst_node->clones)
for (node = id->dst_node->clones; node != id->dst_node;) for (node = id->dst_node->clones; node != id->dst_node;)
{ {
ipa_remove_stmt_references ((symtab_node)node, gsi_stmt (bsi)); ipa_remove_stmt_references (node, gsi_stmt (bsi));
if (gimple_code (gsi_stmt (bsi)) == GIMPLE_CALL if (gimple_code (gsi_stmt (bsi)) == GIMPLE_CALL
&& (e = cgraph_edge (node, gsi_stmt (bsi))) != NULL) && (e = cgraph_edge (node, gsi_stmt (bsi))) != NULL)
{ {
@ -5414,7 +5414,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
pointer_set_destroy (id.statements_to_fold); pointer_set_destroy (id.statements_to_fold);
fold_cond_expr_cond (); fold_cond_expr_cond ();
delete_unreachable_blocks_update_callgraph (&id); delete_unreachable_blocks_update_callgraph (&id);
if (id.dst_node->symbol.definition) if (id.dst_node->definition)
cgraph_rebuild_references (); cgraph_rebuild_references ();
update_ssa (TODO_update_ssa); update_ssa (TODO_update_ssa);

View File

@ -701,11 +701,11 @@ check_for_nested_with_variably_modified (tree fndecl, tree orig_fndecl)
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested) for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
{ {
for (arg = DECL_ARGUMENTS (cgn->symbol.decl); arg; arg = DECL_CHAIN (arg)) for (arg = DECL_ARGUMENTS (cgn->decl); arg; arg = DECL_CHAIN (arg))
if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl)) if (variably_modified_type_p (TREE_TYPE (arg), orig_fndecl))
return true; return true;
if (check_for_nested_with_variably_modified (cgn->symbol.decl, if (check_for_nested_with_variably_modified (cgn->decl,
orig_fndecl)) orig_fndecl))
return true; return true;
} }
@ -724,7 +724,7 @@ create_nesting_tree (struct cgraph_node *cgn)
info->var_map = pointer_map_create (); info->var_map = pointer_map_create ();
info->mem_refs = pointer_set_create (); info->mem_refs = pointer_set_create ();
info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack); info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
info->context = cgn->symbol.decl; info->context = cgn->decl;
for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested) for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
{ {
@ -2630,8 +2630,8 @@ static void
gimplify_all_functions (struct cgraph_node *root) gimplify_all_functions (struct cgraph_node *root)
{ {
struct cgraph_node *iter; struct cgraph_node *iter;
if (!gimple_body (root->symbol.decl)) if (!gimple_body (root->decl))
gimplify_function_tree (root->symbol.decl); gimplify_function_tree (root->decl);
for (iter = root->nested; iter; iter = iter->next_nested) for (iter = root->nested; iter; iter = iter->next_nested)
gimplify_all_functions (iter); gimplify_all_functions (iter);
} }

View File

@ -3390,7 +3390,7 @@ dump_function_header (FILE *dump_file, tree fdecl, int flags)
fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl)); fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
if (node) if (node)
{ {
fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->symbol.order, fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
node->frequency == NODE_FREQUENCY_HOT node->frequency == NODE_FREQUENCY_HOT
? " (hot)" ? " (hot)"
: node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED

View File

@ -528,14 +528,14 @@ tree_profiling (void)
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
{ {
if (!gimple_has_body_p (node->symbol.decl)) if (!gimple_has_body_p (node->decl))
continue; continue;
/* Don't profile functions produced for builtin stuff. */ /* Don't profile functions produced for builtin stuff. */
if (DECL_SOURCE_LOCATION (node->symbol.decl) == BUILTINS_LOCATION) if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION)
continue; continue;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
/* Local pure-const may imply need to fixup the cfg. */ /* Local pure-const may imply need to fixup the cfg. */
if (execute_fixup_cfg () & TODO_cleanup_cfg) if (execute_fixup_cfg () & TODO_cleanup_cfg)
@ -563,13 +563,13 @@ tree_profiling (void)
/* Drop pure/const flags from instrumented functions. */ /* Drop pure/const flags from instrumented functions. */
FOR_EACH_DEFINED_FUNCTION (node) FOR_EACH_DEFINED_FUNCTION (node)
{ {
if (!gimple_has_body_p (node->symbol.decl) if (!gimple_has_body_p (node->decl)
|| !(!node->clone_of || !(!node->clone_of
|| node->symbol.decl != node->clone_of->symbol.decl)) || node->decl != node->clone_of->decl))
continue; continue;
/* Don't profile functions produced for builtin stuff. */ /* Don't profile functions produced for builtin stuff. */
if (DECL_SOURCE_LOCATION (node->symbol.decl) == BUILTINS_LOCATION) if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION)
continue; continue;
cgraph_set_const_flag (node, false, false); cgraph_set_const_flag (node, false, false);
@ -581,16 +581,16 @@ tree_profiling (void)
{ {
basic_block bb; basic_block bb;
if (!gimple_has_body_p (node->symbol.decl) if (!gimple_has_body_p (node->decl)
|| !(!node->clone_of || !(!node->clone_of
|| node->symbol.decl != node->clone_of->symbol.decl)) || node->decl != node->clone_of->decl))
continue; continue;
/* Don't profile functions produced for builtin stuff. */ /* Don't profile functions produced for builtin stuff. */
if (DECL_SOURCE_LOCATION (node->symbol.decl) == BUILTINS_LOCATION) if (DECL_SOURCE_LOCATION (node->decl) == BUILTINS_LOCATION)
continue; continue;
push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {

View File

@ -4838,14 +4838,14 @@ convert_callers_for_node (struct cgraph_node *node,
for (cs = node->callers; cs; cs = cs->next_caller) for (cs = node->callers; cs; cs = cs->next_caller)
{ {
push_cfun (DECL_STRUCT_FUNCTION (cs->caller->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (cs->caller->decl));
if (dump_file) if (dump_file)
fprintf (dump_file, "Adjusting call %s/%i -> %s/%i\n", fprintf (dump_file, "Adjusting call %s/%i -> %s/%i\n",
xstrdup (cgraph_node_name (cs->caller)), xstrdup (cgraph_node_name (cs->caller)),
cs->caller->symbol.order, cs->caller->order,
xstrdup (cgraph_node_name (cs->callee)), xstrdup (cgraph_node_name (cs->callee)),
cs->callee->symbol.order); cs->callee->order);
ipa_modify_call_arguments (cs, cs->call_stmt, *adjustments); ipa_modify_call_arguments (cs, cs->call_stmt, *adjustments);
@ -4854,7 +4854,7 @@ convert_callers_for_node (struct cgraph_node *node,
for (cs = node->callers; cs; cs = cs->next_caller) for (cs = node->callers; cs; cs = cs->next_caller)
if (bitmap_set_bit (recomputed_callers, cs->caller->uid) if (bitmap_set_bit (recomputed_callers, cs->caller->uid)
&& gimple_in_ssa_p (DECL_STRUCT_FUNCTION (cs->caller->symbol.decl))) && gimple_in_ssa_p (DECL_STRUCT_FUNCTION (cs->caller->decl)))
compute_inline_parameters (cs->caller, true); compute_inline_parameters (cs->caller, true);
BITMAP_FREE (recomputed_callers); BITMAP_FREE (recomputed_callers);
@ -4890,7 +4890,7 @@ convert_callers (struct cgraph_node *node, tree old_decl,
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Adjusting recursive call"); fprintf (dump_file, "Adjusting recursive call");
gimple_call_set_fndecl (stmt, node->symbol.decl); gimple_call_set_fndecl (stmt, node->decl);
ipa_modify_call_arguments (NULL, stmt, adjustments); ipa_modify_call_arguments (NULL, stmt, adjustments);
} }
} }
@ -4918,11 +4918,11 @@ modify_function (struct cgraph_node *node, ipa_parm_adjustment_vec adjustments)
NULL, false, NULL, NULL, "isra"); NULL, false, NULL, NULL, "isra");
redirect_callers.release (); redirect_callers.release ();
push_cfun (DECL_STRUCT_FUNCTION (new_node->symbol.decl)); push_cfun (DECL_STRUCT_FUNCTION (new_node->decl));
ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA"); ipa_modify_formal_parameters (current_function_decl, adjustments, "ISRA");
cfg_changed = ipa_sra_modify_function_body (adjustments); cfg_changed = ipa_sra_modify_function_body (adjustments);
sra_ipa_reset_debug_stmts (adjustments); sra_ipa_reset_debug_stmts (adjustments);
convert_callers (new_node, node->symbol.decl, adjustments); convert_callers (new_node, node->decl, adjustments);
cgraph_make_node_local (new_node); cgraph_make_node_local (new_node);
return cfg_changed; return cfg_changed;
} }
@ -4958,7 +4958,7 @@ ipa_sra_preliminary_function_checks (struct cgraph_node *node)
return false; return false;
} }
if (!tree_versionable_function_p (node->symbol.decl)) if (!tree_versionable_function_p (node->decl))
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, "Function is not versionable.\n"); fprintf (dump_file, "Function is not versionable.\n");
@ -4972,7 +4972,7 @@ ipa_sra_preliminary_function_checks (struct cgraph_node *node)
return false; return false;
} }
if ((DECL_COMDAT (node->symbol.decl) || DECL_EXTERNAL (node->symbol.decl)) if ((DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl))
&& inline_summary (node)->size >= MAX_INLINE_INSNS_AUTO) && inline_summary (node)->size >= MAX_INLINE_INSNS_AUTO)
{ {
if (dump_file) if (dump_file)
@ -4995,7 +4995,7 @@ ipa_sra_preliminary_function_checks (struct cgraph_node *node)
return false; return false;
} }
if (TYPE_ATTRIBUTES (TREE_TYPE (node->symbol.decl))) if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
return false; return false;
return true; return true;

View File

@ -2877,10 +2877,10 @@ get_constraint_for_ssa_var (tree t, vec<ce_s> *results, bool address_p)
&& (TREE_STATIC (t) || DECL_EXTERNAL (t))) && (TREE_STATIC (t) || DECL_EXTERNAL (t)))
{ {
struct varpool_node *node = varpool_get_node (t); struct varpool_node *node = varpool_get_node (t);
if (node && node->symbol.alias && node->symbol.analyzed) if (node && node->alias && node->analyzed)
{ {
node = varpool_variable_node (node, NULL); node = varpool_variable_node (node, NULL);
t = node->symbol.decl; t = node->decl;
} }
} }
@ -5754,7 +5754,7 @@ create_variable_info_for (tree decl, const char *name)
/* If this is a global variable with an initializer and we are in /* If this is a global variable with an initializer and we are in
IPA mode generate constraints for it. */ IPA mode generate constraints for it. */
if (DECL_INITIAL (decl) if (DECL_INITIAL (decl)
&& vnode->symbol.definition) && vnode->definition)
{ {
vec<ce_s> rhsc = vNULL; vec<ce_s> rhsc = vNULL;
struct constraint_expr lhs, *rhsp; struct constraint_expr lhs, *rhsp;
@ -7060,9 +7060,9 @@ struct pt_solution ipa_escaped_pt
static bool static bool
associate_varinfo_to_alias (struct cgraph_node *node, void *data) associate_varinfo_to_alias (struct cgraph_node *node, void *data)
{ {
if ((node->symbol.alias || node->thunk.thunk_p) if ((node->alias || node->thunk.thunk_p)
&& node->symbol.analyzed) && node->analyzed)
insert_vi_for_tree (node->symbol.decl, (varinfo_t)data); insert_vi_for_tree (node->decl, (varinfo_t)data);
return false; return false;
} }
@ -7097,18 +7097,18 @@ ipa_pta_execute (void)
gcc_assert (!node->clone_of); gcc_assert (!node->clone_of);
vi = create_function_info_for (node->symbol.decl, vi = create_function_info_for (node->decl,
alias_get_name (node->symbol.decl)); alias_get_name (node->decl));
cgraph_for_node_and_aliases (node, associate_varinfo_to_alias, vi, true); cgraph_for_node_and_aliases (node, associate_varinfo_to_alias, vi, true);
} }
/* Create constraints for global variables and their initializers. */ /* Create constraints for global variables and their initializers. */
FOR_EACH_VARIABLE (var) FOR_EACH_VARIABLE (var)
{ {
if (var->symbol.alias && var->symbol.analyzed) if (var->alias && var->analyzed)
continue; continue;
get_vi_for_tree (var->symbol.decl); get_vi_for_tree (var->decl);
} }
if (dump_file) if (dump_file)
@ -7133,32 +7133,32 @@ ipa_pta_execute (void)
{ {
fprintf (dump_file, fprintf (dump_file,
"Generating constraints for %s", cgraph_node_name (node)); "Generating constraints for %s", cgraph_node_name (node));
if (DECL_ASSEMBLER_NAME_SET_P (node->symbol.decl)) if (DECL_ASSEMBLER_NAME_SET_P (node->decl))
fprintf (dump_file, " (%s)", fprintf (dump_file, " (%s)",
IDENTIFIER_POINTER IDENTIFIER_POINTER
(DECL_ASSEMBLER_NAME (node->symbol.decl))); (DECL_ASSEMBLER_NAME (node->decl)));
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
func = DECL_STRUCT_FUNCTION (node->symbol.decl); func = DECL_STRUCT_FUNCTION (node->decl);
push_cfun (func); push_cfun (func);
/* For externally visible or attribute used annotated functions use /* For externally visible or attribute used annotated functions use
local constraints for their arguments. local constraints for their arguments.
For local functions we see all callers and thus do not need initial For local functions we see all callers and thus do not need initial
constraints for parameters. */ constraints for parameters. */
if (node->symbol.used_from_other_partition if (node->used_from_other_partition
|| node->symbol.externally_visible || node->externally_visible
|| node->symbol.force_output) || node->force_output)
{ {
intra_create_variable_infos (); intra_create_variable_infos ();
/* We also need to make function return values escape. Nothing /* We also need to make function return values escape. Nothing
escapes by returning from main though. */ escapes by returning from main though. */
if (!MAIN_NAME_P (DECL_NAME (node->symbol.decl))) if (!MAIN_NAME_P (DECL_NAME (node->decl)))
{ {
varinfo_t fi, rvi; varinfo_t fi, rvi;
fi = lookup_vi_for_tree (node->symbol.decl); fi = lookup_vi_for_tree (node->decl);
rvi = first_vi_for_offset (fi, fi_result); rvi = first_vi_for_offset (fi, fi_result);
if (rvi && rvi->offset == fi_result) if (rvi && rvi->offset == fi_result)
{ {
@ -7238,7 +7238,7 @@ ipa_pta_execute (void)
if (!cgraph_function_with_gimple_body_p (node) || node->clone_of) if (!cgraph_function_with_gimple_body_p (node) || node->clone_of)
continue; continue;
fn = DECL_STRUCT_FUNCTION (node->symbol.decl); fn = DECL_STRUCT_FUNCTION (node->decl);
/* Compute the points-to sets for pointer SSA_NAMEs. */ /* Compute the points-to sets for pointer SSA_NAMEs. */
FOR_EACH_VEC_ELT (*fn->gimple_df->ssa_names, i, ptr) FOR_EACH_VEC_ELT (*fn->gimple_df->ssa_names, i, ptr)
@ -7249,7 +7249,7 @@ ipa_pta_execute (void)
} }
/* Compute the call-use and call-clobber sets for all direct calls. */ /* Compute the call-use and call-clobber sets for all direct calls. */
fi = lookup_vi_for_tree (node->symbol.decl); fi = lookup_vi_for_tree (node->decl);
gcc_assert (fi->is_fn_info); gcc_assert (fi->is_fn_info);
clobbers clobbers
= find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers)); = find_what_var_points_to (first_vi_for_offset (fi, fi_clobbers));

View File

@ -552,7 +552,7 @@ increase_alignment (void)
/* Increase the alignment of all global arrays for vectorization. */ /* Increase the alignment of all global arrays for vectorization. */
FOR_EACH_DEFINED_VARIABLE (vnode) FOR_EACH_DEFINED_VARIABLE (vnode)
{ {
tree vectype, decl = vnode->symbol.decl; tree vectype, decl = vnode->decl;
tree t; tree t;
unsigned int alignment; unsigned int alignment;

View File

@ -5009,7 +5009,7 @@ free_lang_data_in_decl (tree decl)
{ {
struct cgraph_node *node; struct cgraph_node *node;
if (!(node = cgraph_get_node (decl)) if (!(node = cgraph_get_node (decl))
|| (!node->symbol.definition && !node->clones)) || (!node->definition && !node->clones))
{ {
if (node) if (node)
cgraph_release_function_body (node); cgraph_release_function_body (node);
@ -5423,14 +5423,14 @@ find_decls_types_in_node (struct cgraph_node *n, struct free_lang_data_d *fld)
unsigned ix; unsigned ix;
tree t; tree t;
find_decls_types (n->symbol.decl, fld); find_decls_types (n->decl, fld);
if (!gimple_has_body_p (n->symbol.decl)) if (!gimple_has_body_p (n->decl))
return; return;
gcc_assert (current_function_decl == NULL_TREE && cfun == NULL); gcc_assert (current_function_decl == NULL_TREE && cfun == NULL);
fn = DECL_STRUCT_FUNCTION (n->symbol.decl); fn = DECL_STRUCT_FUNCTION (n->decl);
/* Traverse locals. */ /* Traverse locals. */
FOR_EACH_LOCAL_DECL (fn, ix, t) FOR_EACH_LOCAL_DECL (fn, ix, t)
@ -5486,7 +5486,7 @@ find_decls_types_in_node (struct cgraph_node *n, struct free_lang_data_d *fld)
static void static void
find_decls_types_in_var (struct varpool_node *v, struct free_lang_data_d *fld) find_decls_types_in_var (struct varpool_node *v, struct free_lang_data_d *fld)
{ {
find_decls_types (v->symbol.decl, fld); find_decls_types (v->decl, fld);
} }
/* If T needs an assembler name, have one created for it. */ /* If T needs an assembler name, have one created for it. */

View File

@ -1208,9 +1208,9 @@ init_node_map (bool local)
" with nodes %s/%i %s/%i\n", " with nodes %s/%i %s/%i\n",
n->profile_id, n->profile_id,
cgraph_node_name (n), cgraph_node_name (n),
n->symbol.order, n->order,
symtab_node_name (*(symtab_node*)val), symtab_node_name (*(symtab_node*)val),
(*(symtab_node *)val)->symbol.order); (*(symtab_node *)val)->order);
n->profile_id = (n->profile_id + 1) & 0x7fffffff; n->profile_id = (n->profile_id + 1) & 0x7fffffff;
} }
} }
@ -1221,7 +1221,7 @@ init_node_map (bool local)
"Node %s/%i has no profile-id" "Node %s/%i has no profile-id"
" (profile feedback missing?)\n", " (profile feedback missing?)\n",
cgraph_node_name (n), cgraph_node_name (n),
n->symbol.order); n->order);
continue; continue;
} }
else if ((val = pointer_map_contains (cgraph_node_map, else if ((val = pointer_map_contains (cgraph_node_map,
@ -1232,7 +1232,7 @@ init_node_map (bool local)
"Node %s/%i has IP profile-id %i conflict. " "Node %s/%i has IP profile-id %i conflict. "
"Giving up.\n", "Giving up.\n",
cgraph_node_name (n), cgraph_node_name (n),
n->symbol.order, n->order,
n->profile_id); n->profile_id);
*val = NULL; *val = NULL;
continue; continue;
@ -1273,7 +1273,7 @@ static bool
check_ic_target (gimple call_stmt, struct cgraph_node *target) check_ic_target (gimple call_stmt, struct cgraph_node *target)
{ {
location_t locus; location_t locus;
if (gimple_check_call_matching_types (call_stmt, target->symbol.decl, true)) if (gimple_check_call_matching_types (call_stmt, target->decl, true))
return true; return true;
locus = gimple_location (call_stmt); locus = gimple_location (call_stmt);
@ -1316,7 +1316,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
load_stmt = gimple_build_assign (tmp0, tmp); load_stmt = gimple_build_assign (tmp0, tmp);
gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
tmp = fold_convert (optype, build_addr (direct_call->symbol.decl, tmp = fold_convert (optype, build_addr (direct_call->decl,
current_function_decl)); current_function_decl));
load_stmt = gimple_build_assign (tmp1, tmp); load_stmt = gimple_build_assign (tmp1, tmp);
gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
@ -1328,8 +1328,8 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
gimple_set_vuse (icall_stmt, NULL_TREE); gimple_set_vuse (icall_stmt, NULL_TREE);
update_stmt (icall_stmt); update_stmt (icall_stmt);
dcall_stmt = gimple_copy (icall_stmt); dcall_stmt = gimple_copy (icall_stmt);
gimple_call_set_fndecl (dcall_stmt, direct_call->symbol.decl); gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
dflags = flags_from_decl_or_type (direct_call->symbol.decl); dflags = flags_from_decl_or_type (direct_call->decl);
if ((dflags & ECF_NORETURN) != 0) if ((dflags & ECF_NORETURN) != 0)
gimple_call_set_lhs (dcall_stmt, NULL_TREE); gimple_call_set_lhs (dcall_stmt, NULL_TREE);
gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
@ -1494,7 +1494,7 @@ gimple_ic_transform (gimple_stmt_iterator *gsi)
fprintf (dump_file, "Indirect call -> direct call "); fprintf (dump_file, "Indirect call -> direct call ");
print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM); print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
fprintf (dump_file, "=> "); fprintf (dump_file, "=> ");
print_generic_expr (dump_file, direct_call->symbol.decl, TDF_SLIM); print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
fprintf (dump_file, " transformation skipped because of type mismatch"); fprintf (dump_file, " transformation skipped because of type mismatch");
print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
} }
@ -1507,7 +1507,7 @@ gimple_ic_transform (gimple_stmt_iterator *gsi)
fprintf (dump_file, "Indirect call -> direct call "); fprintf (dump_file, "Indirect call -> direct call ");
print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM); print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
fprintf (dump_file, "=> "); fprintf (dump_file, "=> ");
print_generic_expr (dump_file, direct_call->symbol.decl, TDF_SLIM); print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
fprintf (dump_file, " transformation on insn postponned to ipa-profile"); fprintf (dump_file, " transformation on insn postponned to ipa-profile");
print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
fprintf (dump_file, "hist->count "HOST_WIDEST_INT_PRINT_DEC fprintf (dump_file, "hist->count "HOST_WIDEST_INT_PRINT_DEC

View File

@ -2357,7 +2357,7 @@ mark_decl_referenced (tree decl)
definition. */ definition. */
struct cgraph_node *node = cgraph_get_create_node (decl); struct cgraph_node *node = cgraph_get_create_node (decl);
if (!DECL_EXTERNAL (decl) if (!DECL_EXTERNAL (decl)
&& !node->symbol.definition) && !node->definition)
cgraph_mark_force_output_node (node); cgraph_mark_force_output_node (node);
} }
else if (TREE_CODE (decl) == VAR_DECL) else if (TREE_CODE (decl) == VAR_DECL)
@ -2365,7 +2365,7 @@ mark_decl_referenced (tree decl)
struct varpool_node *node = varpool_node_for_decl (decl); struct varpool_node *node = varpool_node_for_decl (decl);
/* C++ frontend use mark_decl_references to force COMDAT variables /* C++ frontend use mark_decl_references to force COMDAT variables
to be output that might appear dead otherwise. */ to be output that might appear dead otherwise. */
node->symbol.force_output = true; node->force_output = true;
} }
/* else do nothing - we can get various sorts of CST nodes here, /* else do nothing - we can get various sorts of CST nodes here,
which do not need to be marked. */ which do not need to be marked. */
@ -5384,7 +5384,7 @@ find_decl (tree target)
{ {
symtab_node node = symtab_node_for_asm (target); symtab_node node = symtab_node_for_asm (target);
if (node) if (node)
return node->symbol.decl; return node->decl;
return NULL_TREE; return NULL_TREE;
} }
@ -5669,9 +5669,9 @@ assemble_alias (tree decl, tree target)
/* Allow aliases to aliases. */ /* Allow aliases to aliases. */
if (TREE_CODE (decl) == FUNCTION_DECL) if (TREE_CODE (decl) == FUNCTION_DECL)
cgraph_get_create_node (decl)->symbol.alias = true; cgraph_get_create_node (decl)->alias = true;
else else
varpool_node_for_decl (decl)->symbol.alias = true; varpool_node_for_decl (decl)->alias = true;
/* If the target has already been emitted, we don't have to queue the /* If the target has already been emitted, we don't have to queue the
alias. This saves a tad of memory. */ alias. This saves a tad of memory. */
@ -5774,12 +5774,12 @@ dump_tm_clone_pairs (vec<tm_alias_pair> tm_alias_pairs)
TM_GETTMCLONE. If neither of these are true, we didn't generate TM_GETTMCLONE. If neither of these are true, we didn't generate
a clone, and we didn't call it indirectly... no sense keeping it a clone, and we didn't call it indirectly... no sense keeping it
in the clone table. */ in the clone table. */
if (!dst_n || !dst_n->symbol.definition) if (!dst_n || !dst_n->definition)
continue; continue;
/* This covers the case where we have optimized the original /* This covers the case where we have optimized the original
function away, and only access the transactional clone. */ function away, and only access the transactional clone. */
if (!src_n || !src_n->symbol.definition) if (!src_n || !src_n->definition)
continue; continue;
if (!switched) if (!switched)
@ -6724,20 +6724,20 @@ default_binds_local_p_1 (const_tree exp, int shlib)
&& (TREE_STATIC (exp) || DECL_EXTERNAL (exp))) && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
{ {
struct varpool_node *vnode = varpool_get_node (exp); struct varpool_node *vnode = varpool_get_node (exp);
if (vnode && resolution_local_p (vnode->symbol.resolution)) if (vnode && resolution_local_p (vnode->resolution))
resolved_locally = true; resolved_locally = true;
if (vnode if (vnode
&& resolution_to_local_definition_p (vnode->symbol.resolution)) && resolution_to_local_definition_p (vnode->resolution))
resolved_to_local_def = true; resolved_to_local_def = true;
} }
else if (TREE_CODE (exp) == FUNCTION_DECL && TREE_PUBLIC (exp)) else if (TREE_CODE (exp) == FUNCTION_DECL && TREE_PUBLIC (exp))
{ {
struct cgraph_node *node = cgraph_get_node (exp); struct cgraph_node *node = cgraph_get_node (exp);
if (node if (node
&& resolution_local_p (node->symbol.resolution)) && resolution_local_p (node->resolution))
resolved_locally = true; resolved_locally = true;
if (node if (node
&& resolution_to_local_definition_p (node->symbol.resolution)) && resolution_to_local_definition_p (node->resolution))
resolved_to_local_def = true; resolved_to_local_def = true;
} }
@ -6818,15 +6818,15 @@ decl_binds_to_current_def_p (tree decl)
{ {
struct varpool_node *vnode = varpool_get_node (decl); struct varpool_node *vnode = varpool_get_node (decl);
if (vnode if (vnode
&& vnode->symbol.resolution != LDPR_UNKNOWN) && vnode->resolution != LDPR_UNKNOWN)
return resolution_to_local_definition_p (vnode->symbol.resolution); return resolution_to_local_definition_p (vnode->resolution);
} }
else if (TREE_CODE (decl) == FUNCTION_DECL) else if (TREE_CODE (decl) == FUNCTION_DECL)
{ {
struct cgraph_node *node = cgraph_get_node (decl); struct cgraph_node *node = cgraph_get_node (decl);
if (node if (node
&& node->symbol.resolution != LDPR_UNKNOWN) && node->resolution != LDPR_UNKNOWN)
return resolution_to_local_definition_p (node->symbol.resolution); return resolution_to_local_definition_p (node->resolution);
} }
/* Otherwise we have to assume the worst for DECL_WEAK (hidden weaks /* Otherwise we have to assume the worst for DECL_WEAK (hidden weaks
binds locally but still can be overwritten), DECL_COMMON (can be merged binds locally but still can be overwritten), DECL_COMMON (can be merged

View File

@ -135,7 +135,7 @@ struct varpool_node *
varpool_create_empty_node (void) varpool_create_empty_node (void)
{ {
struct varpool_node *node = ggc_alloc_cleared_varpool_node (); struct varpool_node *node = ggc_alloc_cleared_varpool_node ();
node->symbol.type = SYMTAB_VARIABLE; node->type = SYMTAB_VARIABLE;
return node; return node;
} }
@ -149,8 +149,8 @@ varpool_node_for_decl (tree decl)
return node; return node;
node = varpool_create_empty_node (); node = varpool_create_empty_node ();
node->symbol.decl = decl; node->decl = decl;
symtab_register_node ((symtab_node)node); symtab_register_node (node);
return node; return node;
} }
@ -160,15 +160,15 @@ varpool_remove_node (struct varpool_node *node)
{ {
tree init; tree init;
varpool_call_node_removal_hooks (node); varpool_call_node_removal_hooks (node);
symtab_unregister_node ((symtab_node)node); symtab_unregister_node (node);
/* Because we remove references from external functions before final compilation, /* Because we remove references from external functions before final compilation,
we may end up removing useful constructors. we may end up removing useful constructors.
FIXME: We probably want to trace boundaries better. */ FIXME: We probably want to trace boundaries better. */
if ((init = ctor_for_folding (node->symbol.decl)) == error_mark_node) if ((init = ctor_for_folding (node->decl)) == error_mark_node)
varpool_remove_initializer (node); varpool_remove_initializer (node);
else else
DECL_INITIAL (node->symbol.decl) = init; DECL_INITIAL (node->decl) = init;
ggc_free (node); ggc_free (node);
} }
@ -176,10 +176,10 @@ varpool_remove_node (struct varpool_node *node)
void void
varpool_remove_initializer (struct varpool_node *node) varpool_remove_initializer (struct varpool_node *node)
{ {
if (DECL_INITIAL (node->symbol.decl) if (DECL_INITIAL (node->decl)
&& !DECL_IN_CONSTANT_POOL (node->symbol.decl) && !DECL_IN_CONSTANT_POOL (node->decl)
/* Keep vtables for BINFO folding. */ /* Keep vtables for BINFO folding. */
&& !DECL_VIRTUAL_P (node->symbol.decl) && !DECL_VIRTUAL_P (node->decl)
/* FIXME: http://gcc.gnu.org/PR55395 */ /* FIXME: http://gcc.gnu.org/PR55395 */
&& debug_info_level == DINFO_LEVEL_NONE && debug_info_level == DINFO_LEVEL_NONE
/* When doing declaration merging we have duplicate /* When doing declaration merging we have duplicate
@ -187,26 +187,26 @@ varpool_remove_initializer (struct varpool_node *node)
the boides, or we will end up remiving the boides, or we will end up remiving
wrong one. */ wrong one. */
&& cgraph_state != CGRAPH_LTO_STREAMING) && cgraph_state != CGRAPH_LTO_STREAMING)
DECL_INITIAL (node->symbol.decl) = error_mark_node; DECL_INITIAL (node->decl) = error_mark_node;
} }
/* Dump given cgraph node. */ /* Dump given cgraph node. */
void void
dump_varpool_node (FILE *f, struct varpool_node *node) dump_varpool_node (FILE *f, struct varpool_node *node)
{ {
dump_symtab_base (f, (symtab_node)node); dump_symtab_base (f, node);
fprintf (f, " Availability: %s\n", fprintf (f, " Availability: %s\n",
cgraph_function_flags_ready cgraph_function_flags_ready
? cgraph_availability_names[cgraph_variable_initializer_availability (node)] ? cgraph_availability_names[cgraph_variable_initializer_availability (node)]
: "not-ready"); : "not-ready");
fprintf (f, " Varpool flags:"); fprintf (f, " Varpool flags:");
if (DECL_INITIAL (node->symbol.decl)) if (DECL_INITIAL (node->decl))
fprintf (f, " initialized"); fprintf (f, " initialized");
if (node->output) if (node->output)
fprintf (f, " output"); fprintf (f, " output");
if (TREE_READONLY (node->symbol.decl)) if (TREE_READONLY (node->decl))
fprintf (f, " read-only"); fprintf (f, " read-only");
if (ctor_for_folding (node->symbol.decl) != error_mark_node) if (ctor_for_folding (node->decl) != error_mark_node)
fprintf (f, " const-value-known"); fprintf (f, " const-value-known");
fprintf (f, "\n"); fprintf (f, "\n");
} }
@ -275,7 +275,7 @@ ctor_for_folding (tree decl)
if (node) if (node)
{ {
real_node = varpool_variable_node (node); real_node = varpool_variable_node (node);
real_decl = real_node->symbol.decl; real_decl = real_node->decl;
} }
else else
real_decl = decl; real_decl = decl;
@ -292,7 +292,7 @@ ctor_for_folding (tree decl)
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
{ {
node = varpool_alias_target (node); node = varpool_alias_target (node);
decl = node->symbol.decl; decl = node->decl;
} }
} }
@ -342,7 +342,7 @@ varpool_add_new_variable (tree decl)
node = varpool_node_for_decl (decl); node = varpool_node_for_decl (decl);
varpool_call_variable_insertion_hooks (node); varpool_call_variable_insertion_hooks (node);
if (varpool_externally_visible_p (node)) if (varpool_externally_visible_p (node))
node->symbol.externally_visible = true; node->externally_visible = true;
} }
/* Return variable availability. See cgraph.h for description of individual /* Return variable availability. See cgraph.h for description of individual
@ -351,14 +351,14 @@ enum availability
cgraph_variable_initializer_availability (struct varpool_node *node) cgraph_variable_initializer_availability (struct varpool_node *node)
{ {
gcc_assert (cgraph_function_flags_ready); gcc_assert (cgraph_function_flags_ready);
if (!node->symbol.definition) if (!node->definition)
return AVAIL_NOT_AVAILABLE; return AVAIL_NOT_AVAILABLE;
if (!TREE_PUBLIC (node->symbol.decl)) if (!TREE_PUBLIC (node->decl))
return AVAIL_AVAILABLE; return AVAIL_AVAILABLE;
if (DECL_IN_CONSTANT_POOL (node->symbol.decl) if (DECL_IN_CONSTANT_POOL (node->decl)
|| DECL_VIRTUAL_P (node->symbol.decl)) || DECL_VIRTUAL_P (node->decl))
return AVAIL_AVAILABLE; return AVAIL_AVAILABLE;
if (node->symbol.alias && node->symbol.weakref) if (node->alias && node->weakref)
{ {
enum availability avail; enum availability avail;
@ -369,8 +369,8 @@ cgraph_variable_initializer_availability (struct varpool_node *node)
/* If the variable can be overwritten, return OVERWRITABLE. Takes /* If the variable can be overwritten, return OVERWRITABLE. Takes
care of at least one notable extension - the COMDAT variables care of at least one notable extension - the COMDAT variables
used to share template instantiations in C++. */ used to share template instantiations in C++. */
if (decl_replaceable_p (node->symbol.decl) if (decl_replaceable_p (node->decl)
|| DECL_EXTERNAL (node->symbol.decl)) || DECL_EXTERNAL (node->decl))
return AVAIL_OVERWRITABLE; return AVAIL_OVERWRITABLE;
return AVAIL_AVAILABLE; return AVAIL_AVAILABLE;
} }
@ -378,24 +378,24 @@ cgraph_variable_initializer_availability (struct varpool_node *node)
void void
varpool_analyze_node (struct varpool_node *node) varpool_analyze_node (struct varpool_node *node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
/* When reading back varpool at LTO time, we re-construct the queue in order /* When reading back varpool at LTO time, we re-construct the queue in order
to have "needed" list right by inserting all needed nodes into varpool. to have "needed" list right by inserting all needed nodes into varpool.
We however don't want to re-analyze already analyzed nodes. */ We however don't want to re-analyze already analyzed nodes. */
if (!node->symbol.analyzed) if (!node->analyzed)
{ {
gcc_assert (!in_lto_p || cgraph_function_flags_ready); gcc_assert (!in_lto_p || cgraph_function_flags_ready);
/* Compute the alignment early so function body expanders are /* Compute the alignment early so function body expanders are
already informed about increased alignment. */ already informed about increased alignment. */
align_variable (decl, 0); align_variable (decl, 0);
} }
if (node->symbol.alias) if (node->alias)
symtab_resolve_alias symtab_resolve_alias
((symtab_node) node, (symtab_node) varpool_get_node (node->symbol.alias_target)); (node, varpool_get_node (node->alias_target));
else if (DECL_INITIAL (decl)) else if (DECL_INITIAL (decl))
record_references_in_initializer (decl, node->symbol.analyzed); record_references_in_initializer (decl, node->analyzed);
node->symbol.analyzed = true; node->analyzed = true;
} }
/* Assemble thunks and aliases associated to NODE. */ /* Assemble thunks and aliases associated to NODE. */
@ -405,12 +405,12 @@ assemble_aliases (struct varpool_node *node)
{ {
int i; int i;
struct ipa_ref *ref; struct ipa_ref *ref;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
struct varpool_node *alias = ipa_ref_referring_varpool_node (ref); struct varpool_node *alias = ipa_ref_referring_varpool_node (ref);
do_assemble_alias (alias->symbol.decl, do_assemble_alias (alias->decl,
DECL_ASSEMBLER_NAME (node->symbol.decl)); DECL_ASSEMBLER_NAME (node->decl));
assemble_aliases (alias); assemble_aliases (alias);
} }
} }
@ -420,11 +420,11 @@ assemble_aliases (struct varpool_node *node)
bool bool
varpool_assemble_decl (struct varpool_node *node) varpool_assemble_decl (struct varpool_node *node)
{ {
tree decl = node->symbol.decl; tree decl = node->decl;
/* Aliases are outout when their target is produced or by /* Aliases are outout when their target is produced or by
output_weakrefs. */ output_weakrefs. */
if (node->symbol.alias) if (node->alias)
return false; return false;
/* Constant pool is output from RTL land when the reference /* Constant pool is output from RTL land when the reference
@ -448,12 +448,12 @@ varpool_assemble_decl (struct varpool_node *node)
&& TREE_CODE (decl) == VAR_DECL && TREE_CODE (decl) == VAR_DECL
&& !DECL_HAS_VALUE_EXPR_P (decl)); && !DECL_HAS_VALUE_EXPR_P (decl));
if (!node->symbol.in_other_partition if (!node->in_other_partition
&& !DECL_EXTERNAL (decl)) && !DECL_EXTERNAL (decl))
{ {
assemble_variable (decl, 0, 1, 0); assemble_variable (decl, 0, 1, 0);
gcc_assert (TREE_ASM_WRITTEN (decl)); gcc_assert (TREE_ASM_WRITTEN (decl));
node->symbol.definition = true; node->definition = true;
assemble_aliases (node); assemble_aliases (node);
return true; return true;
} }
@ -467,10 +467,10 @@ varpool_assemble_decl (struct varpool_node *node)
static void static void
enqueue_node (struct varpool_node *node, struct varpool_node **first) enqueue_node (struct varpool_node *node, struct varpool_node **first)
{ {
if (node->symbol.aux) if (node->aux)
return; return;
gcc_checking_assert (*first); gcc_checking_assert (*first);
node->symbol.aux = *first; node->aux = *first;
*first = node; *first = node;
} }
@ -494,11 +494,11 @@ varpool_remove_unreferenced_decls (void)
fprintf (cgraph_dump_file, "Trivially needed variables:"); fprintf (cgraph_dump_file, "Trivially needed variables:");
FOR_EACH_DEFINED_VARIABLE (node) FOR_EACH_DEFINED_VARIABLE (node)
{ {
if (node->symbol.analyzed if (node->analyzed
&& (!varpool_can_remove_if_no_refs (node) && (!varpool_can_remove_if_no_refs (node)
/* We just expanded all function bodies. See if any of /* We just expanded all function bodies. See if any of
them needed the variable. */ them needed the variable. */
|| DECL_RTL_SET_P (node->symbol.decl))) || DECL_RTL_SET_P (node->decl)))
{ {
enqueue_node (node, &first); enqueue_node (node, &first);
if (cgraph_dump_file) if (cgraph_dump_file)
@ -508,27 +508,27 @@ varpool_remove_unreferenced_decls (void)
while (first != (struct varpool_node *)(void *)1) while (first != (struct varpool_node *)(void *)1)
{ {
node = first; node = first;
first = (struct varpool_node *)first->symbol.aux; first = (struct varpool_node *)first->aux;
if (node->symbol.same_comdat_group) if (node->same_comdat_group)
{ {
symtab_node next; symtab_node next;
for (next = node->symbol.same_comdat_group; for (next = node->same_comdat_group;
next != (symtab_node)node; next != node;
next = next->symbol.same_comdat_group) next = next->same_comdat_group)
{ {
varpool_node *vnext = dyn_cast <varpool_node> (next); varpool_node *vnext = dyn_cast <varpool_node> (next);
if (vnext && vnext->symbol.analyzed) if (vnext && vnext->analyzed)
enqueue_node (vnext, &first); enqueue_node (vnext, &first);
} }
} }
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_reference_iterate (&node->ref_list, i, ref); i++)
{ {
varpool_node *vnode = dyn_cast <varpool_node> (ref->referred); varpool_node *vnode = dyn_cast <varpool_node> (ref->referred);
if (vnode if (vnode
&& (!DECL_EXTERNAL (ref->referred->symbol.decl) && (!DECL_EXTERNAL (ref->referred->decl)
|| vnode->symbol.alias) || vnode->alias)
&& vnode->symbol.analyzed) && vnode->analyzed)
enqueue_node (vnode, &first); enqueue_node (vnode, &first);
} }
} }
@ -537,7 +537,7 @@ varpool_remove_unreferenced_decls (void)
for (node = varpool_first_defined_variable (); node; node = next) for (node = varpool_first_defined_variable (); node; node = next)
{ {
next = varpool_next_defined_variable (node); next = varpool_next_defined_variable (node);
if (!node->symbol.aux) if (!node->aux)
{ {
if (cgraph_dump_file) if (cgraph_dump_file)
fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node)); fprintf (cgraph_dump_file, " %s", varpool_node_asm_name (node));
@ -555,14 +555,14 @@ varpool_remove_unreferenced_decls (void)
void void
varpool_finalize_named_section_flags (struct varpool_node *node) varpool_finalize_named_section_flags (struct varpool_node *node)
{ {
if (!TREE_ASM_WRITTEN (node->symbol.decl) if (!TREE_ASM_WRITTEN (node->decl)
&& !node->symbol.alias && !node->alias
&& !node->symbol.in_other_partition && !node->in_other_partition
&& !DECL_EXTERNAL (node->symbol.decl) && !DECL_EXTERNAL (node->decl)
&& TREE_CODE (node->symbol.decl) == VAR_DECL && TREE_CODE (node->decl) == VAR_DECL
&& !DECL_HAS_VALUE_EXPR_P (node->symbol.decl) && !DECL_HAS_VALUE_EXPR_P (node->decl)
&& DECL_SECTION_NAME (node->symbol.decl)) && DECL_SECTION_NAME (node->decl))
get_variable_section (node->symbol.decl, false); get_variable_section (node->decl, false);
} }
/* Output all variables enqueued to be assembled. */ /* Output all variables enqueued to be assembled. */
@ -607,7 +607,7 @@ add_new_static_var (tree type)
new_node = varpool_node_for_decl (new_decl); new_node = varpool_node_for_decl (new_decl);
varpool_finalize_decl (new_decl); varpool_finalize_decl (new_decl);
return new_node->symbol.decl; return new_node->decl;
} }
/* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful. /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
@ -621,11 +621,11 @@ varpool_create_variable_alias (tree alias, tree decl)
gcc_assert (TREE_CODE (decl) == VAR_DECL); gcc_assert (TREE_CODE (decl) == VAR_DECL);
gcc_assert (TREE_CODE (alias) == VAR_DECL); gcc_assert (TREE_CODE (alias) == VAR_DECL);
alias_node = varpool_node_for_decl (alias); alias_node = varpool_node_for_decl (alias);
alias_node->symbol.alias = true; alias_node->alias = true;
alias_node->symbol.definition = true; alias_node->definition = true;
alias_node->symbol.alias_target = decl; alias_node->alias_target = decl;
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL) if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
alias_node->symbol.weakref = true; alias_node->weakref = true;
return alias_node; return alias_node;
} }
@ -642,15 +642,15 @@ varpool_extra_name_alias (tree alias, tree decl)
return NULL; return NULL;
#endif #endif
alias_node = varpool_create_variable_alias (alias, decl); alias_node = varpool_create_variable_alias (alias, decl);
alias_node->symbol.cpp_implicit_alias = true; alias_node->cpp_implicit_alias = true;
/* Extra name alias mechanizm creates aliases really late /* Extra name alias mechanizm creates aliases really late
via DECL_ASSEMBLER_NAME mechanizm. via DECL_ASSEMBLER_NAME mechanizm.
This is unfortunate because they are not going through the This is unfortunate because they are not going through the
standard channels. Ensure they get output. */ standard channels. Ensure they get output. */
if (cpp_implicit_aliases_done) if (cpp_implicit_aliases_done)
symtab_resolve_alias ((symtab_node)alias_node, symtab_resolve_alias (alias_node,
(symtab_node)varpool_node_for_decl (decl)); varpool_node_for_decl (decl));
return alias_node; return alias_node;
} }
@ -669,7 +669,7 @@ varpool_for_node_and_aliases (struct varpool_node *node,
if (callback (node, data)) if (callback (node, data))
return true; return true;
for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++) for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++)
if (ref->use == IPA_REF_ALIAS) if (ref->use == IPA_REF_ALIAS)
{ {
struct varpool_node *alias = ipa_ref_referring_varpool_node (ref); struct varpool_node *alias = ipa_ref_referring_varpool_node (ref);