25 PPCELFObjectWriter(
bool Is64Bit, uint8_t OSABI);
29 const MCFixup &Fixup,
bool IsPCRel)
const override;
31 bool needsRelocateWithSymbol(
const MCSymbol &Sym,
32 unsigned Type)
const override;
36 PPCELFObjectWriter::PPCELFObjectWriter(
bool Is64Bit, uint8_t OSABI)
46 return Target.getAccessVariant();
48 switch (cast<PPCMCExpr>(Expr)->getKind()) {
49 case PPCMCExpr::VK_PPC_None:
50 return MCSymbolRefExpr::VK_None;
51 case PPCMCExpr::VK_PPC_LO:
52 return MCSymbolRefExpr::VK_PPC_LO;
53 case PPCMCExpr::VK_PPC_HI:
54 return MCSymbolRefExpr::VK_PPC_HI;
55 case PPCMCExpr::VK_PPC_HA:
56 return MCSymbolRefExpr::VK_PPC_HA;
57 case PPCMCExpr::VK_PPC_HIGH:
58 return MCSymbolRefExpr::VK_PPC_HIGH;
59 case PPCMCExpr::VK_PPC_HIGHA:
60 return MCSymbolRefExpr::VK_PPC_HIGHA;
61 case PPCMCExpr::VK_PPC_HIGHERA:
62 return MCSymbolRefExpr::VK_PPC_HIGHERA;
63 case PPCMCExpr::VK_PPC_HIGHER:
64 return MCSymbolRefExpr::VK_PPC_HIGHER;
65 case PPCMCExpr::VK_PPC_HIGHEST:
66 return MCSymbolRefExpr::VK_PPC_HIGHEST;
67 case PPCMCExpr::VK_PPC_HIGHESTA:
68 return MCSymbolRefExpr::VK_PPC_HIGHESTA;
84 switch (
Fixup.getTargetKind()) {
92 case MCSymbolRefExpr::VK_None:
93 Type = ELF::R_PPC_REL24;
95 case MCSymbolRefExpr::VK_PLT:
96 Type = ELF::R_PPC_PLTREL24;
98 case MCSymbolRefExpr::VK_PPC_LOCAL:
99 Type = ELF::R_PPC_LOCAL24PC;
101 case MCSymbolRefExpr::VK_PPC_NOTOC:
102 Type = ELF::R_PPC64_REL24_NOTOC;
108 Type = ELF::R_PPC_REL14;
113 case MCSymbolRefExpr::VK_None:
114 Type = ELF::R_PPC_REL16;
116 case MCSymbolRefExpr::VK_PPC_LO:
117 Type = ELF::R_PPC_REL16_LO;
119 case MCSymbolRefExpr::VK_PPC_HI:
120 Type = ELF::R_PPC_REL16_HI;
122 case MCSymbolRefExpr::VK_PPC_HA:
123 Type = ELF::R_PPC_REL16_HA;
136 case MCSymbolRefExpr::VK_PCREL:
137 Type = ELF::R_PPC64_PCREL34;
139 case MCSymbolRefExpr::VK_PPC_GOT_PCREL:
140 Type = ELF::R_PPC64_GOT_PCREL34;
142 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
143 Type = ELF::R_PPC64_GOT_TLSGD_PCREL34;
145 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL:
146 Type = ELF::R_PPC64_GOT_TLSLD_PCREL34;
148 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
149 Type = ELF::R_PPC64_GOT_TPREL_PCREL34;
155 Type = ELF::R_PPC_REL32;
159 Type = ELF::R_PPC64_REL64;
163 switch (
Fixup.getTargetKind()) {
166 Type = ELF::R_PPC_ADDR24;
169 Type = ELF::R_PPC_ADDR14;
174 case MCSymbolRefExpr::VK_None:
175 Type = ELF::R_PPC_ADDR16;
177 case MCSymbolRefExpr::VK_PPC_LO:
178 Type = ELF::R_PPC_ADDR16_LO;
180 case MCSymbolRefExpr::VK_PPC_HI:
181 Type = ELF::R_PPC_ADDR16_HI;
183 case MCSymbolRefExpr::VK_PPC_HA:
184 Type = ELF::R_PPC_ADDR16_HA;
186 case MCSymbolRefExpr::VK_PPC_HIGH:
187 Type = ELF::R_PPC64_ADDR16_HIGH;
189 case MCSymbolRefExpr::VK_PPC_HIGHA:
190 Type = ELF::R_PPC64_ADDR16_HIGHA;
192 case MCSymbolRefExpr::VK_PPC_HIGHER:
193 Type = ELF::R_PPC64_ADDR16_HIGHER;
195 case MCSymbolRefExpr::VK_PPC_HIGHERA:
196 Type = ELF::R_PPC64_ADDR16_HIGHERA;
198 case MCSymbolRefExpr::VK_PPC_HIGHEST:
199 Type = ELF::R_PPC64_ADDR16_HIGHEST;
201 case MCSymbolRefExpr::VK_PPC_HIGHESTA:
202 Type = ELF::R_PPC64_ADDR16_HIGHESTA;
204 case MCSymbolRefExpr::VK_GOT:
205 Type = ELF::R_PPC_GOT16;
207 case MCSymbolRefExpr::VK_PPC_GOT_LO:
208 Type = ELF::R_PPC_GOT16_LO;
210 case MCSymbolRefExpr::VK_PPC_GOT_HI:
211 Type = ELF::R_PPC_GOT16_HI;
213 case MCSymbolRefExpr::VK_PPC_GOT_HA:
214 Type = ELF::R_PPC_GOT16_HA;
216 case MCSymbolRefExpr::VK_PPC_TOC:
217 Type = ELF::R_PPC64_TOC16;
219 case MCSymbolRefExpr::VK_PPC_TOC_LO:
220 Type = ELF::R_PPC64_TOC16_LO;
222 case MCSymbolRefExpr::VK_PPC_TOC_HI:
223 Type = ELF::R_PPC64_TOC16_HI;
225 case MCSymbolRefExpr::VK_PPC_TOC_HA:
226 Type = ELF::R_PPC64_TOC16_HA;
228 case MCSymbolRefExpr::VK_TPREL:
229 Type = ELF::R_PPC_TPREL16;
231 case MCSymbolRefExpr::VK_PPC_TPREL_LO:
232 Type = ELF::R_PPC_TPREL16_LO;
234 case MCSymbolRefExpr::VK_PPC_TPREL_HI:
235 Type = ELF::R_PPC_TPREL16_HI;
237 case MCSymbolRefExpr::VK_PPC_TPREL_HA:
238 Type = ELF::R_PPC_TPREL16_HA;
240 case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
241 Type = ELF::R_PPC64_TPREL16_HIGH;
243 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
244 Type = ELF::R_PPC64_TPREL16_HIGHA;
246 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
247 Type = ELF::R_PPC64_TPREL16_HIGHER;
249 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
250 Type = ELF::R_PPC64_TPREL16_HIGHERA;
252 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
253 Type = ELF::R_PPC64_TPREL16_HIGHEST;
255 case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
256 Type = ELF::R_PPC64_TPREL16_HIGHESTA;
258 case MCSymbolRefExpr::VK_DTPREL:
259 Type = ELF::R_PPC64_DTPREL16;
261 case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
262 Type = ELF::R_PPC64_DTPREL16_LO;
264 case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
265 Type = ELF::R_PPC64_DTPREL16_HI;
267 case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
268 Type = ELF::R_PPC64_DTPREL16_HA;
270 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
271 Type = ELF::R_PPC64_DTPREL16_HIGH;
273 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
274 Type = ELF::R_PPC64_DTPREL16_HIGHA;
276 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
277 Type = ELF::R_PPC64_DTPREL16_HIGHER;
279 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
280 Type = ELF::R_PPC64_DTPREL16_HIGHERA;
282 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
283 Type = ELF::R_PPC64_DTPREL16_HIGHEST;
285 case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
286 Type = ELF::R_PPC64_DTPREL16_HIGHESTA;
288 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
290 Type = ELF::R_PPC64_GOT_TLSGD16;
292 Type = ELF::R_PPC_GOT_TLSGD16;
294 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
295 Type = ELF::R_PPC64_GOT_TLSGD16_LO;
297 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
298 Type = ELF::R_PPC64_GOT_TLSGD16_HI;
300 case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
301 Type = ELF::R_PPC64_GOT_TLSGD16_HA;
303 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
305 Type = ELF::R_PPC64_GOT_TLSLD16;
307 Type = ELF::R_PPC_GOT_TLSLD16;
309 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
310 Type = ELF::R_PPC64_GOT_TLSLD16_LO;
312 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
313 Type = ELF::R_PPC64_GOT_TLSLD16_HI;
315 case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
316 Type = ELF::R_PPC64_GOT_TLSLD16_HA;
318 case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
321 Type = ELF::R_PPC64_GOT_TPREL16_DS;
323 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
326 Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
328 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
329 Type = ELF::R_PPC64_GOT_TPREL16_HI;
331 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
334 Type = ELF::R_PPC64_GOT_DTPREL16_DS;
336 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
339 Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
341 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
342 Type = ELF::R_PPC64_GOT_TPREL16_HA;
344 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
345 Type = ELF::R_PPC64_GOT_DTPREL16_HI;
347 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
348 Type = ELF::R_PPC64_GOT_DTPREL16_HA;
356 case MCSymbolRefExpr::VK_None:
357 Type = ELF::R_PPC64_ADDR16_DS;
359 case MCSymbolRefExpr::VK_PPC_LO:
360 Type = ELF::R_PPC64_ADDR16_LO_DS;
362 case MCSymbolRefExpr::VK_GOT:
363 Type = ELF::R_PPC64_GOT16_DS;
365 case MCSymbolRefExpr::VK_PPC_GOT_LO:
366 Type = ELF::R_PPC64_GOT16_LO_DS;
368 case MCSymbolRefExpr::VK_PPC_TOC:
369 Type = ELF::R_PPC64_TOC16_DS;
371 case MCSymbolRefExpr::VK_PPC_TOC_LO:
372 Type = ELF::R_PPC64_TOC16_LO_DS;
374 case MCSymbolRefExpr::VK_TPREL:
375 Type = ELF::R_PPC64_TPREL16_DS;
377 case MCSymbolRefExpr::VK_PPC_TPREL_LO:
378 Type = ELF::R_PPC64_TPREL16_LO_DS;
380 case MCSymbolRefExpr::VK_DTPREL:
381 Type = ELF::R_PPC64_DTPREL16_DS;
383 case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
384 Type = ELF::R_PPC64_DTPREL16_LO_DS;
386 case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
387 Type = ELF::R_PPC64_GOT_TPREL16_DS;
389 case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
390 Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
392 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
393 Type = ELF::R_PPC64_GOT_DTPREL16_DS;
395 case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
396 Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
403 case MCSymbolRefExpr::VK_PPC_TLSGD:
405 Type = ELF::R_PPC64_TLSGD;
407 Type = ELF::R_PPC_TLSGD;
409 case MCSymbolRefExpr::VK_PPC_TLSLD:
411 Type = ELF::R_PPC64_TLSLD;
413 Type = ELF::R_PPC_TLSLD;
415 case MCSymbolRefExpr::VK_PPC_TLS:
417 Type = ELF::R_PPC64_TLS;
419 Type = ELF::R_PPC_TLS;
421 case MCSymbolRefExpr::VK_PPC_TLS_PCREL:
422 Type = ELF::R_PPC64_TLS;
430 case MCSymbolRefExpr::VK_DTPREL:
431 Type = ELF::R_PPC64_DTPREL34;
433 case MCSymbolRefExpr::VK_TPREL:
434 Type = ELF::R_PPC64_TPREL34;
441 case MCSymbolRefExpr::VK_PPC_TOCBASE:
442 Type = ELF::R_PPC64_TOC;
444 case MCSymbolRefExpr::VK_None:
445 Type = ELF::R_PPC64_ADDR64;
447 case MCSymbolRefExpr::VK_PPC_DTPMOD:
448 Type = ELF::R_PPC64_DTPMOD64;
450 case MCSymbolRefExpr::VK_TPREL:
451 Type = ELF::R_PPC64_TPREL64;
453 case MCSymbolRefExpr::VK_DTPREL:
454 Type = ELF::R_PPC64_DTPREL64;
459 Type = ELF::R_PPC_ADDR32;
462 Type = ELF::R_PPC_ADDR16;
469 bool PPCELFObjectWriter::needsRelocateWithSymbol(
const MCSymbol &Sym,
470 unsigned Type)
const {
475 case ELF::R_PPC_REL24:
476 case ELF::R_PPC64_REL24_NOTOC:
482 unsigned Other = cast<MCSymbolELF>(Sym).getOther() << 2;
487 std::unique_ptr<MCObjectTargetWriter>
489 return std::make_unique<PPCELFObjectWriter>(Is64Bit, OSABI);