Index: lld/trunk/ELF/Arch/X86_64.cpp =================================================================== --- lld/trunk/ELF/Arch/X86_64.cpp +++ lld/trunk/ELF/Arch/X86_64.cpp @@ -101,6 +101,8 @@ 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 @@ void X86_64::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; Index: lld/trunk/test/ELF/x86-64-pcrel.s =================================================================== --- lld/trunk/test/ELF/x86-64-pcrel.s +++ lld/trunk/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