X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcgraph.h;h=42a74f549b47efe0bb3644936f409ce215769af4;hb=7276a1d0ae9820d291035bd42f87bd876f9164ce;hp=2a1c1b3b949451a9118c59ac13080ad691e18c89;hpb=113a8828735449dffb3f9e2dbac00ae4235b68d2;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 2a1c1b3b949..42a74f549b4 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -16,12 +16,35 @@ for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. */ #ifndef GCC_CGRAPH_H #define GCC_CGRAPH_H #include "tree.h" +#include "basic-block.h" + +enum availability +{ + /* Not yet set by cgraph_function_body_availability. */ + AVAIL_UNSET, + /* Function body/variable initializer is unknown. */ + AVAIL_NOT_AVAILABLE, + /* Function body/variable initializer is known but might be replaced + by a different one from other compilation unit and thus needs to + be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have + arbitrary side effects on escaping variables and functions, while + like AVAILABLE it might access static variables. */ + AVAIL_OVERWRITABLE, + /* Function body/variable initializer is known and will be used in final + program. */ + AVAIL_AVAILABLE, + /* Function body/variable initializer is known and all it's uses are explicitly + visible within current unit (ie it's address is never taken and it is not + exported to other units). + Currently used only for functions. */ + AVAIL_LOCAL +}; /* Information about the function collected locally. Available after function is analyzed. */ @@ -35,6 +58,9 @@ struct cgraph_local_info GTY(()) and its address is never taken. */ bool local; + /* Set when function is visible by other units. */ + bool externally_visible; + /* Set once it has been finalized so we consider it to be output. */ bool finalized; @@ -51,6 +77,10 @@ struct cgraph_local_info GTY(()) /* True if statics_read_for_function and statics_written_for_function contain valid data. */ bool for_functions_valid; + + /* True if the function is going to be emitted in some other translation + unit, referenced from vtable. */ + bool vtable_method; }; /* Information about the function that needs to be computed globally @@ -64,6 +94,9 @@ struct cgraph_global_info GTY(()) /* Estimated size of the function after inlining. */ int insns; + /* Estimated growth after inlining. INT_MIN if not computed. */ + int estimated_growth; + /* Set iff the function has been inlined at least once. */ bool inlined; }; @@ -74,8 +107,6 @@ struct cgraph_global_info GTY(()) struct cgraph_rtl_info GTY(()) { int preferred_incoming_stack_boundary; - bool const_function; - bool pure_function; }; /* The cgraph data structure. @@ -99,12 +130,18 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) /* Pointer to the next clone. */ struct cgraph_node *next_clone; struct cgraph_node *prev_clone; + /* Pointer to a single unique cgraph node for this function. If the + function is to be output, this is the copy that will survive. */ + struct cgraph_node *master_clone; + PTR GTY ((skip)) aux; struct cgraph_local_info local; struct cgraph_global_info global; struct cgraph_rtl_info rtl; + /* Expected number of executions: calculated in profile.c. */ + gcov_type count; /* Unique id of the node. */ int uid; /* Set when function must be output - it is externally visible @@ -113,11 +150,17 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous"))) /* Set when function is reachable by call from other function that is either reachable or needed. */ bool reachable; + /* Set once the function is lowered (ie it's CFG is built). */ + bool lowered; /* Set once the function has been instantiated and its callee lists created. */ bool analyzed; /* Set when function is scheduled to be assembled. */ bool output; + /* Set when function is visible by other units. */ + bool externally_visible; + /* Set for aliases once they got through assemble_alias. */ + bool alias; }; struct cgraph_edge GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"))) @@ -128,11 +171,15 @@ struct cgraph_edge GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_call struct cgraph_edge *next_caller; struct cgraph_edge *prev_callee; struct cgraph_edge *next_callee; - tree call_expr; + tree call_stmt; PTR GTY ((skip (""))) aux; /* When NULL, inline this call. When non-NULL, points to the explanation why function was not inlined. */ const char *inline_failed; + /* Expected number of executions: calculated in profile.c. */ + gcov_type count; + /* Depth of loop nest, 1 means no loop nest. */ + int loop_nest; }; /* The cgraph_varpool data structure. @@ -149,54 +196,79 @@ struct cgraph_varpool_node GTY(()) /* Set when function must be output - it is externally visible or its address is taken. */ bool needed; + /* Needed variables might become dead by optimization. This flag + forces the variable to be output even if it appears dead otherwise. */ + bool force_output; + /* Set once the variable has been instantiated and its callee + lists created. */ + bool analyzed; /* Set once it has been finalized so we consider it to be output. */ bool finalized; - /* Set when function is scheduled to be assembled. */ + /* Set when variable is scheduled to be assembled. */ bool output; + /* Set when function is visible by other units. */ + bool externally_visible; + /* Set for aliases once they got through assemble_alias. */ + bool alias; }; extern GTY(()) struct cgraph_node *cgraph_nodes; extern GTY(()) int cgraph_n_nodes; extern GTY(()) int cgraph_max_uid; extern bool cgraph_global_info_ready; +extern bool cgraph_function_flags_ready; extern GTY(()) struct cgraph_node *cgraph_nodes_queue; +extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_first_unanalyzed_node; extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_nodes_queue; /* In cgraph.c */ void dump_cgraph (FILE *); void dump_cgraph_node (FILE *, struct cgraph_node *); +void dump_varpool (FILE *); +void dump_cgraph_varpool_node (FILE *, struct cgraph_varpool_node *); void cgraph_remove_edge (struct cgraph_edge *); void cgraph_remove_node (struct cgraph_node *); void cgraph_node_remove_callees (struct cgraph_node *node); struct cgraph_edge *cgraph_create_edge (struct cgraph_node *, struct cgraph_node *, - tree); -struct cgraph_node *cgraph_node (tree decl); + tree, gcov_type, int); +struct cgraph_node *cgraph_node (tree); struct cgraph_node *cgraph_node_for_asm (tree asmname); -struct cgraph_edge *cgraph_edge (struct cgraph_node *, tree call_expr); +struct cgraph_edge *cgraph_edge (struct cgraph_node *, tree); struct cgraph_local_info *cgraph_local_info (tree); struct cgraph_global_info *cgraph_global_info (tree); struct cgraph_rtl_info *cgraph_rtl_info (tree); const char * cgraph_node_name (struct cgraph_node *); -struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_node *, tree); -struct cgraph_node * cgraph_clone_node (struct cgraph_node *); +struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, + struct cgraph_node *, + tree, gcov_type, int, bool); +struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type, + int, bool); -struct cgraph_varpool_node *cgraph_varpool_node (tree decl); +struct cgraph_varpool_node *cgraph_varpool_node (tree); struct cgraph_varpool_node *cgraph_varpool_node_for_asm (tree asmname); void cgraph_varpool_mark_needed_node (struct cgraph_varpool_node *); void cgraph_varpool_finalize_decl (tree); -bool cgraph_varpool_assemble_pending_decls (void); void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *); bool cgraph_function_possibly_inlined_p (tree); -void cgraph_unnest_node (struct cgraph_node *node); +void cgraph_unnest_node (struct cgraph_node *); +void cgraph_varpool_enqueue_needed_node (struct cgraph_varpool_node *); +void cgraph_varpool_reset_queue (void); +bool decide_is_variable_needed (struct cgraph_varpool_node *, tree); + +enum availability cgraph_function_body_availability (struct cgraph_node *); +enum availability cgraph_variable_initializer_availability (struct cgraph_varpool_node *); +bool cgraph_is_master_clone (struct cgraph_node *); +struct cgraph_node *cgraph_master_clone (struct cgraph_node *); /* In cgraphunit.c */ bool cgraph_assemble_pending_functions (void); +bool cgraph_varpool_assemble_pending_decls (void); void cgraph_finalize_function (tree, bool); +void cgraph_lower_function (struct cgraph_node *); void cgraph_finalize_compilation_unit (void); -void cgraph_create_edges (struct cgraph_node *, tree); void cgraph_optimize (void); void cgraph_mark_needed_node (struct cgraph_node *); void cgraph_mark_reachable_node (struct cgraph_node *); @@ -204,10 +276,19 @@ bool cgraph_inline_p (struct cgraph_edge *, const char **reason); bool cgraph_preserve_function_body_p (tree); void verify_cgraph (void); void verify_cgraph_node (struct cgraph_node *); -void cgraph_mark_inline_edge (struct cgraph_edge *e); -void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate); void cgraph_build_static_cdtor (char which, tree body, int priority); void cgraph_reset_static_var_maps (void); void init_cgraph (void); - +struct cgraph_node *cgraph_function_versioning (struct cgraph_node *, + varray_type, varray_type); + +/* In ipa.c */ +bool cgraph_remove_unreachable_nodes (bool, FILE *); +int cgraph_postorder (struct cgraph_node **); + +/* In ipa-inline.c */ +bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool); +void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool); +void cgraph_mark_inline_edge (struct cgraph_edge *, bool); +bool cgraph_default_inline_p (struct cgraph_node *, const char **); #endif /* GCC_CGRAPH_H */