diff options
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp | 9 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/arm-macho-tail.ll | 16 | ||||
| -rw-r--r-- | llvm/test/MC/ARM/mixed-arm-thumb-bl-fixup.ll | 8 | ||||
| -rw-r--r-- | llvm/test/MC/MachO/ARM/darwin-ARM-reloc.s | 2 | 
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 {  | 

