This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH,SPU] Add new relocation, R_SPU_ADD_PIC


Hi,

When generating position independent code for Cell SPU, we generate the
following instruction sequence to compute the address of "symbol":

    # Compute the base PIC offset
    ila $2,.+8
    brsl $3,.+4
    sf   $126,$2,$3

    # Add base PIC offset to absolute symbol address
    ila  $5,symbol
    a    $5,$5,$126
    
When "symbol" is weak and undefined, we want a final value of 0, but the
above sequence would generate the base PIC offset.

Also, if DLL's were supported on SPU, we could not simply patch
relocations at run time and get the correct result.  The DLL loader
could try subtracting the base PIC offset from symbols when patching,
but would sometimes end up with a negative number which can not be
loaded by 1 instruction (that would replace the ila).

To address both of these issues, we mark the "a" instruction with a
relocation to indicate that it is adding the base PIC offset to "symbol.

    # Add base PIC offset to absolute symbol address
    ila  $5,symbol
    .reloc .,SPU_ADD_PIC,symbol
    a    $5,$5,$126

When the linker see the SPU_ADD_PIC relocation, it checks if "symbol" is
weak and undefined, or will be dynamically resolved.  If yes, it will
change the "a" instruction so it becomes a copy instruction.  Thus, the
value computed in the 'ila' instruction will be correct.  For example,
change the above "a" to:

    ai    $5,$5,0  # Add immediate 0

For this to work the ABI must also specify that it is the third register
in the 'a' instruction that contains the base PIC offset.

Currently, binutils does nothing to address these issues.  It just
generates incorrect values.

I used an old patch from Alan Modra which had a similar relocation
called SPU_PIC as a reference and modified his test cases to suit this
new relocation.

The attached patch has been tested on SPU and x86 with no new failures.

Ok?

Trevor

2009-07-10  Trevor Smigiel  <Trevor_Smigiel@playstation.sony.com>
            Alan Modra  <amodra@bigpond.net.au>

include/elf/
	* spu.h (R_SPU_ADD_PIC): New.
bfd/
	* reloc.c (BFD_RELOC_SPU_ADD_PIC): Define.
	* bfd-in2.h: Regenerate.
	* libbfd.h: Regenerate.
	* elf32-spu.c (elf_howto_table): Add entries SPU_ADD_PIC.
	(spu_elf_bfd_to_reloc_type): Handle SPU_ADD_PIC.
	(spu_elf_relocate_section): Patch instructions marked by SPU_ADD_PIC.
gas/
	* config/tc-spu.c (md_apply_fix): Handle SPU_ADD_PIC.
	* config/tc-spu.h (tc_fix_adjustable): Don't adjust for SPU_ADD_PIC.
	(TC_FORCE_RELOCATION): Emit relocs for SPU_ADD_PIC.
ld/testsuite/
	* ld-spu/pic.d: New.
	* ld-spu/pic.s: New.
	* ld-spu/picdef.s: New.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]