/* Return variable availability. See cgraph.h for description of individual return values. */ enum availability cgraph_variable_initializer_availability (varpool_node *node) { if (!node->definition) return AVAIL_NOT_AVAILABLE; if (!TREE_PUBLIC (node->decl)) return AVAIL_AVAILABLE; if (DECL_IN_CONSTANT_POOL (node->decl) || DECL_VIRTUAL_P (node->decl)) return AVAIL_AVAILABLE; if (node->alias && node->weakref) { enum availability avail; cgraph_variable_initializer_availability (varpool_variable_node (node, &avail)); return avail; } /* If the variable can be overwritten, return OVERWRITABLE. Takes care of at least one notable extension - the COMDAT variables used to share template instantiations in C++. */ if (decl_replaceable_p (node->decl) || DECL_EXTERNAL (node->decl)) return AVAIL_OVERWRITABLE; return AVAIL_AVAILABLE; }
/* Dump given cgraph node. */ void dump_varpool_node (FILE *f, varpool_node *node) { dump_symtab_base (f, node); fprintf (f, " Availability: %s\n", cgraph_function_flags_ready ? cgraph_availability_names[cgraph_variable_initializer_availability (node)] : "not-ready"); fprintf (f, " Varpool flags:"); if (DECL_INITIAL (node->decl)) fprintf (f, " initialized"); if (node->output) fprintf (f, " output"); if (node->used_by_single_function) fprintf (f, " used-by-single-function"); if (TREE_READONLY (node->decl)) fprintf (f, " read-only"); if (ctor_for_folding (node->decl) != error_mark_node) fprintf (f, " const-value-known"); if (node->writeonly) fprintf (f, " write-only"); if (node->tls_model) fprintf (f, " %s", tls_model_names [node->tls_model]); fprintf (f, "\n"); }
enum availability symtab_node_availability (symtab_node node) { if (is_a <cgraph_node> (node)) return cgraph_function_body_availability (cgraph (node)); else return cgraph_variable_initializer_availability (varpool (node)); }
/* Dump given cgraph node. */ void dump_varpool_node (FILE *f, struct varpool_node *node) { dump_symtab_base (f, (symtab_node)node); fprintf (f, " Availability: %s\n", cgraph_function_flags_ready ? cgraph_availability_names[cgraph_variable_initializer_availability (node)] : "not-ready"); fprintf (f, " Varpool flags:"); if (DECL_INITIAL (node->symbol.decl)) fprintf (f, " initialized"); if (node->analyzed) fprintf (f, " analyzed"); if (node->finalized) fprintf (f, " finalized"); if (node->output) fprintf (f, " output"); fprintf (f, "\n"); }
/* Dump given cgraph node. */ void dump_varpool_node (FILE *f, struct varpool_node *node) { fprintf (f, "%s:", varpool_node_name (node)); fprintf (f, " availability:%s", cgraph_function_flags_ready ? cgraph_availability_names[cgraph_variable_initializer_availability (node)] : "not-ready"); if (DECL_INITIAL (node->decl)) fprintf (f, " initialized"); if (node->needed) fprintf (f, " needed"); if (node->analyzed) fprintf (f, " analyzed"); if (node->finalized) fprintf (f, " finalized"); if (node->output) fprintf (f, " output"); if (node->externally_visible) fprintf (f, " externally_visible"); fprintf (f, "\n"); }
bool varpool_for_node_and_aliases (varpool_node *node, bool (*callback) (varpool_node *, void *), void *data, bool include_overwritable) { int i; struct ipa_ref *ref; if (callback (node, data)) return true; for (i = 0; ipa_ref_list_referring_iterate (&node->ref_list, i, ref); i++) if (ref->use == IPA_REF_ALIAS) { varpool_node *alias = ipa_ref_referring_varpool_node (ref); if (include_overwritable || cgraph_variable_initializer_availability (alias) > AVAIL_OVERWRITABLE) if (varpool_for_node_and_aliases (alias, callback, data, include_overwritable)) return true; } return false; }
/* Dump given cgraph node. */ void dump_varpool_node (FILE *f, struct varpool_node *node) { fprintf (f, "%s:", varpool_node_name (node)); fprintf (f, " availability:%s", cgraph_function_flags_ready ? cgraph_availability_names[cgraph_variable_initializer_availability (node)] : "not-ready"); if (DECL_ASSEMBLER_NAME_SET_P (node->decl)) fprintf (f, " (asm: %s)", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (node->decl))); if (DECL_INITIAL (node->decl)) fprintf (f, " initialized"); if (TREE_ASM_WRITTEN (node->decl)) fprintf (f, " (asm written)"); if (node->needed) fprintf (f, " needed"); if (node->analyzed) fprintf (f, " analyzed"); if (node->finalized) fprintf (f, " finalized"); if (node->output) fprintf (f, " output"); if (node->externally_visible) fprintf (f, " externally_visible"); if (node->resolution != LDPR_UNKNOWN) fprintf (f, " %s", ld_plugin_symbol_resolution_names[(int)node->resolution]); if (node->in_other_partition) fprintf (f, " in_other_partition"); else if (node->used_from_other_partition) fprintf (f, " used_from_other_partition"); fprintf (f, "\n"); fprintf (f, " References: "); ipa_dump_references (f, &node->ref_list); fprintf (f, " Refering this var: "); ipa_dump_refering (f, &node->ref_list); }