2011-05-31 Paul Brook <paul@codesourcery.com>

gas/
	* config/tc-arm.c (arm_force_relocation): Resolve all pc-relative
	loads.

	gas/testsuite/
	* gas/arm/ldr-global.d: New test.
	* gas/arm/ldr-global.s: New test.
This commit is contained in:
Paul Brook 2011-05-31 14:10:07 +00:00
parent 63e1a0fcba
commit b58843019a
5 changed files with 59 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2011-05-31 Paul Brook <paul@codesourcery.com>
* config/tc-arm.c (arm_force_relocation): Resolve all pc-relative
loads.
2011-05-31 Paul Brook <paul@codesourcery.com>
* config/tc-arm.c (do_t_branch): Avoid relaxing branches to constant

View File

@ -21895,14 +21895,25 @@ arm_force_relocation (struct fix * fixp)
}
#endif
/* Resolve these relocations even if the symbol is extern or weak. */
/* Resolve these relocations even if the symbol is extern or weak.
Technically this is probably wrong due to symbol preemption.
In practice these relocations do not have enough range to be useful
at dynamic link time, and some code (e.g. in the Linux kernel)
expects these references to be resolved. */
if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
|| fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
|| fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
|| fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
|| fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
|| fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
|| fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
|| fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
return 0;
/* Always leave these relocations for the linker. */

View File

@ -1,3 +1,8 @@
2011-05-31 Paul Brook <paul@codesourcery.com>
* gas/arm/ldr-global.d: New test.
* gas/arm/ldr-global.s: New test.
2011-05-31 Paul Brook <paul@codesourcery.com>
* arm/t2-branch-global.d: New test.

View File

@ -0,0 +1,14 @@
#objdump: -dr --prefix-addresses --show-raw-insn
#name: PC-relative LDR from global
.*: +file format .*arm.*
Disassembly of section .text:
0+00 <[^>]*> e59f0010 ? ldr r0, \[pc, #16\] ; 0+18 <[^>]*>
0+04 <[^>]*> e1df00fc ? ldrsh r0, \[pc, #12\] ; 0+18 <[^>]*>
0+08 <[^>]*> ed9f0a02 ? vldr s0, \[pc, #8\] ; 0+18 <[^>]*>
0+0c <[^>]*> 4802 ? ldr r0, \[pc, #8\] ; \(0+18 <[^>]*>\)
0+0e <[^>]*> 4802 ? ldr r0, \[pc, #8\] ; \(0+18 <[^>]*>\)
0+10 <[^>]*> ed9f 0a01 ? vldr s0, \[pc, #4\] ; 0+18 <[^>]*>
0+14 <[^>]*> f8df 0000 ? ldr\.w r0, \[pc\] ; 0+18 <[^>]*>
#...

View File

@ -0,0 +1,22 @@
@ Test pc-relative loads from global objects defined in the same text segment.
@ See tc-arm.c:arm_force_relocation.
.arch armv7-a
.fpu vfp
.syntax unified
.text
foo_arm:
ldr r0, bar
ldrsh r0, bar
vldr s0, bar
.thumb
foo_thumb:
ldr r0, bar
ldr.n r0, bar
vldr s0, bar
ldr.w r0, bar
.align 2
.globl bar
bar:
.word 42