diff --git a/lld/MachO/Arch/X86_64.cpp b/lld/MachO/Arch/X86_64.cpp --- a/lld/MachO/Arch/X86_64.cpp +++ b/lld/MachO/Arch/X86_64.cpp @@ -31,6 +31,7 @@ uint64_t X86_64::getImplicitAddend(const uint8_t *loc, uint8_t type) const { switch (type) { + case X86_64_RELOC_BRANCH: case X86_64_RELOC_SIGNED: case X86_64_RELOC_GOT_LOAD: return read32le(loc); @@ -42,6 +43,7 @@ void X86_64::relocateOne(uint8_t *loc, uint8_t type, uint64_t val) const { switch (type) { + case X86_64_RELOC_BRANCH: case X86_64_RELOC_SIGNED: case X86_64_RELOC_GOT_LOAD: // These types are only used for pc-relative relocations, so offset by 4 diff --git a/lld/test/MachO/relocations.s b/lld/test/MachO/relocations.s --- a/lld/test/MachO/relocations.s +++ b/lld/test/MachO/relocations.s @@ -1,19 +1,34 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %s -o %t.o # RUN: lld -flavor darwinnew -o %t %t.o -# RUN: llvm-objdump -d %t | FileCheck %s +# RUN: llvm-objdump --section-headers --syms -d %t | FileCheck %s -# CHECK: leaq 17(%rip), %rsi +# CHECK-LABEL: Sections: +# CHECK: __cstring {{[0-9a-z]+}} [[#%x, CSTRING_ADDR:]] + +# CHECK-LABEL: SYMBOL TABLE: +# CHECK: [[#%x, F_ADDR:]] {{.*}} _f + +# CHECK-LABEL: <_main>: +## Test X86_64_RELOC_BRANCH +# CHECK: callq 0x[[#%x, F_ADDR]] <_f> +## Test X86_64_RELOC_SIGNED +# CHECK: leaq [[#%u, STR_OFF:]](%rip), %rsi +# CHECK-NEXT: [[#%x, CSTRING_ADDR - STR_OFF]] .section __TEXT,__text -.globl _main +.globl _main, _f _main: + callq _f + mov $0, %rax + ret + +_f: movl $0x2000004, %eax # write() syscall mov $1, %rdi # stdout leaq str(%rip), %rsi mov $13, %rdx # length of str syscall - mov $0, %rax ret .section __TEXT,__cstring