Add base relative relocation record that can be used for the following case (OpenCL example):

static __global int Var = 0; 
__global int* Ptr[] = {&Var};
...

In this case Var is a non premptable symbol and so its address can be used as the value of Ptr, with a base relative relocation that will add the delta between the ELF address and the actual load address. Such relocations do not require a symbol.

This also fixes LLD which was incorrectly generating a PCREL64 for this case.

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

llvm-svn: 315936
This commit is contained in:
Tony Tye 2017-10-16 20:46:53 +00:00
parent d288430c3e
commit 394e1dde6e
2 changed files with 14 additions and 1 deletions

View File

@ -32,7 +32,7 @@ public:
} // namespace
AMDGPU::AMDGPU() {
RelativeRel = R_AMDGPU_REL64;
RelativeRel = R_AMDGPU_RELATIVE64;
GotRel = R_AMDGPU_ABS64;
GotEntrySize = 8;
}

View File

@ -65,10 +65,23 @@ ptr:
.quad temp
.size ptr, 8
# R_AMDGPU_RELATIVE64:
.type temp2, @object
.local temp2
.size temp2, 4
.type ptr2, @object
.globl ptr2
.size ptr2, 8
.p2align 3
ptr2:
.quad temp2
# The relocation for local_var{0, 1, 2} and var should be resolved by the
# linker.
# CHECK: Relocations [
# CHECK: .rela.dyn {
# CHECK-NEXT: R_AMDGPU_RELATIVE64 - 0x0
# CHECK-NEXT: R_AMDGPU_ABS64 common_var0 0x0
# CHECK-NEXT: R_AMDGPU_ABS64 common_var1 0x0
# CHECK-NEXT: R_AMDGPU_ABS64 common_var2 0x0