• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
7
8// Test that we produce the correct relocation.
9// FIXME: move more relocation only tests here.
10
11// Check prefixes:
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
17//         unknown.
18// FIXME - Placeholder. Generation method is known but doesn't work.
19
20        .short foo                         // RELOC: R_MIPS_16 foo
21
22        .long foo                          // RELOC: R_MIPS_32 foo
23
24                                           // ?????: R_MIPS_REL32 foo
25
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
30
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
35
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
40
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
45
46                                           // ?????: R_MIPS_LITERAL foo
47
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
52
53        .short foo-.                       // RELOC: R_MIPS_PC16 foo
54
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
59
60        .quad foo                          // RELOC: R_MIPS_64 foo
61
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
68
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
73
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
78
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
83
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
88
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
93
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
98
99        .set mips64
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
104
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
109
110        .set mips0
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
115
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
120
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
127
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
136
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
141
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
146
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
151
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
156
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
163
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
168
169                                           // ?????: R_MIPS_GLOB_DAT foo
170        .set mips32r6
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
175
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
180
181        .set mips64r6
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
186
187        .set mips32r6
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
192
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
197
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
202
203        .set mips0
204                                           // FIXME: R_MIPS16_*
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
210