xref: /llvm-project/lld/test/ELF/amdgpu-relocs.s (revision df979228ef46caa23f0dff1e6a2c8948d45513bf)
1# REQUIRES: amdgpu
2# RUN: llvm-mc -filetype=obj -triple=amdgcn--amdhsa -mcpu=fiji %s -o %t.o
3# RUN: ld.lld --hash-style=sysv -shared %t.o -o %t.so
4# RUN: llvm-readobj -r %t.so | FileCheck %s
5# RUN: llvm-nm %t.so | FileCheck %s --check-prefix=NM
6# RUN: llvm-readelf -x .rodata -x nonalloc %t.so | FileCheck %s --check-prefix=HEX
7
8## ABS64 and RELATIVE64 relocs do not cause --check-dynamic-relocations errors.
9# RUN: ld.lld --hash-style=sysv -shared %t.o -o /dev/null --apply-dynamic-relocs
10
11.text
12
13kernel0:
14  s_mov_b32 s0, common_var0@GOTPCREL+4
15  s_mov_b32 s0, common_var1@gotpcrel32@lo+4
16  s_mov_b32 s0, common_var2@gotpcrel32@hi+4
17
18  s_mov_b32 s0, global_var0@GOTPCREL+4
19  s_mov_b32 s0, global_var1@gotpcrel32@lo+4
20  s_mov_b32 s0, global_var2@gotpcrel32@hi+4
21
22  s_mov_b32 s0, extern_var0@GOTPCREL+4
23  s_mov_b32 s0, extern_var1@gotpcrel32@lo+4
24  s_mov_b32 s0, extern_var2@gotpcrel32@hi+4
25
26  s_mov_b32 s0, weak_var0@GOTPCREL+4
27  s_mov_b32 s0, weak_var1@gotpcrel32@lo+4
28  s_mov_b32 s0, weak_var2@gotpcrel32@hi+4
29
30  s_mov_b32 s0, weakref_var0@GOTPCREL+4
31  s_mov_b32 s0, weakref_var1@gotpcrel32@lo+4
32  s_mov_b32 s0, weakref_var2@gotpcrel32@hi+4
33
34  s_mov_b32 s0, local_var0+4
35  s_mov_b32 s0, local_var1@rel32@lo+4
36  s_mov_b32 s0, local_var2@rel32@hi+4
37
38  s_endpgm
39
40  .comm    common_var0,1024,4
41  .comm    common_var1,1024,4
42  .comm    common_var2,1024,4
43  .globl   global_var0
44  .globl   global_var1
45  .globl   global_var1
46  .weak    weak_var0
47  .weak    weak_var1
48  .weak    weak_var2
49  .weakref weakref_var0, weakref_alias_var0
50  .weakref weakref_var1, weakref_alias_var1
51  .weakref weakref_var2, weakref_alias_var2
52  .local   local_var0
53  .local   local_var1
54  .local   local_var2
55  local_var0:
56  local_var1:
57  local_var2:
58
59# R_AMDGPU_ABS32:
60.section nonalloc, "w", @progbits
61  .long var0, common_var2+4
62  .long var1, common_var1+8
63  .long var2, common_var0+12
64
65# R_AMDGPU_ABS64:
66.type ptr, @object
67.data
68  .globl ptr
69  .p2align 3
70ptr:
71  .quad temp
72  .size ptr, 8
73
74# R_AMDGPU_RELATIVE64:
75  .type temp2, @object
76  .local temp2
77  .size temp2, 4
78  temp2:
79
80  .type ptr2, @object
81  .globl ptr2
82  .size ptr2, 8
83  .p2align 3
84ptr2:
85  .quad temp2
86
87# R_AMDGPU_REL64:
88.type foo, @object
89.rodata
90  .globl foo
91  .p2align 3
92foo:
93  .quad temp2@rel64
94  .size foo, 8
95
96# The relocation for local_var{0, 1, 2} and var should be resolved by the
97# linker.
98# CHECK: Relocations [
99# CHECK: .rela.dyn {
100# CHECK-NEXT: R_AMDGPU_RELATIVE64 - 0x3928
101# CHECK-NEXT: R_AMDGPU_ABS64 common_var0 0x0
102# CHECK-NEXT: R_AMDGPU_ABS64 common_var1 0x0
103# CHECK-NEXT: R_AMDGPU_ABS64 common_var2 0x0
104# CHECK-NEXT: R_AMDGPU_ABS64 global_var0 0x0
105# CHECK-NEXT: R_AMDGPU_ABS64 global_var1 0x0
106# CHECK-NEXT: R_AMDGPU_ABS64 global_var2 0x0
107# CHECK-NEXT: R_AMDGPU_ABS64 extern_var0 0x0
108# CHECK-NEXT: R_AMDGPU_ABS64 extern_var1 0x0
109# CHECK-NEXT: R_AMDGPU_ABS64 extern_var2 0x0
110# CHECK-NEXT: R_AMDGPU_ABS64 weak_var0 0x0
111# CHECK-NEXT: R_AMDGPU_ABS64 weak_var1 0x0
112# CHECK-NEXT: R_AMDGPU_ABS64 weak_var2 0x0
113# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var0 0x0
114# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var1 0x0
115# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var2 0x0
116# CHECK-NEXT: R_AMDGPU_ABS64 temp 0x0
117# CHECK-NEXT: }
118# CHECK-NEXT: ]
119
120# NM: 0000000000003930 B common_var0
121# NM: 0000000000003d30 B common_var1
122# NM: 0000000000004130 B common_var2
123# NM: 0000000000003928 d temp2
124
125# temp2 - foo = 0x3928-0x768 = 0x31c0
126# HEX:      section '.rodata':
127# HEX-NEXT: 0x00000768 c0310000 00000000
128
129# common_var2+4, common_var1+8, and common_var0+12.
130# HEX:      section 'nonalloc':
131# HEX-NEXT: 0x00000000 00000000 34410000 00000000 383d0000
132# HEX-NEXT: 0x00000010 00000000 3c390000
133