Index: lld/ELF/Arch/AMDGPU.cpp =================================================================== --- lld/ELF/Arch/AMDGPU.cpp +++ lld/ELF/Arch/AMDGPU.cpp @@ -139,6 +139,12 @@ case R_AMDGPU_REL32_HI: write32le(loc, val >> 32); break; + case R_AMDGPU_REL16: { + int64_t simm = (static_cast(val) - 4) / 4; + checkInt(loc, simm, 16, rel); + write16le(loc, simm); + break; + } default: llvm_unreachable("unknown relocation"); } @@ -154,6 +160,7 @@ case R_AMDGPU_REL32_LO: case R_AMDGPU_REL32_HI: case R_AMDGPU_REL64: + case R_AMDGPU_REL16: return R_PC; case R_AMDGPU_GOTPCREL: case R_AMDGPU_GOTPCREL32_LO: Index: lld/test/ELF/amdgpu-relocs2.s =================================================================== --- /dev/null +++ lld/test/ELF/amdgpu-relocs2.s @@ -0,0 +1,38 @@ +# REQUIRES: amdgpu +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=amdgcn--amdhsa -mcpu=fiji %t/asm -o %t.o +# RUN: ld.lld %t.o -o %t/out --script %t/script +# RUN: llvm-objdump -d %t/out | FileCheck %s + + +#--- script +SECTIONS { + . = 0x1000; + .text.likely : { *(.text.likely) } + . = 0x2000; + .text : { *(.text) } + . = 0x3000; + .text.unlikely : { *(.text.unlikely) } +} + + +#--- asm +.section .text.likely +hot1: + s_add_i32 s15, s15, 1 +hot2: + s_add_i32 s13, s13, 1 +.text +foo: + s_branch cold2 + s_branch hot2 +.section .text.unlikely +cold1: + s_add_i32 s15, s15, 1 + s_add_i32 s14, s14, 1 +cold2: + s_add_i32 s13, s13, 1 + +# CHECK: +# CHECK-NEXT: s_branch 1025 +# CHECK-NEXT: s_branch 64511