On Mon, Jul 17, 2017 at 12:48 PM, Eric Botcazou <ebotca...@adacore.com> wrote:
>> So this isn't about global
>>
>>  void *x[] = { &((struct Y *)0x12)->foo }
>>
>> but for a local one where supposedly variable indexing is valid (don't
>> we gimplify that)?
>
> Yes, it's local (it's OK if global because we do a full RTL expansion).
> Everything is valid, constant and passes initializer_constant_valid_p.
>
>> And
>>
>> +    case INDIRECT_REF:
>> +      /* This deals with absolute addresses.  */
>> +      offset += tree_to_shwi (TREE_OPERAND (target, 0));
>> +      x = gen_rtx_MEM (QImode,
>> +                      gen_rtx_SYMBOL_REF (Pmode, "origin of addresses"));
>>
>> simply translates 0x12 to &*<origin> + 0x12 (where origin == 0 somehow?).
>>
>> I suppose returing directly here and sth like
>>
>>     value->base = gen_rtx_SYMBOL_REF (Pmode, "origin of addresses");
>>     value->offset = offset + tree_to_shwi (...);
>>     return;
>>
>> would be clearer.
>
> That's a matter of consistency, the LABEL_DECL case does something equivalent:
>
>       x = gen_rtx_MEM (FUNCTION_MODE,
>                        gen_rtx_LABEL_REF (Pmode, force_label_rtx (target)));

Ah, I see.

>> Or even
>>
>>     value->base = tree-to-rtx (TREE_OPERAND (target, 0));
>>     value->offset = offset;
>
> The callers expect the base to be SYMBOL_REF or LABEL_REF though.

Ok.  I suppose I'm mostly concerned about that magic "origin of addresses".

Patch is ok in its original form.  As said, handling MEM_REF would be nice,
FEs start to generate that (well C++ does).

Thanks,
Richard.

> --
> Eric Botcazou

Reply via email to