On Mon, Jun 4, 2012 at 4:39 PM, Steven Bosscher <[email protected]> wrote:
> On Mon, Jun 4, 2012 at 3:34 PM, Richard Guenther
> <[email protected]> wrote:
>>> have_global_bss_p:
>>> cp/decl.c: && !have_global_bss_p ())
>>> ada/gcc-interface/utils.c: && !have_global_bss_p ())
>>>
>>> I don't even know what this is. Help welcome. :-)
>>
>> Looks like premature optimization to me, better done in
>> varpool_finalize_decl?
>
> I thought so, too, but if you look at the code, then there are
> comments explaining what these uses of have_global_bss_p are for.
>
>
> The case in g++ depends on flag_conserve_space and that is a c-family
> specific flag. This is the only use, btw. Here's the code:
>
> /* Tell the back end to use or not use .common as appropriate. If we say
> -fconserve-space, we want this to save .data space, at the expense of
> wrong semantics. If we say -fno-conserve-space, we want this to
> produce errors about redefs; to do this we force variables into the
> data segment. */
> if (flag_conserve_space
> && TREE_CODE (decl) == VAR_DECL
> && TREE_PUBLIC (decl)
> && !DECL_THREAD_LOCAL_P (decl)
> && !have_global_bss_p ())
> DECL_COMMON (decl) = 1;
>
> Note the "at the expense of wrong semantics", egad! The
> -fconserve-space flag was introduced at r11952 by mrs. That revision
> was done on May 7, 1996, with commit comment: "86th Cygnus<->FSF quick
> merge". There is one test cases for this flag in testsuite/:
> g++.old-deja/g++.brendan/array1.C:
>
> Jason, is this flag something that we could deprecate for GCC 4.7 and remove?
The docs say the flag is not useful these days as BSS is widely available.
> The code for the case in Ada is this:
>
> /* Ada doesn't feature Fortran-like COMMON variables so we shouldn't
> try to fiddle with DECL_COMMON. However, on platforms that don't
> support global BSS sections, uninitialized global variables would
> go in DATA instead, thus increasing the size of the executable. */
> if (!flag_no_common
> && TREE_CODE (var_decl) == VAR_DECL
> && TREE_PUBLIC (var_decl)
> && !have_global_bss_p ())
> DECL_COMMON (var_decl) = 1;
>
> That does look like premature optimization to me, but I don't really
> understand the comment, or the effect of this code. Eric, could you
> please have a look at this and help me out?
I suppose in any case have_global_bss_p () should be a target-hook
and/or moved to target.h. And indeed it's implementation is
/* Return true if the target supports some form of global BSS,
either through bss_noswitch_section, or by selecting a BSS
section in TARGET_ASM_SELECT_SECTION. */
bool
have_global_bss_p (void)
{
return bss_noswitch_section || targetm.have_switchable_bss_sections;
}
OTOH, I suppose including target.h from the FEs is against what you
want to achieve, too.
Richard.
> Ciao!
> Steven