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