[lld-macho] Support X86_64_RELOC_BRANCH
authorJez Ng <jezng@fb.com>
Wed, 29 Apr 2020 22:42:45 +0000 (15:42 -0700)
committerShoaib Meenai <smeenai@fb.com>
Wed, 29 Apr 2020 22:45:01 +0000 (15:45 -0700)
Relatively straightforward diff, to set the stage for calling functions
in dylibs.

Differential Revision: https://reviews.llvm.org/D78269

lld/MachO/Arch/X86_64.cpp
lld/test/MachO/relocations.s

index 39dd644..2fcfab5 100644 (file)
@@ -31,6 +31,7 @@ X86_64::X86_64() {
 
 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 @@ uint64_t X86_64::getImplicitAddend(const uint8_t *loc, uint8_t type) const {
 
 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
index cf38f96..7f41a6c 100644 (file)
@@ -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