static void cgraph_build_cdtor_fns (void) { if (!VEC_empty (tree, static_ctors)) { gcc_assert (!targetm.have_ctors_dtors); qsort (VEC_address (tree, static_ctors), VEC_length (tree, static_ctors), sizeof (tree), compare_ctor); build_cdtor (/*ctor_p=*/true, VEC_address (tree, static_ctors), VEC_length (tree, static_ctors)); VEC_truncate (tree, static_ctors, 0); } if (!VEC_empty (tree, static_dtors)) { gcc_assert (!targetm.have_ctors_dtors); qsort (VEC_address (tree, static_dtors), VEC_length (tree, static_dtors), sizeof (tree), compare_dtor); build_cdtor (/*ctor_p=*/false, VEC_address (tree, static_dtors), VEC_length (tree, static_dtors)); VEC_truncate (tree, static_dtors, 0); } }
static inline void cleanup_build_arrays (void) { build_vdef = NULL_TREE; build_vuse = NULL_TREE; VEC_truncate (tree, build_defs, 0); VEC_truncate (tree, build_uses, 0); }
void clear_edges (void) { basic_block bb; edge e; edge_iterator ei; FOR_EACH_BB (bb) { FOR_EACH_EDGE (e, ei, bb->succs) free_edge (e); VEC_truncate (edge, bb->succs, 0); VEC_truncate (edge, bb->preds, 0); } FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) free_edge (e); VEC_truncate (edge, EXIT_BLOCK_PTR->preds, 0); VEC_truncate (edge, ENTRY_BLOCK_PTR->succs, 0); gcc_assert (!n_edges); }
static VEC (tree, gc) * shared_vuses_from_stmt (tree stmt) { ssa_op_iter iter; tree vuse; if (!stmt) return NULL; VEC_truncate (tree, shared_lookup_vuses, 0); FOR_EACH_SSA_TREE_OPERAND (vuse, stmt, iter, SSA_OP_VUSE) VEC_safe_push (tree, gc, shared_lookup_vuses, vuse); if (VEC_length (tree, shared_lookup_vuses) > 1) sort_vuses (shared_lookup_vuses); return shared_lookup_vuses; }
/* Return SSA names that are unused to GGC memory and compact the SSA version namespace. This is used to keep footprint of compiler during interprocedural optimization. */ static unsigned int release_dead_ssa_names (void) { tree t; unsigned i, j; int n = VEC_length (tree, FREE_SSANAMES (cfun)); referenced_var_iterator rvi; /* Current defs point to various dead SSA names that in turn point to eventually dead variables so a bunch of memory is held live. */ FOR_EACH_REFERENCED_VAR (cfun, t, rvi) set_current_def (t, NULL); /* Now release the freelist. */ VEC_free (tree, gc, FREE_SSANAMES (cfun)); FREE_SSANAMES (cfun) = NULL; /* And compact the SSA number space. We make sure to not change the relative order of SSA versions. */ for (i = 1, j = 1; i < VEC_length (tree, cfun->gimple_df->ssa_names); ++i) { tree name = ssa_name (i); if (name) { if (i != j) { SSA_NAME_VERSION (name) = j; VEC_replace (tree, cfun->gimple_df->ssa_names, j, name); } j++; } } VEC_truncate (tree, cfun->gimple_df->ssa_names, j); statistics_counter_event (cfun, "SSA names released", n); statistics_counter_event (cfun, "SSA name holes removed", i - j); if (dump_file) fprintf (dump_file, "Released %i names, %.2f%%, removed %i holes\n", n, n * 100.0 / num_ssa_names, i - j); return 0; }
/* Emit any file-wide instrumentation. */ void mudflap_finish_file (void) { tree ctor_statements = NULL_TREE; /* No need to continue when there were errors. */ if (errorcount != 0 || sorrycount != 0) return; /* Insert a call to __mf_init. */ { tree call2_stmt = build_function_call_expr (mf_init_fndecl, NULL_TREE); append_to_statement_list (call2_stmt, &ctor_statements); } /* If appropriate, call __mf_set_options to pass along read-ignore mode. */ if (flag_mudflap_ignore_reads) { tree arg = tree_cons (NULL_TREE, mf_build_string ("-ignore-reads"), NULL_TREE); tree call_stmt = build_function_call_expr (mf_set_options_fndecl, arg); append_to_statement_list (call_stmt, &ctor_statements); } /* Process all enqueued object decls. */ if (deferred_static_decls) { size_t i; tree obj; for (i = 0; VEC_iterate (tree, deferred_static_decls, i, obj); i++) { gcc_assert (DECL_P (obj)); if (mf_marked_p (obj)) continue; /* Omit registration for static unaddressed objects. NB: Perform registration for non-static objects regardless of TREE_USED or TREE_ADDRESSABLE, because they may be used from other compilation units. */ if (! TREE_PUBLIC (obj) && ! TREE_ADDRESSABLE (obj)) continue; if (! COMPLETE_TYPE_P (TREE_TYPE (obj))) { warning (0, "mudflap cannot track unknown size extern %qs", IDENTIFIER_POINTER (DECL_NAME (obj))); continue; } mudflap_register_call (obj, size_in_bytes (TREE_TYPE (obj)), mf_varname_tree (obj)); } VEC_truncate (tree, deferred_static_decls, 0); } /* Append all the enqueued registration calls. */ if (enqueued_call_stmt_chain) { append_to_statement_list (enqueued_call_stmt_chain, &ctor_statements); enqueued_call_stmt_chain = NULL_TREE; } cgraph_build_static_cdtor ('I', ctor_statements, MAX_RESERVED_INIT_PRIORITY-1); }