mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
a3bfa8b80c
commit
67348ccc9c
412
gcc/ChangeLog
412
gcc/ChangeLog
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 ())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
10
gcc/asan.c
10
gcc/asan.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
306
gcc/cgraph.c
306
gcc/cgraph.c
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
130
gcc/cgraph.h
130
gcc/cgraph.h
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
302
gcc/cgraphunit.c
302
gcc/cgraphunit.c
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
62
gcc/ipa-cp.c
62
gcc/ipa-cp.c
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
168
gcc/ipa-inline.c
168
gcc/ipa-inline.c
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 "
|
||||||
|
|
|
||||||
|
|
@ -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
428
gcc/ipa.c
|
|
@ -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 ();
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
278
gcc/lto-cgraph.c
278
gcc/lto-cgraph.c
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
34
gcc/passes.c
34
gcc/passes.c
|
|
@ -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;
|
||||||
|
|
|
||||||
386
gcc/symtab.c
386
gcc/symtab.c
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 ();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
10
gcc/tree.c
10
gcc/tree.c
|
|
@ -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. */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
30
gcc/varasm.c
30
gcc/varasm.c
|
|
@ -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
|
||||||
|
|
|
||||||
138
gcc/varpool.c
138
gcc/varpool.c
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue