1# RUN: llvm-mc -triple riscv32 -riscv-no-aliases < %s -show-encoding \
2# RUN:     | FileCheck -check-prefix=INSTR -check-prefix=FIXUP %s
3# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+c < %s \
4# RUN:     | llvm-readobj -r - | FileCheck -check-prefix=RELOC %s
5
6# Check prefixes:
7# RELOC - Check the relocation in the object.
8# FIXUP - Check the fixup on the instruction.
9# INSTR - Check the instruction is handled properly by the ASMPrinter
10
11.long foo
12# RELOC: R_RISCV_32 foo
13
14.quad foo
15# RELOC: R_RISCV_64 foo
16
17lui t1, %hi(foo)
18# RELOC: R_RISCV_HI20 foo 0x0
19# INSTR: lui t1, %hi(foo)
20# FIXUP: fixup A - offset: 0, value: %hi(foo), kind: fixup_riscv_hi20
21
22lui t1, %hi(foo+4)
23# RELOC: R_RISCV_HI20 foo 0x4
24# INSTR: lui t1, %hi(foo+4)
25# FIXUP: fixup A - offset: 0, value: %hi(foo+4), kind: fixup_riscv_hi20
26
27lui t1, %tprel_hi(foo)
28# RELOC: R_RISCV_TPREL_HI20 foo 0x0
29# INSTR: lui t1, %tprel_hi(foo)
30# FIXUP: fixup A - offset: 0, value: %tprel_hi(foo), kind: fixup_riscv_tprel_hi20
31
32lui t1, %tprel_hi(foo+4)
33# RELOC: R_RISCV_TPREL_HI20 foo 0x4
34# INSTR: lui t1, %tprel_hi(foo+4)
35# FIXUP: fixup A - offset: 0, value: %tprel_hi(foo+4), kind: fixup_riscv_tprel_hi20
36
37addi t1, t1, %lo(foo)
38# RELOC: R_RISCV_LO12_I foo 0x0
39# INSTR: addi t1, t1, %lo(foo)
40# FIXUP: fixup A - offset: 0, value: %lo(foo), kind: fixup_riscv_lo12_i
41
42addi t1, t1, %lo(foo+4)
43# RELOC: R_RISCV_LO12_I foo 0x4
44# INSTR: addi t1, t1, %lo(foo+4)
45# FIXUP: fixup A - offset: 0, value: %lo(foo+4), kind: fixup_riscv_lo12_i
46
47addi t1, t1, %tprel_lo(foo)
48# RELOC: R_RISCV_TPREL_LO12_I foo 0x0
49# INSTR: addi t1, t1, %tprel_lo(foo)
50# FIXUP: fixup A - offset: 0, value: %tprel_lo(foo), kind: fixup_riscv_tprel_lo12_i
51
52addi t1, t1, %tprel_lo(foo+4)
53# RELOC: R_RISCV_TPREL_LO12_I foo 0x4
54# INSTR: addi t1, t1, %tprel_lo(foo+4)
55# FIXUP: fixup A - offset: 0, value: %tprel_lo(foo+4), kind: fixup_riscv_tprel_lo12_i
56
57sb t1, %lo(foo)(a2)
58# RELOC: R_RISCV_LO12_S foo 0x0
59# INSTR: sb t1, %lo(foo)(a2)
60# FIXUP: fixup A - offset: 0, value: %lo(foo), kind: fixup_riscv_lo12_s
61
62sb t1, %lo(foo+4)(a2)
63# RELOC: R_RISCV_LO12_S foo 0x4
64# INSTR: sb t1, %lo(foo+4)(a2)
65# FIXUP: fixup A - offset: 0, value: %lo(foo+4), kind: fixup_riscv_lo12_s
66
67sb t1, %tprel_lo(foo)(a2)
68# RELOC: R_RISCV_TPREL_LO12_S foo 0x0
69# INSTR: sb t1, %tprel_lo(foo)(a2)
70# FIXUP: fixup A - offset: 0, value: %tprel_lo(foo), kind: fixup_riscv_tprel_lo12_s
71
72sb t1, %tprel_lo(foo+4)(a2)
73# RELOC: R_RISCV_TPREL_LO12_S foo 0x4
74# INSTR: sb t1, %tprel_lo(foo+4)(a2)
75# FIXUP: fixup A - offset: 0, value: %tprel_lo(foo+4), kind: fixup_riscv_tprel_lo12_s
76
77.L0:
78auipc t1, %pcrel_hi(foo)
79# RELOC: R_RISCV_PCREL_HI20 foo 0x0
80# INSTR: auipc t1, %pcrel_hi(foo)
81# FIXUP: fixup A - offset: 0, value: %pcrel_hi(foo), kind: fixup_riscv_pcrel_hi20
82
83auipc t1, %pcrel_hi(foo+4)
84# RELOC: R_RISCV_PCREL_HI20 foo 0x4
85# INSTR: auipc t1, %pcrel_hi(foo+4)
86# FIXUP: fixup A - offset: 0, value: %pcrel_hi(foo+4), kind: fixup_riscv_pcrel_hi20
87
88addi t1, t1, %pcrel_lo(.L0)
89# RELOC: R_RISCV_PCREL_LO12_I .L0 0x0
90# INSTR: addi t1, t1, %pcrel_lo(.L0)
91# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L0), kind: fixup_riscv_pcrel_lo12_i
92
93sb t1, %pcrel_lo(.L0)(a2)
94# RELOC: R_RISCV_PCREL_LO12_S .L0 0x0
95# INSTR: sb t1, %pcrel_lo(.L0)(a2)
96# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L0), kind: fixup_riscv_pcrel_lo12_s
97
98.L1:
99auipc t1, %got_pcrel_hi(foo)
100# RELOC: R_RISCV_GOT_HI20 foo 0x0
101# INSTR: auipc t1, %got_pcrel_hi(foo)
102# FIXUP: fixup A - offset: 0, value: %got_pcrel_hi(foo), kind: fixup_riscv_got_hi20
103
104addi t1, t1, %pcrel_lo(.L1)
105# RELOC: R_RISCV_PCREL_LO12_I .L1 0x0
106# INSTR: addi t1, t1, %pcrel_lo(.L1)
107# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L1), kind: fixup_riscv_pcrel_lo12_i
108
109sb t1, %pcrel_lo(.L1)(a2)
110# RELOC: R_RISCV_PCREL_LO12_S .L1 0x0
111# INSTR: sb t1, %pcrel_lo(.L1)(a2)
112# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L1), kind: fixup_riscv_pcrel_lo12_s
113
114# Check that GOT relocations aren't evaluated to a constant when the symbol is
115# in the same object file.
116.L2:
117auipc t1, %got_pcrel_hi(.L1)
118# RELOC: R_RISCV_GOT_HI20 .L1 0x0
119# INSTR: auipc t1, %got_pcrel_hi(.L1)
120# FIXUP: fixup A - offset: 0, value: %got_pcrel_hi(.L1), kind: fixup_riscv_got_hi20
121
122addi t1, t1, %pcrel_lo(.L2)
123# RELOC: R_RISCV_PCREL_LO12_I .L2 0x0
124# INSTR: addi t1, t1, %pcrel_lo(.L2)
125# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L2), kind: fixup_riscv_pcrel_lo12_i
126
127sb t1, %pcrel_lo(.L2)(a2)
128# RELOC: R_RISCV_PCREL_LO12_S .L2 0x0
129# INSTR: sb t1, %pcrel_lo(.L2)(a2)
130# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L2), kind: fixup_riscv_pcrel_lo12_s
131
132.L3:
133auipc t1, %tls_ie_pcrel_hi(foo)
134# RELOC: R_RISCV_TLS_GOT_HI20 foo 0x0
135# INSTR: auipc t1, %tls_ie_pcrel_hi(foo)
136# FIXUP: fixup A - offset: 0, value: %tls_ie_pcrel_hi(foo), kind: fixup_riscv_tls_got_hi20
137
138addi t1, t1, %pcrel_lo(.L3)
139# RELOC: R_RISCV_PCREL_LO12_I .L3 0x0
140# INSTR: addi t1, t1, %pcrel_lo(.L3)
141# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L3), kind: fixup_riscv_pcrel_lo12_i
142
143sb t1, %pcrel_lo(.L3)(a2)
144# RELOC: R_RISCV_PCREL_LO12_S .L3 0x0
145# INSTR: sb t1, %pcrel_lo(.L3)(a2)
146# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L3), kind: fixup_riscv_pcrel_lo12_s
147
148.L4:
149auipc t1, %tls_gd_pcrel_hi(foo)
150# RELOC: R_RISCV_TLS_GD_HI20 foo 0x0
151# INSTR: auipc t1, %tls_gd_pcrel_hi(foo)
152# FIXUP: fixup A - offset: 0, value: %tls_gd_pcrel_hi(foo), kind: fixup_riscv_tls_gd_hi20
153
154addi t1, t1, %pcrel_lo(.L4)
155# RELOC: R_RISCV_PCREL_LO12_I .L4 0x0
156# INSTR: addi t1, t1, %pcrel_lo(.L4)
157# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L4), kind: fixup_riscv_pcrel_lo12_i
158
159sb t1, %pcrel_lo(.L4)(a2)
160# RELOC: R_RISCV_PCREL_LO12_S .L4 0x0
161# INSTR: sb t1, %pcrel_lo(.L4)(a2)
162# FIXUP: fixup A - offset: 0, value: %pcrel_lo(.L4), kind: fixup_riscv_pcrel_lo12_s
163
164add t1, t1, tp, %tprel_add(foo)
165# RELOC: R_RISCV_TPREL_ADD foo 0x0
166# INSTR: add t1, t1, tp, %tprel_add(foo)
167# FIXUP: fixup A - offset: 0, value: %tprel_add(foo), kind: fixup_riscv_tprel_add
168
169jal zero, foo
170# RELOC: R_RISCV_JAL
171# INSTR: jal zero, foo
172# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_jal
173
174bgeu a0, a1, foo
175# RELOC: R_RISCV_BRANCH
176# INSTR: bgeu a0, a1, foo
177# FIXUP: fixup A - offset: 0, value: foo, kind: fixup_riscv_branch
178