OSDN Git Service

ARM: use an external relocation for calls from MachO ARM mode.
authorTim Northover <tnorthover@apple.com>
Fri, 18 Aug 2017 19:13:56 +0000 (19:13 +0000)
committerTim Northover <tnorthover@apple.com>
Fri, 18 Aug 2017 19:13:56 +0000 (19:13 +0000)
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
test/CodeGen/ARM/arm-macho-tail.ll [new file with mode: 0644]
test/MC/ARM/mixed-arm-thumb-bl-fixup.ll
test/MC/MachO/ARM/darwin-ARM-reloc.s

index 4a8139d..6f0372c 100644 (file)
@@ -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 (file)
index 0000000..8c9b988
--- /dev/null
@@ -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
+}
index 155ce5a..51a6051 100644 (file)
@@ -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
index 9843ec3..a0bacec 100644 (file)
@@ -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 {