xref: /llvm-project-15.0.7/lld/ELF/Target.cpp (revision 217cf69b)
1 //===- Target.cpp ---------------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Machine-specific things, such as applying relocations, creation of
11 // GOT or PLT entries, etc., are handled in this file.
12 //
13 // Refer the ELF spec for the single letter varaibles, S, A or P, used
14 // in this file.
15 //
16 // Some functions defined in this file has "relaxTls" as part of their names.
17 // They do peephole optimization for TLS variables by rewriting instructions.
18 // They are not part of the ABI but optional optimization, so you can skip
19 // them if you are not interested in how TLS variables are optimized.
20 // See the following paper for the details.
21 //
22 //   Ulrich Drepper, ELF Handling For Thread-Local Storage
23 //   http://www.akkadia.org/drepper/tls.pdf
24 //
25 //===----------------------------------------------------------------------===//
26 
27 #include "Target.h"
28 #include "Error.h"
29 #include "InputFiles.h"
30 #include "OutputSections.h"
31 #include "Symbols.h"
32 
33 #include "llvm/ADT/ArrayRef.h"
34 #include "llvm/Object/ELF.h"
35 #include "llvm/Support/Endian.h"
36 #include "llvm/Support/ELF.h"
37 
38 using namespace llvm;
39 using namespace llvm::object;
40 using namespace llvm::support::endian;
41 using namespace llvm::ELF;
42 
43 namespace lld {
44 namespace elf {
45 
46 TargetInfo *Target;
47 
48 static void or32le(uint8_t *P, int32_t V) { write32le(P, read32le(P) | V); }
49 
50 template <unsigned N> static void checkInt(int64_t V, uint32_t Type) {
51   if (isInt<N>(V))
52     return;
53   StringRef S = getELFRelocationTypeName(Config->EMachine, Type);
54   error("relocation " + S + " out of range");
55 }
56 
57 template <unsigned N> static void checkUInt(uint64_t V, uint32_t Type) {
58   if (isUInt<N>(V))
59     return;
60   StringRef S = getELFRelocationTypeName(Config->EMachine, Type);
61   error("relocation " + S + " out of range");
62 }
63 
64 template <unsigned N> static void checkIntUInt(uint64_t V, uint32_t Type) {
65   if (isInt<N>(V) || isUInt<N>(V))
66     return;
67   StringRef S = getELFRelocationTypeName(Config->EMachine, Type);
68   error("relocation " + S + " out of range");
69 }
70 
71 template <unsigned N> static void checkAlignment(uint64_t V, uint32_t Type) {
72   if ((V & (N - 1)) == 0)
73     return;
74   StringRef S = getELFRelocationTypeName(Config->EMachine, Type);
75   error("improper alignment for relocation " + S);
76 }
77 
78 namespace {
79 class X86TargetInfo final : public TargetInfo {
80 public:
81   X86TargetInfo();
82   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
83   uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override;
84   void writeGotPltHeader(uint8_t *Buf) const override;
85   uint32_t getDynRel(uint32_t Type) const override;
86   bool isTlsLocalDynamicRel(uint32_t Type) const override;
87   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
88   bool isTlsInitialExecRel(uint32_t Type) const override;
89   void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override;
90   void writePltZero(uint8_t *Buf) const override;
91   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
92                 int32_t Index, unsigned RelOff) const override;
93   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
94 
95   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
96                           RelExpr Expr) const override;
97   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
98   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
99   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
100   void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
101 };
102 
103 class X86_64TargetInfo final : public TargetInfo {
104 public:
105   X86_64TargetInfo();
106   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
107   uint32_t getDynRel(uint32_t Type) const override;
108   bool isTlsLocalDynamicRel(uint32_t Type) const override;
109   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
110   bool isTlsInitialExecRel(uint32_t Type) const override;
111   void writeGotPltHeader(uint8_t *Buf) const override;
112   void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override;
113   void writePltZero(uint8_t *Buf) const override;
114   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
115                 int32_t Index, unsigned RelOff) const override;
116   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
117 
118   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
119                           RelExpr Expr) const override;
120   void relaxGot(uint8_t *Loc, uint64_t Val) const override;
121   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
122   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
123   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
124   void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
125 
126 private:
127   void relaxGotNoPic(uint8_t *Loc, uint64_t Val, uint8_t Op,
128                      uint8_t ModRm) const;
129 };
130 
131 class PPCTargetInfo final : public TargetInfo {
132 public:
133   PPCTargetInfo();
134   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
135   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
136 };
137 
138 class PPC64TargetInfo final : public TargetInfo {
139 public:
140   PPC64TargetInfo();
141   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
142   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
143                 int32_t Index, unsigned RelOff) const override;
144   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
145 };
146 
147 class AArch64TargetInfo final : public TargetInfo {
148 public:
149   AArch64TargetInfo();
150   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
151   uint32_t getDynRel(uint32_t Type) const override;
152   bool isTlsInitialExecRel(uint32_t Type) const override;
153   void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override;
154   void writePltZero(uint8_t *Buf) const override;
155   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
156                 int32_t Index, unsigned RelOff) const override;
157   bool usesOnlyLowPageBits(uint32_t Type) const override;
158   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
159   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
160                           RelExpr Expr) const override;
161   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
162   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
163   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
164 };
165 
166 class AMDGPUTargetInfo final : public TargetInfo {
167 public:
168   AMDGPUTargetInfo() {}
169   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
170   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
171 };
172 
173 template <class ELFT> class MipsTargetInfo final : public TargetInfo {
174 public:
175   MipsTargetInfo();
176   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
177   uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override;
178   uint32_t getDynRel(uint32_t Type) const override;
179   void writeGotPlt(uint8_t *Buf, uint64_t Plt) const override;
180   void writePltZero(uint8_t *Buf) const override;
181   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
182                 int32_t Index, unsigned RelOff) const override;
183   void writeThunk(uint8_t *Buf, uint64_t S) const override;
184   bool needsThunk(uint32_t Type, const InputFile &File,
185                   const SymbolBody &S) const override;
186   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
187   bool usesOnlyLowPageBits(uint32_t Type) const override;
188 };
189 } // anonymous namespace
190 
191 TargetInfo *createTarget() {
192   switch (Config->EMachine) {
193   case EM_386:
194     return new X86TargetInfo();
195   case EM_AARCH64:
196     return new AArch64TargetInfo();
197   case EM_AMDGPU:
198     return new AMDGPUTargetInfo();
199   case EM_MIPS:
200     switch (Config->EKind) {
201     case ELF32LEKind:
202       return new MipsTargetInfo<ELF32LE>();
203     case ELF32BEKind:
204       return new MipsTargetInfo<ELF32BE>();
205     case ELF64LEKind:
206       return new MipsTargetInfo<ELF64LE>();
207     case ELF64BEKind:
208       return new MipsTargetInfo<ELF64BE>();
209     default:
210       fatal("unsupported MIPS target");
211     }
212   case EM_PPC:
213     return new PPCTargetInfo();
214   case EM_PPC64:
215     return new PPC64TargetInfo();
216   case EM_X86_64:
217     return new X86_64TargetInfo();
218   }
219   fatal("unknown target machine");
220 }
221 
222 TargetInfo::~TargetInfo() {}
223 
224 uint64_t TargetInfo::getImplicitAddend(const uint8_t *Buf,
225                                        uint32_t Type) const {
226   return 0;
227 }
228 
229 uint64_t TargetInfo::getVAStart() const { return Config->Pic ? 0 : VAStart; }
230 
231 bool TargetInfo::usesOnlyLowPageBits(uint32_t Type) const { return false; }
232 
233 bool TargetInfo::needsThunk(uint32_t Type, const InputFile &File,
234                             const SymbolBody &S) const {
235   return false;
236 }
237 
238 bool TargetInfo::isTlsInitialExecRel(uint32_t Type) const { return false; }
239 
240 bool TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { return false; }
241 
242 bool TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
243   return false;
244 }
245 
246 RelExpr TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
247                                     RelExpr Expr) const {
248   return Expr;
249 }
250 
251 void TargetInfo::relaxGot(uint8_t *Loc, uint64_t Val) const {
252   llvm_unreachable("Should not have claimed to be relaxable");
253 }
254 
255 void TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
256                                 uint64_t Val) const {
257   llvm_unreachable("Should not have claimed to be relaxable");
258 }
259 
260 void TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
261                                 uint64_t Val) const {
262   llvm_unreachable("Should not have claimed to be relaxable");
263 }
264 
265 void TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
266                                 uint64_t Val) const {
267   llvm_unreachable("Should not have claimed to be relaxable");
268 }
269 
270 void TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
271                                 uint64_t Val) const {
272   llvm_unreachable("Should not have claimed to be relaxable");
273 }
274 
275 X86TargetInfo::X86TargetInfo() {
276   CopyRel = R_386_COPY;
277   GotRel = R_386_GLOB_DAT;
278   PltRel = R_386_JUMP_SLOT;
279   IRelativeRel = R_386_IRELATIVE;
280   RelativeRel = R_386_RELATIVE;
281   TlsGotRel = R_386_TLS_TPOFF;
282   TlsModuleIndexRel = R_386_TLS_DTPMOD32;
283   TlsOffsetRel = R_386_TLS_DTPOFF32;
284   PltEntrySize = 16;
285   PltZeroSize = 16;
286   TlsGdRelaxSkip = 2;
287 }
288 
289 RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
290   switch (Type) {
291   default:
292     return R_ABS;
293   case R_386_TLS_GD:
294     return R_TLSGD;
295   case R_386_TLS_LDM:
296     return R_TLSLD;
297   case R_386_PLT32:
298     return R_PLT_PC;
299   case R_386_PC32:
300     return R_PC;
301   case R_386_GOTPC:
302     return R_GOTONLY_PC;
303   case R_386_TLS_IE:
304     return R_GOT;
305   case R_386_GOT32:
306   case R_386_TLS_GOTIE:
307     return R_GOT_FROM_END;
308   case R_386_GOTOFF:
309     return R_GOTREL;
310   case R_386_TLS_LE:
311     return R_TLS;
312   case R_386_TLS_LE_32:
313     return R_NEG_TLS;
314   }
315 }
316 
317 RelExpr X86TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
318                                        RelExpr Expr) const {
319   switch (Expr) {
320   default:
321     return Expr;
322   case R_RELAX_TLS_GD_TO_IE:
323     return R_RELAX_TLS_GD_TO_IE_END;
324   case R_RELAX_TLS_GD_TO_LE:
325     return R_RELAX_TLS_GD_TO_LE_NEG;
326   }
327 }
328 
329 void X86TargetInfo::writeGotPltHeader(uint8_t *Buf) const {
330   write32le(Buf, Out<ELF32LE>::Dynamic->getVA());
331 }
332 
333 void X86TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const {
334   // Entries in .got.plt initially points back to the corresponding
335   // PLT entries with a fixed offset to skip the first instruction.
336   write32le(Buf, Plt + 6);
337 }
338 
339 uint32_t X86TargetInfo::getDynRel(uint32_t Type) const {
340   if (Type == R_386_TLS_LE)
341     return R_386_TLS_TPOFF;
342   if (Type == R_386_TLS_LE_32)
343     return R_386_TLS_TPOFF32;
344   return Type;
345 }
346 
347 bool X86TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
348   return Type == R_386_TLS_GD;
349 }
350 
351 bool X86TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const {
352   return Type == R_386_TLS_LDO_32 || Type == R_386_TLS_LDM;
353 }
354 
355 bool X86TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
356   return Type == R_386_TLS_IE || Type == R_386_TLS_GOTIE;
357 }
358 
359 void X86TargetInfo::writePltZero(uint8_t *Buf) const {
360   // Executable files and shared object files have
361   // separate procedure linkage tables.
362   if (Config->Pic) {
363     const uint8_t V[] = {
364         0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl 4(%ebx)
365         0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp   *8(%ebx)
366         0x90, 0x90, 0x90, 0x90              // nop; nop; nop; nop
367     };
368     memcpy(Buf, V, sizeof(V));
369     return;
370   }
371 
372   const uint8_t PltData[] = {
373       0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushl (GOT+4)
374       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp   *(GOT+8)
375       0x90, 0x90, 0x90, 0x90              // nop; nop; nop; nop
376   };
377   memcpy(Buf, PltData, sizeof(PltData));
378   uint32_t Got = Out<ELF32LE>::GotPlt->getVA();
379   write32le(Buf + 2, Got + 4);
380   write32le(Buf + 8, Got + 8);
381 }
382 
383 void X86TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
384                              uint64_t PltEntryAddr, int32_t Index,
385                              unsigned RelOff) const {
386   const uint8_t Inst[] = {
387       0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // jmp *foo_in_GOT|*foo@GOT(%ebx)
388       0x68, 0x00, 0x00, 0x00, 0x00,       // pushl $reloc_offset
389       0xe9, 0x00, 0x00, 0x00, 0x00        // jmp .PLT0@PC
390   };
391   memcpy(Buf, Inst, sizeof(Inst));
392 
393   // jmp *foo@GOT(%ebx) or jmp *foo_in_GOT
394   Buf[1] = Config->Pic ? 0xa3 : 0x25;
395   uint32_t Got = Out<ELF32LE>::GotPlt->getVA();
396   write32le(Buf + 2, Config->Shared ? GotEntryAddr - Got : GotEntryAddr);
397   write32le(Buf + 7, RelOff);
398   write32le(Buf + 12, -Index * PltEntrySize - PltZeroSize - 16);
399 }
400 
401 uint64_t X86TargetInfo::getImplicitAddend(const uint8_t *Buf,
402                                           uint32_t Type) const {
403   switch (Type) {
404   default:
405     return 0;
406   case R_386_32:
407   case R_386_GOT32:
408   case R_386_GOTOFF:
409   case R_386_GOTPC:
410   case R_386_PC32:
411   case R_386_PLT32:
412     return read32le(Buf);
413   }
414 }
415 
416 void X86TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
417                                 uint64_t Val) const {
418   checkInt<32>(Val, Type);
419   write32le(Loc, Val);
420 }
421 
422 void X86TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
423                                    uint64_t Val) const {
424   // Convert
425   //   leal x@tlsgd(, %ebx, 1),
426   //   call __tls_get_addr@plt
427   // to
428   //   movl %gs:0,%eax
429   //   subl $x@ntpoff,%eax
430   const uint8_t Inst[] = {
431       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
432       0x81, 0xe8, 0x00, 0x00, 0x00, 0x00  // subl 0(%ebx), %eax
433   };
434   memcpy(Loc - 3, Inst, sizeof(Inst));
435   relocateOne(Loc + 5, R_386_32, Val);
436 }
437 
438 void X86TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
439                                    uint64_t Val) const {
440   // Convert
441   //   leal x@tlsgd(, %ebx, 1),
442   //   call __tls_get_addr@plt
443   // to
444   //   movl %gs:0, %eax
445   //   addl x@gotntpoff(%ebx), %eax
446   const uint8_t Inst[] = {
447       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
448       0x03, 0x83, 0x00, 0x00, 0x00, 0x00  // addl 0(%ebx), %eax
449   };
450   memcpy(Loc - 3, Inst, sizeof(Inst));
451   relocateOne(Loc + 5, R_386_32, Val);
452 }
453 
454 // In some conditions, relocations can be optimized to avoid using GOT.
455 // This function does that for Initial Exec to Local Exec case.
456 void X86TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
457                                    uint64_t Val) const {
458   // Ulrich's document section 6.2 says that @gotntpoff can
459   // be used with MOVL or ADDL instructions.
460   // @indntpoff is similar to @gotntpoff, but for use in
461   // position dependent code.
462   uint8_t *Inst = Loc - 2;
463   uint8_t *Op = Loc - 1;
464   uint8_t Reg = (Loc[-1] >> 3) & 7;
465   bool IsMov = *Inst == 0x8b;
466   if (Type == R_386_TLS_IE) {
467     // For R_386_TLS_IE relocation we perform the next transformations:
468     // MOVL foo@INDNTPOFF,%EAX is transformed to MOVL $foo,%EAX
469     // MOVL foo@INDNTPOFF,%REG is transformed to MOVL $foo,%REG
470     // ADDL foo@INDNTPOFF,%REG is transformed to ADDL $foo,%REG
471     // First one is special because when EAX is used the sequence is 5 bytes
472     // long, otherwise it is 6 bytes.
473     if (*Op == 0xa1) {
474       *Op = 0xb8;
475     } else {
476       *Inst = IsMov ? 0xc7 : 0x81;
477       *Op = 0xc0 | ((*Op >> 3) & 7);
478     }
479   } else {
480     // R_386_TLS_GOTIE relocation can be optimized to
481     // R_386_TLS_LE so that it does not use GOT.
482     // "MOVL foo@GOTTPOFF(%RIP), %REG" is transformed to "MOVL $foo, %REG".
483     // "ADDL foo@GOTNTPOFF(%RIP), %REG" is transformed to "LEAL foo(%REG), %REG"
484     // Note: gold converts to ADDL instead of LEAL.
485     *Inst = IsMov ? 0xc7 : 0x8d;
486     if (IsMov)
487       *Op = 0xc0 | ((*Op >> 3) & 7);
488     else
489       *Op = 0x80 | Reg | (Reg << 3);
490   }
491   relocateOne(Loc, R_386_TLS_LE, Val);
492 }
493 
494 void X86TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
495                                    uint64_t Val) const {
496   if (Type == R_386_TLS_LDO_32) {
497     relocateOne(Loc, R_386_TLS_LE, Val);
498     return;
499   }
500 
501   // Convert
502   //   leal foo(%reg),%eax
503   //   call ___tls_get_addr
504   // to
505   //   movl %gs:0,%eax
506   //   nop
507   //   leal 0(%esi,1),%esi
508   const uint8_t Inst[] = {
509       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0,%eax
510       0x90,                               // nop
511       0x8d, 0x74, 0x26, 0x00              // leal 0(%esi,1),%esi
512   };
513   memcpy(Loc - 2, Inst, sizeof(Inst));
514 }
515 
516 X86_64TargetInfo::X86_64TargetInfo() {
517   CopyRel = R_X86_64_COPY;
518   GotRel = R_X86_64_GLOB_DAT;
519   PltRel = R_X86_64_JUMP_SLOT;
520   RelativeRel = R_X86_64_RELATIVE;
521   IRelativeRel = R_X86_64_IRELATIVE;
522   TlsGotRel = R_X86_64_TPOFF64;
523   TlsModuleIndexRel = R_X86_64_DTPMOD64;
524   TlsOffsetRel = R_X86_64_DTPOFF64;
525   PltEntrySize = 16;
526   PltZeroSize = 16;
527   TlsGdRelaxSkip = 2;
528 }
529 
530 RelExpr X86_64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
531   switch (Type) {
532   default:
533     return R_ABS;
534   case R_X86_64_TPOFF32:
535     return R_TLS;
536   case R_X86_64_TLSLD:
537     return R_TLSLD_PC;
538   case R_X86_64_TLSGD:
539     return R_TLSGD_PC;
540   case R_X86_64_SIZE32:
541   case R_X86_64_SIZE64:
542     return R_SIZE;
543   case R_X86_64_PLT32:
544     return R_PLT_PC;
545   case R_X86_64_PC32:
546   case R_X86_64_PC64:
547     return R_PC;
548   case R_X86_64_GOT32:
549     return R_GOT_FROM_END;
550   case R_X86_64_GOTPCREL:
551   case R_X86_64_GOTPCRELX:
552   case R_X86_64_REX_GOTPCRELX:
553   case R_X86_64_GOTTPOFF:
554     return R_GOT_PC;
555   }
556 }
557 
558 void X86_64TargetInfo::writeGotPltHeader(uint8_t *Buf) const {
559   // The first entry holds the value of _DYNAMIC. It is not clear why that is
560   // required, but it is documented in the psabi and the glibc dynamic linker
561   // seems to use it (note that this is relevant for linking ld.so, not any
562   // other program).
563   write64le(Buf, Out<ELF64LE>::Dynamic->getVA());
564 }
565 
566 void X86_64TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const {
567   // See comments in X86TargetInfo::writeGotPlt.
568   write32le(Buf, Plt + 6);
569 }
570 
571 void X86_64TargetInfo::writePltZero(uint8_t *Buf) const {
572   const uint8_t PltData[] = {
573       0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)
574       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)
575       0x0f, 0x1f, 0x40, 0x00              // nopl 0x0(rax)
576   };
577   memcpy(Buf, PltData, sizeof(PltData));
578   uint64_t Got = Out<ELF64LE>::GotPlt->getVA();
579   uint64_t Plt = Out<ELF64LE>::Plt->getVA();
580   write32le(Buf + 2, Got - Plt + 2); // GOT+8
581   write32le(Buf + 8, Got - Plt + 4); // GOT+16
582 }
583 
584 void X86_64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
585                                 uint64_t PltEntryAddr, int32_t Index,
586                                 unsigned RelOff) const {
587   const uint8_t Inst[] = {
588       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
589       0x68, 0x00, 0x00, 0x00, 0x00,       // pushq <relocation index>
590       0xe9, 0x00, 0x00, 0x00, 0x00        // jmpq plt[0]
591   };
592   memcpy(Buf, Inst, sizeof(Inst));
593 
594   write32le(Buf + 2, GotEntryAddr - PltEntryAddr - 6);
595   write32le(Buf + 7, Index);
596   write32le(Buf + 12, -Index * PltEntrySize - PltZeroSize - 16);
597 }
598 
599 uint32_t X86_64TargetInfo::getDynRel(uint32_t Type) const {
600   if (Type == R_X86_64_PC32 || Type == R_X86_64_32)
601     if (Config->Shared)
602       error(getELFRelocationTypeName(EM_X86_64, Type) +
603             " cannot be a dynamic relocation");
604   return Type;
605 }
606 
607 bool X86_64TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
608   return Type == R_X86_64_GOTTPOFF;
609 }
610 
611 bool X86_64TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
612   return Type == R_X86_64_TLSGD;
613 }
614 
615 bool X86_64TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const {
616   return Type == R_X86_64_DTPOFF32 || Type == R_X86_64_DTPOFF64 ||
617          Type == R_X86_64_TLSLD;
618 }
619 
620 void X86_64TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
621                                       uint64_t Val) const {
622   // Convert
623   //   .byte 0x66
624   //   leaq x@tlsgd(%rip), %rdi
625   //   .word 0x6666
626   //   rex64
627   //   call __tls_get_addr@plt
628   // to
629   //   mov %fs:0x0,%rax
630   //   lea x@tpoff,%rax
631   const uint8_t Inst[] = {
632       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax
633       0x48, 0x8d, 0x80, 0x00, 0x00, 0x00, 0x00              // lea x@tpoff,%rax
634   };
635   memcpy(Loc - 4, Inst, sizeof(Inst));
636   // The original code used a pc relative relocation and so we have to
637   // compensate for the -4 in had in the addend.
638   relocateOne(Loc + 8, R_X86_64_TPOFF32, Val + 4);
639 }
640 
641 void X86_64TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
642                                       uint64_t Val) const {
643   // Convert
644   //   .byte 0x66
645   //   leaq x@tlsgd(%rip), %rdi
646   //   .word 0x6666
647   //   rex64
648   //   call __tls_get_addr@plt
649   // to
650   //   mov %fs:0x0,%rax
651   //   addq x@tpoff,%rax
652   const uint8_t Inst[] = {
653       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax
654       0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00              // addq x@tpoff,%rax
655   };
656   memcpy(Loc - 4, Inst, sizeof(Inst));
657   // Both code sequences are PC relatives, but since we are moving the constant
658   // forward by 8 bytes we have to subtract the value by 8.
659   relocateOne(Loc + 8, R_X86_64_PC32, Val - 8);
660 }
661 
662 // In some conditions, R_X86_64_GOTTPOFF relocation can be optimized to
663 // R_X86_64_TPOFF32 so that it does not use GOT.
664 void X86_64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
665                                       uint64_t Val) const {
666   // Ulrich's document section 6.5 says that @gottpoff(%rip) must be
667   // used in MOVQ or ADDQ instructions only.
668   // "MOVQ foo@GOTTPOFF(%RIP), %REG" is transformed to "MOVQ $foo, %REG".
669   // "ADDQ foo@GOTTPOFF(%RIP), %REG" is transformed to "LEAQ foo(%REG), %REG"
670   // (if the register is not RSP/R12) or "ADDQ $foo, %RSP".
671   // Opcodes info can be found at http://ref.x86asm.net/coder64.html#x48.
672   uint8_t *Prefix = Loc - 3;
673   uint8_t *Inst = Loc - 2;
674   uint8_t *RegSlot = Loc - 1;
675   uint8_t Reg = Loc[-1] >> 3;
676   bool IsMov = *Inst == 0x8b;
677   bool RspAdd = !IsMov && Reg == 4;
678 
679   // r12 and rsp registers requires special handling.
680   // Problem is that for other registers, for example leaq 0xXXXXXXXX(%r11),%r11
681   // result out is 7 bytes: 4d 8d 9b XX XX XX XX,
682   // but leaq 0xXXXXXXXX(%r12),%r12 is 8 bytes: 4d 8d a4 24 XX XX XX XX.
683   // The same true for rsp. So we convert to addq for them, saving 1 byte that
684   // we dont have.
685   if (RspAdd)
686     *Inst = 0x81;
687   else
688     *Inst = IsMov ? 0xc7 : 0x8d;
689   if (*Prefix == 0x4c)
690     *Prefix = (IsMov || RspAdd) ? 0x49 : 0x4d;
691   *RegSlot = (IsMov || RspAdd) ? (0xc0 | Reg) : (0x80 | Reg | (Reg << 3));
692   // The original code used a pc relative relocation and so we have to
693   // compensate for the -4 in had in the addend.
694   relocateOne(Loc, R_X86_64_TPOFF32, Val + 4);
695 }
696 
697 void X86_64TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
698                                       uint64_t Val) const {
699   // Convert
700   //   leaq bar@tlsld(%rip), %rdi
701   //   callq __tls_get_addr@PLT
702   //   leaq bar@dtpoff(%rax), %rcx
703   // to
704   //   .word 0x6666
705   //   .byte 0x66
706   //   mov %fs:0,%rax
707   //   leaq bar@tpoff(%rax), %rcx
708   if (Type == R_X86_64_DTPOFF64) {
709     write64le(Loc, Val);
710     return;
711   }
712   if (Type == R_X86_64_DTPOFF32) {
713     relocateOne(Loc, R_X86_64_TPOFF32, Val);
714     return;
715   }
716 
717   const uint8_t Inst[] = {
718       0x66, 0x66,                                          // .word 0x6666
719       0x66,                                                // .byte 0x66
720       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00 // mov %fs:0,%rax
721   };
722   memcpy(Loc - 3, Inst, sizeof(Inst));
723 }
724 
725 void X86_64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
726                                    uint64_t Val) const {
727   switch (Type) {
728   case R_X86_64_32:
729     checkUInt<32>(Val, Type);
730     write32le(Loc, Val);
731     break;
732   case R_X86_64_32S:
733   case R_X86_64_TPOFF32:
734   case R_X86_64_GOT32:
735   case R_X86_64_GOTPCREL:
736   case R_X86_64_GOTPCRELX:
737   case R_X86_64_REX_GOTPCRELX:
738   case R_X86_64_PC32:
739   case R_X86_64_GOTTPOFF:
740   case R_X86_64_PLT32:
741   case R_X86_64_TLSGD:
742   case R_X86_64_TLSLD:
743   case R_X86_64_DTPOFF32:
744   case R_X86_64_SIZE32:
745     checkInt<32>(Val, Type);
746     write32le(Loc, Val);
747     break;
748   case R_X86_64_64:
749   case R_X86_64_DTPOFF64:
750   case R_X86_64_SIZE64:
751   case R_X86_64_PC64:
752     write64le(Loc, Val);
753     break;
754   default:
755     fatal("unrecognized reloc " + Twine(Type));
756   }
757 }
758 
759 RelExpr X86_64TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
760                                           RelExpr RelExpr) const {
761   if (Type != R_X86_64_GOTPCRELX && Type != R_X86_64_REX_GOTPCRELX)
762     return RelExpr;
763   const uint8_t Op = Data[-2];
764   const uint8_t ModRm = Data[-1];
765   // FIXME: When PIC is disabled and foo is defined locally in the
766   // lower 32 bit address space, memory operand in mov can be converted into
767   // immediate operand. Otherwise, mov must be changed to lea. We support only
768   // latter relaxation at this moment.
769   if (Op == 0x8b)
770     return R_RELAX_GOT_PC;
771   // Relax call and jmp.
772   if (Op == 0xff && (ModRm == 0x15 || ModRm == 0x25))
773     return R_RELAX_GOT_PC;
774 
775   // Relaxation of test, adc, add, and, cmp, or, sbb, sub, xor.
776   // If PIC then no relaxation is available.
777   // We also don't relax test/binop instructions without REX byte,
778   // they are 32bit operations and not common to have.
779   assert(Type == R_X86_64_REX_GOTPCRELX);
780   return Config->Pic ? RelExpr : R_RELAX_GOT_PC_NOPIC;
781 }
782 
783 // A subset of relaxations can only be applied for no-PIC. This method
784 // handles such relaxations. Instructions encoding information was taken from:
785 // "Intel 64 and IA-32 Architectures Software Developer's Manual V2"
786 // (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/
787 //    64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf)
788 void X86_64TargetInfo::relaxGotNoPic(uint8_t *Loc, uint64_t Val, uint8_t Op,
789                                      uint8_t ModRm) const {
790   const uint8_t Rex = Loc[-3];
791   // Convert "test %reg, foo@GOTPCREL(%rip)" to "test $foo, %reg".
792   if (Op == 0x85) {
793     // See "TEST-Logical Compare" (4-428 Vol. 2B),
794     // TEST r/m64, r64 uses "full" ModR / M byte (no opcode extension).
795 
796     // ModR/M byte has form XX YYY ZZZ, where
797     // YYY is MODRM.reg(register 2), ZZZ is MODRM.rm(register 1).
798     // XX has different meanings:
799     // 00: The operand's memory address is in reg1.
800     // 01: The operand's memory address is reg1 + a byte-sized displacement.
801     // 10: The operand's memory address is reg1 + a word-sized displacement.
802     // 11: The operand is reg1 itself.
803     // If an instruction requires only one operand, the unused reg2 field
804     // holds extra opcode bits rather than a register code
805     // 0xC0 == 11 000 000 binary.
806     // 0x38 == 00 111 000 binary.
807     // We transfer reg2 to reg1 here as operand.
808     // See "2.1.3 ModR/M and SIB Bytes" (Vol. 2A 2-3).
809     *(Loc - 1) = 0xc0 | (ModRm & 0x38) >> 3; // ModR/M byte.
810 
811     // Change opcode from TEST r/m64, r64 to TEST r/m64, imm32
812     // See "TEST-Logical Compare" (4-428 Vol. 2B).
813     *(Loc - 2) = 0xf7;
814 
815     // Move R bit to the B bit in REX byte.
816     // REX byte is encoded as 0100WRXB, where
817     // 0100 is 4bit fixed pattern.
818     // REX.W When 1, a 64-bit operand size is used. Otherwise, when 0, the
819     //   default operand size is used (which is 32-bit for most but not all
820     //   instructions).
821     // REX.R This 1-bit value is an extension to the MODRM.reg field.
822     // REX.X This 1-bit value is an extension to the SIB.index field.
823     // REX.B This 1-bit value is an extension to the MODRM.rm field or the
824     // SIB.base field.
825     // See "2.2.1.2 More on REX Prefix Fields " (2-8 Vol. 2A).
826     *(Loc - 3) = (Rex & ~0x4) | (Rex & 0x4) >> 2;
827     relocateOne(Loc, R_X86_64_PC32, Val);
828     return;
829   }
830 
831   // If we are here then we need to relax the adc, add, and, cmp, or, sbb, sub
832   // or xor operations.
833 
834   // Convert "binop foo@GOTPCREL(%rip), %reg" to "binop $foo, %reg".
835   // Logic is close to one for test instruction above, but we also
836   // write opcode extension here, see below for details.
837   *(Loc - 1) = 0xc0 | (ModRm & 0x38) >> 3 | (Op & 0x3c); // ModR/M byte.
838 
839   // Primary opcode is 0x81, opcode extension is one of:
840   // 000b = ADD, 001b is OR, 010b is ADC, 011b is SBB,
841   // 100b is AND, 101b is SUB, 110b is XOR, 111b is CMP.
842   // This value was wrote to MODRM.reg in a line above.
843   // See "3.2 INSTRUCTIONS (A-M)" (Vol. 2A 3-15),
844   // "INSTRUCTION SET REFERENCE, N-Z" (Vol. 2B 4-1) for
845   // descriptions about each operation.
846   *(Loc - 2) = 0x81;
847   *(Loc - 3) = (Rex & ~0x4) | (Rex & 0x4) >> 2;
848   relocateOne(Loc, R_X86_64_PC32, Val);
849 }
850 
851 void X86_64TargetInfo::relaxGot(uint8_t *Loc, uint64_t Val) const {
852   const uint8_t Op = Loc[-2];
853   const uint8_t ModRm = Loc[-1];
854 
855   // Convert mov foo@GOTPCREL(%rip), %reg to lea foo(%rip), %reg.
856   if (Op == 0x8b) {
857     *(Loc - 2) = 0x8d;
858     relocateOne(Loc, R_X86_64_PC32, Val);
859     return;
860   }
861 
862   // Convert call/jmp instructions.
863   if (Op == 0xff) {
864     if (ModRm == 0x15) {
865       // ABI says we can convert call *foo@GOTPCREL(%rip) to nop call foo.
866       // Instead we convert to addr32 call foo, where addr32 is instruction
867       // prefix. That makes result expression to be a single instruction.
868       *(Loc - 2) = 0x67; // addr32 prefix
869       *(Loc - 1) = 0xe8; // call
870     } else {
871       assert(ModRm == 0x25);
872       // Convert jmp *foo@GOTPCREL(%rip) to jmp foo nop.
873       // jmp doesn't return, so it is fine to use nop here, it is just a stub.
874       *(Loc - 2) = 0xe9; // jmp
875       *(Loc + 3) = 0x90; // nop
876       Loc -= 1;
877       Val += 1;
878     }
879     relocateOne(Loc, R_X86_64_PC32, Val);
880     return;
881   }
882 
883   assert(!Config->Pic);
884   // We are relaxing a rip relative to an absolute, so compensate
885   // for the old -4 addend.
886   relaxGotNoPic(Loc, Val + 4, Op, ModRm);
887 }
888 
889 // Relocation masks following the #lo(value), #hi(value), #ha(value),
890 // #higher(value), #highera(value), #highest(value), and #highesta(value)
891 // macros defined in section 4.5.1. Relocation Types of the PPC-elf64abi
892 // document.
893 static uint16_t applyPPCLo(uint64_t V) { return V; }
894 static uint16_t applyPPCHi(uint64_t V) { return V >> 16; }
895 static uint16_t applyPPCHa(uint64_t V) { return (V + 0x8000) >> 16; }
896 static uint16_t applyPPCHigher(uint64_t V) { return V >> 32; }
897 static uint16_t applyPPCHighera(uint64_t V) { return (V + 0x8000) >> 32; }
898 static uint16_t applyPPCHighest(uint64_t V) { return V >> 48; }
899 static uint16_t applyPPCHighesta(uint64_t V) { return (V + 0x8000) >> 48; }
900 
901 PPCTargetInfo::PPCTargetInfo() {}
902 
903 void PPCTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
904                                 uint64_t Val) const {
905   switch (Type) {
906   case R_PPC_ADDR16_HA:
907     write16be(Loc, applyPPCHa(Val));
908     break;
909   case R_PPC_ADDR16_LO:
910     write16be(Loc, applyPPCLo(Val));
911     break;
912   default:
913     fatal("unrecognized reloc " + Twine(Type));
914   }
915 }
916 
917 RelExpr PPCTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
918   return R_ABS;
919 }
920 
921 PPC64TargetInfo::PPC64TargetInfo() {
922   PltRel = GotRel = R_PPC64_GLOB_DAT;
923   RelativeRel = R_PPC64_RELATIVE;
924   PltEntrySize = 32;
925 
926   // We need 64K pages (at least under glibc/Linux, the loader won't
927   // set different permissions on a finer granularity than that).
928   PageSize = 65536;
929 
930   // The PPC64 ELF ABI v1 spec, says:
931   //
932   //   It is normally desirable to put segments with different characteristics
933   //   in separate 256 Mbyte portions of the address space, to give the
934   //   operating system full paging flexibility in the 64-bit address space.
935   //
936   // And because the lowest non-zero 256M boundary is 0x10000000, PPC64 linkers
937   // use 0x10000000 as the starting address.
938   VAStart = 0x10000000;
939 }
940 
941 static uint64_t PPC64TocOffset = 0x8000;
942 
943 uint64_t getPPC64TocBase() {
944   // The TOC consists of sections .got, .toc, .tocbss, .plt in that order. The
945   // TOC starts where the first of these sections starts. We always create a
946   // .got when we see a relocation that uses it, so for us the start is always
947   // the .got.
948   uint64_t TocVA = Out<ELF64BE>::Got->getVA();
949 
950   // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000
951   // thus permitting a full 64 Kbytes segment. Note that the glibc startup
952   // code (crt1.o) assumes that you can get from the TOC base to the
953   // start of the .toc section with only a single (signed) 16-bit relocation.
954   return TocVA + PPC64TocOffset;
955 }
956 
957 RelExpr PPC64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
958   switch (Type) {
959   default:
960     return R_ABS;
961   case R_PPC64_TOC16:
962   case R_PPC64_TOC16_DS:
963   case R_PPC64_TOC16_HA:
964   case R_PPC64_TOC16_HI:
965   case R_PPC64_TOC16_LO:
966   case R_PPC64_TOC16_LO_DS:
967     return R_GOTREL;
968   case R_PPC64_TOC:
969     return R_PPC_TOC;
970   case R_PPC64_REL24:
971     return R_PPC_PLT_OPD;
972   }
973 }
974 
975 void PPC64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
976                                uint64_t PltEntryAddr, int32_t Index,
977                                unsigned RelOff) const {
978   uint64_t Off = GotEntryAddr - getPPC64TocBase();
979 
980   // FIXME: What we should do, in theory, is get the offset of the function
981   // descriptor in the .opd section, and use that as the offset from %r2 (the
982   // TOC-base pointer). Instead, we have the GOT-entry offset, and that will
983   // be a pointer to the function descriptor in the .opd section. Using
984   // this scheme is simpler, but requires an extra indirection per PLT dispatch.
985 
986   write32be(Buf,      0xf8410028);                   // std %r2, 40(%r1)
987   write32be(Buf + 4,  0x3d620000 | applyPPCHa(Off)); // addis %r11, %r2, X@ha
988   write32be(Buf + 8,  0xe98b0000 | applyPPCLo(Off)); // ld %r12, X@l(%r11)
989   write32be(Buf + 12, 0xe96c0000);                   // ld %r11,0(%r12)
990   write32be(Buf + 16, 0x7d6903a6);                   // mtctr %r11
991   write32be(Buf + 20, 0xe84c0008);                   // ld %r2,8(%r12)
992   write32be(Buf + 24, 0xe96c0010);                   // ld %r11,16(%r12)
993   write32be(Buf + 28, 0x4e800420);                   // bctr
994 }
995 
996 void PPC64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
997                                   uint64_t Val) const {
998   uint64_t TO = PPC64TocOffset;
999 
1000   // For a TOC-relative relocation,  proceed in terms of the corresponding
1001   // ADDR16 relocation type.
1002   switch (Type) {
1003   case R_PPC64_TOC16:       Type = R_PPC64_ADDR16;       Val -= TO; break;
1004   case R_PPC64_TOC16_DS:    Type = R_PPC64_ADDR16_DS;    Val -= TO; break;
1005   case R_PPC64_TOC16_HA:    Type = R_PPC64_ADDR16_HA;    Val -= TO; break;
1006   case R_PPC64_TOC16_HI:    Type = R_PPC64_ADDR16_HI;    Val -= TO; break;
1007   case R_PPC64_TOC16_LO:    Type = R_PPC64_ADDR16_LO;    Val -= TO; break;
1008   case R_PPC64_TOC16_LO_DS: Type = R_PPC64_ADDR16_LO_DS; Val -= TO; break;
1009   default: break;
1010   }
1011 
1012   switch (Type) {
1013   case R_PPC64_ADDR14: {
1014     checkAlignment<4>(Val, Type);
1015     // Preserve the AA/LK bits in the branch instruction
1016     uint8_t AALK = Loc[3];
1017     write16be(Loc + 2, (AALK & 3) | (Val & 0xfffc));
1018     break;
1019   }
1020   case R_PPC64_ADDR16:
1021     checkInt<16>(Val, Type);
1022     write16be(Loc, Val);
1023     break;
1024   case R_PPC64_ADDR16_DS:
1025     checkInt<16>(Val, Type);
1026     write16be(Loc, (read16be(Loc) & 3) | (Val & ~3));
1027     break;
1028   case R_PPC64_ADDR16_HA:
1029     write16be(Loc, applyPPCHa(Val));
1030     break;
1031   case R_PPC64_ADDR16_HI:
1032     write16be(Loc, applyPPCHi(Val));
1033     break;
1034   case R_PPC64_ADDR16_HIGHER:
1035     write16be(Loc, applyPPCHigher(Val));
1036     break;
1037   case R_PPC64_ADDR16_HIGHERA:
1038     write16be(Loc, applyPPCHighera(Val));
1039     break;
1040   case R_PPC64_ADDR16_HIGHEST:
1041     write16be(Loc, applyPPCHighest(Val));
1042     break;
1043   case R_PPC64_ADDR16_HIGHESTA:
1044     write16be(Loc, applyPPCHighesta(Val));
1045     break;
1046   case R_PPC64_ADDR16_LO:
1047     write16be(Loc, applyPPCLo(Val));
1048     break;
1049   case R_PPC64_ADDR16_LO_DS:
1050     write16be(Loc, (read16be(Loc) & 3) | (applyPPCLo(Val) & ~3));
1051     break;
1052   case R_PPC64_ADDR32:
1053     checkInt<32>(Val, Type);
1054     write32be(Loc, Val);
1055     break;
1056   case R_PPC64_ADDR64:
1057     write64be(Loc, Val);
1058     break;
1059   case R_PPC64_REL16_HA:
1060     write16be(Loc, applyPPCHa(Val));
1061     break;
1062   case R_PPC64_REL16_HI:
1063     write16be(Loc, applyPPCHi(Val));
1064     break;
1065   case R_PPC64_REL16_LO:
1066     write16be(Loc, applyPPCLo(Val));
1067     break;
1068   case R_PPC64_REL24: {
1069     uint32_t Mask = 0x03FFFFFC;
1070     checkInt<24>(Val, Type);
1071     write32be(Loc, (read32be(Loc) & ~Mask) | (Val & Mask));
1072     break;
1073   }
1074   case R_PPC64_REL32:
1075     checkInt<32>(Val, Type);
1076     write32be(Loc, Val);
1077     break;
1078   case R_PPC64_REL64:
1079     write64be(Loc, Val);
1080     break;
1081   case R_PPC64_TOC:
1082     write64be(Loc, Val);
1083     break;
1084   default:
1085     fatal("unrecognized reloc " + Twine(Type));
1086   }
1087 }
1088 
1089 AArch64TargetInfo::AArch64TargetInfo() {
1090   CopyRel = R_AARCH64_COPY;
1091   RelativeRel = R_AARCH64_RELATIVE;
1092   IRelativeRel = R_AARCH64_IRELATIVE;
1093   GotRel = R_AARCH64_GLOB_DAT;
1094   PltRel = R_AARCH64_JUMP_SLOT;
1095   TlsDescRel = R_AARCH64_TLSDESC;
1096   TlsGotRel = R_AARCH64_TLS_TPREL64;
1097   PltEntrySize = 16;
1098   PltZeroSize = 32;
1099 
1100   // It doesn't seem to be documented anywhere, but tls on aarch64 uses variant
1101   // 1 of the tls structures and the tcb size is 16.
1102   TcbSize = 16;
1103 }
1104 
1105 RelExpr AArch64TargetInfo::getRelExpr(uint32_t Type,
1106                                       const SymbolBody &S) const {
1107   switch (Type) {
1108   default:
1109     return R_ABS;
1110 
1111   case R_AARCH64_TLSDESC_ADR_PAGE21:
1112     return R_TLSDESC_PAGE;
1113 
1114   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1115   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1116     return R_TLSDESC;
1117 
1118   case R_AARCH64_TLSDESC_CALL:
1119     return R_HINT;
1120 
1121   case R_AARCH64_TLSLE_ADD_TPREL_HI12:
1122   case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
1123     return R_TLS;
1124 
1125   case R_AARCH64_CALL26:
1126   case R_AARCH64_CONDBR19:
1127   case R_AARCH64_JUMP26:
1128   case R_AARCH64_TSTBR14:
1129     return R_PLT_PC;
1130 
1131   case R_AARCH64_PREL16:
1132   case R_AARCH64_PREL32:
1133   case R_AARCH64_PREL64:
1134   case R_AARCH64_ADR_PREL_LO21:
1135     return R_PC;
1136   case R_AARCH64_ADR_PREL_PG_HI21:
1137     return R_PAGE_PC;
1138   case R_AARCH64_LD64_GOT_LO12_NC:
1139   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1140     return R_GOT;
1141   case R_AARCH64_ADR_GOT_PAGE:
1142   case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
1143     return R_GOT_PAGE_PC;
1144   }
1145 }
1146 
1147 RelExpr AArch64TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
1148                                            RelExpr Expr) const {
1149   if (Expr == R_RELAX_TLS_GD_TO_IE) {
1150     if (Type == R_AARCH64_TLSDESC_ADR_PAGE21)
1151       return R_RELAX_TLS_GD_TO_IE_PAGE_PC;
1152     return R_RELAX_TLS_GD_TO_IE_ABS;
1153   }
1154   return Expr;
1155 }
1156 
1157 bool AArch64TargetInfo::usesOnlyLowPageBits(uint32_t Type) const {
1158   switch (Type) {
1159   default:
1160     return false;
1161   case R_AARCH64_ADD_ABS_LO12_NC:
1162   case R_AARCH64_LD64_GOT_LO12_NC:
1163   case R_AARCH64_LDST128_ABS_LO12_NC:
1164   case R_AARCH64_LDST16_ABS_LO12_NC:
1165   case R_AARCH64_LDST32_ABS_LO12_NC:
1166   case R_AARCH64_LDST64_ABS_LO12_NC:
1167   case R_AARCH64_LDST8_ABS_LO12_NC:
1168   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1169   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1170   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1171     return true;
1172   }
1173 }
1174 
1175 bool AArch64TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
1176   return Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 ||
1177          Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
1178 }
1179 
1180 uint32_t AArch64TargetInfo::getDynRel(uint32_t Type) const {
1181   if (Type == R_AARCH64_ABS32 || Type == R_AARCH64_ABS64)
1182     return Type;
1183   StringRef S = getELFRelocationTypeName(EM_AARCH64, Type);
1184   error("relocation " + S + " cannot be used when making a shared object; "
1185                             "recompile with -fPIC.");
1186   // Keep it going with a dummy value so that we can find more reloc errors.
1187   return R_AARCH64_ABS32;
1188 }
1189 
1190 void AArch64TargetInfo::writeGotPlt(uint8_t *Buf, uint64_t Plt) const {
1191   write64le(Buf, Out<ELF64LE>::Plt->getVA());
1192 }
1193 
1194 static uint64_t getAArch64Page(uint64_t Expr) {
1195   return Expr & (~static_cast<uint64_t>(0xFFF));
1196 }
1197 
1198 void AArch64TargetInfo::writePltZero(uint8_t *Buf) const {
1199   const uint8_t PltData[] = {
1200       0xf0, 0x7b, 0xbf, 0xa9, // stp	x16, x30, [sp,#-16]!
1201       0x10, 0x00, 0x00, 0x90, // adrp	x16, Page(&(.plt.got[2]))
1202       0x11, 0x02, 0x40, 0xf9, // ldr	x17, [x16, Offset(&(.plt.got[2]))]
1203       0x10, 0x02, 0x00, 0x91, // add	x16, x16, Offset(&(.plt.got[2]))
1204       0x20, 0x02, 0x1f, 0xd6, // br	x17
1205       0x1f, 0x20, 0x03, 0xd5, // nop
1206       0x1f, 0x20, 0x03, 0xd5, // nop
1207       0x1f, 0x20, 0x03, 0xd5  // nop
1208   };
1209   memcpy(Buf, PltData, sizeof(PltData));
1210 
1211   uint64_t Got = Out<ELF64LE>::GotPlt->getVA();
1212   uint64_t Plt = Out<ELF64LE>::Plt->getVA();
1213   relocateOne(Buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
1214               getAArch64Page(Got + 16) - getAArch64Page(Plt + 4));
1215   relocateOne(Buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, Got + 16);
1216   relocateOne(Buf + 12, R_AARCH64_ADD_ABS_LO12_NC, Got + 16);
1217 }
1218 
1219 void AArch64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
1220                                  uint64_t PltEntryAddr, int32_t Index,
1221                                  unsigned RelOff) const {
1222   const uint8_t Inst[] = {
1223       0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n]))
1224       0x11, 0x02, 0x40, 0xf9, // ldr  x17, [x16, Offset(&(.plt.got[n]))]
1225       0x10, 0x02, 0x00, 0x91, // add  x16, x16, Offset(&(.plt.got[n]))
1226       0x20, 0x02, 0x1f, 0xd6  // br   x17
1227   };
1228   memcpy(Buf, Inst, sizeof(Inst));
1229 
1230   relocateOne(Buf, R_AARCH64_ADR_PREL_PG_HI21,
1231               getAArch64Page(GotEntryAddr) - getAArch64Page(PltEntryAddr));
1232   relocateOne(Buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, GotEntryAddr);
1233   relocateOne(Buf + 8, R_AARCH64_ADD_ABS_LO12_NC, GotEntryAddr);
1234 }
1235 
1236 static void updateAArch64Addr(uint8_t *L, uint64_t Imm) {
1237   uint32_t ImmLo = (Imm & 0x3) << 29;
1238   uint32_t ImmHi = (Imm & 0x1FFFFC) << 3;
1239   uint64_t Mask = (0x3 << 29) | (0x1FFFFC << 3);
1240   write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi);
1241 }
1242 
1243 static inline void updateAArch64Add(uint8_t *L, uint64_t Imm) {
1244   or32le(L, (Imm & 0xFFF) << 10);
1245 }
1246 
1247 void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1248                                     uint64_t Val) const {
1249   switch (Type) {
1250   case R_AARCH64_ABS16:
1251   case R_AARCH64_PREL16:
1252     checkIntUInt<16>(Val, Type);
1253     write16le(Loc, Val);
1254     break;
1255   case R_AARCH64_ABS32:
1256   case R_AARCH64_PREL32:
1257     checkIntUInt<32>(Val, Type);
1258     write32le(Loc, Val);
1259     break;
1260   case R_AARCH64_ABS64:
1261   case R_AARCH64_PREL64:
1262     write64le(Loc, Val);
1263     break;
1264   case R_AARCH64_ADD_ABS_LO12_NC:
1265     // This relocation stores 12 bits and there's no instruction
1266     // to do it. Instead, we do a 32 bits store of the value
1267     // of r_addend bitwise-or'ed Loc. This assumes that the addend
1268     // bits in Loc are zero.
1269     or32le(Loc, (Val & 0xFFF) << 10);
1270     break;
1271   case R_AARCH64_ADR_GOT_PAGE:
1272   case R_AARCH64_ADR_PREL_PG_HI21:
1273   case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
1274   case R_AARCH64_TLSDESC_ADR_PAGE21:
1275     checkInt<33>(Val, Type);
1276     updateAArch64Addr(Loc, Val >> 12);
1277     break;
1278   case R_AARCH64_ADR_PREL_LO21:
1279     checkInt<21>(Val, Type);
1280     updateAArch64Addr(Loc, Val);
1281     break;
1282   case R_AARCH64_CALL26:
1283   case R_AARCH64_JUMP26:
1284     checkInt<28>(Val, Type);
1285     or32le(Loc, (Val & 0x0FFFFFFC) >> 2);
1286     break;
1287   case R_AARCH64_CONDBR19:
1288     checkInt<21>(Val, Type);
1289     or32le(Loc, (Val & 0x1FFFFC) << 3);
1290     break;
1291   case R_AARCH64_LD64_GOT_LO12_NC:
1292   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1293   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1294     checkAlignment<8>(Val, Type);
1295     or32le(Loc, (Val & 0xFF8) << 7);
1296     break;
1297   case R_AARCH64_LDST128_ABS_LO12_NC:
1298     or32le(Loc, (Val & 0x0FF8) << 6);
1299     break;
1300   case R_AARCH64_LDST16_ABS_LO12_NC:
1301     or32le(Loc, (Val & 0x0FFC) << 9);
1302     break;
1303   case R_AARCH64_LDST8_ABS_LO12_NC:
1304     or32le(Loc, (Val & 0xFFF) << 10);
1305     break;
1306   case R_AARCH64_LDST32_ABS_LO12_NC:
1307     or32le(Loc, (Val & 0xFFC) << 8);
1308     break;
1309   case R_AARCH64_LDST64_ABS_LO12_NC:
1310     or32le(Loc, (Val & 0xFF8) << 7);
1311     break;
1312   case R_AARCH64_TSTBR14:
1313     checkInt<16>(Val, Type);
1314     or32le(Loc, (Val & 0xFFFC) << 3);
1315     break;
1316   case R_AARCH64_TLSLE_ADD_TPREL_HI12:
1317     checkInt<24>(Val, Type);
1318     updateAArch64Add(Loc, Val >> 12);
1319     break;
1320   case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
1321   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1322     updateAArch64Add(Loc, Val);
1323     break;
1324   default:
1325     fatal("unrecognized reloc " + Twine(Type));
1326   }
1327 }
1328 
1329 void AArch64TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
1330                                        uint64_t Val) const {
1331   // TLSDESC Global-Dynamic relocation are in the form:
1332   //   adrp    x0, :tlsdesc:v             [R_AARCH64_TLSDESC_ADR_PAGE21]
1333   //   ldr     x1, [x0, #:tlsdesc_lo12:v  [R_AARCH64_TLSDESC_LD64_LO12_NC]
1334   //   add     x0, x0, :tlsdesc_los:v     [_AARCH64_TLSDESC_ADD_LO12_NC]
1335   //   .tlsdesccall                       [R_AARCH64_TLSDESC_CALL]
1336   //   blr     x1
1337   // And it can optimized to:
1338   //   movz    x0, #0x0, lsl #16
1339   //   movk    x0, #0x10
1340   //   nop
1341   //   nop
1342   checkUInt<32>(Val, Type);
1343 
1344   uint32_t NewInst;
1345   switch (Type) {
1346   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1347   case R_AARCH64_TLSDESC_CALL:
1348     // nop
1349     NewInst = 0xd503201f;
1350     break;
1351   case R_AARCH64_TLSDESC_ADR_PAGE21:
1352     // movz
1353     NewInst = 0xd2a00000 | (((Val >> 16) & 0xffff) << 5);
1354     break;
1355   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1356     // movk
1357     NewInst = 0xf2800000 | ((Val & 0xffff) << 5);
1358     break;
1359   default:
1360     llvm_unreachable("unsupported Relocation for TLS GD to LE relax");
1361   }
1362   write32le(Loc, NewInst);
1363 }
1364 
1365 void AArch64TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
1366                                        uint64_t Val) const {
1367   // TLSDESC Global-Dynamic relocation are in the form:
1368   //   adrp    x0, :tlsdesc:v             [R_AARCH64_TLSDESC_ADR_PAGE21]
1369   //   ldr     x1, [x0, #:tlsdesc_lo12:v  [R_AARCH64_TLSDESC_LD64_LO12_NC]
1370   //   add     x0, x0, :tlsdesc_los:v     [_AARCH64_TLSDESC_ADD_LO12_NC]
1371   //   .tlsdesccall                       [R_AARCH64_TLSDESC_CALL]
1372   //   blr     x1
1373   // And it can optimized to:
1374   //   adrp    x0, :gottprel:v
1375   //   ldr     x0, [x0, :gottprel_lo12:v]
1376   //   nop
1377   //   nop
1378 
1379   switch (Type) {
1380   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1381   case R_AARCH64_TLSDESC_CALL:
1382     write32le(Loc, 0xd503201f); // nop
1383     break;
1384   case R_AARCH64_TLSDESC_ADR_PAGE21:
1385     write32le(Loc, 0x90000000); // adrp
1386     relocateOne(Loc, R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, Val);
1387     break;
1388   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1389     write32le(Loc, 0xf9400000); // ldr
1390     relocateOne(Loc, R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, Val);
1391     break;
1392   default:
1393     llvm_unreachable("unsupported Relocation for TLS GD to LE relax");
1394   }
1395 }
1396 
1397 void AArch64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
1398                                        uint64_t Val) const {
1399   checkUInt<32>(Val, Type);
1400 
1401   uint32_t Inst = read32le(Loc);
1402   uint32_t NewInst;
1403   if (Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) {
1404     // Generate movz.
1405     unsigned RegNo = (Inst & 0x1f);
1406     NewInst = (0xd2a00000 | RegNo) | (((Val >> 16) & 0xffff) << 5);
1407   } else if (Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) {
1408     // Generate movk
1409     unsigned RegNo = (Inst & 0x1f);
1410     NewInst = (0xf2800000 | RegNo) | ((Val & 0xffff) << 5);
1411   } else {
1412     llvm_unreachable("invalid Relocation for TLS IE to LE Relax");
1413   }
1414   write32le(Loc, NewInst);
1415 }
1416 
1417 // Implementing relocations for AMDGPU is low priority since most
1418 // programs don't use relocations now. Thus, this function is not
1419 // actually called (relocateOne is called for each relocation).
1420 // That's why the AMDGPU port works without implementing this function.
1421 void AMDGPUTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1422                                    uint64_t Val) const {
1423   llvm_unreachable("not implemented");
1424 }
1425 
1426 RelExpr AMDGPUTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
1427   llvm_unreachable("not implemented");
1428 }
1429 
1430 template <class ELFT> MipsTargetInfo<ELFT>::MipsTargetInfo() {
1431   GotPltHeaderEntriesNum = 2;
1432   PageSize = 65536;
1433   PltEntrySize = 16;
1434   PltZeroSize = 32;
1435   ThunkSize = 16;
1436   CopyRel = R_MIPS_COPY;
1437   PltRel = R_MIPS_JUMP_SLOT;
1438   if (ELFT::Is64Bits)
1439     RelativeRel = (R_MIPS_64 << 8) | R_MIPS_REL32;
1440   else
1441     RelativeRel = R_MIPS_REL32;
1442 }
1443 
1444 template <class ELFT>
1445 RelExpr MipsTargetInfo<ELFT>::getRelExpr(uint32_t Type,
1446                                          const SymbolBody &S) const {
1447   if (ELFT::Is64Bits)
1448     // See comment in the calculateMips64RelChain.
1449     Type &= 0xff;
1450   switch (Type) {
1451   default:
1452     return R_ABS;
1453   case R_MIPS_JALR:
1454     return R_HINT;
1455   case R_MIPS_GPREL16:
1456   case R_MIPS_GPREL32:
1457     return R_GOTREL;
1458   case R_MIPS_26:
1459     return R_PLT;
1460   case R_MIPS_HI16:
1461   case R_MIPS_LO16:
1462   case R_MIPS_GOT_OFST:
1463     // MIPS _gp_disp designates offset between start of function and 'gp'
1464     // pointer into GOT. __gnu_local_gp is equal to the current value of
1465     // the 'gp'. Therefore any relocations against them do not require
1466     // dynamic relocation.
1467     if (&S == ElfSym<ELFT>::MipsGpDisp)
1468       return R_PC;
1469     return R_ABS;
1470   case R_MIPS_PC32:
1471   case R_MIPS_PC16:
1472   case R_MIPS_PC19_S2:
1473   case R_MIPS_PC21_S2:
1474   case R_MIPS_PC26_S2:
1475   case R_MIPS_PCHI16:
1476   case R_MIPS_PCLO16:
1477     return R_PC;
1478   case R_MIPS_GOT16:
1479     if (S.isLocal())
1480       return R_MIPS_GOT_LOCAL_PAGE;
1481   // fallthrough
1482   case R_MIPS_CALL16:
1483   case R_MIPS_GOT_DISP:
1484     if (!S.isPreemptible())
1485       return R_MIPS_GOT_LOCAL;
1486     return R_GOT_OFF;
1487   case R_MIPS_GOT_PAGE:
1488     return R_MIPS_GOT_LOCAL_PAGE;
1489   }
1490 }
1491 
1492 template <class ELFT>
1493 uint32_t MipsTargetInfo<ELFT>::getDynRel(uint32_t Type) const {
1494   if (Type == R_MIPS_32 || Type == R_MIPS_64)
1495     return RelativeRel;
1496   StringRef S = getELFRelocationTypeName(EM_MIPS, Type);
1497   error("relocation " + S + " cannot be used when making a shared object; "
1498                             "recompile with -fPIC.");
1499   // Keep it going with a dummy value so that we can find more reloc errors.
1500   return R_MIPS_32;
1501 }
1502 
1503 template <class ELFT>
1504 void MipsTargetInfo<ELFT>::writeGotPlt(uint8_t *Buf, uint64_t Plt) const {
1505   write32<ELFT::TargetEndianness>(Buf, Out<ELFT>::Plt->getVA());
1506 }
1507 
1508 static uint16_t mipsHigh(uint64_t V) { return (V + 0x8000) >> 16; }
1509 
1510 template <endianness E, uint8_t BSIZE, uint8_t SHIFT>
1511 static int64_t getPcRelocAddend(const uint8_t *Loc) {
1512   uint32_t Instr = read32<E>(Loc);
1513   uint32_t Mask = 0xffffffff >> (32 - BSIZE);
1514   return SignExtend64<BSIZE + SHIFT>((Instr & Mask) << SHIFT);
1515 }
1516 
1517 template <endianness E, uint8_t BSIZE, uint8_t SHIFT>
1518 static void applyMipsPcReloc(uint8_t *Loc, uint32_t Type, uint64_t V) {
1519   uint32_t Mask = 0xffffffff >> (32 - BSIZE);
1520   uint32_t Instr = read32<E>(Loc);
1521   if (SHIFT > 0)
1522     checkAlignment<(1 << SHIFT)>(V, Type);
1523   checkInt<BSIZE + SHIFT>(V, Type);
1524   write32<E>(Loc, (Instr & ~Mask) | ((V >> SHIFT) & Mask));
1525 }
1526 
1527 template <endianness E>
1528 static void writeMipsHi16(uint8_t *Loc, uint64_t V) {
1529   uint32_t Instr = read32<E>(Loc);
1530   write32<E>(Loc, (Instr & 0xffff0000) | mipsHigh(V));
1531 }
1532 
1533 template <endianness E>
1534 static void writeMipsLo16(uint8_t *Loc, uint64_t V) {
1535   uint32_t Instr = read32<E>(Loc);
1536   write32<E>(Loc, (Instr & 0xffff0000) | (V & 0xffff));
1537 }
1538 
1539 template <endianness E> static int16_t readSignedLo16(const uint8_t *Loc) {
1540   return SignExtend32<16>(read32<E>(Loc) & 0xffff);
1541 }
1542 
1543 template <class ELFT>
1544 void MipsTargetInfo<ELFT>::writePltZero(uint8_t *Buf) const {
1545   const endianness E = ELFT::TargetEndianness;
1546   write32<E>(Buf, 0x3c1c0000);      // lui   $28, %hi(&GOTPLT[0])
1547   write32<E>(Buf + 4, 0x8f990000);  // lw    $25, %lo(&GOTPLT[0])($28)
1548   write32<E>(Buf + 8, 0x279c0000);  // addiu $28, $28, %lo(&GOTPLT[0])
1549   write32<E>(Buf + 12, 0x031cc023); // subu  $24, $24, $28
1550   write32<E>(Buf + 16, 0x03e07825); // move  $15, $31
1551   write32<E>(Buf + 20, 0x0018c082); // srl   $24, $24, 2
1552   write32<E>(Buf + 24, 0x0320f809); // jalr  $25
1553   write32<E>(Buf + 28, 0x2718fffe); // subu  $24, $24, 2
1554   uint64_t Got = Out<ELFT>::GotPlt->getVA();
1555   writeMipsHi16<E>(Buf, Got);
1556   writeMipsLo16<E>(Buf + 4, Got);
1557   writeMipsLo16<E>(Buf + 8, Got);
1558 }
1559 
1560 template <class ELFT>
1561 void MipsTargetInfo<ELFT>::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
1562                                     uint64_t PltEntryAddr, int32_t Index,
1563                                     unsigned RelOff) const {
1564   const endianness E = ELFT::TargetEndianness;
1565   write32<E>(Buf, 0x3c0f0000);      // lui   $15, %hi(.got.plt entry)
1566   write32<E>(Buf + 4, 0x8df90000);  // l[wd] $25, %lo(.got.plt entry)($15)
1567   write32<E>(Buf + 8, 0x03200008);  // jr    $25
1568   write32<E>(Buf + 12, 0x25f80000); // addiu $24, $15, %lo(.got.plt entry)
1569   writeMipsHi16<E>(Buf, GotEntryAddr);
1570   writeMipsLo16<E>(Buf + 4, GotEntryAddr);
1571   writeMipsLo16<E>(Buf + 12, GotEntryAddr);
1572 }
1573 
1574 template <class ELFT>
1575 void MipsTargetInfo<ELFT>::writeThunk(uint8_t *Buf, uint64_t S) const {
1576   // Write MIPS LA25 thunk code to call PIC function from the non-PIC one.
1577   // See MipsTargetInfo::writeThunk for details.
1578   const endianness E = ELFT::TargetEndianness;
1579   write32<E>(Buf, 0x3c190000);      // lui   $25, %hi(func)
1580   write32<E>(Buf + 4, 0x08000000);  // j     func
1581   write32<E>(Buf + 8, 0x27390000);  // addiu $25, $25, %lo(func)
1582   write32<E>(Buf + 12, 0x00000000); // nop
1583   writeMipsHi16<E>(Buf, S);
1584   write32<E>(Buf + 4, 0x08000000 | (S >> 2));
1585   writeMipsLo16<E>(Buf + 8, S);
1586 }
1587 
1588 template <class ELFT>
1589 bool MipsTargetInfo<ELFT>::needsThunk(uint32_t Type, const InputFile &File,
1590                                       const SymbolBody &S) const {
1591   // Any MIPS PIC code function is invoked with its address in register $t9.
1592   // So if we have a branch instruction from non-PIC code to the PIC one
1593   // we cannot make the jump directly and need to create a small stubs
1594   // to save the target function address.
1595   // See page 3-38 ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
1596   if (Type != R_MIPS_26)
1597     return false;
1598   auto *F = dyn_cast<ELFFileBase<ELFT>>(&File);
1599   if (!F)
1600     return false;
1601   // If current file has PIC code, LA25 stub is not required.
1602   if (F->getObj().getHeader()->e_flags & EF_MIPS_PIC)
1603     return false;
1604   auto *D = dyn_cast<DefinedRegular<ELFT>>(&S);
1605   if (!D || !D->Section)
1606     return false;
1607   // LA25 is required if target file has PIC code
1608   // or target symbol is a PIC symbol.
1609   return (D->Section->getFile()->getObj().getHeader()->e_flags & EF_MIPS_PIC) ||
1610          (D->StOther & STO_MIPS_MIPS16) == STO_MIPS_PIC;
1611 }
1612 
1613 template <class ELFT>
1614 uint64_t MipsTargetInfo<ELFT>::getImplicitAddend(const uint8_t *Buf,
1615                                                  uint32_t Type) const {
1616   const endianness E = ELFT::TargetEndianness;
1617   switch (Type) {
1618   default:
1619     return 0;
1620   case R_MIPS_32:
1621   case R_MIPS_GPREL32:
1622     return read32<E>(Buf);
1623   case R_MIPS_26:
1624     // FIXME (simon): If the relocation target symbol is not a PLT entry
1625     // we should use another expression for calculation:
1626     // ((A << 2) | (P & 0xf0000000)) >> 2
1627     return SignExtend64<28>((read32<E>(Buf) & 0x3ffffff) << 2);
1628   case R_MIPS_GPREL16:
1629   case R_MIPS_LO16:
1630   case R_MIPS_PCLO16:
1631   case R_MIPS_TLS_DTPREL_HI16:
1632   case R_MIPS_TLS_DTPREL_LO16:
1633   case R_MIPS_TLS_TPREL_HI16:
1634   case R_MIPS_TLS_TPREL_LO16:
1635     return readSignedLo16<E>(Buf);
1636   case R_MIPS_PC16:
1637     return getPcRelocAddend<E, 16, 2>(Buf);
1638   case R_MIPS_PC19_S2:
1639     return getPcRelocAddend<E, 19, 2>(Buf);
1640   case R_MIPS_PC21_S2:
1641     return getPcRelocAddend<E, 21, 2>(Buf);
1642   case R_MIPS_PC26_S2:
1643     return getPcRelocAddend<E, 26, 2>(Buf);
1644   case R_MIPS_PC32:
1645     return getPcRelocAddend<E, 32, 0>(Buf);
1646   }
1647 }
1648 
1649 static std::pair<uint32_t, uint64_t> calculateMips64RelChain(uint32_t Type,
1650                                                              uint64_t Val) {
1651   // MIPS N64 ABI packs multiple relocations into the single relocation
1652   // record. In general, all up to three relocations can have arbitrary
1653   // types. In fact, Clang and GCC uses only a few combinations. For now,
1654   // we support two of them. That is allow to pass at least all LLVM
1655   // test suite cases.
1656   // <any relocation> / R_MIPS_SUB / R_MIPS_HI16 | R_MIPS_LO16
1657   // <any relocation> / R_MIPS_64 / R_MIPS_NONE
1658   // The first relocation is a 'real' relocation which is calculated
1659   // using the corresponding symbol's value. The second and the third
1660   // relocations used to modify result of the first one: extend it to
1661   // 64-bit, extract high or low part etc. For details, see part 2.9 Relocation
1662   // at the https://dmz-portal.mips.com/mw/images/8/82/007-4658-001.pdf
1663   uint32_t Type2 = (Type >> 8) & 0xff;
1664   uint32_t Type3 = (Type >> 16) & 0xff;
1665   if (Type2 == R_MIPS_NONE && Type3 == R_MIPS_NONE)
1666     return std::make_pair(Type, Val);
1667   if (Type2 == R_MIPS_64 && Type3 == R_MIPS_NONE)
1668     return std::make_pair(Type2, Val);
1669   if (Type2 == R_MIPS_SUB && (Type3 == R_MIPS_HI16 || Type3 == R_MIPS_LO16))
1670     return std::make_pair(Type3, -Val);
1671   error("unsupported relocations combination " + Twine(Type));
1672   return std::make_pair(Type & 0xff, Val);
1673 }
1674 
1675 template <class ELFT>
1676 void MipsTargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type,
1677                                        uint64_t Val) const {
1678   const endianness E = ELFT::TargetEndianness;
1679   // Thread pointer and DRP offsets from the start of TLS data area.
1680   // https://www.linux-mips.org/wiki/NPTL
1681   if (Type == R_MIPS_TLS_DTPREL_HI16 || Type == R_MIPS_TLS_DTPREL_LO16)
1682     Val -= 0x8000;
1683   else if (Type == R_MIPS_TLS_TPREL_HI16 || Type == R_MIPS_TLS_TPREL_LO16)
1684     Val -= 0x7000;
1685   if (ELFT::Is64Bits)
1686     std::tie(Type, Val) = calculateMips64RelChain(Type, Val);
1687   switch (Type) {
1688   case R_MIPS_32:
1689   case R_MIPS_GPREL32:
1690     write32<E>(Loc, Val);
1691     break;
1692   case R_MIPS_64:
1693     write64<E>(Loc, Val);
1694     break;
1695   case R_MIPS_26:
1696     write32<E>(Loc, (read32<E>(Loc) & ~0x3ffffff) | (Val >> 2));
1697     break;
1698   case R_MIPS_GOT_DISP:
1699   case R_MIPS_GOT_PAGE:
1700   case R_MIPS_GOT16:
1701   case R_MIPS_GPREL16:
1702     checkInt<16>(Val, Type);
1703   // fallthrough
1704   case R_MIPS_CALL16:
1705   case R_MIPS_GOT_OFST:
1706   case R_MIPS_LO16:
1707   case R_MIPS_PCLO16:
1708   case R_MIPS_TLS_DTPREL_LO16:
1709   case R_MIPS_TLS_TPREL_LO16:
1710     writeMipsLo16<E>(Loc, Val);
1711     break;
1712   case R_MIPS_HI16:
1713   case R_MIPS_PCHI16:
1714   case R_MIPS_TLS_DTPREL_HI16:
1715   case R_MIPS_TLS_TPREL_HI16:
1716     writeMipsHi16<E>(Loc, Val);
1717     break;
1718   case R_MIPS_JALR:
1719     // Ignore this optimization relocation for now
1720     break;
1721   case R_MIPS_PC16:
1722     applyMipsPcReloc<E, 16, 2>(Loc, Type, Val);
1723     break;
1724   case R_MIPS_PC19_S2:
1725     applyMipsPcReloc<E, 19, 2>(Loc, Type, Val);
1726     break;
1727   case R_MIPS_PC21_S2:
1728     applyMipsPcReloc<E, 21, 2>(Loc, Type, Val);
1729     break;
1730   case R_MIPS_PC26_S2:
1731     applyMipsPcReloc<E, 26, 2>(Loc, Type, Val);
1732     break;
1733   case R_MIPS_PC32:
1734     applyMipsPcReloc<E, 32, 0>(Loc, Type, Val);
1735     break;
1736   default:
1737     fatal("unrecognized reloc " + Twine(Type));
1738   }
1739 }
1740 
1741 template <class ELFT>
1742 bool MipsTargetInfo<ELFT>::usesOnlyLowPageBits(uint32_t Type) const {
1743   return Type == R_MIPS_LO16 || Type == R_MIPS_GOT_OFST;
1744 }
1745 }
1746 }
1747