void gfc_run_passes (gfc_namespace *ns) { /* Warn about dubious DO loops where the index might change. */ doloop_size = 20; doloop_level = 0; doloop_list = XNEWVEC(gfc_code *, doloop_size); doloop_warn (ns); XDELETEVEC (doloop_list); if (gfc_option.flag_frontend_optimize) { expr_size = 20; expr_array = XNEWVEC(gfc_expr **, expr_size); optimize_namespace (ns); optimize_reduction (ns); if (gfc_option.dump_fortran_optimized) gfc_dump_parse_tree (ns, stdout); XDELETEVEC (expr_array); }
void diagnostic_finish (diagnostic_context *context) { /* Some of the errors may actually have been warnings. */ if (diagnostic_kind_count (context, DK_WERROR)) { /* -Werror was given. */ if (context->warning_as_error_requested) pp_verbatim (context->printer, _("%s: all warnings being treated as errors"), progname); /* At least one -Werror= was given. */ else pp_verbatim (context->printer, _("%s: some warnings being treated as errors"), progname); pp_newline_and_flush (context->printer); } diagnostic_file_cache_fini (); XDELETEVEC (context->classify_diagnostic); context->classify_diagnostic = NULL; /* diagnostic_initialize allocates context->printer using XNEW and placement-new. */ context->printer->~pretty_printer (); XDELETE (context->printer); context->printer = NULL; }
void params_c_finalize (void) { XDELETEVEC (compiler_params); compiler_params = NULL; num_compiler_params = 0; params_finished = false; }
fcache::~fcache () { if (fp) { fclose (fp); fp = NULL; } if (data) { XDELETEVEC (data); data = 0; } line_record.release (); }
void gfc_run_passes (gfc_namespace *ns) { if (gfc_option.flag_frontend_optimize) { expr_size = 20; expr_array = XNEWVEC(gfc_expr **, expr_size); optimize_namespace (ns); if (gfc_option.dump_fortran_optimized) gfc_dump_parse_tree (ns, stdout); XDELETEVEC (expr_array); }
static int splay_tree_foreach_helper (splay_tree_node node, splay_tree_foreach_fn fn, void *data) { int val; splay_tree_node *stack; int stack_ptr, stack_size; /* A non-recursive implementation is used to avoid filling the stack for large trees. Splay trees are worst case O(n) in the depth of the tree. */ #define INITIAL_STACK_SIZE 100 stack_size = INITIAL_STACK_SIZE; stack_ptr = 0; stack = XNEWVEC (splay_tree_node, stack_size); val = 0; for (;;) { while (node != NULL) { if (stack_ptr == stack_size) { stack_size *= 2; stack = XRESIZEVEC (splay_tree_node, stack, stack_size); } stack[stack_ptr++] = node; node = node->left; } if (stack_ptr == 0) break; node = stack[--stack_ptr]; val = (*fn) (node, data); if (val) break; node = node->right; } XDELETEVEC (stack); return val; }
static void expand_used_vars (void) { tree t, outer_block = DECL_INITIAL (current_function_decl); /* Compute the phase of the stack frame for this function. */ { int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; int off = STARTING_FRAME_OFFSET % align; frame_phase = off ? align - off : 0; } /* Set TREE_USED on all variables in the unexpanded_var_list. */ for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t)) TREE_USED (TREE_VALUE (t)) = 1; /* Clear TREE_USED on all variables associated with a block scope. */ clear_tree_used (outer_block); /* At this point all variables on the unexpanded_var_list with TREE_USED set are not associated with any block scope. Lay them out. */ for (t = cfun->unexpanded_var_list; t; t = TREE_CHAIN (t)) { tree var = TREE_VALUE (t); bool expand_now = false; /* We didn't set a block for static or extern because it's hard to tell the difference between a global variable (re)declared in a local scope, and one that's really declared there to begin with. And it doesn't really matter much, since we're not giving them stack space. Expand them now. */ if (TREE_STATIC (var) || DECL_EXTERNAL (var)) expand_now = true; /* Any variable that could have been hoisted into an SSA_NAME will have been propagated anywhere the optimizers chose, i.e. not confined to their original block. Allocate them as if they were defined in the outermost scope. */ else if (is_gimple_reg (var)) expand_now = true; /* If the variable is not associated with any block, then it was created by the optimizers, and could be live anywhere in the function. */ else if (TREE_USED (var)) expand_now = true; /* Finally, mark all variables on the list as used. We'll use this in a moment when we expand those associated with scopes. */ TREE_USED (var) = 1; if (expand_now) expand_one_var (var, true); } cfun->unexpanded_var_list = NULL_TREE; /* At this point, all variables within the block tree with TREE_USED set are actually used by the optimized function. Lay them out. */ expand_used_vars_for_block (outer_block, true); if (stack_vars_num > 0) { /* Due to the way alias sets work, no variables with non-conflicting alias sets may be assigned the same address. Add conflicts to reflect this. */ add_alias_set_conflicts (); /* Now that we have collected all stack variables, and have computed a minimal interference graph, attempt to save some stack space. */ partition_stack_vars (); if (dump_file) dump_stack_var_partition (); /* Assign rtl to each variable based on these partitions. */ expand_stack_vars (); /* Free up stack variable graph data. */ XDELETEVEC (stack_vars); XDELETEVEC (stack_vars_sorted); XDELETEVEC (stack_vars_conflict); stack_vars = NULL; stack_vars_alloc = stack_vars_num = 0; stack_vars_conflict = NULL; stack_vars_conflict_alloc = 0; } /* If the target requires that FRAME_OFFSET be aligned, do it. */ if (STACK_ALIGNMENT_NEEDED) { HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; if (!FRAME_GROWS_DOWNWARD) frame_offset += align - 1; frame_offset &= -align; } }
static void free_temp_arrays (struct switch_conv_info *info) { XDELETEVEC (info->constructors); XDELETEVEC (info->default_values); }
static void free_temp_arrays (void) { XDELETEVEC (info.constructors); XDELETEVEC (info.default_values); }