From 9b4ee7baf46a127d7549545bc23fd03f91187872 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Fri, 18 Aug 2017 19:13:56 +0000 Subject: [PATCH] ARM: use an external relocation for calls from MachO ARM mode. The internal (__text-relative) relocation risks the offset not being encodable if the destination is Thumb. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311187 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp | 9 ++++----- test/CodeGen/ARM/arm-macho-tail.ll | 16 ++++++++++++++++ test/MC/ARM/mixed-arm-thumb-bl-fixup.ll | 8 ++++---- test/MC/MachO/ARM/darwin-ARM-reloc.s | 2 +- 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 test/CodeGen/ARM/arm-macho-tail.ll diff --git a/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp index 4a8139dea66..6f0372c9019 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp @@ -322,11 +322,10 @@ bool ARMMachObjectWriter::requiresExternRelocation(MachObjectWriter *Writer, default: return false; case MachO::ARM_RELOC_BR24: - // PC pre-adjustment of 8 for these instructions. - Value -= 8; - // ARM BL/BLX has a 25-bit offset. - Range = 0x1ffffff; - break; + // An ARM call might be to a Thumb function, in which case the offset may + // not be encodable in the instruction and we must use an external + // relocation that explicitly mentions the function. + return true; case MachO::ARM_THUMB_RELOC_BR22: // PC pre-adjustment of 4 for these instructions. Value -= 4; diff --git a/test/CodeGen/ARM/arm-macho-tail.ll b/test/CodeGen/ARM/arm-macho-tail.ll new file mode 100644 index 00000000000..8c9b988ea78 --- /dev/null +++ b/test/CodeGen/ARM/arm-macho-tail.ll @@ -0,0 +1,16 @@ +; RUN: llc -mtriple=thumbv7-apple-watchos %s -filetype=obj -o %t +; RUN: llvm-objdump -r %t | FileCheck %s + + ; Relocation needs to explicitly mention _bar rather than be __text relative + ; because the __text relative offset is not encodable in an ARM instruction. +; CHECK: ARM_RELOC_BR24 _bar +define void @foo() "target-features"="-thumb-mode" { + tail call void @bar() + ret void +} + +define void @one_inst() { ret void } + +define void @bar() { + ret void +} diff --git a/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll b/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll index 155ce5a425b..51a6051e564 100644 --- a/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll +++ b/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll @@ -66,10 +66,10 @@ attributes #1 = { "target-features"="-thumb-mode" } ; LINUX-NEXT: } ; IOS: Section __text { -; IOS-NEXT: 0x2C 1 2 0 ARM_RELOC_BR24 0 __text -; IOS-NEXT: 0x28 1 2 0 ARM_RELOC_BR24 0 __text -; IOS-NEXT: 0x24 1 2 0 ARM_RELOC_BR24 0 __text -; IOS-NEXT: 0x20 1 2 0 ARM_RELOC_BR24 0 __text +; IOS-NEXT: 0x2C 1 2 1 ARM_RELOC_BR24 0 _global_thumb_fn +; IOS-NEXT: 0x28 1 2 1 ARM_RELOC_BR24 0 _internal_thumb_fn +; IOS-NEXT: 0x24 1 2 1 ARM_RELOC_BR24 0 _global_arm_fn +; IOS-NEXT: 0x20 1 2 1 ARM_RELOC_BR24 0 _internal_arm_fn ; IOS-NEXT: 0x10 1 2 0 ARM_THUMB_RELOC_BR22 0 __text ; IOS-NEXT: 0xC 1 2 0 ARM_THUMB_RELOC_BR22 0 __text ; IOS-NEXT: 0x8 1 2 0 ARM_THUMB_RELOC_BR22 0 __text diff --git a/test/MC/MachO/ARM/darwin-ARM-reloc.s b/test/MC/MachO/ARM/darwin-ARM-reloc.s index 9843ec30154..a0bacec7aa5 100644 --- a/test/MC/MachO/ARM/darwin-ARM-reloc.s +++ b/test/MC/MachO/ARM/darwin-ARM-reloc.s @@ -99,7 +99,7 @@ Lsc0_0: @ CHECK: ] @ CHECK: Relocations [ @ CHECK: Section __text { -@ CHECK: 0x4 1 2 0 ARM_RELOC_BR24 0 __text +@ CHECK: 0x4 1 2 1 ARM_RELOC_BR24 0 _f0 @ CHECK: 0x0 1 2 1 ARM_RELOC_BR24 0 _printf @ CHECK: } @ CHECK: Section __data { -- 2.11.0