http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50266

--- Comment #5 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-09-03 
14:32:01 UTC ---
> and we have a CTOR and not individual initializations because of Erics
> const-pool changes I believe.

No, we have the constructor with GCC 4.5 as well, my patch only makes it go
through tree_output_constant_def.

> &p->a is folded to &1241530624B->a even before gimplification (but 
> &1241530624B->a is "unfolded" - it's an obfuscated constant).
> 
> We ICE from
> 
> #0  fancy_abort (
>     file=0x1252a70 "/space/rguenther/src/svn/gcc-4_6-branch/gcc/varasm.c", 
>     line=2638, function=0x1253700 "decode_addr_const")
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/diagnostic.c:893
> #1  0x0000000000ca9016 in decode_addr_const (exp=0x2aaaaceb3fc0, 
>     value=0x7fffffff9b30)
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/varasm.c:2638
> #2  0x0000000000ca97f0 in const_hash_1 (exp=0x2aaaaceb3fc0)
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/varasm.c:2734
> #3  0x0000000000ca95db in const_hash_1 (exp=0x2aaaacea54e0)
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/varasm.c:2724
> #4  0x0000000000cace7a in tree_output_constant_def (exp=0x2aaaacea54e0)
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/varasm.c:3302
> #5  0x000000000083a5f4 in gimplify_init_constructor (expr_p=0x7fffffffb3a8, 
>     pre_p=0x7fffffffccf8, post_p=0x7fffffffa928, want_value=0 '\000', 
>     notify_temp_creation=0 '\000')
>     at /space/rguenther/src/svn/gcc-4_6-branch/gcc/gimplify.c:3833
> 
> and fold &p->a via c_fully_fold_internal.

This is a known issue, namely that tree_output_constant_def rejects offsetof
computations.  See PR middle-end/44100 for an example with the C++ compiler.

I think this should be folded in the front-end - c_fully_fold is kind of a
misnomer if it can only partially fold &p->a.  It's just a matter of copying
the chunk of code present in build_unary_op, no big deal IMO.

And this compiles fine in C++ because the folding is done:

Starting program: /home/eric/build/gcc/native/gcc/cc1plus -quiet pr50266.c
-quiet -mtune=generic -march=x86-64 -Os

Breakpoint 1, tree_output_constant_def (exp=0x7ffff6edbdf8)
    at /home/eric/svn/gcc/gcc/varasm.c:3295
3295      key.value = exp;
(gdb) p debug_generic_expr(exp)
{1241530624B, 1241530628B, 0B}

Reply via email to