Mercurial > hg > CbC > CbC_gcc
diff gcc/cgraph.h @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/cgraph.h Tue May 25 18:58:51 2010 +0900 +++ b/gcc/cgraph.h Tue Mar 22 17:18:12 2011 +0900 @@ -1,5 +1,5 @@ /* Callgraph handling code. - Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Jan Hubicka @@ -22,6 +22,7 @@ #ifndef GCC_CGRAPH_H #define GCC_CGRAPH_H +#include "plugin-api.h" #include "vec.h" #include "tree.h" #include "basic-block.h" @@ -55,6 +56,7 @@ struct lto_file_decl_data; extern const char * const cgraph_availability_names[]; +extern const char * const ld_plugin_symbol_resolution_names[]; /* Function inlining information. */ @@ -101,7 +103,7 @@ /* Set when function is visible by other units. */ unsigned externally_visible : 1; - + /* Set once it has been finalized so we consider it to be output. */ unsigned finalized : 1; @@ -112,6 +114,10 @@ Currently computed and used only by ipa-cp. */ unsigned versionable : 1; + /* False when function calling convention and signature can not be changed. + This is the case when __builtin_apply_args is used. */ + unsigned can_change_signature : 1; + /* True when function should be inlined independently on its size. */ unsigned disregard_inline_limits : 1; @@ -178,20 +184,6 @@ bitmap combined_args_to_skip; }; -enum node_frequency { - /* This function most likely won't be executed at all. - (set only when profile feedback is available or via function attribute). */ - NODE_FREQUENCY_UNLIKELY_EXECUTED, - /* For functions that are known to be executed once (i.e. constructors, destructors - and main function. */ - NODE_FREQUENCY_EXECUTED_ONCE, - /* The default value. */ - NODE_FREQUENCY_NORMAL, - /* Optimize this function hard - (set only when profile feedback is available or via function attribute). */ - NODE_FREQUENCY_HOT -}; - /* The cgraph data structure. Each function decl has assigned cgraph_node listing callees and callers. */ @@ -226,6 +218,8 @@ /* For functions with many calls sites it holds map from call expression to the edge to speed up cgraph_edge function. */ htab_t GTY((param_is (struct cgraph_edge))) call_site_hash; + /* Declaration node used to be clone of. */ + tree former_clone_of; PTR GTY ((skip)) aux; @@ -243,6 +237,9 @@ /* Expected number of executions: calculated in profile.c. */ gcov_type count; + /* How to scale counts at materialization time; used to merge + LTO units with different number of profile runs. */ + int count_materialization_scale; /* Unique id of the node. */ int uid; /* Ordering of all cgraph nodes. */ @@ -251,6 +248,7 @@ /* unique id for profiling. pid is not suitable because of different number of cfg nodes with -fprofile-generate and -fprofile-use */ int pid; + enum ld_plugin_symbol_resolution resolution; /* Set when function must be output for some reason. The primary use of this flag is to mark functions needed to be output for @@ -278,7 +276,9 @@ /* Set once the function has been instantiated and its callee lists created. */ unsigned analyzed : 1; - /* Set when function is available in the other LTRANS partition. */ + /* Set when function is available in the other LTRANS partition. + During WPA output it is used to mark nodes that are present in + multiple partitions. */ unsigned in_other_partition : 1; /* Set when function is scheduled to be processed by local passes. */ unsigned process : 1; @@ -292,6 +292,10 @@ /* How commonly executed the node is. Initialized during branch probabilities pass. */ ENUM_BITFIELD (node_frequency) frequency : 2; + /* True when function can only be called at startup (from static ctor). */ + unsigned only_called_at_startup : 1; + /* True when function can only be called at startup (from static dtor). */ + unsigned only_called_at_exit : 1; }; typedef struct cgraph_node *cgraph_node_ptr; @@ -306,7 +310,6 @@ { htab_t GTY((param_is (struct cgraph_node_set_element_def))) hashtab; VEC(cgraph_node_ptr, gc) *nodes; - PTR GTY ((skip)) aux; }; typedef struct varpool_node *varpool_node_ptr; @@ -321,7 +324,6 @@ { htab_t GTY((param_is (struct varpool_node_set_element_def))) hashtab; VEC(varpool_node_ptr, gc) *nodes; - PTR GTY ((skip)) aux; }; typedef struct cgraph_node_set_def *cgraph_node_set; @@ -388,6 +390,9 @@ HOST_WIDE_INT anc_offset; /* OBJ_TYPE_REF_TOKEN of a polymorphic call (if polymorphic is set). */ HOST_WIDE_INT otr_token; + /* Delta by which must be added to this parameter to compensate for a skipped + this adjusting thunk. */ + HOST_WIDE_INT thunk_delta; /* Type of the object from OBJ_TYPE_REF_OBJECT. */ tree otr_type; /* Index of the parameter that is called. */ @@ -463,9 +468,12 @@ /* Circular list of nodes in the same comdat group if non-NULL. */ struct varpool_node *same_comdat_group; struct ipa_ref_list ref_list; + /* File stream where this node is being written to. */ + struct lto_file_decl_data * lto_file_data; PTR GTY ((skip)) aux; /* Ordering of all cgraph nodes. */ int order; + enum ld_plugin_symbol_resolution resolution; /* Set when function must be output - it is externally visible or its address is taken. */ @@ -487,7 +495,9 @@ unsigned alias : 1; /* Set when variable is used from other LTRANS partition. */ unsigned used_from_other_partition : 1; - /* Set when variable is available in the other LTRANS partition. */ + /* Set when variable is available in the other LTRANS partition. + During WPA output it is used to mark nodes that are present in + multiple partitions. */ unsigned in_other_partition : 1; }; @@ -543,12 +553,15 @@ struct cgraph_edge *cgraph_create_edge (struct cgraph_node *, struct cgraph_node *, gimple, gcov_type, int, int); -struct cgraph_edge *cgraph_create_indirect_edge (struct cgraph_node *, gimple, int, - gcov_type, int, int); -struct cgraph_node * cgraph_get_node (tree); -struct cgraph_node *cgraph_node (tree); -bool cgraph_same_body_alias (tree, tree); -void cgraph_add_thunk (tree, tree, bool, HOST_WIDE_INT, HOST_WIDE_INT, tree, tree); +struct cgraph_edge *cgraph_create_indirect_edge (struct cgraph_node *, gimple, + int, gcov_type, int, int); +struct cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void); +struct cgraph_node * cgraph_get_node (const_tree); +struct cgraph_node * cgraph_get_node_or_alias (const_tree); +struct cgraph_node * cgraph_node (tree); +struct cgraph_node * cgraph_same_body_alias (struct cgraph_node *, tree, tree); +struct cgraph_node * cgraph_add_thunk (struct cgraph_node *, tree, tree, bool, HOST_WIDE_INT, + HOST_WIDE_INT, tree, tree); void cgraph_remove_same_body_alias (struct cgraph_node *); struct cgraph_node *cgraph_node_for_asm (tree); struct cgraph_edge *cgraph_edge (struct cgraph_node *, gimple); @@ -570,7 +583,8 @@ int, bool, VEC(cgraph_edge_p,heap) *); void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *); -void cgraph_make_edge_direct (struct cgraph_edge *, struct cgraph_node *); +void cgraph_make_edge_direct (struct cgraph_edge *, struct cgraph_node *, + HOST_WIDE_INT); struct cgraph_asm_node *cgraph_add_asm_node (tree); @@ -583,14 +597,25 @@ struct cgraph_node * cgraph_create_virtual_clone (struct cgraph_node *old_node, VEC(cgraph_edge_p,heap)*, VEC(ipa_replace_map_p,gc)* tree_map, - bitmap args_to_skip); + bitmap args_to_skip, + const char *clone_name); void cgraph_set_nothrow_flag (struct cgraph_node *, bool); -void cgraph_set_readonly_flag (struct cgraph_node *, bool); -void cgraph_set_pure_flag (struct cgraph_node *, bool); -void cgraph_set_looping_const_or_pure_flag (struct cgraph_node *, bool); +void cgraph_set_const_flag (struct cgraph_node *, bool, bool); +void cgraph_set_pure_flag (struct cgraph_node *, bool, bool); +tree clone_function_name (tree decl, const char *); +bool cgraph_node_cannot_return (struct cgraph_node *); +bool cgraph_edge_cannot_lead_to_return (struct cgraph_edge *); +bool cgraph_will_be_removed_from_program_if_no_direct_calls + (struct cgraph_node *node); +bool cgraph_can_remove_if_no_direct_calls_and_refs_p + (struct cgraph_node *node); +bool resolution_used_from_other_file_p (enum ld_plugin_symbol_resolution resolution); +bool cgraph_used_from_object_file_p (struct cgraph_node *node); +bool varpool_used_from_object_file_p (struct varpool_node *node); /* In cgraphunit.c */ +extern FILE *cgraph_dump_file; void cgraph_finalize_function (tree, bool); void cgraph_mark_if_needed (tree); void cgraph_finalize_compilation_unit (void); @@ -608,8 +633,10 @@ struct cgraph_node *cgraph_function_versioning (struct cgraph_node *, VEC(cgraph_edge_p,heap)*, VEC(ipa_replace_map_p,gc)*, - bitmap); -void tree_function_versioning (tree, tree, VEC (ipa_replace_map_p,gc)*, bool, bitmap); + bitmap, bitmap, basic_block, + const char *); +void tree_function_versioning (tree, tree, VEC (ipa_replace_map_p,gc)*, bool, bitmap, + bitmap, basic_block); struct cgraph_node *save_inline_function_body (struct cgraph_node *); void record_references_in_initializer (tree, bool); bool cgraph_process_new_functions (void); @@ -667,6 +694,7 @@ void dump_varpool_node_set (FILE *, varpool_node_set); void debug_varpool_node_set (varpool_node_set); void ipa_discover_readonly_nonaddressable_vars (void); +bool cgraph_comdat_can_be_unshared_p (struct cgraph_node *); /* In predict.c */ bool cgraph_maybe_hot_edge_p (struct cgraph_edge *e); @@ -690,16 +718,18 @@ bool cgraph_node_can_be_local_p (struct cgraph_node *); -struct varpool_node * varpool_get_node (tree decl); +struct varpool_node * varpool_get_node (const_tree decl); void varpool_remove_node (struct varpool_node *node); +void varpool_finalize_named_section_flags (struct varpool_node *node); bool varpool_assemble_pending_decls (void); bool varpool_assemble_decl (struct varpool_node *node); bool varpool_analyze_pending_decls (void); void varpool_remove_unreferenced_decls (void); void varpool_empty_needed_queue (void); -bool varpool_extra_name_alias (tree, tree); +struct varpool_node * varpool_extra_name_alias (tree, tree); const char * varpool_node_name (struct varpool_node *node); void varpool_reset_queue (void); +bool const_value_known_p (tree); /* Walk all reachable static variables. */ #define FOR_EACH_STATIC_VARIABLE(node) \ @@ -712,7 +742,7 @@ struct varpool_node *node; for (node = varpool_nodes_queue; node; node = node->next_needed) { - gcc_assert (TREE_CODE (node->decl) == VAR_DECL); + gcc_checking_assert (TREE_CODE (node->decl) == VAR_DECL); if (DECL_INITIAL (node->decl)) return node; } @@ -725,7 +755,7 @@ { for (node = node->next_needed; node; node = node->next_needed) { - gcc_assert (TREE_CODE (node->decl) == VAR_DECL); + gcc_checking_assert (TREE_CODE (node->decl) == VAR_DECL); if (DECL_INITIAL (node->decl)) return node; } @@ -739,7 +769,7 @@ /* In ipa-inline.c */ void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool); -unsigned int compute_inline_parameters (struct cgraph_node *); +void compute_inline_parameters (struct cgraph_node *); /* Create a new static variable of type TYPE. */ @@ -862,14 +892,14 @@ static inline bool cgraph_node_set_nonempty_p (cgraph_node_set set) { - return VEC_length (cgraph_node_ptr, set->nodes); + return !VEC_empty (cgraph_node_ptr, set->nodes); } /* Return true if set is nonempty. */ static inline bool varpool_node_set_nonempty_p (varpool_node_set set) { - return VEC_length (varpool_node_ptr, set->nodes); + return !VEC_empty (varpool_node_ptr, set->nodes); } /* Return true when function NODE is only called directly. @@ -879,17 +909,12 @@ static inline bool cgraph_only_called_directly_p (struct cgraph_node *node) { - return !node->needed && !node->address_taken && !node->local.externally_visible; -} - -/* Return true when function NODE can be removed from callgraph - if all direct calls are eliminated. */ - -static inline bool -cgraph_can_remove_if_no_direct_calls_and_refs_p (struct cgraph_node *node) -{ - return (!node->needed && !node->reachable_from_other_partition - && (DECL_COMDAT (node->decl) || !node->local.externally_visible)); + gcc_assert (!node->global.inlined_to); + return (!node->needed && !node->address_taken + && !node->reachable_from_other_partition + && !DECL_STATIC_CONSTRUCTOR (node->decl) + && !DECL_STATIC_DESTRUCTOR (node->decl) + && !node->local.externally_visible); } /* Return true when function NODE can be removed from callgraph @@ -898,13 +923,28 @@ static inline bool cgraph_can_remove_if_no_direct_calls_p (struct cgraph_node *node) { + /* Extern inlines can always go, we will use the external definition. */ + if (DECL_EXTERNAL (node->decl)) + return true; return !node->address_taken && cgraph_can_remove_if_no_direct_calls_and_refs_p (node); } +/* Return true when function NODE can be removed from callgraph + if all direct calls are eliminated. */ + +static inline bool +varpool_can_remove_if_no_refs (struct varpool_node *node) +{ + return (!node->force_output && !node->used_from_other_partition + && (flag_toplevel_reorder || DECL_COMDAT (node->decl) + || DECL_ARTIFICIAL (node->decl)) + && (DECL_COMDAT (node->decl) || !node->externally_visible)); +} + /* Return true when all references to VNODE must be visible in ipa_ref_list. i.e. if the variable is not externally visible or not used in some magic way (asm statement or such). - The magic uses are all sumarized in force_output flag. */ + The magic uses are all summarized in force_output flag. */ static inline bool varpool_all_refs_explicit_p (struct varpool_node *vnode)