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