On Thu, Dec 8, 2011 at 2:02 PM, Han Shen(沈涵) <shen...@google.com> wrote:
> +  FOR_EACH_REFERENCED_VAR(cfun, var, rvi)
> +    if (!is_global_var(var) && TREE_ADDRESSABLE(var))
> +      ++gen_stack_protect_signal;
> +
> +  /* Examine local variable declaration. */
> +  if (!gen_stack_protect_signal)
> +    FOR_EACH_LOCAL_DECL (cfun, i, var)
> +      if (TREE_CODE(var) == VAR_DECL && !is_global_var(var)) {
> +       tree var_type = TREE_TYPE(var);
> +       gen_stack_protect_signal += (TREE_CODE(var_type) == ARRAY_TYPE) ||
> +         (RECORD_OR_UNION_TYPE_P(var_type) &&
> +          record_or_union_type_has_array(var_type));
> +      }

How about merging the above two loops and break if you set
gen_stack_protect_signal?  Also I think it is better if you only look
at referenced variables rather than just all local decls.

Something like:
 FOR_EACH_REFERENCED_VAR(cfun, var, rvi)
  if (!is_global_var(var))
    {
      tree var_type = TREE_TYPE(var);
      if (TREE_ADDRESSABLE(var))
        {
          gen_stack_protect_signal = true;
          break;
        }
      if (TREE_CODE (var) == VAR_DECL
         && (TREE_CODE (var_type) == ARRAY_TYPE
               || (RECORD_OR_UNION_TYPE_P (var_type)
                   && record_or_union_type_has_array (var_type))))
        {
          gen_stack_protect_signal = true;
          break;
        }
    }

Also I think you should use const_tree in some places like:
>static int record_or_union_type_has_array(tree tree_type)
static int
record_or_union_type_has_array (const_tree tree_type)

Thanks,
Andrew Pinski

Reply via email to