diff options
| -rw-r--r-- | lld/ELF/Arch/X86_64.cpp | 4 | ||||
| -rw-r--r-- | lld/test/ELF/x86-64-pcrel.s | 21 | 
2 files changed, 25 insertions, 0 deletions
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp index 86368631109..c423f376118 100644 --- a/lld/ELF/Arch/X86_64.cpp +++ b/lld/ELF/Arch/X86_64.cpp @@ -101,6 +101,8 @@ RelExpr X86_64<ELFT>::getRelExpr(RelType Type, const Symbol &S,      return R_SIZE;    case R_X86_64_PLT32:      return R_PLT_PC; +  case R_X86_64_PC8: +  case R_X86_64_PC16:    case R_X86_64_PC32:    case R_X86_64_PC64:      return R_PC; @@ -319,10 +321,12 @@ template <class ELFT>  void X86_64<ELFT>::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const {    switch (Type) {    case R_X86_64_8: +  case R_X86_64_PC8:      checkUInt(Loc, Val, 8, Type);      *Loc = Val;      break;    case R_X86_64_16: +  case R_X86_64_PC16:      checkUInt(Loc, Val, 16, Type);      write16le(Loc, Val);      break; diff --git a/lld/test/ELF/x86-64-pcrel.s b/lld/test/ELF/x86-64-pcrel.s new file mode 100644 index 00000000000..dd62242e99f --- /dev/null +++ b/lld/test/ELF/x86-64-pcrel.s @@ -0,0 +1,21 @@ +// REQUIRES: x86 + +// This is a test for R_X86_64_PC8 and R_X86_64_PC16. + +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +// RUN: echo '.globl foo; foo:' | llvm-mc -filetype=obj -triple=x86_64-pc-linux - -o %t2.o +// RUN: ld.lld -o %t.exe %t1.o %t2.o +// RUN: llvm-objdump -s %t.exe | FileCheck %s + +// CHECK: Contents of section .text: +// CHECK: 2000cccc cccccccc cccccccc cccccccc +// CHECK: 20cccccc cccccccc cccccccc cccccccc + +.globl _start +_start: + +.word foo - _start +.fill 14,1,0xcc + +.byte foo - _start +.fill 15,1,0xcc  | 

