mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
9a1fd96887
Add ELF relocations for the following fixups: fixup_thumb_adr_pcrel_10 -> R_ARM_THM_PC8 fixup_thumb_cp -> R_ARM_THM_PC8 fixup_t2_adr_pcrel_12 -> R_ARM_THM_PREL_11_0 fixup_t2_ldst_pcrel_12 -> R_ARM_THM_PC12 While these relocations are short-ranged there is support in the open source ELF linker's in binutils and soon to be in LLD. MC will no longer resolve pc-relative fixups to global symbols due to interpositioning concerns. We can handle these at link time by implementing the relocations. The R_ARM_THM_PC8 has some extra encoding rules for addends that llvm-mc sidesteps by not supporting addends for these instructions, using the wide Thumb 2 instruction if it is available. I think that this is a reasonable compromise given that these are rare. This partiall reverts D72892, the Thumb fixups no longer need to be evaluated at assembly time. Differential Revision: https://reviews.llvm.org/D75039
19 lines
569 B
ArmAsm
19 lines
569 B
ArmAsm
@ RUN: llvm-mc -filetype=obj -triple=armv7 %s -o %t
|
|
@ RUN: llvm-readobj -r %t
|
|
|
|
@ Check that for ELF targets we generate a relocation for a within section
|
|
@ pc-relative reference to a global symbol as it may be interposed and we won't
|
|
@ know till link time whether this is possible.
|
|
.thumb
|
|
.thumb_func
|
|
|
|
.globl bar
|
|
bar:
|
|
adr r0, bar @ thumb_adr_pcrel_10
|
|
adr.w r0, bar @ t2_adr_pcrel_12
|
|
ldr.w pc, bar @ t2_ldst_pcrel_12
|
|
|
|
@ CHECK: 0x0 R_ARM_THM_ALU_PREL_11_0 bar 0x0
|
|
@ CHECK-NEXT: 0x4 R_ARM_THM_ALU_PREL_11_0 bar 0x0
|
|
@ CHECK-NEXT: 0x8 R_ARM_THM_PC12 bar 0x0
|