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.text
9
10kernel0:
11  s_mov_b32 s0, common_var0@GOTPCREL+4
12  s_mov_b32 s0, common_var1@gotpcrel32@lo+4
13  s_mov_b32 s0, common_var2@gotpcrel32@hi+4
14
15  s_mov_b32 s0, global_var0@GOTPCREL+4
16  s_mov_b32 s0, global_var1@gotpcrel32@lo+4
17  s_mov_b32 s0, global_var2@gotpcrel32@hi+4
18
19  s_mov_b32 s0, extern_var0@GOTPCREL+4
20  s_mov_b32 s0, extern_var1@gotpcrel32@lo+4
21  s_mov_b32 s0, extern_var2@gotpcrel32@hi+4
22
23  s_mov_b32 s0, weak_var0@GOTPCREL+4
24  s_mov_b32 s0, weak_var1@gotpcrel32@lo+4
25  s_mov_b32 s0, weak_var2@gotpcrel32@hi+4
26
27  s_mov_b32 s0, weakref_var0@GOTPCREL+4
28  s_mov_b32 s0, weakref_var1@gotpcrel32@lo+4
29  s_mov_b32 s0, weakref_var2@gotpcrel32@hi+4
30
31  s_mov_b32 s0, local_var0+4
32  s_mov_b32 s0, local_var1@rel32@lo+4
33  s_mov_b32 s0, local_var2@rel32@hi+4
34
35  s_endpgm
36
37  .comm    common_var0,1024,4
38  .comm    common_var1,1024,4
39  .comm    common_var2,1024,4
40  .globl   global_var0
41  .globl   global_var1
42  .globl   global_var1
43  .weak    weak_var0
44  .weak    weak_var1
45  .weak    weak_var2
46  .weakref weakref_var0, weakref_alias_var0
47  .weakref weakref_var1, weakref_alias_var1
48  .weakref weakref_var2, weakref_alias_var2
49  .local   local_var0
50  .local   local_var1
51  .local   local_var2
52  local_var0:
53  local_var1:
54  local_var2:
55
56# R_AMDGPU_ABS32:
57.section nonalloc, "w", @progbits
58  .long var0, common_var2+4
59  .long var1, common_var1+8
60  .long var2, common_var0+12
61
62# R_AMDGPU_ABS64:
63.type ptr, @object
64.data
65  .globl ptr
66  .p2align 3
67ptr:
68  .quad temp
69  .size ptr, 8
70
71# R_AMDGPU_RELATIVE64:
72  .type temp2, @object
73  .local temp2
74  .size temp2, 4
75  temp2:
76
77  .type ptr2, @object
78  .globl ptr2
79  .size ptr2, 8
80  .p2align 3
81ptr2:
82  .quad temp2
83
84# R_AMDGPU_REL64:
85.type foo, @object
86.rodata
87  .globl foo
88  .p2align 3
89foo:
90  .quad temp2@rel64
91  .size foo, 8
92
93# The relocation for local_var{0, 1, 2} and var should be resolved by the
94# linker.
95# CHECK: Relocations [
96# CHECK: .rela.dyn {
97# CHECK-NEXT: R_AMDGPU_RELATIVE64 - 0x3008
98# CHECK-NEXT: R_AMDGPU_ABS64 common_var0 0x0
99# CHECK-NEXT: R_AMDGPU_ABS64 common_var1 0x0
100# CHECK-NEXT: R_AMDGPU_ABS64 common_var2 0x0
101# CHECK-NEXT: R_AMDGPU_ABS64 extern_var0 0x0
102# CHECK-NEXT: R_AMDGPU_ABS64 extern_var1 0x0
103# CHECK-NEXT: R_AMDGPU_ABS64 extern_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 temp 0x0
108# CHECK-NEXT: R_AMDGPU_ABS64 weak_var0 0x0
109# CHECK-NEXT: R_AMDGPU_ABS64 weak_var1 0x0
110# CHECK-NEXT: R_AMDGPU_ABS64 weak_var2 0x0
111# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var0 0x0
112# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var1 0x0
113# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var2 0x0
114# CHECK-NEXT: }
115# CHECK-NEXT: ]
116
117# NM: 0000000000003010 B common_var0
118# NM: 0000000000003410 B common_var1
119# NM: 0000000000003810 B common_var2
120# NM: 0000000000003008 d temp2
121
122# temp2 - foo = 0x3008-0x768 = 0x28a0
123# HEX:      section '.rodata':
124# HEX-NEXT: 0x00000768 a0280000 00000000
125
126# common_var2+4, common_var1+8, and common_var0+12.
127# HEX:      section 'nonalloc':
128# HEX-NEXT: 0x00000000 00000000 14380000 00000000 18340000
129# HEX-NEXT: 0x00000010 00000000 1c300000
130