Mark initialized struct/array defs as initalized.

Also, use the initialized flag for setting up the initalized var set in
flow_uninitialized().
This commit is contained in:
Bill Currie 2012-11-24 15:26:27 +09:00
parent f4604d9db5
commit dbbca47a3b
2 changed files with 19 additions and 1 deletions

View file

@ -514,12 +514,14 @@ initialize_def (symbol_t *sym, type_t *type, expr_t *init, defspace_t *space,
if ((is_array (type) || is_struct (type))
&& init->type == ex_block && !init->e.block.result) {
init_elements (sym->s.def, init);
sym->s.def->initialized = 1;
} else {
if (!type_assignable (type, get_type (init))) {
error (init, "type mismatch in initializer");
return;
}
if (local_expr) {
sym->s.def->initialized = 1;
init = assign_expr (new_symbol_expr (sym), init);
// fold_constants takes care of int/float conversions
append_expr (local_expr, fold_constants (init));

View file

@ -219,6 +219,21 @@ flowvar_is_param (flowvar_t *var)
return 1;
}
static int
flowvar_is_initialized (flowvar_t *var)
{
symbol_t *sym;
def_t *def;
if (var->op->op_type != op_symbol)
return 0;
sym = var->op->o.symbol;
if (sym->sy_type != sy_var)
return 0;
def = sym->s.def;
return def->initialized;
}
flowvar_t *
flow_get_var (operand_t *op)
{
@ -467,7 +482,8 @@ flow_uninitialized (flowgraph_t *graph)
tmp = set_new ();
for (i = 0; i < func->num_vars; i++) {
flowvar_t *var = func->vars[i];
if (flowvar_is_global (var) || flowvar_is_param (var))
if (flowvar_is_global (var) || flowvar_is_param (var)
|| flowvar_is_initialized (var))
set_add (tmp, i);
}
// first, calculate use and def for each block, and initialize the in and