https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88677

--- Comment #9 from Jan Hubicka <hubicka at ucw dot cz> ---
> https://gcc.gnu 
> -> You can't simply remove this flag.  You could set it to true 
> conservatively.
> Or we could stop marking globals that need constructing TREE_READONLY.

I see, I was under impression that we already drop TREE_READONLY for
them. But it is bit more subtle and thus I was indeed to quick to drop
streaming here.  In:

struct c { int a; c() { a=1; } };
const c cc;
const int dd=1;
extern const c ee;
int foo() { return ee.a; }

I get:
const c ee/8 (const c ee) @0x7f68d301ee80
  Type: variable
  Visibility: external public
  References: 
  Referring: _Z3foov/5 (read)
  Availability: not-ready
  Varpool flags: read-only
const int dd/4 (const int dd) @0x7f68d301ec80
  Type: variable definition analyzed
  Visibility: force_output no_reorder
  Aux: @0x7f68d316c450
  References: 
  Referring: 
  Availability: not-ready
  Varpool flags: initialized read-only const-value-known
const c cc/3 (const c cc) @0x7f68d301e900
  Type: variable definition analyzed
  Visibility: force_output no_reorder
  Aux: @0x7f68d301ec80
  References: 
  Referring: _Z41__static_initialization_and_destruction_0ii/6 (addr)
  Availability: not-ready
  Varpool flags:

So EE is indeed read-only, but CC is not.
I guess it is because constructor to CC is output locally and we clear
the flag, while constructor of EE is output externally. What is utility
of this information? Can we realy in some context that value of EE did
not change?

It seems to me that it is completely useless info, so I would be in
favor of dropping TREE_READONLY flag probably at cgraph
construction time (because I suppose it is relevant to front-end)

Honza

Reply via email to