summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp9
-rw-r--r--llvm/test/CodeGen/ARM/arm-macho-tail.ll16
-rw-r--r--llvm/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll8
-rw-r--r--llvm/test/MC/MachO/ARM/darwin-ARM-reloc.s2
4 files changed, 25 insertions, 10 deletions
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
index 4a8139dea66..6f0372c9019 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
+++ b/llvm/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/llvm/test/CodeGen/ARM/arm-macho-tail.ll b/llvm/test/CodeGen/ARM/arm-macho-tail.ll
new file mode 100644
index 00000000000..8c9b988ea78
--- /dev/null
+++ b/llvm/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/llvm/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll b/llvm/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll
index 155ce5a425b..51a6051e564 100644
--- a/llvm/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll
+++ b/llvm/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/llvm/test/MC/MachO/ARM/darwin-ARM-reloc.s b/llvm/test/MC/MachO/ARM/darwin-ARM-reloc.s
index 9843ec30154..a0bacec7aa5 100644
--- a/llvm/test/MC/MachO/ARM/darwin-ARM-reloc.s
+++ b/llvm/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 {
OpenPOWER on IntegriCloud