if (TREE_READONLY (t))
return false;
+ /* We can not track variables with address taken. */
+ if (TREE_ADDRESSABLE (t))
+ return false;
+
+ /* TODO: We could track public variables that are not addressable, but currently
+ frontends don't give us those. */
+ if (TREE_PUBLIC (t))
+ return false;
+
+ /* TODO: Check aliases. */
+
/* This is a variable we care about. Check if we have seen it
before, and if not add it the set of variables we care about. */
if (all_module_statics
return x == all_module_statics;
}
-/* Compute X &= Y, taking into account the possibility that
- X may become the maximum set. */
-
-static bool
-intersect_static_var_sets (bitmap &x, bitmap y)
-{
- if (x != all_module_statics)
- {
- bitmap_and_into (x, y);
- /* As with union_static_var_sets, reducing to the maximum
- set as early as possible is an overall win. */
- if (bitmap_equal_p (x, all_module_statics))
- {
- BITMAP_FREE (x);
- x = all_module_statics;
- }
- }
- return x == all_module_statics;
-}
-
/* Return a copy of SET on the bitmap obstack containing SET.
But if SET is NULL or the maximum set, return that instead. */
propagate (void)
{
struct cgraph_node *node;
- varpool_node *vnode;
struct cgraph_node **order =
XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
int order_pos;
ipa_discover_readonly_nonaddressable_vars ();
generate_summary ();
- /* Now we know what vars are really statics; prune out those that aren't. */
- FOR_EACH_VARIABLE (vnode)
- if (vnode->externally_visible
- || TREE_ADDRESSABLE (vnode->decl)
- || TREE_READONLY (vnode->decl)
- || !is_proper_for_analysis (vnode->decl)
- || !vnode->definition)
- bitmap_clear_bit (all_module_statics, DECL_UID (vnode->decl));
-
- /* Forget info we collected "just for fun" on variables that turned out to be
- non-local. */
- FOR_EACH_DEFINED_FUNCTION (node)
- {
- ipa_reference_local_vars_info_t node_l;
- node_l = &get_reference_vars_info (node)->local;
- intersect_static_var_sets (node_l->statics_read, all_module_statics);
- intersect_static_var_sets (node_l->statics_written, all_module_statics);
- }
-
/* Propagate the local information through the call graph to produce
the global information. All the nodes within a cycle will have
the same info so we collapse cycles first. Then we can do the