Pull in r370426 from upstream llvm trunk (by Fāng-ruì Sòng):
[PPC32] Emit R_PPC_GOT_TPREL16 instead R_PPC_GOT_TPREL16_LO Unlike ppc64, which has ADDISgotTprelHA+LDgotTprelL pairs, ppc32 just uses LDgotTprelL32, so it does not make lots of sense to use _LO without a paired _HA. Emit R_PPC_GOT_TPREL16 instead R_PPC_GOT_TPREL16_LO to match GCC, and get better linker relocation check. Note, R_PPC_GOT_TPREL16_{HA,LO} don't have good linker support: (a) lld does not support R_PPC_GOT_TPREL16_{HA,LO}. (b) Top of tree ld.bfd does not support R_PPC_GOT_REL16_HA Initial-Exec -> Local-Exec relaxation: // a.o addis 3, 3, tsd_tls@got@tprel@ha lwz 3, tsd_tls@got@tprel@l(3) add 3, 3, tsd_tls@tls // b.o .section .tdata,"awT"; .globl tsd_tls; tsd_tls: // ld/ld-new a.o b.o internal error, aborting at ../../bfd/elf32-ppc.c:7952 in ppc_elf_relocate_section Reviewed By: adalava Differential Revision: https://reviews.llvm.org/D66925 This allows use of LLD for linking 32-bit static binaries on FreeBSD/powerpc. Submitted by: Alfredo Dal'Ava Júnior <alfredo.junior@eldorado.org.br>
This commit is contained in:
parent
fb3a446a37
commit
617ea2e6c8
@ -866,8 +866,10 @@ void PPCAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
const GlobalValue *GValue = MO.getGlobal();
|
||||
MCSymbol *MOSymbol = getSymbol(GValue);
|
||||
const MCExpr *Exp =
|
||||
MCSymbolRefExpr::create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO,
|
||||
OutContext);
|
||||
MCSymbolRefExpr::create(MOSymbol,
|
||||
isPPC64 ? MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO
|
||||
: MCSymbolRefExpr::VK_PPC_GOT_TPREL,
|
||||
OutContext);
|
||||
TmpInst.getOperand(1) = MCOperand::createExpr(Exp);
|
||||
EmitToStreamer(*OutStreamer, TmpInst);
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user