> For static storage yes, which it seems to test:
>
> else if (TREE_CODE (rhs) == VAR_DECL
> && TREE_STATIC (rhs)
> && TREE_READONLY (rhs)
> && targetm.binds_local_p (rhs))
> fns->init (lhs_elt, DECL_INITIAL (rhs), bsi);
I think there is a problem with binds_local_p though, which explains why PR
tree-opt/35493 has been fixed for ELF but not for PE-COFF (PR ada/36207):
what if we have DECL_EXTERNAL, targetm.binds_local_p and no DECL_INITIAL?
In this case, the code will replace the VAR_DECL with zero, which is wrong.
tree-ssa-ccp.c:get_symbol_constant_value will do the same.
For example, expand_expr_real_1 does test the non-nullity of DECL_INITIAL:
else if (optimize >= 1
&& modifier != EXPAND_CONST_ADDRESS
&& modifier != EXPAND_INITIALIZER
&& modifier != EXPAND_MEMORY
&& TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
&& TREE_CODE (array) == VAR_DECL && DECL_INITIAL (array)
&& TREE_CODE (DECL_INITIAL (array)) != ERROR_MARK
&& targetm.binds_local_p (array))
Here's the hook for PE-COFF:
bool
i386_pe_binds_local_p (const_tree exp)
{
/* PE does not do dynamic binding. Indeed, the only kind of
non-local reference comes from a dllimport'd symbol. */
if ((TREE_CODE (exp) == VAR_DECL || TREE_CODE (exp) == FUNCTION_DECL)
&& DECL_DLLIMPORT_P (exp))
return false;
return true;
}
--
Eric Botcazou