This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: ipa-visibility TLC 2/n
- From: David Edelsohn <dje dot gcc at gmail dot com>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Henderson <rth at redhat dot com>, ramrad01 at arm dot com, Richard Sandiford <rdsandiford at googlemail dot com>
- Date: Fri, 30 May 2014 20:57:51 -0400
- Subject: Re: ipa-visibility TLC 2/n
- Authentication-results: sourceware.org; auth=none
- References: <CAGWvnykpdrmfigAjx+gXghA7iWx0mo4_7V1YaAhWMh9OQdx14A at mail dot gmail dot com> <20140528223103 dot GB15880 at kam dot mff dot cuni dot cz> <CAGWvnynmW2d7S=fDWOE0g7CKfcO=y+p0v4=0jwhTAuOx+pVbYQ at mail dot gmail dot com> <20140528231723 dot GA31990 at kam dot mff dot cuni dot cz> <87bnuh9fdo dot fsf at talisman dot default> <20140529171214 dot GB32218 at kam dot mff dot cuni dot cz> <877g53ag1p dot fsf at talisman dot default> <CAGWvny=uXmpFepw4pQSqwyL3Qdj1Zf0=ghOeaUGgV1MxWubxuw at mail dot gmail dot com> <20140530210219 dot GE17544 at kam dot mff dot cuni dot cz>
Honza,
With the patch, I cannot bootstrap.
I am concerned about the much greater frequency of AIX linker warnings
about branch not followed by no-op after your patch.
GCC may bootstrap only because it links libstdc++ statically. If your
patch is too aggressive in its effort to remove PLT calls, it may be
breaking shared library support on AIX. Previously there were a few
recursive libstdc++ calls that binds_local_p() asserted were bound
locally to functions declared global. I hope that cross-module calls
have not been incorrectly analyzed as local.
Thanks, David
On Fri, May 30, 2014 at 5:02 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> Honza,
>>
>> For example g++.dg/abi/vcall1.C fails at a call in a "localalias"
>> function, which jumps to a bad location:
>>
>>
>> (gdb) up
>> #1 0x100004c0 in B::B() [clone .localalias.2] ()
>> (gdb) x/16i $pc-32
>> 0x100004a0 <_ZN1BC2Ev+156>: add r10,r10,r8
>> 0x100004a4 <_ZN1BC2Ev+160>: mr r3,r10
>> 0x100004a8 <_ZN1BC2Ev+164>: stw r2,20(r1)
>> 0x100004ac <_ZN1BC2Ev+168>: lwz r10,0(r9)
>> 0x100004b0 <_ZN1BC2Ev+172>: lwz r11,8(r9)
>> 0x100004b4 <_ZN1BC2Ev+176>: mtctr r10
>> 0x100004b8 <_ZN1BC2Ev.localalias.2+180>: lwz r2,4(r9)
>> 0x100004bc <_ZN1BC2Ev.localalias.2+184>: bctrl
>> => 0x100004c0 <_ZN1BC2Ev.localalias.2+188>: lwz r2,20(r1)
>> 0x100004c4 <_ZN1BC2Ev.localalias.2+192>: addi r1,r31,64
>> 0x100004c8 <_ZN1BC2Ev.localalias.2+196>: lwz r0,8(r1)
>> 0x100004cc <_ZN1BC2Ev.localalias.2+200>: mtlr r0
>> 0x100004d0 <_ZN1BC2Ev.localalias.2+204>: lwz r31,-4(r1)
>> 0x100004d4 <_ZN1BC2Ev.localalias.2+208>: blr
>
> I suppose this is the problem Richard mentioned - the offsets are not computed
> by DECL_RTL callback but by place_block.
>
>> >>> is SYMBOL_REF_BLOCK_OFFSET (target) guaranteed to be valid at this point?
>> >>> It looked at face value like you'd need a recursive call to place_block_symbol
>> >>> on the target before the copy.
>> >>
>> >> My reading was that SYMBOL_REF_BLOCK_OFFSET is computed at DECL_RTL
>> >> calculation time. But you are right - it is done by validize_mem that
>> >> is not done by DECL_RTL. Shall I just call it on target first?
>> >
>> > Yeah, sounds like calling place_block_symbol would be safer.
>
> I will test:
> Index: varasm.c
> ===================================================================
> --- varasm.c (revision 211096)
> +++ varasm.c (working copy)
> @@ -7094,6 +7094,7 @@
> if (snode->alias)
> {
> rtx target = DECL_RTL (symtab_alias_ultimate_target (snode)->decl);
> + place_block_symbol (symbol);
> SYMBOL_REF_BLOCK_OFFSET (symbol) = SYMBOL_REF_BLOCK_OFFSET (target);
> return;
> }
>
>
> Honza
>> >
>> > IIRC, the reason I didn't do it at SET_DECL_RTL time is that some frontends
>> > tended to create placeholder decls that for whatever reason ended up with
>> > an initial DECL_RTL, then changed the properties of the decl later once
>> > more information was known. (This was all many years ago.)
>> >
>> > Thanks,
>> > Richard