On Fri, Jul 11, 2008 at 8:17 PM, Eric Botcazou <[EMAIL PROTECTED]> wrote:
>> 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.
But it also tests TREE_STATIC which should not be true for automatic variables.
The binds_local_p check is only to guard against overriding the symbol with
an external definition.
Richard.
> 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
>