From dbbca47a3b00beb6b71929d5aaac1c87245e4294 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 24 Nov 2012 15:26:27 +0900 Subject: [PATCH] Mark initialized struct/array defs as initalized. Also, use the initialized flag for setting up the initalized var set in flow_uninitialized(). --- tools/qfcc/source/def.c | 2 ++ tools/qfcc/source/flow.c | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tools/qfcc/source/def.c b/tools/qfcc/source/def.c index 79d623aec..982e6b6bf 100644 --- a/tools/qfcc/source/def.c +++ b/tools/qfcc/source/def.c @@ -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)); diff --git a/tools/qfcc/source/flow.c b/tools/qfcc/source/flow.c index 58a148ba0..fbc86358d 100644 --- a/tools/qfcc/source/flow.c +++ b/tools/qfcc/source/flow.c @@ -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