Richard Henderson <r...@redhat.com> wrote on 2010/10/05 20:56:55:
>
> On 10/05/2010 06:54 AM, Joakim Tjernlund wrote:
> > Ian Lance Taylor <i...@google.com> wrote on 2010/10/05 15:47:38:
> >> Joakim Tjernlund <joakim.tjernl...@transmode.se> writes:
> >>> While doing relocation work on u-boot I often whish for strings/const data
> >>> to be accessible through %pc relative address rather than and ABS address
> >>> or through GOT. Has this feature ever been considered by gcc?
> >>
> >> The feature can only be supported on processors which are reasonably
> >> able to support it.  So, what target are you asking about?
> >
> > In my case PowerPC but I think most arch's would want this feature.
> > Is there arch's where this cannot be support at all or just within
> > some limits? I think within limits could work for small apps
> > like u-boot.
>
> PowerPC doesn't really have the relocations for pc-relative offsets
> within code -- primarily because it doesn't have pc-relative insns
> to match.  Nor, unfortunately, does it have got-relative relocations,
> like some other targets.  These are normally how we get around not
> having pc-relative relocations and avoiding tables in memory.  C.f.
>
>   #pragma GCC visibility push(hidden)
>   extern int x, y;
>   int foo(void) { return x + y; }
>
> Without pragma (-O2 -fpic):
> i386:
>         movl    y...@got(%ecx), %eax
>         movl    x...@got(%ecx), %edx
>         movl    (%eax), %eax
>         addl    (%edx), %eax
>
> alpha:
>         ldq $1,y($29)           !literal
>         ldl $0,0($1)
>         ldq $1,x($29)           !literal
>         ldl $1,0($1)
>         addl $0,$1,$0
>
> In both cases here, we have load the address from memory, from
> the GOT table, then load the data (X or Y) from memory and
> perform the addition.
>
>
> With pragma:
> i386:
>         movl    y...@gotoff(%ecx), %eax
>         addl    x...@gotoff(%ecx), %eax
>
> alpha (-fpic):
>         ldl $1,x($29)           !gprel
>         ldl $0,y($29)           !gprel
>         addl $0,$1,$0
>
> alpha (-fPIC):
>         ldah $1,y($29)          !gprelhigh
>         ldl $0,y($1)            !gprellow
>         ldah $1,x($29)          !gprelhigh
>         ldl $1,x($1)            !gprellow
>         addl $0,$1,$0
>
> In all cases here, we've replaced the load from the GOT table
> with arithmetic.  In the case of i386 this gets folded into the
> memory reference.  The alpha cases are essentially the same as
> what ppc could generate if it had the appropriate relocations.

I don't do x86 or alpha so let me ask: If you run the code on an address
!= link address, will it do the right thing?

I tested the #pragma/no #pragma on PPC and the resulting code
was the same:
/* with #pragma, -fpic -O2 -mregnames
foo:
        stwu %r1,-16(%r1)
        mflr %r12
        bcl 20,31,.LCF0
.LCF0:
        stw %r30,8(%r1)
        mflr %r30
        addis %r30,%r30,_global_offset_table_-.l...@ha
        addi %r30,%r30,_global_offset_table_-.l...@l
        mtlr %r12
        lwz %r9,y...@got(%r30)
        lwz %r3,0(%r9)
        lwz %r9,x...@got(%r30)
        lwz %r30,8(%r1)
        addi %r1,%r1,16
        lwz %r0,0(%r9)
        add %r3,%r3,%r0
        blr
 */


You can get at the GOT table using PC relative addressing so why not
strings or data in a similar fashion?

>
> If you're sufficiently motivated, you could work with the ppc
> maintainers to add the missing support.

Lets see, is there any interest amongst PPC maintainers?

 Jocke

Reply via email to