mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-25 23:26:16 +08:00
2010-04-28 Martin Jambor <mjambor@suse.cz> * cgraph.h (struct cgraph_node): New field indirect_calls. (struct cgraph_indirect_call_info): New type. (struct cgraph_edge): Removed field indirect_call. New fields indirect_info, indirect_inlining_edge and indirect_unknown_callee. (cgraph_create_indirect_edge): Declare. (cgraph_make_edge_direct): Likewise. (enum LTO_cgraph_tags): New item LTO_cgraph_indirect_edge. * ipa-prop.h (struct ipa_param_call_note): Removed. (struct ipa_node_params): Removed field param_calls. (ipa_create_all_structures_for_iinln): Declare. * cgraph.c: Described indirect edges and uids in initial comment. (cgraph_add_edge_to_call_site_hash): New function. (cgraph_edge): Search also among the indirect edges, use cgraph_add_edge_to_call_site_hash to add edges to the call site hash. (cgraph_set_call_stmt): Possibly turn an indirect edge into a direct one, use cgraph_add_edge_to_call_site_hash to add edges to the call site hash. (initialize_inline_failed): Assign a reason to indirect edges. (cgraph_create_edge_1): New function. (cgraph_create_edge): Moved some functionality to cgraph_create_edge_1. (cgraph_create_indirect_edge): New function. (cgraph_edge_remove_callee): Add an assert checking for non-indirectness. (cgraph_edge_remove_caller): Special-case indirect edges. (cgraph_remove_edge): Likewise. (cgraph_set_edge_callee): New function. (cgraph_redirect_edge_callee): Use cgraph_set_edge_callee. (cgraph_make_edge_direct): New function. (cgraph_update_edges_for_call_stmt_node): Do nothing only when also the declaration of the call statement matches. (cgraph_node_remove_callees): Special-case indirect edges. (cgraph_clone_edge): Likewise. (cgraph_clone_node): Clone also the indirect edges. (dump_cgraph_node): Dump indirect_inlining_edge flag instead of indirect_call, dump count of indirect_calls edges. * ipa-prop.c (iinlining_processed_edges): New variable. (ipa_note_param_call): Create indirect edges instead of creating notes. New parameter node. (ipa_analyze_call_uses): New parameter node, pass it on to ipa_note_param_call. (ipa_analyze_stmt_uses): Likewise. (ipa_analyze_params_uses): Pass node to ipa_analyze_stmt_uses. (print_edge_addition_message): Work on edges rather than on notes. (update_call_notes_after_inlining): Likewise, renamed to update_indirect_edges_after_inlining. (ipa_create_all_structures_for_iinln): New function. (ipa_free_node_params_substructures): Do not free notes. (ipa_edge_duplication_hook): Propagate bits within iinlining_processed_edges bitmap. (ipa_node_duplication_hook): Do not duplicate notes. (free_all_ipa_structures_after_ipa_cp): Renamed to ipa_free_all_structures_after_ipa_cp. (free_all_ipa_structures_after_iinln): Renamed to ipa_free_all_structures_after_iinln.g (ipa_write_param_call_note): Removed. (ipa_read_param_call_note): Removed. (ipa_write_indirect_edge_info): New function. (ipa_read_indirect_edge_info): Likewise. (ipa_write_node_info): Do not stream notes, do stream information in indirect edges. (ipa_read_node_info): Likewise. (lto_ipa_fixup_call_notes): Removed. * ipa-cp.c (pass_ipa_cp): Set stmt_fixup to NULL. * ipa-inline.c (pass_ipa_inline): Likewise. * cgraphunit.c (verify_cgraph_node): Check also indirect edges. * cif-code.def (INDIRECT_UNKNOWN_CALL): New reason. * tree-inline.c (copy_bb): Removed an unnecessary double check for is_gimple_call. * tree-inline.c (get_indirect_callee_fndecl): Do not consider indirect edges. * lto-cgraph.c (output_outgoing_cgraph_edges): New function. (output_cgraph): Stream also indirect edges. (lto_output_edge): Added capability to stream indirect edges. (input_edge): Likewise. (input_cgraph_1): Likewise. * testsuite/gcc.dg/lto/20091209-1_0.c: New testcase. From-SVN: r158827
91 lines
3.4 KiB
Modula-2
91 lines
3.4 KiB
Modula-2
/* This file contains the definitions of the cgraph_inline_failed_t
|
|
enums used in GCC.
|
|
|
|
Copyright (C) 2008 Free Software Foundation, Inc.
|
|
Contributed by Doug Kwan <dougkwan@google.com>
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
/* The format of this file is
|
|
DEFCIFCODE(code, string).
|
|
|
|
Where symbol is the enumeration name without the ``''.
|
|
The argument STRING is a explain the failure. Except for OK,
|
|
which is a NULL pointer. */
|
|
|
|
/* Inlining successful. This must be the first code. */
|
|
DEFCIFCODE(OK , NULL)
|
|
|
|
/* Inlining failed for an unspecified reason. */
|
|
DEFCIFCODE(UNSPECIFIED , "")
|
|
|
|
/* Function has not be considered for inlining. This is the code for
|
|
functions that have not been rejected for inlining yet. */
|
|
DEFCIFCODE(FUNCTION_NOT_CONSIDERED,
|
|
N_("function not considered for inlining"))
|
|
|
|
/* Inlining failed owing to unavailable function body. */
|
|
DEFCIFCODE(BODY_NOT_AVAILABLE, N_("function body not available"))
|
|
|
|
DEFCIFCODE(REDEFINED_EXTERN_INLINE,
|
|
N_("redefined extern inline functions are not considered for "
|
|
"inlining"))
|
|
|
|
/* Function is not inlinable. */
|
|
DEFCIFCODE(FUNCTION_NOT_INLINABLE, N_("function not inlinable"))
|
|
|
|
/* Function is not an inlining candidate. */
|
|
DEFCIFCODE(FUNCTION_NOT_INLINE_CANDIDATE, N_("function not inline candidate"))
|
|
|
|
/* Inlining failed because of various limit parameters. */
|
|
DEFCIFCODE(LARGE_FUNCTION_GROWTH_LIMIT,
|
|
N_("--param large-function-growth limit reached"))
|
|
DEFCIFCODE(LARGE_STACK_FRAME_GROWTH_LIMIT,
|
|
N_("--param large-stack-frame-growth limit reached"))
|
|
DEFCIFCODE(MAX_INLINE_INSNS_SINGLE_LIMIT,
|
|
N_("--param max-inline-insns-single limit reached"))
|
|
DEFCIFCODE(MAX_INLINE_INSNS_AUTO_LIMIT,
|
|
N_("--param max-inline-insns-auto limit reached"))
|
|
DEFCIFCODE(INLINE_UNIT_GROWTH_LIMIT,
|
|
N_("--param inline-unit-growth limit reached"))
|
|
|
|
/* Recursive inlining. */
|
|
DEFCIFCODE(RECURSIVE_INLINING, N_("recursive inlining"))
|
|
|
|
/* Call is unlikely. */
|
|
DEFCIFCODE(UNLIKELY_CALL, N_("call is unlikely and code size would grow"))
|
|
|
|
/* Function is not declared as an inline. */
|
|
DEFCIFCODE(NOT_DECLARED_INLINED,
|
|
N_("function not declared inline and code size would grow"))
|
|
|
|
/* Inlining suppressed due to size optimization. */
|
|
DEFCIFCODE(OPTIMIZING_FOR_SIZE,
|
|
N_("optimizing for size and code size would grow"))
|
|
|
|
/* Inlining failed because of mismatched options or arguments. */
|
|
DEFCIFCODE(TARGET_OPTION_MISMATCH, N_("target specific option mismatch"))
|
|
DEFCIFCODE(MISMATCHED_ARGUMENTS, N_("mismatched arguments"))
|
|
|
|
/* Call was originally indirect. */
|
|
DEFCIFCODE(ORIGINALLY_INDIRECT_CALL,
|
|
N_("originally indirect function call not considered for inlining"))
|
|
|
|
/* Ths edge represents an indirect edge with a yet-undetermined callee . */
|
|
DEFCIFCODE(INDIRECT_UNKNOWN_CALL,
|
|
N_("indirect function call with a yet undetermined callee"))
|