This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH,SPU] Add new relocation, R_SPU_ADD_PIC
- From: Trevor_Smigiel at playstation dot sony dot com
- To: binutils at sourceware dot org
- Cc: Alan Modra <amodra at bigpond dot net dot au>, Ulrich Weigand <uweigand at de dot ibm dot com>, andrew_pinski at playstation dot sony dot com
- Date: Thu, 16 Jul 2009 15:04:45 -0700
- Subject: [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.