1 // RUN: llvm-mc -triple mips-unknown-linux < %s -show-encoding \
2 // RUN: | FileCheck -check-prefix=ENCBE -check-prefix=FIXUP %s
3 // RUN: llvm-mc -triple mipsel-unknown-linux < %s -show-encoding \
4 // RUN: | FileCheck -check-prefix=ENCLE -check-prefix=FIXUP %s
5 // RUN: llvm-mc -filetype=obj -triple mipsel-unknown-linux < %s \
6 // RUN: | llvm-readobj -r | FileCheck -check-prefix=RELOC %s
8 // Test that we produce the correct relocation.
9 // FIXME: move more relocation only tests here.
12 // RELOC - Check the relocation in the object.
13 // FIXUP - Check the fixup on the instruction.
14 // ENCBE - Check the big-endian encoding on the instruction.
15 // ENCLE - Check the little-endian encoding on the instruction.
16 // ????? - Placeholder. Relocation is defined but the way of generating it is
18 // FIXME - Placeholder. Generation method is known but doesn't work.
20 .short foo // RELOC: R_MIPS_16 foo
22 .long foo // RELOC: R_MIPS_32 foo
24 // ?????: R_MIPS_REL32 foo
26 jal foo // RELOC: R_MIPS_26 foo
27 // ENCBE: jal foo # encoding: [0b000011AA,A,A,A]
28 // ENCLE: jal foo # encoding: [A,A,A,0b000011AA]
29 // FIXUP: # fixup A - offset: 0, value: foo, kind: fixup_Mips_26
31 addiu $2, $3, %hi(foo) // RELOC: R_MIPS_HI16 foo
32 // ENCBE: addiu $2, $3, %hi(foo) # encoding: [0x24,0x62,A,A]
33 // ENCLE: addiu $2, $3, %hi(foo) # encoding: [A,A,0x62,0x24]
34 // FIXUP: # fixup A - offset: 0, value: foo@ABS_HI, kind: fixup_Mips_HI16
36 addiu $2, $3, %lo(foo) // RELOC: R_MIPS_LO16 foo
37 // ENCBE: addiu $2, $3, %lo(foo) # encoding: [0x24,0x62,A,A]
38 // ENCLE: addiu $2, $3, %lo(foo) # encoding: [A,A,0x62,0x24]
39 // FIXUP: # fixup A - offset: 0, value: foo@ABS_LO, kind: fixup_Mips_LO16
41 addiu $2, $3, %gp_rel(foo) // RELOC: R_MIPS_GPREL16 foo
42 // ENCBE: addiu $2, $3, %gp_rel(foo) # encoding: [0x24,0x62,A,A]
43 // ENCLE: addiu $2, $3, %gp_rel(foo) # encoding: [A,A,0x62,0x24]
44 // FIXUP: # fixup A - offset: 0, value: foo@GPREL, kind: fixup_Mips_GPREL
46 // ?????: R_MIPS_LITERAL foo
48 addiu $2, $3, %got(foo) // RELOC: R_MIPS_GOT16 foo
49 // ENCBE: addiu $2, $3, %got(foo) # encoding: [0x24,0x62,A,A]
50 // ENCLE: addiu $2, $3, %got(foo) # encoding: [A,A,0x62,0x24]
51 // FIXUP: # fixup A - offset: 0, value: foo@GOT, kind: fixup_Mips_GOT_Local
53 .short foo-. // RELOC: R_MIPS_PC16 foo
55 addiu $2, $3, %call16(foo) // RELOC: R_MIPS_CALL16 foo
56 // ENCBE: addiu $2, $3, %call16(foo) # encoding: [0x24,0x62,A,A]
57 // ENCLE: addiu $2, $3, %call16(foo) # encoding: [A,A,0x62,0x24]
58 // FIXUP: # fixup A - offset: 0, value: foo@GOT_CALL, kind: fixup_Mips_CALL16
60 .quad foo // RELOC: R_MIPS_64 foo
62 // ?????: R_MIPS_GPREL32 foo
63 // ?????: R_MIPS_UNUSED1 foo
64 // ?????: R_MIPS_UNUSED2 foo
65 // ?????: R_MIPS_UNUSED3 foo
66 // ?????: R_MIPS_SHIFT5 foo
67 // ?????: R_MIPS_SHIFT6 foo
69 addiu $2, $3, %got_disp(foo) // RELOC: R_MIPS_GOT_DISP foo
70 // ENCBE: addiu $2, $3, %got_disp(foo) # encoding: [0x24,0x62,A,A]
71 // ENCLE: addiu $2, $3, %got_disp(foo) # encoding: [A,A,0x62,0x24]
72 // FIXUP: # fixup A - offset: 0, value: foo@GOT_DISP, kind: fixup_Mips_GOT_DISP
74 addiu $2, $3, %got_page(foo) // RELOC: R_MIPS_GOT_PAGE foo
75 // ENCBE: addiu $2, $3, %got_page(foo) # encoding: [0x24,0x62,A,A]
76 // ENCLE: addiu $2, $3, %got_page(foo) # encoding: [A,A,0x62,0x24]
77 // FIXUP: # fixup A - offset: 0, value: foo@GOT_PAGE, kind: fixup_Mips_GOT_PAGE
79 addiu $2, $3, %got_ofst(foo) // RELOC: R_MIPS_GOT_OFST foo
80 // ENCBE: addiu $2, $3, %got_ofst(foo) # encoding: [0x24,0x62,A,A]
81 // ENCLE: addiu $2, $3, %got_ofst(foo) # encoding: [A,A,0x62,0x24]
82 // FIXUP: # fixup A - offset: 0, value: foo@GOT_OFST, kind: fixup_Mips_GOT_OFST
84 addiu $2, $3, %got_hi(foo) // RELOC: R_MIPS_GOT_HI16 foo
85 // ENCBE: addiu $2, $3, %got_hi(foo) # encoding: [0x24,0x62,A,A]
86 // ENCLE: addiu $2, $3, %got_hi(foo) # encoding: [A,A,0x62,0x24]
87 // FIXUP: # fixup A - offset: 0, value: foo@GOT_HI16, kind: fixup_Mips_GOT_HI16
89 addiu $2, $3, %got_lo(foo) // RELOC: R_MIPS_GOT_LO16 foo
90 // ENCBE: addiu $2, $3, %got_lo(foo) # encoding: [0x24,0x62,A,A]
91 // ENCLE: addiu $2, $3, %got_lo(foo) # encoding: [A,A,0x62,0x24]
92 // FIXUP: # fixup A - offset: 0, value: foo@GOT_LO16, kind: fixup_Mips_GOT_LO16
94 // addiu $2, $3, %neg(foo) // FIXME: R_MIPS_SUB foo
95 // ?????: R_MIPS_INSERT_A
96 // ?????: R_MIPS_INSERT_B
97 // ?????: R_MIPS_DELETE
100 daddiu $2, $3, %higher(foo) // RELOC: R_MIPS_HIGHER foo
101 // ENCBE: daddiu $2, $3, %higher(foo) # encoding: [0x64,0x62,A,A]
102 // ENCLE: daddiu $2, $3, %higher(foo) # encoding: [A,A,0x62,0x64]
103 // FIXUP: # fixup A - offset: 0, value: foo@HIGHER, kind: fixup_Mips_HIGHER
105 daddiu $2, $3, %highest(foo) // RELOC: R_MIPS_HIGHEST foo
106 // ENCBE: daddiu $2, $3, %highest(foo) # encoding: [0x64,0x62,A,A]
107 // ENCLE: daddiu $2, $3, %highest(foo) # encoding: [A,A,0x62,0x64]
108 // FIXUP: # fixup A - offset: 0, value: foo@HIGHEST, kind: fixup_Mips_HIGHEST
111 addiu $2, $3, %call_hi(foo) // RELOC: R_MIPS_CALL_HI16 foo
112 // ENCBE: addiu $2, $3, %call_hi(foo) # encoding: [0x24,0x62,A,A]
113 // ENCLE: addiu $2, $3, %call_hi(foo) # encoding: [A,A,0x62,0x24]
114 // FIXUP: # fixup A - offset: 0, value: foo@CALL_HI16, kind: fixup_Mips_CALL_HI16
116 addiu $2, $3, %call_lo(foo) // RELOC: R_MIPS_CALL_LO16 foo
117 // ENCBE: addiu $2, $3, %call_lo(foo) # encoding: [0x24,0x62,A,A]
118 // ENCLE: addiu $2, $3, %call_lo(foo) # encoding: [A,A,0x62,0x24]
119 // FIXUP: # fixup A - offset: 0, value: foo@CALL_LO16, kind: fixup_Mips_CALL_LO16
121 // ?????: R_MIPS_SCN_DISP foo
122 // ?????: R_MIPS_REL16 foo
123 // ?????: R_MIPS_ADD_IMMEDIATE foo
124 // ?????: R_MIPS_PJUMP foo
125 // ?????: R_MIPS_RELGOT foo
126 // jalr $25 // ?????: R_MIPS_JALR foo
128 // ?????: R_MIPS_TLS_DTPMOD32 foo
129 // .dtprelword foo // FIXME: R_MIPS_TLS_DTPREL32 foo
130 // ?????: R_MIPS_TLS_DTPMOD64 foo
131 // .dtpreldword foo // FIXME: R_MIPS_TLS_DTPREL64 foo
132 addiu $2, $3, %tlsgd(foo) // RELOC: R_MIPS_TLS_GD foo
133 // ENCBE: addiu $2, $3, %tlsgd(foo) # encoding: [0x24,0x62,A,A]
134 // ENCLE: addiu $2, $3, %tlsgd(foo) # encoding: [A,A,0x62,0x24]
135 // FIXUP: # fixup A - offset: 0, value: foo@TLSGD, kind: fixup_Mips_TLSGD
137 addiu $2, $3, %tlsldm(foo) // RELOC: R_MIPS_TLS_LDM foo
138 // ENCBE: addiu $2, $3, %tlsldm(foo) # encoding: [0x24,0x62,A,A]
139 // ENCLE: addiu $2, $3, %tlsldm(foo) # encoding: [A,A,0x62,0x24]
140 // FIXUP: # fixup A - offset: 0, value: foo@TLSLDM, kind: fixup_Mips_TLSLDM
142 addiu $2, $3, %dtprel_hi(foo) // RELOC: R_MIPS_TLS_DTPREL_HI16 foo
143 // ENCBE: addiu $2, $3, %dtprel_hi(foo) # encoding: [0x24,0x62,A,A]
144 // ENCLE: addiu $2, $3, %dtprel_hi(foo) # encoding: [A,A,0x62,0x24]
145 // FIXUP: # fixup A - offset: 0, value: foo@DTPREL_HI, kind: fixup_Mips_DTPREL_HI
147 addiu $2, $3, %dtprel_lo(foo) // RELOC: R_MIPS_TLS_DTPREL_LO16 foo
148 // ENCBE: addiu $2, $3, %dtprel_lo(foo) # encoding: [0x24,0x62,A,A]
149 // ENCLE: addiu $2, $3, %dtprel_lo(foo) # encoding: [A,A,0x62,0x24]
150 // FIXUP: # fixup A - offset: 0, value: foo@DTPREL_LO, kind: fixup_Mips_DTPREL_LO
152 addiu $2, $3, %gottprel(foo) // RELOC: R_MIPS_TLS_GOTTPREL foo
153 // ENCBE: addiu $2, $3, %gottprel(foo) # encoding: [0x24,0x62,A,A]
154 // ENCLE: addiu $2, $3, %gottprel(foo) # encoding: [A,A,0x62,0x24]
155 // FIXUP: # fixup A - offset: 0, value: foo@GOTTPREL, kind: fixup_Mips_GOTTPREL
157 // .tprelword foo // FIXME: R_MIPS_TLS_TPREL32 foo
158 // .tpreldword foo // FIXME: R_MIPS_TLS_TPREL64 foo
159 addiu $2, $3, %tprel_hi(foo) // RELOC: R_MIPS_TLS_TPREL_HI16 foo
160 // ENCBE: addiu $2, $3, %tprel_hi(foo) # encoding: [0x24,0x62,A,A]
161 // ENCLE: addiu $2, $3, %tprel_hi(foo) # encoding: [A,A,0x62,0x24]
162 // FIXUP: # fixup A - offset: 0, value: foo@TPREL_HI, kind: fixup_Mips_TPREL_HI
164 addiu $2, $3, %tprel_lo(foo) // RELOC: R_MIPS_TLS_TPREL_LO16 foo
165 // ENCBE: addiu $2, $3, %tprel_lo(foo) # encoding: [0x24,0x62,A,A]
166 // ENCLE: addiu $2, $3, %tprel_lo(foo) # encoding: [A,A,0x62,0x24]
167 // FIXUP: # fixup A - offset: 0, value: foo@TPREL_LO, kind: fixup_Mips_TPREL_LO
169 // ?????: R_MIPS_GLOB_DAT foo
171 beqzc $2, foo // RELOC: R_MIPS_PC21_S2 foo
172 // ENCBE: beqzc $2, foo # encoding: [0xd8,0b010AAAAA,A,A]
173 // ENCLE: beqzc $2, foo # encoding: [A,A,0b010AAAAA,0xd8]
174 // FIXUP: # fixup A - offset: 0, value: foo-4, kind: fixup_MIPS_PC21_S2
176 bc foo // RELOC: R_MIPS_PC26_S2 foo
177 // ENCBE: bc foo # encoding: [0b110010AA,A,A,A]
178 // ENCLE: bc foo # encoding: [A,A,A,0b110010AA]
179 // FIXUP: # fixup A - offset: 0, value: foo-4, kind: fixup_MIPS_PC26_S2
182 ldpc $2, foo // RELOC: R_MIPS_PC18_S3 foo
183 // ENCBE: ldpc $2, foo # encoding: [0xec,0b010110AA,A,A]
184 // ENCLE: ldpc $2, foo # encoding: [A,A,0b010110AA,0xec]
185 // FIXUP: # fixup A - offset: 0, value: foo, kind: fixup_Mips_PC18_S3
188 lwpc $2, foo // RELOC: R_MIPS_PC19_S2 foo
189 // ENCBE: lwpc $2, foo # encoding: [0xec,0b01001AAA,A,A]
190 // ENCLE: lwpc $2, foo # encoding: [A,A,0b01001AAA,0xec]
191 // FIXUP: # fixup A - offset: 0, value: foo, kind: fixup_MIPS_PC19_S2
193 addiu $2, $3, %pcrel_hi(foo) // RELOC: R_MIPS_PCHI16 foo
194 // ENCBE: addiu $2, $3, %pcrel_hi(foo) # encoding: [0x24,0x62,A,A]
195 // ENCLE: addiu $2, $3, %pcrel_hi(foo) # encoding: [A,A,0x62,0x24]
196 // FIXUP: # fixup A - offset: 0, value: foo@PCREL_HI16, kind: fixup_MIPS_PCHI16
198 addiu $2, $3, %pcrel_lo(foo) // RELOC: R_MIPS_PCLO16 foo
199 // ENCBE: addiu $2, $3, %pcrel_lo(foo) # encoding: [0x24,0x62,A,A]
200 // ENCLE: addiu $2, $3, %pcrel_lo(foo) # encoding: [A,A,0x62,0x24]
201 // FIXUP: # fixup A - offset: 0, value: foo@PCREL_LO16, kind: fixup_MIPS_PCLO16
205 // ?????: R_MIPS_COPY foo
206 // ?????: R_MIPS_JUMP_SLOT foo
207 // FIXME: R_MICROMIPS_*
208 .long foo-. // RELOC: R_MIPS_PC32 foo
209 // .ehword foo // FIXME: R_MIPS_EH foo