Symbol table 21/many: analyze initializers of external vars
Jan Hubicka
hubicka@ucw.cz
Fri May 18 10:15:00 GMT 2012
> > Bootstrapped/regtested x86_64-linux, comitted.
>
> It presumably breaks Ada bootstrap on x86/Linux:
I suppose so. I tested x86_64/linux with Ada.
>
> /home/eric/build/gcc/native32/./prev-gcc/xgcc -B/home/eric/build/gcc/native32/./prev-gcc/ -B/home/eric/install/gcc/i586-suse-linux/bin/ -B/home/eric/install/gcc/i586-suse-linux/bin/ -B/home/eric/install/gcc/i586-suse-linux/lib/ -isystem /home/eric/install/gcc/i586-suse-linux/include -isystem /home/eric/install/gcc/i586-suse-linux/sys-include -c -g -O2 -gtoggle -gnatpg -gnata -W -Wall -nostdinc -I- -I. -Iada -I/home/eric/svn/gcc/gcc/ada -I/home/eric/svn/gcc/gcc/ada/gcc-interface /home/eric/svn/gcc/gcc/ada/ali.adb -o
> ada/ali.o
> +===========================GNAT BUG DETECTED==============================+
> | 4.8.0 20120518 (experimental) [trunk revision 187647] (i586-suse-linux) GCC
> error:|
> | in varpool_finalize_decl, at cgraphunit.c:822 |
> | Error detected around /home/eric/svn/gcc/gcc/ada/ali.adb:2499:1
The problem here seems to be that Ada constructs an variable that is DECL_EXTERNAL,
passes const_value_known_p and has DECL_INITIAL, yet its TREE_STATIC is not set.
C++ always output those variables with TREE_STATIC set and to be honest, I am unsure
what is intended semantics of this flag in this case.
Is folding through these variables desirable in Ada? If not, i would suggest
clear DECL_INITIAL (it is useless), if it is, we can either relatex the
varpool_finalize_decl check or arrange TREE_STATIC to not be set.
We use the combination of STATIC and EXTERN flag to test presence of references to
static (and non-public) object from other file in:
/* External flag is set, so we deal with C++ reference
to static object from other file.
We also may see weakref that is always safe. */
if (DECL_EXTERNAL (decl) && TREE_STATIC (decl)
&& TREE_CODE (decl) == VAR_DECL)
So this particular combination of flags would prevent us from folding into references
to these vars. If this is not intended, I would not keep the flag set.
Honza
More information about the Gcc-patches
mailing list