1# RUN: llvm-mc %s -triple mips-unknown-linux-gnu -show-encoding |\
2# RUN:   FileCheck %s -check-prefixes=ALL,MIPS,O32
3
4# RUN: llvm-mc %s -triple mips64-unknown-linux-gnuabin32 -show-encoding |\
5# RUN:   FileCheck %s -check-prefixes=ALL,MIPS,N32
6
7# RUN: llvm-mc %s -triple mips64-unknown-linux-gnu -show-encoding |\
8# RUN:   FileCheck %s -check-prefixes=ALL,MIPS,N64
9
10# RUN: llvm-mc %s -triple mips-unknown-linux-gnu -mattr=micromips -show-encoding |\
11# RUN:   FileCheck %s -check-prefixes=ALL,MM,O32-MM
12
13# Repeat the tests but using ELF output. An initial version of this patch did
14# this as the output different depending on whether it went through
15# MCAsmStreamer or MCELFStreamer. This ensures that the assembly expansion and
16# direct objection emission match.
17
18# RUN: llvm-mc %s -triple mips-unknown-linux-gnu -filetype=obj | \
19# RUN:   llvm-objdump -d -r - | FileCheck %s -check-prefixes=ELF-O32
20# RUN: llvm-mc %s -triple mips64-unknown-linux-gnuabin32 -filetype=obj | \
21# RUN:   llvm-objdump -d -r - | FileCheck %s -check-prefixes=ELF-N32
22# RUN: llvm-mc %s -triple mips64-unknown-linux-gnu -filetype=obj | \
23# RUN:   llvm-objdump -d -r - | FileCheck %s -check-prefixes=ELF-N64
24
25  .weak weak_label
26
27  .text
28  .option pic2
29
30  .ent local_label
31local_label:
32  .frame  $sp, 0, $ra
33  .set noreorder
34
35  jal local_label
36  nop
37
38# Expanding "jal local_label":
39# O32: lw     $25, %got(local_label)($gp)   # encoding: [0x8f,0x99,A,A]
40# O32:                                      #   fixup A - offset: 0, value: %got(local_label), kind:   fixup_Mips_GOT
41# O32: addiu  $25, $25, %lo(local_label)    # encoding: [0x27,0x39,A,A]
42# O32:                                      #   fixup A - offset: 0, value: %lo(local_label), kind:   fixup_Mips_LO16
43# O32-NEXT: .reloc ($tmp0), R_MIPS_JALR, local_label
44
45# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
46# ELF-O32-NEXT:                 R_MIPS_GOT16 .text
47# ELF-O32-NEXT: 27 39 00 00 addiu $25, $25, 0
48# ELF-O32-NEXT:                 R_MIPS_LO16 .text
49# ELF-O32-NEXT: 03 20 f8 09 jalr $25
50# ELF-O32-NEXT:                 R_MIPS_JALR local_label
51
52# N32: lw  $25, %got_disp(local_label)($gp) # encoding: [0x8f,0x99,A,A]
53# N32:                                      #   fixup A - offset: 0, value: %got_disp(local_label), kind:   fixup_Mips_GOT_DISP
54# N32-NEXT: .reloc .Ltmp0, R_MIPS_JALR, local_label
55
56# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
57# ELF-N32-NEXT:                 R_MIPS_GOT_DISP local_label
58# ELF-N32-NEXT: 03 20 f8 09 jalr $25
59# ELF-N32-NEXT:                 R_MIPS_JALR local_label
60
61# N64: ld  $25, %got_disp(local_label)($gp) # encoding: [0xdf,0x99,A,A]
62# N64:                                      #   fixup A - offset: 0, value: %got_disp(local_label), kind:   fixup_Mips_GOT_DISP
63# N64-NEXT: .reloc .Ltmp0, R_MIPS_JALR, local_label
64
65# ELF-N64:      df 99 00 00 ld $25, 0($gp)
66# ELF-N64-NEXT:                 R_MIPS_GOT_DISP/R_MIPS_NONE/R_MIPS_NONE local_label
67# ELF-N64-NEXT: 03 20 f8 09 jalr $25
68# ELF-N64-NEXT: R_MIPS_JALR/R_MIPS_NONE/R_MIPS_NONE local_label
69
70# O32-MM: lw    $25, %got(local_label)($gp)      # encoding: [0xff,0x3c,A,A]
71# O32-MM:                                        #   fixup A - offset: 0, value: %got(local_label), kind:   fixup_MICROMIPS_GOT16
72# O32-MM: addiu $25, $25, %lo(local_label)       # encoding: [0x33,0x39,A,A]
73# O32-MM:                                        #   fixup A - offset: 0, value: %lo(local_label), kind:   fixup_MICROMIPS_LO16
74# O32-MM-NEXT: .reloc ($tmp0), R_MICROMIPS_JALR, local_label
75
76# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
77# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
78# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
79
80  jal weak_label
81  nop
82
83# Expanding "jal weak_label":
84# O32: lw  $25, %call16(weak_label)($gp) # encoding: [0x8f,0x99,A,A]
85# O32:                                   #   fixup A - offset: 0, value: %call16(weak_label), kind:   fixup_Mips_CALL16
86# O32-NEXT: .reloc ($tmp1), R_MIPS_JALR, weak_label
87
88# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
89# ELF-O32-NEXT:                 R_MIPS_CALL16 weak_label
90# ELF-O32-NEXT: 03 20 f8 09 jalr $25
91# ELF-O32-NEXT:                 R_MIPS_JALR weak_label
92
93# N32: lw  $25, %call16(weak_label)($gp) # encoding: [0x8f,0x99,A,A]
94# N32:                                   #   fixup A - offset: 0, value: %call16(weak_label), kind:   fixup_Mips_CALL16
95# N32-NEXT: .reloc .Ltmp1, R_MIPS_JALR, weak_label
96
97# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
98# ELF-N32-NEXT:                 R_MIPS_CALL16 weak_label
99# ELF-N32-NEXT: 03 20 f8 09 jalr $25
100# ELF-N32-NEXT:                 R_MIPS_JALR weak_label
101
102# N64: ld  $25, %call16(weak_label)($gp) # encoding: [0xdf,0x99,A,A]
103# N64:                                   #   fixup A - offset: 0, value: %call16(weak_label), kind:   fixup_Mips_CALL16
104# N64-NEXT: .reloc .Ltmp1, R_MIPS_JALR, weak_label
105
106# ELF-N64:      df 99 00 00 ld $25, 0($gp)
107# ELF-N64-NEXT:                 R_MIPS_CALL16/R_MIPS_NONE/R_MIPS_NONE weak_label
108# ELF-N64-NEXT: 03 20 f8 09 jalr $25
109# ELF-N64-NEXT:                 R_MIPS_JALR/R_MIPS_NONE/R_MIPS_NONE weak_label
110
111# O32-MM: lw  $25, %call16(weak_label)($gp) # encoding: [0xff,0x3c,A,A]
112# O32-MM:                                   #   fixup A - offset: 0, value: %call16(weak_label), kind:   fixup_MICROMIPS_CALL16
113# O32-MM-NEXT: .reloc ($tmp1), R_MICROMIPS_JALR, weak_label
114
115# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
116# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
117# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
118
119  jal global_label
120  nop
121
122# Expanding "jal global_label":
123# O32: lw  $25, %call16(global_label)($gp) # encoding: [0x8f,0x99,A,A]
124# O32:                                     #   fixup A - offset: 0, value: %call16(global_label), kind:   fixup_Mips_CALL16
125# O32-NEXT: .reloc ($tmp2), R_MIPS_JALR, global_label
126
127# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
128# ELF-O32-NEXT:                 R_MIPS_CALL16 global_label
129# ELF-O32-NEXT: 03 20 f8 09 jalr $25
130# ELF-O32-NEXT:                 R_MIPS_JALR global_label
131
132# N32: lw  $25, %call16(global_label)($gp) # encoding: [0x8f,0x99,A,A]
133# N32:                                     #   fixup A - offset: 0, value: %call16(global_label), kind:   fixup_Mips_CALL16
134# N32-NEXT: .reloc .Ltmp2, R_MIPS_JALR, global_label
135
136# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
137# ELF-N32-NEXT:                 R_MIPS_CALL16 global_label
138# ELF-N32-NEXT: 03 20 f8 09 jalr $25
139# ELF-N32-NEXT:                 R_MIPS_JALR global_label
140
141# N64: ld  $25, %call16(global_label)($gp) # encoding: [0xdf,0x99,A,A]
142# N64:                                     #   fixup A - offset: 0, value: %call16(global_label), kind:   fixup_Mips_CALL16
143# N64-NEXT: .reloc .Ltmp2, R_MIPS_JALR, global_label
144
145# ELF-N64:      df 99 00 00 ld $25, 0($gp)
146# ELF-N64-NEXT:                 R_MIPS_CALL16/R_MIPS_NONE/R_MIPS_NONE global_label
147# ELF-N64-NEXT: 03 20 f8 09 jalr $25
148# ELF-N64-NEXT:                 R_MIPS_JALR/R_MIPS_NONE/R_MIPS_NONE global_label
149
150# O32-MM: lw  $25, %call16(global_label)($gp) # encoding: [0xff,0x3c,A,A]
151# O32-MM:                                     #   fixup A - offset: 0, value: %call16(global_label), kind: fixup_MICROMIPS_CALL16
152# O32-MM-NEXT: .reloc ($tmp2), R_MICROMIPS_JALR, global_label
153
154# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
155# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
156# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
157
158  jal .text
159  nop
160
161# Expanding "jal .text":
162# O32: lw	$25, %got(.text)($gp)   # encoding: [0x8f,0x99,A,A]
163# O32-NEXT:                                       #   fixup A - offset: 0, value: %got(.text), kind: fixup_Mips_GOT
164
165# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
166# ELF-O32-NEXT:                 R_MIPS_GOT16 .text
167
168# N32: lw	$25, %got_disp(.text)($gp) # encoding: [0x8f,0x99,A,A]
169# N32-NEXT:                                       #   fixup A - offset: 0, value: %got_disp(.text), kind: fixup_Mips_GOT_DISP
170
171# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
172# ELF-N32-NEXT:                 R_MIPS_GOT_DISP .text
173
174# N64: ld	$25, %got_disp(.text)($gp) # encoding: [0xdf,0x99,A,A]
175# N64-NEXT:                                       #   fixup A - offset: 0, value: %got_disp(.text), kind: fixup_Mips_GOT_DISP
176
177# ELF-N64:      df 99 00 00 ld $25, 0($gp)
178# ELF-N64-NEXT:                 R_MIPS_GOT_DISP/R_MIPS_NONE/R_MIPS_NONE	.text
179
180# O32-MM: lw    $25, %got(.text)($gp)      # encoding: [0xff,0x3c,A,A]
181# O32-MM-NEXT:                                  #   fixup A - offset: 0, value: %got(.text), kind: fixup_MICROMIPS_GOT16
182# O32-MM-NEXT: addiu $25, $25, %lo(.text)       # encoding: [0x33,0x39,A,A]
183# O32-MM-NEXT:                                  #   fixup A - offset: 0, value: %lo(.text), kind: fixup_MICROMIPS_LO16
184# O32-MM-NEXT: .reloc ($tmp3), R_MICROMIPS_JALR, .text
185
186# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
187# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
188# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
189
190  # local labels ($tmp symbols)
191  jal 1f
192  nop
193
194# Expanding "jal 1f":
195# O32: lw     $25, %got($tmp4)($gp)   # encoding: [0x8f,0x99,A,A]
196# O32:                                #   fixup A - offset: 0, value: %got($tmp4), kind:   fixup_Mips_GOT
197# O32: addiu  $25, $25, %lo($tmp4)    # encoding: [0x27,0x39,A,A]
198# O32:                                #   fixup A - offset: 0, value: %lo($tmp4), kind:   fixup_Mips_LO16
199# O32-NEXT: .reloc ($tmp5), R_MIPS_JALR, ($tmp4)
200
201# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
202# ELF-O32-NEXT:                 R_MIPS_GOT16 .text
203# ELF-O32-NEXT: 27 39 00 58 	addiu	$25, $25, 88
204# ELF-O32-NEXT:                 R_MIPS_LO16 .text
205# ELF-O32-NEXT: 03 20 f8 09 jalr $25
206# ELF-O32-NEXT:                 R_MIPS_JALR $tmp0
207
208# N32: lw  $25, %got_disp(.Ltmp4)($gp) # encoding: [0x8f,0x99,A,A]
209# N32:                                #   fixup A - offset: 0, value: %got_disp(.Ltmp4), kind:   fixup_Mips_GOT_DISP
210
211# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
212# ELF-N32-NEXT:                 R_MIPS_GOT_DISP .Ltmp0
213
214# N64: ld  $25, %got_disp(.Ltmp4)($gp) # encoding: [0xdf,0x99,A,A]
215# N64:                                 #   fixup A - offset: 0, value: %got_disp(.Ltmp4), kind:   fixup_Mips_GOT_DISP
216
217# ELF-N64:      df 99 00 00 ld $25, 0($gp)
218# ELF-N64-NEXT:                 R_MIPS_GOT_DISP/R_MIPS_NONE/R_MIPS_NONE .Ltmp0
219
220# O32-MM: lw    $25, %got($tmp4)($gp)    # encoding: [0xff,0x3c,A,A]
221# O32-MM:                                #   fixup A - offset: 0, value: %got($tmp4), kind: fixup_MICROMIPS_GOT16
222# O32-MM: addiu $25, $25, %lo($tmp4)     # encoding: [0x33,0x39,A,A]
223# O32-MM:                                #   fixup A - offset: 0, value: %lo($tmp4), kind: fixup_MICROMIPS_LO16
224# O32-MM-NEXT: .reloc ($tmp5), R_MICROMIPS_JALR, ($tmp4)
225
226# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
227# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
228# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
229
230  .local forward_local
231  jal forward_local
232  nop
233
234# Expanding "jal forward_local":
235# O32-FIXME: lw     $25, %got(forward_local)($gp)                    # encoding: [0x8f,0x99,A,A]
236# O32-FIXME:                                                         #   fixup A - offset: 0, value: %got(forward_local), kind:   fixup_Mips_GOT
237# O32-FIXME: addiu  $25, $25, %lo(forward_local)                     # encoding: [0x27,0x39,A,A]
238# O32-FIXME::                                                         #   fixup A - offset: 0, value: %lo(forward_local), kind:   fixup_Mips_LO16
239# O32-FIXME: .reloc ($tmp6), R_MIPS_JALR, forward_local
240
241# ELF-O32:      8f 99 00 00 lw $25, 0($gp)
242# ELF-O32-NEXT:                 R_MIPS_GOT16 .text
243# ELF-O32-NEXT: 27 39 00 64 	addiu	$25, $25, 100
244# ELF-O32-NEXT:                 R_MIPS_LO16 .text
245# ELF-O32-NEXT: 03 20 f8 09 jalr $25
246# ELF-O32-NEXT:                 R_MIPS_JALR forward_local
247
248# N32-FIXME: lw  $25, %got_disp(forward_local)($gp)            # encoding: [0x8f,0x99,A,A]
249# N32-FIXME:                                                   #   fixup A - offset: 0, value: %got_disp(forward_local), kind:   fixup_Mips_GOT_DISP
250
251# ELF-N32:      8f 99 00 00 lw $25, 0($gp)
252# ELF-N32-NEXT:                 R_MIPS_GOT_DISP forward_local
253
254# N64-FIXME: ld  $25, %got_disp(forward_local)($gp)            # encoding: [0xdf,0x99,A,A]
255# N64-FIXME:                                                   #   fixup A - offset: 0, value: %got_disp(forward_local), kind:   fixup_Mips_GOT_DISP
256
257# ELF-N64:      df 99 00 00 ld $25, 0($gp)
258# ELF-N64-NEXT:                 R_MIPS_GOT_DISP/R_MIPS_NONE/R_MIPS_NONE forward_local
259
260# O32-MM-FIXME: lw    $25, %got(forward_local)($gp)            # encoding: [0xff,0x3c,A,A]
261# O32-MM-FIXME:                                                #   fixup A - offset: 0, value: %got(forward_local), kind:   fixup_MICROMIPS_GOT16
262# O32-MM-FIXME: addiu $25, $25, %lo(forward_local)             # encoding: [0x33,0x39,A,A]
263# O32-MM-FIXME:                                                #   fixup A - offset: 0, value: %lo(forward_local), kind:   fixup_MICROMIPS_LO16
264# O32-MM-FIXME: .reloc ($tmp6), R_MIPS_JALR, forward_local
265
266# MIPS: jalr $25      # encoding: [0x03,0x20,0xf8,0x09]
267# MM:   jalr $ra, $25 # encoding: [0x03,0xf9,0x0f,0x3c]
268# ALL:  nop           # encoding: [0x00,0x00,0x00,0x00]
269
270  .end local_label
271
2721:
273  nop
274  add $8, $8, $8
275  nop
276forward_local:
277