X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcgraph.h;h=8be0354c2e2359d0d9a1b663e0d001506192f324;hb=329d3a2b57fdd28d824d71b84d357cbd3aa2b890;hp=14848b5e6b957a08db66a18dafed280aef6ec09d;hpb=0835ad03325b16dbc28ea1e7b53b3b2491dc2d6d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 14848b5e6b9..8be0354c2e2 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -256,10 +256,10 @@ DEF_VEC_ALLOC_P(cgraph_node_ptr,gc); /* A cgraph node set is a collection of cgraph nodes. A cgraph node can appear in multiple sets. */ -struct GTY(()) cgraph_node_set_def +struct cgraph_node_set_def { - htab_t GTY((param_is (struct cgraph_node_set_element_def))) hashtab; - VEC(cgraph_node_ptr, gc) *nodes; + struct pointer_map_t *map; + VEC(cgraph_node_ptr, heap) *nodes; }; typedef struct varpool_node *varpool_node_ptr; @@ -270,10 +270,10 @@ DEF_VEC_ALLOC_P(varpool_node_ptr,gc); /* A varpool node set is a collection of varpool nodes. A varpool node can appear in multiple sets. */ -struct GTY(()) varpool_node_set_def +struct varpool_node_set_def { - htab_t GTY((param_is (struct varpool_node_set_element_def))) hashtab; - VEC(varpool_node_ptr, gc) *nodes; + struct pointer_map_t * map; + VEC(varpool_node_ptr, heap) *nodes; }; typedef struct cgraph_node_set_def *cgraph_node_set; @@ -288,17 +288,6 @@ DEF_VEC_P(varpool_node_set); DEF_VEC_ALLOC_P(varpool_node_set,gc); DEF_VEC_ALLOC_P(varpool_node_set,heap); -/* A cgraph node set element contains an index in the vector of nodes in - the set. */ -struct GTY(()) cgraph_node_set_element_def -{ - struct cgraph_node *node; - HOST_WIDE_INT index; -}; - -typedef struct cgraph_node_set_element_def *cgraph_node_set_element; -typedef const struct cgraph_node_set_element_def *const_cgraph_node_set_element; - /* Iterator structure for cgraph node sets. */ typedef struct { @@ -306,17 +295,6 @@ typedef struct unsigned index; } cgraph_node_set_iterator; -/* A varpool node set element contains an index in the vector of nodes in - the set. */ -struct GTY(()) varpool_node_set_element_def -{ - struct varpool_node *node; - HOST_WIDE_INT index; -}; - -typedef struct varpool_node_set_element_def *varpool_node_set_element; -typedef const struct varpool_node_set_element_def *const_varpool_node_set_element; - /* Iterator structure for varpool node sets. */ typedef struct { @@ -528,7 +506,8 @@ struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_node *, gimple, unsigned, gcov_type, int, bool); struct cgraph_node * cgraph_clone_node (struct cgraph_node *, tree, gcov_type, - int, bool, VEC(cgraph_edge_p,heap) *); + int, bool, VEC(cgraph_edge_p,heap) *, + bool); void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *); void cgraph_make_edge_direct (struct cgraph_edge *, struct cgraph_node *, @@ -573,7 +552,7 @@ void cgraph_mark_needed_node (struct cgraph_node *); void cgraph_mark_address_taken_node (struct cgraph_node *); void cgraph_mark_reachable_node (struct cgraph_node *); bool cgraph_inline_p (struct cgraph_edge *, cgraph_inline_failed_t *reason); -bool cgraph_preserve_function_body_p (tree); +bool cgraph_preserve_function_body_p (struct cgraph_node *); void verify_cgraph (void); void verify_cgraph_node (struct cgraph_node *); void cgraph_build_static_cdtor (char which, tree body, int priority); @@ -625,7 +604,6 @@ int compute_call_stmt_bb_frequency (tree, basic_block bb); /* In ipa.c */ bool cgraph_remove_unreachable_nodes (bool, FILE *); -int cgraph_postorder (struct cgraph_node **); cgraph_node_set cgraph_node_set_new (void); cgraph_node_set_iterator cgraph_node_set_find (cgraph_node_set, struct cgraph_node *); @@ -633,6 +611,7 @@ void cgraph_node_set_add (cgraph_node_set, struct cgraph_node *); void cgraph_node_set_remove (cgraph_node_set, struct cgraph_node *); void dump_cgraph_node_set (FILE *, cgraph_node_set); void debug_cgraph_node_set (cgraph_node_set); +void free_cgraph_node_set (cgraph_node_set); varpool_node_set varpool_node_set_new (void); varpool_node_set_iterator varpool_node_set_find (varpool_node_set, @@ -641,6 +620,7 @@ void varpool_node_set_add (varpool_node_set, struct varpool_node *); void varpool_node_set_remove (varpool_node_set, struct varpool_node *); void dump_varpool_node_set (FILE *, varpool_node_set); void debug_varpool_node_set (varpool_node_set); +void free_varpool_node_set (varpool_node_set); void ipa_discover_readonly_nonaddressable_vars (void); bool cgraph_comdat_can_be_unshared_p (struct cgraph_node *); @@ -716,6 +696,79 @@ varpool_next_static_initializer (struct varpool_node *node) for ((node) = varpool_first_static_initializer (); (node); \ (node) = varpool_next_static_initializer (node)) +/* Return first function with body defined. */ +static inline struct cgraph_node * +cgraph_first_defined_function (void) +{ + struct cgraph_node *node; + for (node = cgraph_nodes; node; node = node->next) + { + if (node->analyzed) + return node; + } + return NULL; +} + +/* Return next reachable static variable with initializer after NODE. */ +static inline struct cgraph_node * +cgraph_next_defined_function (struct cgraph_node *node) +{ + for (node = node->next; node; node = node->next) + { + if (node->analyzed) + return node; + } + return NULL; +} + +/* Walk all functions with body defined. */ +#define FOR_EACH_DEFINED_FUNCTION(node) \ + for ((node) = cgraph_first_defined_function (); (node); \ + (node) = cgraph_next_defined_function (node)) + + +/* Return true when NODE is a function with Gimple body defined + in current unit. Functions can also be define externally or they + can be thunks with no Gimple representation. + + Note that at WPA stage, the function body may not be present in memory. */ + +static inline bool +cgraph_function_with_gimple_body_p (struct cgraph_node *node) +{ + return node->analyzed && !node->thunk.thunk_p; +} + +/* Return first function with body defined. */ +static inline struct cgraph_node * +cgraph_first_function_with_gimple_body (void) +{ + struct cgraph_node *node; + for (node = cgraph_nodes; node; node = node->next) + { + if (cgraph_function_with_gimple_body_p (node)) + return node; + } + return NULL; +} + +/* Return next reachable static variable with initializer after NODE. */ +static inline struct cgraph_node * +cgraph_next_function_with_gimple_body (struct cgraph_node *node) +{ + for (node = node->next; node; node = node->next) + { + if (cgraph_function_with_gimple_body_p (node)) + return node; + } + return NULL; +} + +/* Walk all functions with body defined. */ +#define FOR_EACH_FUNCTION_WITH_GIMPLE_BODY(node) \ + for ((node) = cgraph_first_function_with_gimple_body (); (node); \ + (node) = cgraph_next_function_with_gimple_body (node)) + /* Create a new static variable of type TYPE. */ tree add_new_static_var (tree type); @@ -764,7 +817,7 @@ cgraph_node_in_set_p (struct cgraph_node *node, cgraph_node_set set) static inline size_t cgraph_node_set_size (cgraph_node_set set) { - return htab_elements (set->hashtab); + return VEC_length (cgraph_node_ptr, set->nodes); } /* Return true if iterator VSI points to nothing. */ @@ -812,7 +865,7 @@ varpool_node_in_set_p (struct varpool_node *node, varpool_node_set set) static inline size_t varpool_node_set_size (varpool_node_set set) { - return htab_elements (set->hashtab); + return VEC_length (varpool_node_ptr, set->nodes); } /* Uniquize all constants that appear in memory.