1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

[ARM] Create relocations for beq.w branches to ARM function syms.

Summary:
The ARM ELF ABI requires the linker to do interworking for wide
conditional branches from Thumb code to ARM code. 

That was pointed out by @peter.smith in the comments for D33436.

Reviewers: rafael, peter.smith, echristo

Reviewed By: peter.smith

Subscribers: aemerson, javed.absar, kristof.beyls, llvm-commits, peter.smith

Differential Revision: https://reviews.llvm.org/D34447

llvm-svn: 306009
This commit is contained in:
Florian Hahn 2017-06-22 15:32:41 +00:00
parent 38d4905a9a
commit ee7da221bf
2 changed files with 40 additions and 0 deletions

View File

@ -759,6 +759,7 @@ void ARMAsmBackend::processFixupValue(const MCAssembler &Asm,
IsResolved = false;
if (!Asm.isThumbFunc(Sym) && (FixupKind == ARM::fixup_arm_thumb_br ||
FixupKind == ARM::fixup_arm_thumb_bl ||
FixupKind == ARM::fixup_t2_condbranch ||
FixupKind == ARM::fixup_t2_uncondbranch))
IsResolved = false;
}

View File

@ -0,0 +1,39 @@
@ RUN: llvm-mc < %s -triple armv7-linux-gnueabi -filetype=obj -o - \
@ RUN: | llvm-readobj -r | FileCheck %s
.code 16
.thumb_func
thumb_caller:
beq.w internal_arm_fn
beq.w global_arm_fn
beq.w global_thumb_fn
beq.w internal_thumb_fn
.type internal_arm_fn,%function
.code 32
internal_arm_fn:
bx lr
.globl global_arm_fn
.type global_arm_fn,%function
.code 32
global_arm_fn:
bx lr
.type internal_thumb_fn,%function
.code 16
.thumb_func
internal_thumb_fn:
bx lr
.globl global_thumb_fn
.type global_thumb_fn,%function
.code 16
.thumb_func
global_thumb_fn:
bx lr
@ CHECK: Section (3) .rel.text
@ CHECK-NEXT: 0x0 R_ARM_THM_JUMP19 internal_arm_fn 0x0
@ CHECK-NEXT: 0x4 R_ARM_THM_JUMP19 global_arm_fn 0x0
@ CHECK-NEXT: }