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