xref: /llvm-project-15.0.7/lld/ELF/Target.cpp (revision ee6d3fa0)
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 variables, 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 #include "SyntheticSections.h"
33 #include "Thunks.h"
34 #include "Writer.h"
35 
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/Object/ELF.h"
38 #include "llvm/Support/Endian.h"
39 #include "llvm/Support/ELF.h"
40 
41 using namespace llvm;
42 using namespace llvm::object;
43 using namespace llvm::support::endian;
44 using namespace llvm::ELF;
45 
46 namespace lld {
47 namespace elf {
48 
49 TargetInfo *Target;
50 
51 static void or32le(uint8_t *P, int32_t V) { write32le(P, read32le(P) | V); }
52 static void or32be(uint8_t *P, int32_t V) { write32be(P, read32be(P) | V); }
53 
54 StringRef getRelName(uint32_t Type) {
55   return getELFRelocationTypeName(Config->EMachine, Type);
56 }
57 
58 template <unsigned N> static void checkInt(int64_t V, uint32_t Type) {
59   if (!isInt<N>(V))
60     error("relocation " + getRelName(Type) + " out of range");
61 }
62 
63 template <unsigned N> static void checkUInt(uint64_t V, uint32_t Type) {
64   if (!isUInt<N>(V))
65     error("relocation " + getRelName(Type) + " out of range");
66 }
67 
68 template <unsigned N> static void checkIntUInt(uint64_t V, uint32_t Type) {
69   if (!isInt<N>(V) && !isUInt<N>(V))
70     error("relocation " + getRelName(Type) + " out of range");
71 }
72 
73 template <unsigned N> static void checkAlignment(uint64_t V, uint32_t Type) {
74   if ((V & (N - 1)) != 0)
75     error("improper alignment for relocation " + getRelName(Type));
76 }
77 
78 static void errorDynRel(uint32_t Type) {
79   error("relocation " + getRelName(Type) +
80         " cannot be used against shared object; recompile with -fPIC.");
81 }
82 
83 namespace {
84 class X86TargetInfo final : public TargetInfo {
85 public:
86   X86TargetInfo();
87   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
88   uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override;
89   void writeGotPltHeader(uint8_t *Buf) const override;
90   uint32_t getDynRel(uint32_t Type) const override;
91   bool isTlsLocalDynamicRel(uint32_t Type) const override;
92   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
93   bool isTlsInitialExecRel(uint32_t Type) const override;
94   void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override;
95   void writePltHeader(uint8_t *Buf) const override;
96   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
97                 int32_t Index, unsigned RelOff) const override;
98   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
99 
100   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
101                           RelExpr Expr) const override;
102   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
103   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
104   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
105   void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
106 };
107 
108 template <class ELFT> class X86_64TargetInfo final : public TargetInfo {
109 public:
110   X86_64TargetInfo();
111   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
112   uint32_t getDynRel(uint32_t Type) const override;
113   bool isTlsLocalDynamicRel(uint32_t Type) const override;
114   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
115   bool isTlsInitialExecRel(uint32_t Type) const override;
116   void writeGotPltHeader(uint8_t *Buf) const override;
117   void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override;
118   void writePltHeader(uint8_t *Buf) const override;
119   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
120                 int32_t Index, unsigned RelOff) const override;
121   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
122 
123   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
124                           RelExpr Expr) const override;
125   void relaxGot(uint8_t *Loc, uint64_t Val) const override;
126   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
127   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
128   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
129   void relaxTlsLdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
130 
131 private:
132   void relaxGotNoPic(uint8_t *Loc, uint64_t Val, uint8_t Op,
133                      uint8_t ModRm) const;
134 };
135 
136 class PPCTargetInfo final : public TargetInfo {
137 public:
138   PPCTargetInfo();
139   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
140   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
141 };
142 
143 class PPC64TargetInfo final : public TargetInfo {
144 public:
145   PPC64TargetInfo();
146   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
147   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
148                 int32_t Index, unsigned RelOff) const override;
149   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
150 };
151 
152 class AArch64TargetInfo final : public TargetInfo {
153 public:
154   AArch64TargetInfo();
155   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
156   uint32_t getDynRel(uint32_t Type) const override;
157   bool isTlsInitialExecRel(uint32_t Type) const override;
158   void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override;
159   void writePltHeader(uint8_t *Buf) const override;
160   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
161                 int32_t Index, unsigned RelOff) const override;
162   bool usesOnlyLowPageBits(uint32_t Type) const override;
163   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
164   RelExpr adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
165                           RelExpr Expr) const override;
166   void relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
167   void relaxTlsGdToIe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
168   void relaxTlsIeToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
169 };
170 
171 class AMDGPUTargetInfo final : public TargetInfo {
172 public:
173   AMDGPUTargetInfo();
174   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
175   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
176 };
177 
178 class ARMTargetInfo final : public TargetInfo {
179 public:
180   ARMTargetInfo();
181   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
182   uint32_t getDynRel(uint32_t Type) const override;
183   uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override;
184   bool isTlsLocalDynamicRel(uint32_t Type) const override;
185   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
186   bool isTlsInitialExecRel(uint32_t Type) const override;
187   void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override;
188   void writePltHeader(uint8_t *Buf) const override;
189   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
190                 int32_t Index, unsigned RelOff) const override;
191   RelExpr getThunkExpr(RelExpr Expr, uint32_t RelocType, const InputFile &File,
192                        const SymbolBody &S) const override;
193   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
194 };
195 
196 template <class ELFT> class MipsTargetInfo final : public TargetInfo {
197 public:
198   MipsTargetInfo();
199   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
200   uint64_t getImplicitAddend(const uint8_t *Buf, uint32_t Type) const override;
201   uint32_t getDynRel(uint32_t Type) const override;
202   bool isTlsLocalDynamicRel(uint32_t Type) const override;
203   bool isTlsGlobalDynamicRel(uint32_t Type) const override;
204   void writeGotPlt(uint8_t *Buf, const SymbolBody &S) const override;
205   void writePltHeader(uint8_t *Buf) const override;
206   void writePlt(uint8_t *Buf, uint64_t GotEntryAddr, uint64_t PltEntryAddr,
207                 int32_t Index, unsigned RelOff) const override;
208   RelExpr getThunkExpr(RelExpr Expr, uint32_t RelocType, const InputFile &File,
209                        const SymbolBody &S) const override;
210   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
211   bool usesOnlyLowPageBits(uint32_t Type) const override;
212 };
213 } // anonymous namespace
214 
215 TargetInfo *createTarget() {
216   switch (Config->EMachine) {
217   case EM_386:
218   case EM_IAMCU:
219     return new X86TargetInfo();
220   case EM_AARCH64:
221     return new AArch64TargetInfo();
222   case EM_AMDGPU:
223     return new AMDGPUTargetInfo();
224   case EM_ARM:
225     return new ARMTargetInfo();
226   case EM_MIPS:
227     switch (Config->EKind) {
228     case ELF32LEKind:
229       return new MipsTargetInfo<ELF32LE>();
230     case ELF32BEKind:
231       return new MipsTargetInfo<ELF32BE>();
232     case ELF64LEKind:
233       return new MipsTargetInfo<ELF64LE>();
234     case ELF64BEKind:
235       return new MipsTargetInfo<ELF64BE>();
236     default:
237       fatal("unsupported MIPS target");
238     }
239   case EM_PPC:
240     return new PPCTargetInfo();
241   case EM_PPC64:
242     return new PPC64TargetInfo();
243   case EM_X86_64:
244     if (Config->EKind == ELF32LEKind)
245       return new X86_64TargetInfo<ELF32LE>();
246     return new X86_64TargetInfo<ELF64LE>();
247   }
248   fatal("unknown target machine");
249 }
250 
251 TargetInfo::~TargetInfo() {}
252 
253 uint64_t TargetInfo::getImplicitAddend(const uint8_t *Buf,
254                                        uint32_t Type) const {
255   return 0;
256 }
257 
258 bool TargetInfo::usesOnlyLowPageBits(uint32_t Type) const { return false; }
259 
260 RelExpr TargetInfo::getThunkExpr(RelExpr Expr, uint32_t RelocType,
261                                  const InputFile &File,
262                                  const SymbolBody &S) const {
263   return Expr;
264 }
265 
266 bool TargetInfo::isTlsInitialExecRel(uint32_t Type) const { return false; }
267 
268 bool TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const { return false; }
269 
270 bool TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const { return false; }
271 
272 RelExpr TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
273                                     RelExpr Expr) const {
274   return Expr;
275 }
276 
277 void TargetInfo::relaxGot(uint8_t *Loc, uint64_t Val) const {
278   llvm_unreachable("Should not have claimed to be relaxable");
279 }
280 
281 void TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
282                                 uint64_t Val) const {
283   llvm_unreachable("Should not have claimed to be relaxable");
284 }
285 
286 void TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
287                                 uint64_t Val) const {
288   llvm_unreachable("Should not have claimed to be relaxable");
289 }
290 
291 void TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
292                                 uint64_t Val) const {
293   llvm_unreachable("Should not have claimed to be relaxable");
294 }
295 
296 void TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
297                                 uint64_t Val) const {
298   llvm_unreachable("Should not have claimed to be relaxable");
299 }
300 
301 X86TargetInfo::X86TargetInfo() {
302   CopyRel = R_386_COPY;
303   GotRel = R_386_GLOB_DAT;
304   PltRel = R_386_JUMP_SLOT;
305   IRelativeRel = R_386_IRELATIVE;
306   RelativeRel = R_386_RELATIVE;
307   TlsGotRel = R_386_TLS_TPOFF;
308   TlsModuleIndexRel = R_386_TLS_DTPMOD32;
309   TlsOffsetRel = R_386_TLS_DTPOFF32;
310   GotEntrySize = 4;
311   GotPltEntrySize = 4;
312   PltEntrySize = 16;
313   PltHeaderSize = 16;
314   TlsGdRelaxSkip = 2;
315 }
316 
317 RelExpr X86TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
318   switch (Type) {
319   default:
320     return R_ABS;
321   case R_386_TLS_GD:
322     return R_TLSGD;
323   case R_386_TLS_LDM:
324     return R_TLSLD;
325   case R_386_PLT32:
326     return R_PLT_PC;
327   case R_386_PC32:
328     return R_PC;
329   case R_386_GOTPC:
330     return R_GOTONLY_PC_FROM_END;
331   case R_386_TLS_IE:
332     return R_GOT;
333   case R_386_GOT32:
334   case R_386_GOT32X:
335   case R_386_TLS_GOTIE:
336     return R_GOT_FROM_END;
337   case R_386_GOTOFF:
338     return R_GOTREL_FROM_END;
339   case R_386_TLS_LE:
340     return R_TLS;
341   case R_386_TLS_LE_32:
342     return R_NEG_TLS;
343   }
344 }
345 
346 RelExpr X86TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
347                                        RelExpr Expr) const {
348   switch (Expr) {
349   default:
350     return Expr;
351   case R_RELAX_TLS_GD_TO_IE:
352     return R_RELAX_TLS_GD_TO_IE_END;
353   case R_RELAX_TLS_GD_TO_LE:
354     return R_RELAX_TLS_GD_TO_LE_NEG;
355   }
356 }
357 
358 void X86TargetInfo::writeGotPltHeader(uint8_t *Buf) const {
359   write32le(Buf, In<ELF32LE>::Dynamic->getVA());
360 }
361 
362 void X86TargetInfo::writeGotPlt(uint8_t *Buf, const SymbolBody &S) const {
363   // Entries in .got.plt initially points back to the corresponding
364   // PLT entries with a fixed offset to skip the first instruction.
365   write32le(Buf, S.getPltVA<ELF32LE>() + 6);
366 }
367 
368 uint32_t X86TargetInfo::getDynRel(uint32_t Type) const {
369   if (Type == R_386_TLS_LE)
370     return R_386_TLS_TPOFF;
371   if (Type == R_386_TLS_LE_32)
372     return R_386_TLS_TPOFF32;
373   return Type;
374 }
375 
376 bool X86TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
377   return Type == R_386_TLS_GD;
378 }
379 
380 bool X86TargetInfo::isTlsLocalDynamicRel(uint32_t Type) const {
381   return Type == R_386_TLS_LDO_32 || Type == R_386_TLS_LDM;
382 }
383 
384 bool X86TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
385   return Type == R_386_TLS_IE || Type == R_386_TLS_GOTIE;
386 }
387 
388 void X86TargetInfo::writePltHeader(uint8_t *Buf) const {
389   // Executable files and shared object files have
390   // separate procedure linkage tables.
391   if (Config->Pic) {
392     const uint8_t V[] = {
393         0xff, 0xb3, 0x04, 0x00, 0x00, 0x00, // pushl 4(%ebx)
394         0xff, 0xa3, 0x08, 0x00, 0x00, 0x00, // jmp   *8(%ebx)
395         0x90, 0x90, 0x90, 0x90              // nop; nop; nop; nop
396     };
397     memcpy(Buf, V, sizeof(V));
398     return;
399   }
400 
401   const uint8_t PltData[] = {
402       0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushl (GOT+4)
403       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp   *(GOT+8)
404       0x90, 0x90, 0x90, 0x90              // nop; nop; nop; nop
405   };
406   memcpy(Buf, PltData, sizeof(PltData));
407   uint32_t Got = In<ELF32LE>::GotPlt->getVA();
408   write32le(Buf + 2, Got + 4);
409   write32le(Buf + 8, Got + 8);
410 }
411 
412 void X86TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
413                              uint64_t PltEntryAddr, int32_t Index,
414                              unsigned RelOff) const {
415   const uint8_t Inst[] = {
416       0xff, 0x00, 0x00, 0x00, 0x00, 0x00, // jmp *foo_in_GOT|*foo@GOT(%ebx)
417       0x68, 0x00, 0x00, 0x00, 0x00,       // pushl $reloc_offset
418       0xe9, 0x00, 0x00, 0x00, 0x00        // jmp .PLT0@PC
419   };
420   memcpy(Buf, Inst, sizeof(Inst));
421 
422   // jmp *foo@GOT(%ebx) or jmp *foo_in_GOT
423   Buf[1] = Config->Pic ? 0xa3 : 0x25;
424   uint32_t Got = In<ELF32LE>::GotPlt->getVA();
425   write32le(Buf + 2, Config->Shared ? GotEntryAddr - Got : GotEntryAddr);
426   write32le(Buf + 7, RelOff);
427   write32le(Buf + 12, -Index * PltEntrySize - PltHeaderSize - 16);
428 }
429 
430 uint64_t X86TargetInfo::getImplicitAddend(const uint8_t *Buf,
431                                           uint32_t Type) const {
432   switch (Type) {
433   default:
434     return 0;
435   case R_386_32:
436   case R_386_GOT32:
437   case R_386_GOT32X:
438   case R_386_GOTOFF:
439   case R_386_GOTPC:
440   case R_386_PC32:
441   case R_386_PLT32:
442   case R_386_TLS_LE:
443     return read32le(Buf);
444   }
445 }
446 
447 void X86TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
448                                 uint64_t Val) const {
449   checkInt<32>(Val, Type);
450   write32le(Loc, Val);
451 }
452 
453 void X86TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
454                                    uint64_t Val) const {
455   // Convert
456   //   leal x@tlsgd(, %ebx, 1),
457   //   call __tls_get_addr@plt
458   // to
459   //   movl %gs:0,%eax
460   //   subl $x@ntpoff,%eax
461   const uint8_t Inst[] = {
462       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
463       0x81, 0xe8, 0x00, 0x00, 0x00, 0x00  // subl 0(%ebx), %eax
464   };
465   memcpy(Loc - 3, Inst, sizeof(Inst));
466   relocateOne(Loc + 5, R_386_32, Val);
467 }
468 
469 void X86TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
470                                    uint64_t Val) const {
471   // Convert
472   //   leal x@tlsgd(, %ebx, 1),
473   //   call __tls_get_addr@plt
474   // to
475   //   movl %gs:0, %eax
476   //   addl x@gotntpoff(%ebx), %eax
477   const uint8_t Inst[] = {
478       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0, %eax
479       0x03, 0x83, 0x00, 0x00, 0x00, 0x00  // addl 0(%ebx), %eax
480   };
481   memcpy(Loc - 3, Inst, sizeof(Inst));
482   relocateOne(Loc + 5, R_386_32, Val);
483 }
484 
485 // In some conditions, relocations can be optimized to avoid using GOT.
486 // This function does that for Initial Exec to Local Exec case.
487 void X86TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
488                                    uint64_t Val) const {
489   // Ulrich's document section 6.2 says that @gotntpoff can
490   // be used with MOVL or ADDL instructions.
491   // @indntpoff is similar to @gotntpoff, but for use in
492   // position dependent code.
493   uint8_t Reg = (Loc[-1] >> 3) & 7;
494 
495   if (Type == R_386_TLS_IE) {
496     if (Loc[-1] == 0xa1) {
497       // "movl foo@indntpoff,%eax" -> "movl $foo,%eax"
498       // This case is different from the generic case below because
499       // this is a 5 byte instruction while below is 6 bytes.
500       Loc[-1] = 0xb8;
501     } else if (Loc[-2] == 0x8b) {
502       // "movl foo@indntpoff,%reg" -> "movl $foo,%reg"
503       Loc[-2] = 0xc7;
504       Loc[-1] = 0xc0 | Reg;
505     } else {
506       // "addl foo@indntpoff,%reg" -> "addl $foo,%reg"
507       Loc[-2] = 0x81;
508       Loc[-1] = 0xc0 | Reg;
509     }
510   } else {
511     assert(Type == R_386_TLS_GOTIE);
512     if (Loc[-2] == 0x8b) {
513       // "movl foo@gottpoff(%rip),%reg" -> "movl $foo,%reg"
514       Loc[-2] = 0xc7;
515       Loc[-1] = 0xc0 | Reg;
516     } else {
517       // "addl foo@gotntpoff(%rip),%reg" -> "leal foo(%reg),%reg"
518       Loc[-2] = 0x8d;
519       Loc[-1] = 0x80 | (Reg << 3) | Reg;
520     }
521   }
522   relocateOne(Loc, R_386_TLS_LE, Val);
523 }
524 
525 void X86TargetInfo::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
526                                    uint64_t Val) const {
527   if (Type == R_386_TLS_LDO_32) {
528     relocateOne(Loc, R_386_TLS_LE, Val);
529     return;
530   }
531 
532   // Convert
533   //   leal foo(%reg),%eax
534   //   call ___tls_get_addr
535   // to
536   //   movl %gs:0,%eax
537   //   nop
538   //   leal 0(%esi,1),%esi
539   const uint8_t Inst[] = {
540       0x65, 0xa1, 0x00, 0x00, 0x00, 0x00, // movl %gs:0,%eax
541       0x90,                               // nop
542       0x8d, 0x74, 0x26, 0x00              // leal 0(%esi,1),%esi
543   };
544   memcpy(Loc - 2, Inst, sizeof(Inst));
545 }
546 
547 template <class ELFT> X86_64TargetInfo<ELFT>::X86_64TargetInfo() {
548   CopyRel = R_X86_64_COPY;
549   GotRel = R_X86_64_GLOB_DAT;
550   PltRel = R_X86_64_JUMP_SLOT;
551   RelativeRel = R_X86_64_RELATIVE;
552   IRelativeRel = R_X86_64_IRELATIVE;
553   TlsGotRel = R_X86_64_TPOFF64;
554   TlsModuleIndexRel = R_X86_64_DTPMOD64;
555   TlsOffsetRel = R_X86_64_DTPOFF64;
556   GotEntrySize = 8;
557   GotPltEntrySize = 8;
558   PltEntrySize = 16;
559   PltHeaderSize = 16;
560   TlsGdRelaxSkip = 2;
561 }
562 
563 template <class ELFT>
564 RelExpr X86_64TargetInfo<ELFT>::getRelExpr(uint32_t Type,
565                                            const SymbolBody &S) const {
566   switch (Type) {
567   default:
568     return R_ABS;
569   case R_X86_64_TPOFF32:
570     return R_TLS;
571   case R_X86_64_TLSLD:
572     return R_TLSLD_PC;
573   case R_X86_64_TLSGD:
574     return R_TLSGD_PC;
575   case R_X86_64_SIZE32:
576   case R_X86_64_SIZE64:
577     return R_SIZE;
578   case R_X86_64_PLT32:
579     return R_PLT_PC;
580   case R_X86_64_PC32:
581   case R_X86_64_PC64:
582     return R_PC;
583   case R_X86_64_GOT32:
584     return R_GOT_FROM_END;
585   case R_X86_64_GOTPCREL:
586   case R_X86_64_GOTPCRELX:
587   case R_X86_64_REX_GOTPCRELX:
588   case R_X86_64_GOTTPOFF:
589     return R_GOT_PC;
590   }
591 }
592 
593 template <class ELFT>
594 void X86_64TargetInfo<ELFT>::writeGotPltHeader(uint8_t *Buf) const {
595   // The first entry holds the value of _DYNAMIC. It is not clear why that is
596   // required, but it is documented in the psabi and the glibc dynamic linker
597   // seems to use it (note that this is relevant for linking ld.so, not any
598   // other program).
599   write64le(Buf, In<ELFT>::Dynamic->getVA());
600 }
601 
602 template <class ELFT>
603 void X86_64TargetInfo<ELFT>::writeGotPlt(uint8_t *Buf,
604                                          const SymbolBody &S) const {
605   // See comments in X86TargetInfo::writeGotPlt.
606   write32le(Buf, S.getPltVA<ELFT>() + 6);
607 }
608 
609 template <class ELFT>
610 void X86_64TargetInfo<ELFT>::writePltHeader(uint8_t *Buf) const {
611   const uint8_t PltData[] = {
612       0xff, 0x35, 0x00, 0x00, 0x00, 0x00, // pushq GOT+8(%rip)
613       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmp *GOT+16(%rip)
614       0x0f, 0x1f, 0x40, 0x00              // nopl 0x0(rax)
615   };
616   memcpy(Buf, PltData, sizeof(PltData));
617   uint64_t Got = In<ELFT>::GotPlt->getVA();
618   uint64_t Plt = Out<ELFT>::Plt->Addr;
619   write32le(Buf + 2, Got - Plt + 2); // GOT+8
620   write32le(Buf + 8, Got - Plt + 4); // GOT+16
621 }
622 
623 template <class ELFT>
624 void X86_64TargetInfo<ELFT>::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
625                                       uint64_t PltEntryAddr, int32_t Index,
626                                       unsigned RelOff) const {
627   const uint8_t Inst[] = {
628       0xff, 0x25, 0x00, 0x00, 0x00, 0x00, // jmpq *got(%rip)
629       0x68, 0x00, 0x00, 0x00, 0x00,       // pushq <relocation index>
630       0xe9, 0x00, 0x00, 0x00, 0x00        // jmpq plt[0]
631   };
632   memcpy(Buf, Inst, sizeof(Inst));
633 
634   write32le(Buf + 2, GotEntryAddr - PltEntryAddr - 6);
635   write32le(Buf + 7, Index);
636   write32le(Buf + 12, -Index * PltEntrySize - PltHeaderSize - 16);
637 }
638 
639 template <class ELFT>
640 uint32_t X86_64TargetInfo<ELFT>::getDynRel(uint32_t Type) const {
641   if (Type == R_X86_64_PC32 || Type == R_X86_64_32)
642     errorDynRel(Type);
643   return Type;
644 }
645 
646 template <class ELFT>
647 bool X86_64TargetInfo<ELFT>::isTlsInitialExecRel(uint32_t Type) const {
648   return Type == R_X86_64_GOTTPOFF;
649 }
650 
651 template <class ELFT>
652 bool X86_64TargetInfo<ELFT>::isTlsGlobalDynamicRel(uint32_t Type) const {
653   return Type == R_X86_64_TLSGD;
654 }
655 
656 template <class ELFT>
657 bool X86_64TargetInfo<ELFT>::isTlsLocalDynamicRel(uint32_t Type) const {
658   return Type == R_X86_64_DTPOFF32 || Type == R_X86_64_DTPOFF64 ||
659          Type == R_X86_64_TLSLD;
660 }
661 
662 template <class ELFT>
663 void X86_64TargetInfo<ELFT>::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
664                                             uint64_t Val) const {
665   // Convert
666   //   .byte 0x66
667   //   leaq x@tlsgd(%rip), %rdi
668   //   .word 0x6666
669   //   rex64
670   //   call __tls_get_addr@plt
671   // to
672   //   mov %fs:0x0,%rax
673   //   lea x@tpoff,%rax
674   const uint8_t Inst[] = {
675       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax
676       0x48, 0x8d, 0x80, 0x00, 0x00, 0x00, 0x00              // lea x@tpoff,%rax
677   };
678   memcpy(Loc - 4, Inst, sizeof(Inst));
679   // The original code used a pc relative relocation and so we have to
680   // compensate for the -4 in had in the addend.
681   relocateOne(Loc + 8, R_X86_64_TPOFF32, Val + 4);
682 }
683 
684 template <class ELFT>
685 void X86_64TargetInfo<ELFT>::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
686                                             uint64_t Val) const {
687   // Convert
688   //   .byte 0x66
689   //   leaq x@tlsgd(%rip), %rdi
690   //   .word 0x6666
691   //   rex64
692   //   call __tls_get_addr@plt
693   // to
694   //   mov %fs:0x0,%rax
695   //   addq x@tpoff,%rax
696   const uint8_t Inst[] = {
697       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, // mov %fs:0x0,%rax
698       0x48, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00              // addq x@tpoff,%rax
699   };
700   memcpy(Loc - 4, Inst, sizeof(Inst));
701   // Both code sequences are PC relatives, but since we are moving the constant
702   // forward by 8 bytes we have to subtract the value by 8.
703   relocateOne(Loc + 8, R_X86_64_PC32, Val - 8);
704 }
705 
706 // In some conditions, R_X86_64_GOTTPOFF relocation can be optimized to
707 // R_X86_64_TPOFF32 so that it does not use GOT.
708 template <class ELFT>
709 void X86_64TargetInfo<ELFT>::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
710                                             uint64_t Val) const {
711   uint8_t *Inst = Loc - 3;
712   uint8_t Reg = Loc[-1] >> 3;
713   uint8_t *RegSlot = Loc - 1;
714 
715   // Note that ADD with RSP or R12 is converted to ADD instead of LEA
716   // because LEA with these registers needs 4 bytes to encode and thus
717   // wouldn't fit the space.
718 
719   if (memcmp(Inst, "\x48\x03\x25", 3) == 0) {
720     // "addq foo@gottpoff(%rip),%rsp" -> "addq $foo,%rsp"
721     memcpy(Inst, "\x48\x81\xc4", 3);
722   } else if (memcmp(Inst, "\x4c\x03\x25", 3) == 0) {
723     // "addq foo@gottpoff(%rip),%r12" -> "addq $foo,%r12"
724     memcpy(Inst, "\x49\x81\xc4", 3);
725   } else if (memcmp(Inst, "\x4c\x03", 2) == 0) {
726     // "addq foo@gottpoff(%rip),%r[8-15]" -> "leaq foo(%r[8-15]),%r[8-15]"
727     memcpy(Inst, "\x4d\x8d", 2);
728     *RegSlot = 0x80 | (Reg << 3) | Reg;
729   } else if (memcmp(Inst, "\x48\x03", 2) == 0) {
730     // "addq foo@gottpoff(%rip),%reg -> "leaq foo(%reg),%reg"
731     memcpy(Inst, "\x48\x8d", 2);
732     *RegSlot = 0x80 | (Reg << 3) | Reg;
733   } else if (memcmp(Inst, "\x4c\x8b", 2) == 0) {
734     // "movq foo@gottpoff(%rip),%r[8-15]" -> "movq $foo,%r[8-15]"
735     memcpy(Inst, "\x49\xc7", 2);
736     *RegSlot = 0xc0 | Reg;
737   } else if (memcmp(Inst, "\x48\x8b", 2) == 0) {
738     // "movq foo@gottpoff(%rip),%reg" -> "movq $foo,%reg"
739     memcpy(Inst, "\x48\xc7", 2);
740     *RegSlot = 0xc0 | Reg;
741   } else {
742     fatal("R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only");
743   }
744 
745   // The original code used a PC relative relocation.
746   // Need to compensate for the -4 it had in the addend.
747   relocateOne(Loc, R_X86_64_TPOFF32, Val + 4);
748 }
749 
750 template <class ELFT>
751 void X86_64TargetInfo<ELFT>::relaxTlsLdToLe(uint8_t *Loc, uint32_t Type,
752                                             uint64_t Val) const {
753   // Convert
754   //   leaq bar@tlsld(%rip), %rdi
755   //   callq __tls_get_addr@PLT
756   //   leaq bar@dtpoff(%rax), %rcx
757   // to
758   //   .word 0x6666
759   //   .byte 0x66
760   //   mov %fs:0,%rax
761   //   leaq bar@tpoff(%rax), %rcx
762   if (Type == R_X86_64_DTPOFF64) {
763     write64le(Loc, Val);
764     return;
765   }
766   if (Type == R_X86_64_DTPOFF32) {
767     relocateOne(Loc, R_X86_64_TPOFF32, Val);
768     return;
769   }
770 
771   const uint8_t Inst[] = {
772       0x66, 0x66,                                          // .word 0x6666
773       0x66,                                                // .byte 0x66
774       0x64, 0x48, 0x8b, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00 // mov %fs:0,%rax
775   };
776   memcpy(Loc - 3, Inst, sizeof(Inst));
777 }
778 
779 template <class ELFT>
780 void X86_64TargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type,
781                                          uint64_t Val) const {
782   switch (Type) {
783   case R_X86_64_32:
784     checkUInt<32>(Val, Type);
785     write32le(Loc, Val);
786     break;
787   case R_X86_64_32S:
788   case R_X86_64_TPOFF32:
789   case R_X86_64_GOT32:
790   case R_X86_64_GOTPCREL:
791   case R_X86_64_GOTPCRELX:
792   case R_X86_64_REX_GOTPCRELX:
793   case R_X86_64_PC32:
794   case R_X86_64_GOTTPOFF:
795   case R_X86_64_PLT32:
796   case R_X86_64_TLSGD:
797   case R_X86_64_TLSLD:
798   case R_X86_64_DTPOFF32:
799   case R_X86_64_SIZE32:
800     checkInt<32>(Val, Type);
801     write32le(Loc, Val);
802     break;
803   case R_X86_64_64:
804   case R_X86_64_DTPOFF64:
805   case R_X86_64_SIZE64:
806   case R_X86_64_PC64:
807     write64le(Loc, Val);
808     break;
809   default:
810     fatal("unrecognized reloc " + Twine(Type));
811   }
812 }
813 
814 template <class ELFT>
815 RelExpr X86_64TargetInfo<ELFT>::adjustRelaxExpr(uint32_t Type,
816                                                 const uint8_t *Data,
817                                                 RelExpr RelExpr) const {
818   if (Type != R_X86_64_GOTPCRELX && Type != R_X86_64_REX_GOTPCRELX)
819     return RelExpr;
820   const uint8_t Op = Data[-2];
821   const uint8_t ModRm = Data[-1];
822   // FIXME: When PIC is disabled and foo is defined locally in the
823   // lower 32 bit address space, memory operand in mov can be converted into
824   // immediate operand. Otherwise, mov must be changed to lea. We support only
825   // latter relaxation at this moment.
826   if (Op == 0x8b)
827     return R_RELAX_GOT_PC;
828   // Relax call and jmp.
829   if (Op == 0xff && (ModRm == 0x15 || ModRm == 0x25))
830     return R_RELAX_GOT_PC;
831 
832   // Relaxation of test, adc, add, and, cmp, or, sbb, sub, xor.
833   // If PIC then no relaxation is available.
834   // We also don't relax test/binop instructions without REX byte,
835   // they are 32bit operations and not common to have.
836   assert(Type == R_X86_64_REX_GOTPCRELX);
837   return Config->Pic ? RelExpr : R_RELAX_GOT_PC_NOPIC;
838 }
839 
840 // A subset of relaxations can only be applied for no-PIC. This method
841 // handles such relaxations. Instructions encoding information was taken from:
842 // "Intel 64 and IA-32 Architectures Software Developer's Manual V2"
843 // (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/
844 //    64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf)
845 template <class ELFT>
846 void X86_64TargetInfo<ELFT>::relaxGotNoPic(uint8_t *Loc, uint64_t Val,
847                                            uint8_t Op, uint8_t ModRm) const {
848   const uint8_t Rex = Loc[-3];
849   // Convert "test %reg, foo@GOTPCREL(%rip)" to "test $foo, %reg".
850   if (Op == 0x85) {
851     // See "TEST-Logical Compare" (4-428 Vol. 2B),
852     // TEST r/m64, r64 uses "full" ModR / M byte (no opcode extension).
853 
854     // ModR/M byte has form XX YYY ZZZ, where
855     // YYY is MODRM.reg(register 2), ZZZ is MODRM.rm(register 1).
856     // XX has different meanings:
857     // 00: The operand's memory address is in reg1.
858     // 01: The operand's memory address is reg1 + a byte-sized displacement.
859     // 10: The operand's memory address is reg1 + a word-sized displacement.
860     // 11: The operand is reg1 itself.
861     // If an instruction requires only one operand, the unused reg2 field
862     // holds extra opcode bits rather than a register code
863     // 0xC0 == 11 000 000 binary.
864     // 0x38 == 00 111 000 binary.
865     // We transfer reg2 to reg1 here as operand.
866     // See "2.1.3 ModR/M and SIB Bytes" (Vol. 2A 2-3).
867     Loc[-1] = 0xc0 | (ModRm & 0x38) >> 3; // ModR/M byte.
868 
869     // Change opcode from TEST r/m64, r64 to TEST r/m64, imm32
870     // See "TEST-Logical Compare" (4-428 Vol. 2B).
871     Loc[-2] = 0xf7;
872 
873     // Move R bit to the B bit in REX byte.
874     // REX byte is encoded as 0100WRXB, where
875     // 0100 is 4bit fixed pattern.
876     // REX.W When 1, a 64-bit operand size is used. Otherwise, when 0, the
877     //   default operand size is used (which is 32-bit for most but not all
878     //   instructions).
879     // REX.R This 1-bit value is an extension to the MODRM.reg field.
880     // REX.X This 1-bit value is an extension to the SIB.index field.
881     // REX.B This 1-bit value is an extension to the MODRM.rm field or the
882     // SIB.base field.
883     // See "2.2.1.2 More on REX Prefix Fields " (2-8 Vol. 2A).
884     Loc[-3] = (Rex & ~0x4) | (Rex & 0x4) >> 2;
885     relocateOne(Loc, R_X86_64_PC32, Val);
886     return;
887   }
888 
889   // If we are here then we need to relax the adc, add, and, cmp, or, sbb, sub
890   // or xor operations.
891 
892   // Convert "binop foo@GOTPCREL(%rip), %reg" to "binop $foo, %reg".
893   // Logic is close to one for test instruction above, but we also
894   // write opcode extension here, see below for details.
895   Loc[-1] = 0xc0 | (ModRm & 0x38) >> 3 | (Op & 0x3c); // ModR/M byte.
896 
897   // Primary opcode is 0x81, opcode extension is one of:
898   // 000b = ADD, 001b is OR, 010b is ADC, 011b is SBB,
899   // 100b is AND, 101b is SUB, 110b is XOR, 111b is CMP.
900   // This value was wrote to MODRM.reg in a line above.
901   // See "3.2 INSTRUCTIONS (A-M)" (Vol. 2A 3-15),
902   // "INSTRUCTION SET REFERENCE, N-Z" (Vol. 2B 4-1) for
903   // descriptions about each operation.
904   Loc[-2] = 0x81;
905   Loc[-3] = (Rex & ~0x4) | (Rex & 0x4) >> 2;
906   relocateOne(Loc, R_X86_64_PC32, Val);
907 }
908 
909 template <class ELFT>
910 void X86_64TargetInfo<ELFT>::relaxGot(uint8_t *Loc, uint64_t Val) const {
911   const uint8_t Op = Loc[-2];
912   const uint8_t ModRm = Loc[-1];
913 
914   // Convert "mov foo@GOTPCREL(%rip),%reg" to "lea foo(%rip),%reg".
915   if (Op == 0x8b) {
916     Loc[-2] = 0x8d;
917     relocateOne(Loc, R_X86_64_PC32, Val);
918     return;
919   }
920 
921   if (Op != 0xff) {
922     // We are relaxing a rip relative to an absolute, so compensate
923     // for the old -4 addend.
924     assert(!Config->Pic);
925     relaxGotNoPic(Loc, Val + 4, Op, ModRm);
926     return;
927   }
928 
929   // Convert call/jmp instructions.
930   if (ModRm == 0x15) {
931     // ABI says we can convert "call *foo@GOTPCREL(%rip)" to "nop; call foo".
932     // Instead we convert to "addr32 call foo" where addr32 is an instruction
933     // prefix. That makes result expression to be a single instruction.
934     Loc[-2] = 0x67; // addr32 prefix
935     Loc[-1] = 0xe8; // call
936     relocateOne(Loc, R_X86_64_PC32, Val);
937     return;
938   }
939 
940   // Convert "jmp *foo@GOTPCREL(%rip)" to "jmp foo; nop".
941   // jmp doesn't return, so it is fine to use nop here, it is just a stub.
942   assert(ModRm == 0x25);
943   Loc[-2] = 0xe9; // jmp
944   Loc[3] = 0x90;  // nop
945   relocateOne(Loc - 1, R_X86_64_PC32, Val + 1);
946 }
947 
948 // Relocation masks following the #lo(value), #hi(value), #ha(value),
949 // #higher(value), #highera(value), #highest(value), and #highesta(value)
950 // macros defined in section 4.5.1. Relocation Types of the PPC-elf64abi
951 // document.
952 static uint16_t applyPPCLo(uint64_t V) { return V; }
953 static uint16_t applyPPCHi(uint64_t V) { return V >> 16; }
954 static uint16_t applyPPCHa(uint64_t V) { return (V + 0x8000) >> 16; }
955 static uint16_t applyPPCHigher(uint64_t V) { return V >> 32; }
956 static uint16_t applyPPCHighera(uint64_t V) { return (V + 0x8000) >> 32; }
957 static uint16_t applyPPCHighest(uint64_t V) { return V >> 48; }
958 static uint16_t applyPPCHighesta(uint64_t V) { return (V + 0x8000) >> 48; }
959 
960 PPCTargetInfo::PPCTargetInfo() {}
961 
962 void PPCTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
963                                 uint64_t Val) const {
964   switch (Type) {
965   case R_PPC_ADDR16_HA:
966     write16be(Loc, applyPPCHa(Val));
967     break;
968   case R_PPC_ADDR16_LO:
969     write16be(Loc, applyPPCLo(Val));
970     break;
971   case R_PPC_ADDR32:
972   case R_PPC_REL32:
973     write32be(Loc, Val);
974     break;
975   case R_PPC_REL24:
976     or32be(Loc, Val & 0x3FFFFFC);
977     break;
978   default:
979     fatal("unrecognized reloc " + Twine(Type));
980   }
981 }
982 
983 RelExpr PPCTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
984   switch (Type) {
985   case R_PPC_REL24:
986   case R_PPC_REL32:
987     return R_PC;
988   default:
989     return R_ABS;
990   }
991 }
992 
993 PPC64TargetInfo::PPC64TargetInfo() {
994   PltRel = GotRel = R_PPC64_GLOB_DAT;
995   RelativeRel = R_PPC64_RELATIVE;
996   GotEntrySize = 8;
997   GotPltEntrySize = 8;
998   PltEntrySize = 32;
999   PltHeaderSize = 0;
1000 
1001   // We need 64K pages (at least under glibc/Linux, the loader won't
1002   // set different permissions on a finer granularity than that).
1003   MaxPageSize = 65536;
1004 
1005   // The PPC64 ELF ABI v1 spec, says:
1006   //
1007   //   It is normally desirable to put segments with different characteristics
1008   //   in separate 256 Mbyte portions of the address space, to give the
1009   //   operating system full paging flexibility in the 64-bit address space.
1010   //
1011   // And because the lowest non-zero 256M boundary is 0x10000000, PPC64 linkers
1012   // use 0x10000000 as the starting address.
1013   DefaultImageBase = 0x10000000;
1014 }
1015 
1016 static uint64_t PPC64TocOffset = 0x8000;
1017 
1018 uint64_t getPPC64TocBase() {
1019   // The TOC consists of sections .got, .toc, .tocbss, .plt in that order. The
1020   // TOC starts where the first of these sections starts. We always create a
1021   // .got when we see a relocation that uses it, so for us the start is always
1022   // the .got.
1023   uint64_t TocVA = In<ELF64BE>::Got->getVA();
1024 
1025   // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000
1026   // thus permitting a full 64 Kbytes segment. Note that the glibc startup
1027   // code (crt1.o) assumes that you can get from the TOC base to the
1028   // start of the .toc section with only a single (signed) 16-bit relocation.
1029   return TocVA + PPC64TocOffset;
1030 }
1031 
1032 RelExpr PPC64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
1033   switch (Type) {
1034   default:
1035     return R_ABS;
1036   case R_PPC64_TOC16:
1037   case R_PPC64_TOC16_DS:
1038   case R_PPC64_TOC16_HA:
1039   case R_PPC64_TOC16_HI:
1040   case R_PPC64_TOC16_LO:
1041   case R_PPC64_TOC16_LO_DS:
1042     return R_GOTREL;
1043   case R_PPC64_TOC:
1044     return R_PPC_TOC;
1045   case R_PPC64_REL24:
1046     return R_PPC_PLT_OPD;
1047   }
1048 }
1049 
1050 void PPC64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
1051                                uint64_t PltEntryAddr, int32_t Index,
1052                                unsigned RelOff) const {
1053   uint64_t Off = GotEntryAddr - getPPC64TocBase();
1054 
1055   // FIXME: What we should do, in theory, is get the offset of the function
1056   // descriptor in the .opd section, and use that as the offset from %r2 (the
1057   // TOC-base pointer). Instead, we have the GOT-entry offset, and that will
1058   // be a pointer to the function descriptor in the .opd section. Using
1059   // this scheme is simpler, but requires an extra indirection per PLT dispatch.
1060 
1061   write32be(Buf, 0xf8410028);                       // std %r2, 40(%r1)
1062   write32be(Buf + 4, 0x3d620000 | applyPPCHa(Off)); // addis %r11, %r2, X@ha
1063   write32be(Buf + 8, 0xe98b0000 | applyPPCLo(Off)); // ld %r12, X@l(%r11)
1064   write32be(Buf + 12, 0xe96c0000);                  // ld %r11,0(%r12)
1065   write32be(Buf + 16, 0x7d6903a6);                  // mtctr %r11
1066   write32be(Buf + 20, 0xe84c0008);                  // ld %r2,8(%r12)
1067   write32be(Buf + 24, 0xe96c0010);                  // ld %r11,16(%r12)
1068   write32be(Buf + 28, 0x4e800420);                  // bctr
1069 }
1070 
1071 static std::pair<uint32_t, uint64_t> toAddr16Rel(uint32_t Type, uint64_t Val) {
1072   uint64_t V = Val - PPC64TocOffset;
1073   switch (Type) {
1074   case R_PPC64_TOC16:
1075     return {R_PPC64_ADDR16, V};
1076   case R_PPC64_TOC16_DS:
1077     return {R_PPC64_ADDR16_DS, V};
1078   case R_PPC64_TOC16_HA:
1079     return {R_PPC64_ADDR16_HA, V};
1080   case R_PPC64_TOC16_HI:
1081     return {R_PPC64_ADDR16_HI, V};
1082   case R_PPC64_TOC16_LO:
1083     return {R_PPC64_ADDR16_LO, V};
1084   case R_PPC64_TOC16_LO_DS:
1085     return {R_PPC64_ADDR16_LO_DS, V};
1086   default:
1087     return {Type, Val};
1088   }
1089 }
1090 
1091 void PPC64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1092                                   uint64_t Val) const {
1093   // For a TOC-relative relocation, proceed in terms of the corresponding
1094   // ADDR16 relocation type.
1095   std::tie(Type, Val) = toAddr16Rel(Type, Val);
1096 
1097   switch (Type) {
1098   case R_PPC64_ADDR14: {
1099     checkAlignment<4>(Val, Type);
1100     // Preserve the AA/LK bits in the branch instruction
1101     uint8_t AALK = Loc[3];
1102     write16be(Loc + 2, (AALK & 3) | (Val & 0xfffc));
1103     break;
1104   }
1105   case R_PPC64_ADDR16:
1106     checkInt<16>(Val, Type);
1107     write16be(Loc, Val);
1108     break;
1109   case R_PPC64_ADDR16_DS:
1110     checkInt<16>(Val, Type);
1111     write16be(Loc, (read16be(Loc) & 3) | (Val & ~3));
1112     break;
1113   case R_PPC64_ADDR16_HA:
1114   case R_PPC64_REL16_HA:
1115     write16be(Loc, applyPPCHa(Val));
1116     break;
1117   case R_PPC64_ADDR16_HI:
1118   case R_PPC64_REL16_HI:
1119     write16be(Loc, applyPPCHi(Val));
1120     break;
1121   case R_PPC64_ADDR16_HIGHER:
1122     write16be(Loc, applyPPCHigher(Val));
1123     break;
1124   case R_PPC64_ADDR16_HIGHERA:
1125     write16be(Loc, applyPPCHighera(Val));
1126     break;
1127   case R_PPC64_ADDR16_HIGHEST:
1128     write16be(Loc, applyPPCHighest(Val));
1129     break;
1130   case R_PPC64_ADDR16_HIGHESTA:
1131     write16be(Loc, applyPPCHighesta(Val));
1132     break;
1133   case R_PPC64_ADDR16_LO:
1134     write16be(Loc, applyPPCLo(Val));
1135     break;
1136   case R_PPC64_ADDR16_LO_DS:
1137   case R_PPC64_REL16_LO:
1138     write16be(Loc, (read16be(Loc) & 3) | (applyPPCLo(Val) & ~3));
1139     break;
1140   case R_PPC64_ADDR32:
1141   case R_PPC64_REL32:
1142     checkInt<32>(Val, Type);
1143     write32be(Loc, Val);
1144     break;
1145   case R_PPC64_ADDR64:
1146   case R_PPC64_REL64:
1147   case R_PPC64_TOC:
1148     write64be(Loc, Val);
1149     break;
1150   case R_PPC64_REL24: {
1151     uint32_t Mask = 0x03FFFFFC;
1152     checkInt<24>(Val, Type);
1153     write32be(Loc, (read32be(Loc) & ~Mask) | (Val & Mask));
1154     break;
1155   }
1156   default:
1157     fatal("unrecognized reloc " + Twine(Type));
1158   }
1159 }
1160 
1161 AArch64TargetInfo::AArch64TargetInfo() {
1162   CopyRel = R_AARCH64_COPY;
1163   RelativeRel = R_AARCH64_RELATIVE;
1164   IRelativeRel = R_AARCH64_IRELATIVE;
1165   GotRel = R_AARCH64_GLOB_DAT;
1166   PltRel = R_AARCH64_JUMP_SLOT;
1167   TlsDescRel = R_AARCH64_TLSDESC;
1168   TlsGotRel = R_AARCH64_TLS_TPREL64;
1169   GotEntrySize = 8;
1170   GotPltEntrySize = 8;
1171   PltEntrySize = 16;
1172   PltHeaderSize = 32;
1173   MaxPageSize = 65536;
1174 
1175   // It doesn't seem to be documented anywhere, but tls on aarch64 uses variant
1176   // 1 of the tls structures and the tcb size is 16.
1177   TcbSize = 16;
1178 }
1179 
1180 RelExpr AArch64TargetInfo::getRelExpr(uint32_t Type,
1181                                       const SymbolBody &S) const {
1182   switch (Type) {
1183   default:
1184     return R_ABS;
1185   case R_AARCH64_TLSDESC_ADR_PAGE21:
1186     return R_TLSDESC_PAGE;
1187   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1188   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1189     return R_TLSDESC;
1190   case R_AARCH64_TLSDESC_CALL:
1191     return R_TLSDESC_CALL;
1192   case R_AARCH64_TLSLE_ADD_TPREL_HI12:
1193   case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
1194     return R_TLS;
1195   case R_AARCH64_CALL26:
1196   case R_AARCH64_CONDBR19:
1197   case R_AARCH64_JUMP26:
1198   case R_AARCH64_TSTBR14:
1199     return R_PLT_PC;
1200   case R_AARCH64_PREL16:
1201   case R_AARCH64_PREL32:
1202   case R_AARCH64_PREL64:
1203   case R_AARCH64_ADR_PREL_LO21:
1204     return R_PC;
1205   case R_AARCH64_ADR_PREL_PG_HI21:
1206     return R_PAGE_PC;
1207   case R_AARCH64_LD64_GOT_LO12_NC:
1208   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1209     return R_GOT;
1210   case R_AARCH64_ADR_GOT_PAGE:
1211   case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
1212     return R_GOT_PAGE_PC;
1213   }
1214 }
1215 
1216 RelExpr AArch64TargetInfo::adjustRelaxExpr(uint32_t Type, const uint8_t *Data,
1217                                            RelExpr Expr) const {
1218   if (Expr == R_RELAX_TLS_GD_TO_IE) {
1219     if (Type == R_AARCH64_TLSDESC_ADR_PAGE21)
1220       return R_RELAX_TLS_GD_TO_IE_PAGE_PC;
1221     return R_RELAX_TLS_GD_TO_IE_ABS;
1222   }
1223   return Expr;
1224 }
1225 
1226 bool AArch64TargetInfo::usesOnlyLowPageBits(uint32_t Type) const {
1227   switch (Type) {
1228   default:
1229     return false;
1230   case R_AARCH64_ADD_ABS_LO12_NC:
1231   case R_AARCH64_LD64_GOT_LO12_NC:
1232   case R_AARCH64_LDST128_ABS_LO12_NC:
1233   case R_AARCH64_LDST16_ABS_LO12_NC:
1234   case R_AARCH64_LDST32_ABS_LO12_NC:
1235   case R_AARCH64_LDST64_ABS_LO12_NC:
1236   case R_AARCH64_LDST8_ABS_LO12_NC:
1237   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1238   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1239   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1240     return true;
1241   }
1242 }
1243 
1244 bool AArch64TargetInfo::isTlsInitialExecRel(uint32_t Type) const {
1245   return Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 ||
1246          Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC;
1247 }
1248 
1249 uint32_t AArch64TargetInfo::getDynRel(uint32_t Type) const {
1250   if (Type == R_AARCH64_ABS32 || Type == R_AARCH64_ABS64)
1251     return Type;
1252   // Keep it going with a dummy value so that we can find more reloc errors.
1253   errorDynRel(Type);
1254   return R_AARCH64_ABS32;
1255 }
1256 
1257 void AArch64TargetInfo::writeGotPlt(uint8_t *Buf, const SymbolBody &) const {
1258   write64le(Buf, Out<ELF64LE>::Plt->Addr);
1259 }
1260 
1261 static uint64_t getAArch64Page(uint64_t Expr) {
1262   return Expr & (~static_cast<uint64_t>(0xFFF));
1263 }
1264 
1265 void AArch64TargetInfo::writePltHeader(uint8_t *Buf) const {
1266   const uint8_t PltData[] = {
1267       0xf0, 0x7b, 0xbf, 0xa9, // stp	x16, x30, [sp,#-16]!
1268       0x10, 0x00, 0x00, 0x90, // adrp	x16, Page(&(.plt.got[2]))
1269       0x11, 0x02, 0x40, 0xf9, // ldr	x17, [x16, Offset(&(.plt.got[2]))]
1270       0x10, 0x02, 0x00, 0x91, // add	x16, x16, Offset(&(.plt.got[2]))
1271       0x20, 0x02, 0x1f, 0xd6, // br	x17
1272       0x1f, 0x20, 0x03, 0xd5, // nop
1273       0x1f, 0x20, 0x03, 0xd5, // nop
1274       0x1f, 0x20, 0x03, 0xd5  // nop
1275   };
1276   memcpy(Buf, PltData, sizeof(PltData));
1277 
1278   uint64_t Got = In<ELF64LE>::GotPlt->getVA();
1279   uint64_t Plt = Out<ELF64LE>::Plt->Addr;
1280   relocateOne(Buf + 4, R_AARCH64_ADR_PREL_PG_HI21,
1281               getAArch64Page(Got + 16) - getAArch64Page(Plt + 4));
1282   relocateOne(Buf + 8, R_AARCH64_LDST64_ABS_LO12_NC, Got + 16);
1283   relocateOne(Buf + 12, R_AARCH64_ADD_ABS_LO12_NC, Got + 16);
1284 }
1285 
1286 void AArch64TargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
1287                                  uint64_t PltEntryAddr, int32_t Index,
1288                                  unsigned RelOff) const {
1289   const uint8_t Inst[] = {
1290       0x10, 0x00, 0x00, 0x90, // adrp x16, Page(&(.plt.got[n]))
1291       0x11, 0x02, 0x40, 0xf9, // ldr  x17, [x16, Offset(&(.plt.got[n]))]
1292       0x10, 0x02, 0x00, 0x91, // add  x16, x16, Offset(&(.plt.got[n]))
1293       0x20, 0x02, 0x1f, 0xd6  // br   x17
1294   };
1295   memcpy(Buf, Inst, sizeof(Inst));
1296 
1297   relocateOne(Buf, R_AARCH64_ADR_PREL_PG_HI21,
1298               getAArch64Page(GotEntryAddr) - getAArch64Page(PltEntryAddr));
1299   relocateOne(Buf + 4, R_AARCH64_LDST64_ABS_LO12_NC, GotEntryAddr);
1300   relocateOne(Buf + 8, R_AARCH64_ADD_ABS_LO12_NC, GotEntryAddr);
1301 }
1302 
1303 static void updateAArch64Addr(uint8_t *L, uint64_t Imm) {
1304   uint32_t ImmLo = (Imm & 0x3) << 29;
1305   uint32_t ImmHi = (Imm & 0x1FFFFC) << 3;
1306   uint64_t Mask = (0x3 << 29) | (0x1FFFFC << 3);
1307   write32le(L, (read32le(L) & ~Mask) | ImmLo | ImmHi);
1308 }
1309 
1310 static inline void updateAArch64Add(uint8_t *L, uint64_t Imm) {
1311   or32le(L, (Imm & 0xFFF) << 10);
1312 }
1313 
1314 void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1315                                     uint64_t Val) const {
1316   switch (Type) {
1317   case R_AARCH64_ABS16:
1318   case R_AARCH64_PREL16:
1319     checkIntUInt<16>(Val, Type);
1320     write16le(Loc, Val);
1321     break;
1322   case R_AARCH64_ABS32:
1323   case R_AARCH64_PREL32:
1324     checkIntUInt<32>(Val, Type);
1325     write32le(Loc, Val);
1326     break;
1327   case R_AARCH64_ABS64:
1328   case R_AARCH64_PREL64:
1329     write64le(Loc, Val);
1330     break;
1331   case R_AARCH64_ADD_ABS_LO12_NC:
1332     // This relocation stores 12 bits and there's no instruction
1333     // to do it. Instead, we do a 32 bits store of the value
1334     // of r_addend bitwise-or'ed Loc. This assumes that the addend
1335     // bits in Loc are zero.
1336     or32le(Loc, (Val & 0xFFF) << 10);
1337     break;
1338   case R_AARCH64_ADR_GOT_PAGE:
1339   case R_AARCH64_ADR_PREL_PG_HI21:
1340   case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
1341   case R_AARCH64_TLSDESC_ADR_PAGE21:
1342     checkInt<33>(Val, Type);
1343     updateAArch64Addr(Loc, Val >> 12);
1344     break;
1345   case R_AARCH64_ADR_PREL_LO21:
1346     checkInt<21>(Val, Type);
1347     updateAArch64Addr(Loc, Val);
1348     break;
1349   case R_AARCH64_CALL26:
1350   case R_AARCH64_JUMP26:
1351     checkInt<28>(Val, Type);
1352     or32le(Loc, (Val & 0x0FFFFFFC) >> 2);
1353     break;
1354   case R_AARCH64_CONDBR19:
1355     checkInt<21>(Val, Type);
1356     or32le(Loc, (Val & 0x1FFFFC) << 3);
1357     break;
1358   case R_AARCH64_LD64_GOT_LO12_NC:
1359   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
1360   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1361     checkAlignment<8>(Val, Type);
1362     or32le(Loc, (Val & 0xFF8) << 7);
1363     break;
1364   case R_AARCH64_LDST128_ABS_LO12_NC:
1365     or32le(Loc, (Val & 0x0FF8) << 6);
1366     break;
1367   case R_AARCH64_LDST16_ABS_LO12_NC:
1368     or32le(Loc, (Val & 0x0FFC) << 9);
1369     break;
1370   case R_AARCH64_LDST8_ABS_LO12_NC:
1371     or32le(Loc, (Val & 0xFFF) << 10);
1372     break;
1373   case R_AARCH64_LDST32_ABS_LO12_NC:
1374     or32le(Loc, (Val & 0xFFC) << 8);
1375     break;
1376   case R_AARCH64_LDST64_ABS_LO12_NC:
1377     or32le(Loc, (Val & 0xFF8) << 7);
1378     break;
1379   case R_AARCH64_MOVW_UABS_G0_NC:
1380     or32le(Loc, (Val & 0xFFFF) << 5);
1381     break;
1382   case R_AARCH64_MOVW_UABS_G1_NC:
1383     or32le(Loc, (Val & 0xFFFF0000) >> 11);
1384     break;
1385   case R_AARCH64_MOVW_UABS_G2_NC:
1386     or32le(Loc, (Val & 0xFFFF00000000) >> 27);
1387     break;
1388   case R_AARCH64_MOVW_UABS_G3:
1389     or32le(Loc, (Val & 0xFFFF000000000000) >> 43);
1390     break;
1391   case R_AARCH64_TSTBR14:
1392     checkInt<16>(Val, Type);
1393     or32le(Loc, (Val & 0xFFFC) << 3);
1394     break;
1395   case R_AARCH64_TLSLE_ADD_TPREL_HI12:
1396     checkInt<24>(Val, Type);
1397     updateAArch64Add(Loc, Val >> 12);
1398     break;
1399   case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
1400   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1401     updateAArch64Add(Loc, Val);
1402     break;
1403   default:
1404     fatal("unrecognized reloc " + Twine(Type));
1405   }
1406 }
1407 
1408 void AArch64TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type,
1409                                        uint64_t Val) const {
1410   // TLSDESC Global-Dynamic relocation are in the form:
1411   //   adrp    x0, :tlsdesc:v             [R_AARCH64_TLSDESC_ADR_PAGE21]
1412   //   ldr     x1, [x0, #:tlsdesc_lo12:v  [R_AARCH64_TLSDESC_LD64_LO12_NC]
1413   //   add     x0, x0, :tlsdesc_los:v     [_AARCH64_TLSDESC_ADD_LO12_NC]
1414   //   .tlsdesccall                       [R_AARCH64_TLSDESC_CALL]
1415   //   blr     x1
1416   // And it can optimized to:
1417   //   movz    x0, #0x0, lsl #16
1418   //   movk    x0, #0x10
1419   //   nop
1420   //   nop
1421   checkUInt<32>(Val, Type);
1422 
1423   switch (Type) {
1424   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1425   case R_AARCH64_TLSDESC_CALL:
1426     write32le(Loc, 0xd503201f); // nop
1427     return;
1428   case R_AARCH64_TLSDESC_ADR_PAGE21:
1429     write32le(Loc, 0xd2a00000 | (((Val >> 16) & 0xffff) << 5)); // movz
1430     return;
1431   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1432     write32le(Loc, 0xf2800000 | ((Val & 0xffff) << 5)); // movk
1433     return;
1434   default:
1435     llvm_unreachable("unsupported relocation for TLS GD to LE relaxation");
1436   }
1437 }
1438 
1439 void AArch64TargetInfo::relaxTlsGdToIe(uint8_t *Loc, uint32_t Type,
1440                                        uint64_t Val) const {
1441   // TLSDESC Global-Dynamic relocation are in the form:
1442   //   adrp    x0, :tlsdesc:v             [R_AARCH64_TLSDESC_ADR_PAGE21]
1443   //   ldr     x1, [x0, #:tlsdesc_lo12:v  [R_AARCH64_TLSDESC_LD64_LO12_NC]
1444   //   add     x0, x0, :tlsdesc_los:v     [_AARCH64_TLSDESC_ADD_LO12_NC]
1445   //   .tlsdesccall                       [R_AARCH64_TLSDESC_CALL]
1446   //   blr     x1
1447   // And it can optimized to:
1448   //   adrp    x0, :gottprel:v
1449   //   ldr     x0, [x0, :gottprel_lo12:v]
1450   //   nop
1451   //   nop
1452 
1453   switch (Type) {
1454   case R_AARCH64_TLSDESC_ADD_LO12_NC:
1455   case R_AARCH64_TLSDESC_CALL:
1456     write32le(Loc, 0xd503201f); // nop
1457     break;
1458   case R_AARCH64_TLSDESC_ADR_PAGE21:
1459     write32le(Loc, 0x90000000); // adrp
1460     relocateOne(Loc, R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, Val);
1461     break;
1462   case R_AARCH64_TLSDESC_LD64_LO12_NC:
1463     write32le(Loc, 0xf9400000); // ldr
1464     relocateOne(Loc, R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, Val);
1465     break;
1466   default:
1467     llvm_unreachable("unsupported relocation for TLS GD to LE relaxation");
1468   }
1469 }
1470 
1471 void AArch64TargetInfo::relaxTlsIeToLe(uint8_t *Loc, uint32_t Type,
1472                                        uint64_t Val) const {
1473   checkUInt<32>(Val, Type);
1474 
1475   if (Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) {
1476     // Generate MOVZ.
1477     uint32_t RegNo = read32le(Loc) & 0x1f;
1478     write32le(Loc, (0xd2a00000 | RegNo) | (((Val >> 16) & 0xffff) << 5));
1479     return;
1480   }
1481   if (Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) {
1482     // Generate MOVK.
1483     uint32_t RegNo = read32le(Loc) & 0x1f;
1484     write32le(Loc, (0xf2800000 | RegNo) | ((Val & 0xffff) << 5));
1485     return;
1486   }
1487   llvm_unreachable("invalid relocation for TLS IE to LE relaxation");
1488 }
1489 
1490 AMDGPUTargetInfo::AMDGPUTargetInfo() {
1491   RelativeRel = R_AMDGPU_REL64;
1492   GotRel = R_AMDGPU_ABS64;
1493   GotEntrySize = 8;
1494 }
1495 
1496 void AMDGPUTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1497                                    uint64_t Val) const {
1498   switch (Type) {
1499   case R_AMDGPU_ABS32:
1500   case R_AMDGPU_GOTPCREL:
1501   case R_AMDGPU_GOTPCREL32_LO:
1502   case R_AMDGPU_REL32:
1503   case R_AMDGPU_REL32_LO:
1504     write32le(Loc, Val);
1505     break;
1506   case R_AMDGPU_ABS64:
1507     write64le(Loc, Val);
1508     break;
1509   case R_AMDGPU_GOTPCREL32_HI:
1510   case R_AMDGPU_REL32_HI:
1511     write32le(Loc, Val >> 32);
1512     break;
1513   default:
1514     fatal("unrecognized reloc " + Twine(Type));
1515   }
1516 }
1517 
1518 RelExpr AMDGPUTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
1519   switch (Type) {
1520   case R_AMDGPU_ABS32:
1521   case R_AMDGPU_ABS64:
1522     return R_ABS;
1523   case R_AMDGPU_REL32:
1524   case R_AMDGPU_REL32_LO:
1525   case R_AMDGPU_REL32_HI:
1526     return R_PC;
1527   case R_AMDGPU_GOTPCREL:
1528   case R_AMDGPU_GOTPCREL32_LO:
1529   case R_AMDGPU_GOTPCREL32_HI:
1530     return R_GOT_PC;
1531   default:
1532     fatal("do not know how to handle relocation " + Twine(Type));
1533   }
1534 }
1535 
1536 ARMTargetInfo::ARMTargetInfo() {
1537   CopyRel = R_ARM_COPY;
1538   RelativeRel = R_ARM_RELATIVE;
1539   IRelativeRel = R_ARM_IRELATIVE;
1540   GotRel = R_ARM_GLOB_DAT;
1541   PltRel = R_ARM_JUMP_SLOT;
1542   TlsGotRel = R_ARM_TLS_TPOFF32;
1543   TlsModuleIndexRel = R_ARM_TLS_DTPMOD32;
1544   TlsOffsetRel = R_ARM_TLS_DTPOFF32;
1545   GotEntrySize = 4;
1546   GotPltEntrySize = 4;
1547   PltEntrySize = 16;
1548   PltHeaderSize = 20;
1549   // ARM uses Variant 1 TLS
1550   TcbSize = 8;
1551   NeedsThunks = true;
1552 }
1553 
1554 RelExpr ARMTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
1555   switch (Type) {
1556   default:
1557     return R_ABS;
1558   case R_ARM_THM_JUMP11:
1559     return R_PC;
1560   case R_ARM_CALL:
1561   case R_ARM_JUMP24:
1562   case R_ARM_PC24:
1563   case R_ARM_PLT32:
1564   case R_ARM_PREL31:
1565   case R_ARM_THM_JUMP19:
1566   case R_ARM_THM_JUMP24:
1567   case R_ARM_THM_CALL:
1568     return R_PLT_PC;
1569   case R_ARM_GOTOFF32:
1570     // (S + A) - GOT_ORG
1571     return R_GOTREL;
1572   case R_ARM_GOT_BREL:
1573     // GOT(S) + A - GOT_ORG
1574     return R_GOT_OFF;
1575   case R_ARM_GOT_PREL:
1576   case R_ARM_TLS_IE32:
1577     // GOT(S) + A - P
1578     return R_GOT_PC;
1579   case R_ARM_TARGET1:
1580     return Config->Target1Rel ? R_PC : R_ABS;
1581   case R_ARM_TARGET2:
1582     if (Config->Target2 == Target2Policy::Rel)
1583       return R_PC;
1584     if (Config->Target2 == Target2Policy::Abs)
1585       return R_ABS;
1586     return R_GOT_PC;
1587   case R_ARM_TLS_GD32:
1588     return R_TLSGD_PC;
1589   case R_ARM_TLS_LDM32:
1590     return R_TLSLD_PC;
1591   case R_ARM_BASE_PREL:
1592     // B(S) + A - P
1593     // FIXME: currently B(S) assumed to be .got, this may not hold for all
1594     // platforms.
1595     return R_GOTONLY_PC;
1596   case R_ARM_MOVW_PREL_NC:
1597   case R_ARM_MOVT_PREL:
1598   case R_ARM_REL32:
1599   case R_ARM_THM_MOVW_PREL_NC:
1600   case R_ARM_THM_MOVT_PREL:
1601     return R_PC;
1602   case R_ARM_NONE:
1603     return R_HINT;
1604   case R_ARM_TLS_LE32:
1605     return R_TLS;
1606   }
1607 }
1608 
1609 uint32_t ARMTargetInfo::getDynRel(uint32_t Type) const {
1610   if (Type == R_ARM_TARGET1 && !Config->Target1Rel)
1611     return R_ARM_ABS32;
1612   if (Type == R_ARM_ABS32)
1613     return Type;
1614   // Keep it going with a dummy value so that we can find more reloc errors.
1615   errorDynRel(Type);
1616   return R_ARM_ABS32;
1617 }
1618 
1619 void ARMTargetInfo::writeGotPlt(uint8_t *Buf, const SymbolBody &) const {
1620   write32le(Buf, Out<ELF32LE>::Plt->Addr);
1621 }
1622 
1623 void ARMTargetInfo::writePltHeader(uint8_t *Buf) const {
1624   const uint8_t PltData[] = {
1625       0x04, 0xe0, 0x2d, 0xe5, //     str lr, [sp,#-4]!
1626       0x04, 0xe0, 0x9f, 0xe5, //     ldr lr, L2
1627       0x0e, 0xe0, 0x8f, 0xe0, // L1: add lr, pc, lr
1628       0x08, 0xf0, 0xbe, 0xe5, //     ldr pc, [lr, #8]
1629       0x00, 0x00, 0x00, 0x00, // L2: .word   &(.got.plt) - L1 - 8
1630   };
1631   memcpy(Buf, PltData, sizeof(PltData));
1632   uint64_t GotPlt = In<ELF32LE>::GotPlt->getVA();
1633   uint64_t L1 = Out<ELF32LE>::Plt->Addr + 8;
1634   write32le(Buf + 16, GotPlt - L1 - 8);
1635 }
1636 
1637 void ARMTargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
1638                              uint64_t PltEntryAddr, int32_t Index,
1639                              unsigned RelOff) const {
1640   // FIXME: Using simple code sequence with simple relocations.
1641   // There is a more optimal sequence but it requires support for the group
1642   // relocations. See ELF for the ARM Architecture Appendix A.3
1643   const uint8_t PltData[] = {
1644       0x04, 0xc0, 0x9f, 0xe5, //     ldr ip, L2
1645       0x0f, 0xc0, 0x8c, 0xe0, // L1: add ip, ip, pc
1646       0x00, 0xf0, 0x9c, 0xe5, //     ldr pc, [ip]
1647       0x00, 0x00, 0x00, 0x00, // L2: .word   Offset(&(.plt.got) - L1 - 8
1648   };
1649   memcpy(Buf, PltData, sizeof(PltData));
1650   uint64_t L1 = PltEntryAddr + 4;
1651   write32le(Buf + 12, GotEntryAddr - L1 - 8);
1652 }
1653 
1654 RelExpr ARMTargetInfo::getThunkExpr(RelExpr Expr, uint32_t RelocType,
1655                                     const InputFile &File,
1656                                     const SymbolBody &S) const {
1657   // If S is an undefined weak symbol we don't need a Thunk
1658   if (S.isUndefined())
1659     return Expr;
1660   // A state change from ARM to Thumb and vice versa must go through an
1661   // interworking thunk if the relocation type is not R_ARM_CALL or
1662   // R_ARM_THM_CALL.
1663   switch (RelocType) {
1664   case R_ARM_PC24:
1665   case R_ARM_PLT32:
1666   case R_ARM_JUMP24:
1667     // Source is ARM, all PLT entries are ARM so no interworking required.
1668     // Otherwise we need to interwork if Symbol has bit 0 set (Thumb).
1669     if (Expr == R_PC && ((S.getVA<ELF32LE>() & 1) == 1))
1670       return R_THUNK_PC;
1671     break;
1672   case R_ARM_THM_JUMP19:
1673   case R_ARM_THM_JUMP24:
1674     // Source is Thumb, all PLT entries are ARM so interworking is required.
1675     // Otherwise we need to interwork if Symbol has bit 0 clear (ARM).
1676     if (Expr == R_PLT_PC)
1677       return R_THUNK_PLT_PC;
1678     if ((S.getVA<ELF32LE>() & 1) == 0)
1679       return R_THUNK_PC;
1680     break;
1681   }
1682   return Expr;
1683 }
1684 
1685 void ARMTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
1686                                 uint64_t Val) const {
1687   switch (Type) {
1688   case R_ARM_ABS32:
1689   case R_ARM_BASE_PREL:
1690   case R_ARM_GOTOFF32:
1691   case R_ARM_GOT_BREL:
1692   case R_ARM_GOT_PREL:
1693   case R_ARM_REL32:
1694   case R_ARM_TARGET1:
1695   case R_ARM_TARGET2:
1696   case R_ARM_TLS_GD32:
1697   case R_ARM_TLS_IE32:
1698   case R_ARM_TLS_LDM32:
1699   case R_ARM_TLS_LDO32:
1700   case R_ARM_TLS_LE32:
1701     write32le(Loc, Val);
1702     break;
1703   case R_ARM_PREL31:
1704     checkInt<31>(Val, Type);
1705     write32le(Loc, (read32le(Loc) & 0x80000000) | (Val & ~0x80000000));
1706     break;
1707   case R_ARM_CALL:
1708     // R_ARM_CALL is used for BL and BLX instructions, depending on the
1709     // value of bit 0 of Val, we must select a BL or BLX instruction
1710     if (Val & 1) {
1711       // If bit 0 of Val is 1 the target is Thumb, we must select a BLX.
1712       // The BLX encoding is 0xfa:H:imm24 where Val = imm24:H:'1'
1713       checkInt<26>(Val, Type);
1714       write32le(Loc, 0xfa000000 |                    // opcode
1715                          ((Val & 2) << 23) |         // H
1716                          ((Val >> 2) & 0x00ffffff)); // imm24
1717       break;
1718     }
1719     if ((read32le(Loc) & 0xfe000000) == 0xfa000000)
1720       // BLX (always unconditional) instruction to an ARM Target, select an
1721       // unconditional BL.
1722       write32le(Loc, 0xeb000000 | (read32le(Loc) & 0x00ffffff));
1723   // fall through as BL encoding is shared with B
1724   case R_ARM_JUMP24:
1725   case R_ARM_PC24:
1726   case R_ARM_PLT32:
1727     checkInt<26>(Val, Type);
1728     write32le(Loc, (read32le(Loc) & ~0x00ffffff) | ((Val >> 2) & 0x00ffffff));
1729     break;
1730   case R_ARM_THM_JUMP11:
1731     checkInt<12>(Val, Type);
1732     write16le(Loc, (read32le(Loc) & 0xf800) | ((Val >> 1) & 0x07ff));
1733     break;
1734   case R_ARM_THM_JUMP19:
1735     // Encoding T3: Val = S:J2:J1:imm6:imm11:0
1736     checkInt<21>(Val, Type);
1737     write16le(Loc,
1738               (read16le(Loc) & 0xfbc0) |   // opcode cond
1739                   ((Val >> 10) & 0x0400) | // S
1740                   ((Val >> 12) & 0x003f)); // imm6
1741     write16le(Loc + 2,
1742               0x8000 |                    // opcode
1743                   ((Val >> 8) & 0x0800) | // J2
1744                   ((Val >> 5) & 0x2000) | // J1
1745                   ((Val >> 1) & 0x07ff)); // imm11
1746     break;
1747   case R_ARM_THM_CALL:
1748     // R_ARM_THM_CALL is used for BL and BLX instructions, depending on the
1749     // value of bit 0 of Val, we must select a BL or BLX instruction
1750     if ((Val & 1) == 0) {
1751       // Ensure BLX destination is 4-byte aligned. As BLX instruction may
1752       // only be two byte aligned. This must be done before overflow check
1753       Val = alignTo(Val, 4);
1754     }
1755     // Bit 12 is 0 for BLX, 1 for BL
1756     write16le(Loc + 2, (read16le(Loc + 2) & ~0x1000) | (Val & 1) << 12);
1757   // Fall through as rest of encoding is the same as B.W
1758   case R_ARM_THM_JUMP24:
1759     // Encoding B  T4, BL T1, BLX T2: Val = S:I1:I2:imm10:imm11:0
1760     // FIXME: Use of I1 and I2 require v6T2ops
1761     checkInt<25>(Val, Type);
1762     write16le(Loc,
1763               0xf000 |                     // opcode
1764                   ((Val >> 14) & 0x0400) | // S
1765                   ((Val >> 12) & 0x03ff)); // imm10
1766     write16le(Loc + 2,
1767               (read16le(Loc + 2) & 0xd000) |                  // opcode
1768                   (((~(Val >> 10)) ^ (Val >> 11)) & 0x2000) | // J1
1769                   (((~(Val >> 11)) ^ (Val >> 13)) & 0x0800) | // J2
1770                   ((Val >> 1) & 0x07ff));                     // imm11
1771     break;
1772   case R_ARM_MOVW_ABS_NC:
1773   case R_ARM_MOVW_PREL_NC:
1774     write32le(Loc, (read32le(Loc) & ~0x000f0fff) | ((Val & 0xf000) << 4) |
1775                        (Val & 0x0fff));
1776     break;
1777   case R_ARM_MOVT_ABS:
1778   case R_ARM_MOVT_PREL:
1779     checkInt<32>(Val, Type);
1780     write32le(Loc, (read32le(Loc) & ~0x000f0fff) |
1781                        (((Val >> 16) & 0xf000) << 4) | ((Val >> 16) & 0xfff));
1782     break;
1783   case R_ARM_THM_MOVT_ABS:
1784   case R_ARM_THM_MOVT_PREL:
1785     // Encoding T1: A = imm4:i:imm3:imm8
1786     checkInt<32>(Val, Type);
1787     write16le(Loc,
1788               0xf2c0 |                     // opcode
1789                   ((Val >> 17) & 0x0400) | // i
1790                   ((Val >> 28) & 0x000f)); // imm4
1791     write16le(Loc + 2,
1792               (read16le(Loc + 2) & 0x8f00) | // opcode
1793                   ((Val >> 12) & 0x7000) |   // imm3
1794                   ((Val >> 16) & 0x00ff));   // imm8
1795     break;
1796   case R_ARM_THM_MOVW_ABS_NC:
1797   case R_ARM_THM_MOVW_PREL_NC:
1798     // Encoding T3: A = imm4:i:imm3:imm8
1799     write16le(Loc,
1800               0xf240 |                     // opcode
1801                   ((Val >> 1) & 0x0400) |  // i
1802                   ((Val >> 12) & 0x000f)); // imm4
1803     write16le(Loc + 2,
1804               (read16le(Loc + 2) & 0x8f00) | // opcode
1805                   ((Val << 4) & 0x7000) |    // imm3
1806                   (Val & 0x00ff));           // imm8
1807     break;
1808   default:
1809     fatal("unrecognized reloc " + Twine(Type));
1810   }
1811 }
1812 
1813 uint64_t ARMTargetInfo::getImplicitAddend(const uint8_t *Buf,
1814                                           uint32_t Type) const {
1815   switch (Type) {
1816   default:
1817     return 0;
1818   case R_ARM_ABS32:
1819   case R_ARM_BASE_PREL:
1820   case R_ARM_GOTOFF32:
1821   case R_ARM_GOT_BREL:
1822   case R_ARM_GOT_PREL:
1823   case R_ARM_REL32:
1824   case R_ARM_TARGET1:
1825   case R_ARM_TARGET2:
1826   case R_ARM_TLS_GD32:
1827   case R_ARM_TLS_LDM32:
1828   case R_ARM_TLS_LDO32:
1829   case R_ARM_TLS_IE32:
1830   case R_ARM_TLS_LE32:
1831     return SignExtend64<32>(read32le(Buf));
1832   case R_ARM_PREL31:
1833     return SignExtend64<31>(read32le(Buf));
1834   case R_ARM_CALL:
1835   case R_ARM_JUMP24:
1836   case R_ARM_PC24:
1837   case R_ARM_PLT32:
1838     return SignExtend64<26>(read32le(Buf) << 2);
1839   case R_ARM_THM_JUMP11:
1840     return SignExtend64<12>(read16le(Buf) << 1);
1841   case R_ARM_THM_JUMP19: {
1842     // Encoding T3: A = S:J2:J1:imm10:imm6:0
1843     uint16_t Hi = read16le(Buf);
1844     uint16_t Lo = read16le(Buf + 2);
1845     return SignExtend64<20>(((Hi & 0x0400) << 10) | // S
1846                             ((Lo & 0x0800) << 8) |  // J2
1847                             ((Lo & 0x2000) << 5) |  // J1
1848                             ((Hi & 0x003f) << 12) | // imm6
1849                             ((Lo & 0x07ff) << 1));  // imm11:0
1850   }
1851   case R_ARM_THM_CALL:
1852   case R_ARM_THM_JUMP24: {
1853     // Encoding B T4, BL T1, BLX T2: A = S:I1:I2:imm10:imm11:0
1854     // I1 = NOT(J1 EOR S), I2 = NOT(J2 EOR S)
1855     // FIXME: I1 and I2 require v6T2ops
1856     uint16_t Hi = read16le(Buf);
1857     uint16_t Lo = read16le(Buf + 2);
1858     return SignExtend64<24>(((Hi & 0x0400) << 14) |                    // S
1859                             (~((Lo ^ (Hi << 3)) << 10) & 0x00800000) | // I1
1860                             (~((Lo ^ (Hi << 1)) << 11) & 0x00400000) | // I2
1861                             ((Hi & 0x003ff) << 12) |                   // imm0
1862                             ((Lo & 0x007ff) << 1)); // imm11:0
1863   }
1864   // ELF for the ARM Architecture 4.6.1.1 the implicit addend for MOVW and
1865   // MOVT is in the range -32768 <= A < 32768
1866   case R_ARM_MOVW_ABS_NC:
1867   case R_ARM_MOVT_ABS:
1868   case R_ARM_MOVW_PREL_NC:
1869   case R_ARM_MOVT_PREL: {
1870     uint64_t Val = read32le(Buf) & 0x000f0fff;
1871     return SignExtend64<16>(((Val & 0x000f0000) >> 4) | (Val & 0x00fff));
1872   }
1873   case R_ARM_THM_MOVW_ABS_NC:
1874   case R_ARM_THM_MOVT_ABS:
1875   case R_ARM_THM_MOVW_PREL_NC:
1876   case R_ARM_THM_MOVT_PREL: {
1877     // Encoding T3: A = imm4:i:imm3:imm8
1878     uint16_t Hi = read16le(Buf);
1879     uint16_t Lo = read16le(Buf + 2);
1880     return SignExtend64<16>(((Hi & 0x000f) << 12) | // imm4
1881                             ((Hi & 0x0400) << 1) |  // i
1882                             ((Lo & 0x7000) >> 4) |  // imm3
1883                             (Lo & 0x00ff));         // imm8
1884   }
1885   }
1886 }
1887 
1888 bool ARMTargetInfo::isTlsLocalDynamicRel(uint32_t Type) const {
1889   return Type == R_ARM_TLS_LDO32 || Type == R_ARM_TLS_LDM32;
1890 }
1891 
1892 bool ARMTargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
1893   return Type == R_ARM_TLS_GD32;
1894 }
1895 
1896 bool ARMTargetInfo::isTlsInitialExecRel(uint32_t Type) const {
1897   return Type == R_ARM_TLS_IE32;
1898 }
1899 
1900 template <class ELFT> MipsTargetInfo<ELFT>::MipsTargetInfo() {
1901   GotPltHeaderEntriesNum = 2;
1902   MaxPageSize = 65536;
1903   GotEntrySize = sizeof(typename ELFT::uint);
1904   GotPltEntrySize = sizeof(typename ELFT::uint);
1905   PltEntrySize = 16;
1906   PltHeaderSize = 32;
1907   CopyRel = R_MIPS_COPY;
1908   PltRel = R_MIPS_JUMP_SLOT;
1909   NeedsThunks = true;
1910   if (ELFT::Is64Bits) {
1911     RelativeRel = (R_MIPS_64 << 8) | R_MIPS_REL32;
1912     TlsGotRel = R_MIPS_TLS_TPREL64;
1913     TlsModuleIndexRel = R_MIPS_TLS_DTPMOD64;
1914     TlsOffsetRel = R_MIPS_TLS_DTPREL64;
1915   } else {
1916     RelativeRel = R_MIPS_REL32;
1917     TlsGotRel = R_MIPS_TLS_TPREL32;
1918     TlsModuleIndexRel = R_MIPS_TLS_DTPMOD32;
1919     TlsOffsetRel = R_MIPS_TLS_DTPREL32;
1920   }
1921 }
1922 
1923 template <class ELFT>
1924 RelExpr MipsTargetInfo<ELFT>::getRelExpr(uint32_t Type,
1925                                          const SymbolBody &S) const {
1926   // See comment in the calculateMipsRelChain.
1927   if (ELFT::Is64Bits || Config->MipsN32Abi)
1928     Type &= 0xff;
1929   switch (Type) {
1930   default:
1931     return R_ABS;
1932   case R_MIPS_JALR:
1933     return R_HINT;
1934   case R_MIPS_GPREL16:
1935   case R_MIPS_GPREL32:
1936     return R_GOTREL;
1937   case R_MIPS_26:
1938     return R_PLT;
1939   case R_MIPS_HI16:
1940   case R_MIPS_LO16:
1941   case R_MIPS_GOT_OFST:
1942     // MIPS _gp_disp designates offset between start of function and 'gp'
1943     // pointer into GOT. __gnu_local_gp is equal to the current value of
1944     // the 'gp'. Therefore any relocations against them do not require
1945     // dynamic relocation.
1946     if (&S == ElfSym<ELFT>::MipsGpDisp)
1947       return R_PC;
1948     return R_ABS;
1949   case R_MIPS_PC32:
1950   case R_MIPS_PC16:
1951   case R_MIPS_PC19_S2:
1952   case R_MIPS_PC21_S2:
1953   case R_MIPS_PC26_S2:
1954   case R_MIPS_PCHI16:
1955   case R_MIPS_PCLO16:
1956     return R_PC;
1957   case R_MIPS_GOT16:
1958     if (S.isLocal())
1959       return R_MIPS_GOT_LOCAL_PAGE;
1960   // fallthrough
1961   case R_MIPS_CALL16:
1962   case R_MIPS_GOT_DISP:
1963   case R_MIPS_TLS_GOTTPREL:
1964     return R_MIPS_GOT_OFF;
1965   case R_MIPS_CALL_HI16:
1966   case R_MIPS_CALL_LO16:
1967   case R_MIPS_GOT_HI16:
1968   case R_MIPS_GOT_LO16:
1969     return R_MIPS_GOT_OFF32;
1970   case R_MIPS_GOT_PAGE:
1971     return R_MIPS_GOT_LOCAL_PAGE;
1972   case R_MIPS_TLS_GD:
1973     return R_MIPS_TLSGD;
1974   case R_MIPS_TLS_LDM:
1975     return R_MIPS_TLSLD;
1976   }
1977 }
1978 
1979 template <class ELFT>
1980 uint32_t MipsTargetInfo<ELFT>::getDynRel(uint32_t Type) const {
1981   if (Type == R_MIPS_32 || Type == R_MIPS_64)
1982     return RelativeRel;
1983   // Keep it going with a dummy value so that we can find more reloc errors.
1984   errorDynRel(Type);
1985   return R_MIPS_32;
1986 }
1987 
1988 template <class ELFT>
1989 bool MipsTargetInfo<ELFT>::isTlsLocalDynamicRel(uint32_t Type) const {
1990   return Type == R_MIPS_TLS_LDM;
1991 }
1992 
1993 template <class ELFT>
1994 bool MipsTargetInfo<ELFT>::isTlsGlobalDynamicRel(uint32_t Type) const {
1995   return Type == R_MIPS_TLS_GD;
1996 }
1997 
1998 template <class ELFT>
1999 void MipsTargetInfo<ELFT>::writeGotPlt(uint8_t *Buf, const SymbolBody &) const {
2000   write32<ELFT::TargetEndianness>(Buf, Out<ELFT>::Plt->Addr);
2001 }
2002 
2003 template <endianness E, uint8_t BSIZE, uint8_t SHIFT>
2004 static int64_t getPcRelocAddend(const uint8_t *Loc) {
2005   uint32_t Instr = read32<E>(Loc);
2006   uint32_t Mask = 0xffffffff >> (32 - BSIZE);
2007   return SignExtend64<BSIZE + SHIFT>((Instr & Mask) << SHIFT);
2008 }
2009 
2010 template <endianness E, uint8_t BSIZE, uint8_t SHIFT>
2011 static void applyMipsPcReloc(uint8_t *Loc, uint32_t Type, uint64_t V) {
2012   uint32_t Mask = 0xffffffff >> (32 - BSIZE);
2013   uint32_t Instr = read32<E>(Loc);
2014   if (SHIFT > 0)
2015     checkAlignment<(1 << SHIFT)>(V, Type);
2016   checkInt<BSIZE + SHIFT>(V, Type);
2017   write32<E>(Loc, (Instr & ~Mask) | ((V >> SHIFT) & Mask));
2018 }
2019 
2020 template <endianness E> static void writeMipsHi16(uint8_t *Loc, uint64_t V) {
2021   uint32_t Instr = read32<E>(Loc);
2022   uint16_t Res = ((V + 0x8000) >> 16) & 0xffff;
2023   write32<E>(Loc, (Instr & 0xffff0000) | Res);
2024 }
2025 
2026 template <endianness E> static void writeMipsHigher(uint8_t *Loc, uint64_t V) {
2027   uint32_t Instr = read32<E>(Loc);
2028   uint16_t Res = ((V + 0x80008000) >> 32) & 0xffff;
2029   write32<E>(Loc, (Instr & 0xffff0000) | Res);
2030 }
2031 
2032 template <endianness E> static void writeMipsHighest(uint8_t *Loc, uint64_t V) {
2033   uint32_t Instr = read32<E>(Loc);
2034   uint16_t Res = ((V + 0x800080008000) >> 48) & 0xffff;
2035   write32<E>(Loc, (Instr & 0xffff0000) | Res);
2036 }
2037 
2038 template <endianness E> static void writeMipsLo16(uint8_t *Loc, uint64_t V) {
2039   uint32_t Instr = read32<E>(Loc);
2040   write32<E>(Loc, (Instr & 0xffff0000) | (V & 0xffff));
2041 }
2042 
2043 template <class ELFT> static bool isMipsR6() {
2044   const auto &FirstObj = cast<ELFFileBase<ELFT>>(*Config->FirstElf);
2045   uint32_t Arch = FirstObj.getObj().getHeader()->e_flags & EF_MIPS_ARCH;
2046   return Arch == EF_MIPS_ARCH_32R6 || Arch == EF_MIPS_ARCH_64R6;
2047 }
2048 
2049 template <class ELFT>
2050 void MipsTargetInfo<ELFT>::writePltHeader(uint8_t *Buf) const {
2051   const endianness E = ELFT::TargetEndianness;
2052   if (Config->MipsN32Abi) {
2053     write32<E>(Buf, 0x3c0e0000);      // lui   $14, %hi(&GOTPLT[0])
2054     write32<E>(Buf + 4, 0x8dd90000);  // lw    $25, %lo(&GOTPLT[0])($14)
2055     write32<E>(Buf + 8, 0x25ce0000);  // addiu $14, $14, %lo(&GOTPLT[0])
2056     write32<E>(Buf + 12, 0x030ec023); // subu  $24, $24, $14
2057   } else {
2058     write32<E>(Buf, 0x3c1c0000);      // lui   $28, %hi(&GOTPLT[0])
2059     write32<E>(Buf + 4, 0x8f990000);  // lw    $25, %lo(&GOTPLT[0])($28)
2060     write32<E>(Buf + 8, 0x279c0000);  // addiu $28, $28, %lo(&GOTPLT[0])
2061     write32<E>(Buf + 12, 0x031cc023); // subu  $24, $24, $28
2062   }
2063   write32<E>(Buf + 16, 0x03e07825); // move  $15, $31
2064   write32<E>(Buf + 20, 0x0018c082); // srl   $24, $24, 2
2065   write32<E>(Buf + 24, 0x0320f809); // jalr  $25
2066   write32<E>(Buf + 28, 0x2718fffe); // subu  $24, $24, 2
2067   uint64_t Got = In<ELFT>::GotPlt->getVA();
2068   writeMipsHi16<E>(Buf, Got);
2069   writeMipsLo16<E>(Buf + 4, Got);
2070   writeMipsLo16<E>(Buf + 8, Got);
2071 }
2072 
2073 template <class ELFT>
2074 void MipsTargetInfo<ELFT>::writePlt(uint8_t *Buf, uint64_t GotEntryAddr,
2075                                     uint64_t PltEntryAddr, int32_t Index,
2076                                     unsigned RelOff) const {
2077   const endianness E = ELFT::TargetEndianness;
2078   write32<E>(Buf, 0x3c0f0000);     // lui   $15, %hi(.got.plt entry)
2079   write32<E>(Buf + 4, 0x8df90000); // l[wd] $25, %lo(.got.plt entry)($15)
2080                                    // jr    $25
2081   write32<E>(Buf + 8, isMipsR6<ELFT>() ? 0x03200009 : 0x03200008);
2082   write32<E>(Buf + 12, 0x25f80000); // addiu $24, $15, %lo(.got.plt entry)
2083   writeMipsHi16<E>(Buf, GotEntryAddr);
2084   writeMipsLo16<E>(Buf + 4, GotEntryAddr);
2085   writeMipsLo16<E>(Buf + 12, GotEntryAddr);
2086 }
2087 
2088 template <class ELFT>
2089 RelExpr MipsTargetInfo<ELFT>::getThunkExpr(RelExpr Expr, uint32_t Type,
2090                                            const InputFile &File,
2091                                            const SymbolBody &S) const {
2092   // Any MIPS PIC code function is invoked with its address in register $t9.
2093   // So if we have a branch instruction from non-PIC code to the PIC one
2094   // we cannot make the jump directly and need to create a small stubs
2095   // to save the target function address.
2096   // See page 3-38 ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf
2097   if (Type != R_MIPS_26)
2098     return Expr;
2099   auto *F = dyn_cast<ELFFileBase<ELFT>>(&File);
2100   if (!F)
2101     return Expr;
2102   // If current file has PIC code, LA25 stub is not required.
2103   if (F->getObj().getHeader()->e_flags & EF_MIPS_PIC)
2104     return Expr;
2105   auto *D = dyn_cast<DefinedRegular<ELFT>>(&S);
2106   // LA25 is required if target file has PIC code
2107   // or target symbol is a PIC symbol.
2108   return D && D->isMipsPIC() ? R_THUNK_ABS : Expr;
2109 }
2110 
2111 template <class ELFT>
2112 uint64_t MipsTargetInfo<ELFT>::getImplicitAddend(const uint8_t *Buf,
2113                                                  uint32_t Type) const {
2114   const endianness E = ELFT::TargetEndianness;
2115   switch (Type) {
2116   default:
2117     return 0;
2118   case R_MIPS_32:
2119   case R_MIPS_GPREL32:
2120   case R_MIPS_TLS_DTPREL32:
2121   case R_MIPS_TLS_TPREL32:
2122     return read32<E>(Buf);
2123   case R_MIPS_26:
2124     // FIXME (simon): If the relocation target symbol is not a PLT entry
2125     // we should use another expression for calculation:
2126     // ((A << 2) | (P & 0xf0000000)) >> 2
2127     return SignExtend64<28>((read32<E>(Buf) & 0x3ffffff) << 2);
2128   case R_MIPS_GPREL16:
2129   case R_MIPS_LO16:
2130   case R_MIPS_PCLO16:
2131   case R_MIPS_TLS_DTPREL_HI16:
2132   case R_MIPS_TLS_DTPREL_LO16:
2133   case R_MIPS_TLS_TPREL_HI16:
2134   case R_MIPS_TLS_TPREL_LO16:
2135     return SignExtend64<16>(read32<E>(Buf));
2136   case R_MIPS_PC16:
2137     return getPcRelocAddend<E, 16, 2>(Buf);
2138   case R_MIPS_PC19_S2:
2139     return getPcRelocAddend<E, 19, 2>(Buf);
2140   case R_MIPS_PC21_S2:
2141     return getPcRelocAddend<E, 21, 2>(Buf);
2142   case R_MIPS_PC26_S2:
2143     return getPcRelocAddend<E, 26, 2>(Buf);
2144   case R_MIPS_PC32:
2145     return getPcRelocAddend<E, 32, 0>(Buf);
2146   }
2147 }
2148 
2149 static std::pair<uint32_t, uint64_t> calculateMipsRelChain(uint32_t Type,
2150                                                            uint64_t Val) {
2151   // MIPS N64 ABI packs multiple relocations into the single relocation
2152   // record. In general, all up to three relocations can have arbitrary
2153   // types. In fact, Clang and GCC uses only a few combinations. For now,
2154   // we support two of them. That is allow to pass at least all LLVM
2155   // test suite cases.
2156   // <any relocation> / R_MIPS_SUB / R_MIPS_HI16 | R_MIPS_LO16
2157   // <any relocation> / R_MIPS_64 / R_MIPS_NONE
2158   // The first relocation is a 'real' relocation which is calculated
2159   // using the corresponding symbol's value. The second and the third
2160   // relocations used to modify result of the first one: extend it to
2161   // 64-bit, extract high or low part etc. For details, see part 2.9 Relocation
2162   // at the https://dmz-portal.mips.com/mw/images/8/82/007-4658-001.pdf
2163   uint32_t Type2 = (Type >> 8) & 0xff;
2164   uint32_t Type3 = (Type >> 16) & 0xff;
2165   if (Type2 == R_MIPS_NONE && Type3 == R_MIPS_NONE)
2166     return std::make_pair(Type, Val);
2167   if (Type2 == R_MIPS_64 && Type3 == R_MIPS_NONE)
2168     return std::make_pair(Type2, Val);
2169   if (Type2 == R_MIPS_SUB && (Type3 == R_MIPS_HI16 || Type3 == R_MIPS_LO16))
2170     return std::make_pair(Type3, -Val);
2171   error("unsupported relocations combination " + Twine(Type));
2172   return std::make_pair(Type & 0xff, Val);
2173 }
2174 
2175 template <class ELFT>
2176 void MipsTargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type,
2177                                        uint64_t Val) const {
2178   const endianness E = ELFT::TargetEndianness;
2179   // Thread pointer and DRP offsets from the start of TLS data area.
2180   // https://www.linux-mips.org/wiki/NPTL
2181   if (Type == R_MIPS_TLS_DTPREL_HI16 || Type == R_MIPS_TLS_DTPREL_LO16 ||
2182       Type == R_MIPS_TLS_DTPREL32 || Type == R_MIPS_TLS_DTPREL64)
2183     Val -= 0x8000;
2184   else if (Type == R_MIPS_TLS_TPREL_HI16 || Type == R_MIPS_TLS_TPREL_LO16 ||
2185            Type == R_MIPS_TLS_TPREL32 || Type == R_MIPS_TLS_TPREL64)
2186     Val -= 0x7000;
2187   if (ELFT::Is64Bits || Config->MipsN32Abi)
2188     std::tie(Type, Val) = calculateMipsRelChain(Type, Val);
2189   switch (Type) {
2190   case R_MIPS_32:
2191   case R_MIPS_GPREL32:
2192   case R_MIPS_TLS_DTPREL32:
2193   case R_MIPS_TLS_TPREL32:
2194     write32<E>(Loc, Val);
2195     break;
2196   case R_MIPS_64:
2197   case R_MIPS_TLS_DTPREL64:
2198   case R_MIPS_TLS_TPREL64:
2199     write64<E>(Loc, Val);
2200     break;
2201   case R_MIPS_26:
2202     write32<E>(Loc, (read32<E>(Loc) & ~0x3ffffff) | ((Val >> 2) & 0x3ffffff));
2203     break;
2204   case R_MIPS_GOT_DISP:
2205   case R_MIPS_GOT_PAGE:
2206   case R_MIPS_GOT16:
2207   case R_MIPS_GPREL16:
2208   case R_MIPS_TLS_GD:
2209   case R_MIPS_TLS_LDM:
2210     checkInt<16>(Val, Type);
2211   // fallthrough
2212   case R_MIPS_CALL16:
2213   case R_MIPS_CALL_LO16:
2214   case R_MIPS_GOT_LO16:
2215   case R_MIPS_GOT_OFST:
2216   case R_MIPS_LO16:
2217   case R_MIPS_PCLO16:
2218   case R_MIPS_TLS_DTPREL_LO16:
2219   case R_MIPS_TLS_GOTTPREL:
2220   case R_MIPS_TLS_TPREL_LO16:
2221     writeMipsLo16<E>(Loc, Val);
2222     break;
2223   case R_MIPS_CALL_HI16:
2224   case R_MIPS_GOT_HI16:
2225   case R_MIPS_HI16:
2226   case R_MIPS_PCHI16:
2227   case R_MIPS_TLS_DTPREL_HI16:
2228   case R_MIPS_TLS_TPREL_HI16:
2229     writeMipsHi16<E>(Loc, Val);
2230     break;
2231   case R_MIPS_HIGHER:
2232     writeMipsHigher<E>(Loc, Val);
2233     break;
2234   case R_MIPS_HIGHEST:
2235     writeMipsHighest<E>(Loc, Val);
2236     break;
2237   case R_MIPS_JALR:
2238     // Ignore this optimization relocation for now
2239     break;
2240   case R_MIPS_PC16:
2241     applyMipsPcReloc<E, 16, 2>(Loc, Type, Val);
2242     break;
2243   case R_MIPS_PC19_S2:
2244     applyMipsPcReloc<E, 19, 2>(Loc, Type, Val);
2245     break;
2246   case R_MIPS_PC21_S2:
2247     applyMipsPcReloc<E, 21, 2>(Loc, Type, Val);
2248     break;
2249   case R_MIPS_PC26_S2:
2250     applyMipsPcReloc<E, 26, 2>(Loc, Type, Val);
2251     break;
2252   case R_MIPS_PC32:
2253     applyMipsPcReloc<E, 32, 0>(Loc, Type, Val);
2254     break;
2255   default:
2256     fatal("unrecognized reloc " + Twine(Type));
2257   }
2258 }
2259 
2260 template <class ELFT>
2261 bool MipsTargetInfo<ELFT>::usesOnlyLowPageBits(uint32_t Type) const {
2262   return Type == R_MIPS_LO16 || Type == R_MIPS_GOT_OFST;
2263 }
2264 }
2265 }
2266