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