PPC32: Support R_PPC_PLTREL32 in static mode.
See https://reviews.llvm.org/D39226 Patch by vit9696 <vit9696@avp.su> llvm-svn: 320286
This commit is contained in:
parent
fa3f1a15b2
commit
8f1bc370e2
|
@ -34,6 +34,15 @@ RelExpr PPC::getRelExpr(RelType Type, const Symbol &S,
|
|||
case R_PPC_REL24:
|
||||
case R_PPC_REL32:
|
||||
return R_PC;
|
||||
// In general case R_PPC_PLTREL24 should result in R_PLT_PC, however, since
|
||||
// PLT support is currently not available for PPC32 this workaround at least
|
||||
// allows lld to resolve local symbols when performing static linkage after
|
||||
// LLVM started to forcibly use PLT relocations by default (see D38554).
|
||||
// Non-local symbols will need a full PLT implementation, but once it lands
|
||||
// local symbols should still avoid PLT table with static relocation model.
|
||||
// This is the optimisation that bfd and gold are doing by default as well.
|
||||
case R_PPC_PLTREL24:
|
||||
return R_PC;
|
||||
default:
|
||||
return R_ABS;
|
||||
}
|
||||
|
@ -54,6 +63,7 @@ void PPC::relocateOne(uint8_t *Loc, RelType Type, uint64_t Val) const {
|
|||
case R_PPC_REL32:
|
||||
write32be(Loc, Val);
|
||||
break;
|
||||
case R_PPC_PLTREL24:
|
||||
case R_PPC_REL24:
|
||||
write32be(Loc, read32be(Loc) | (Val & 0x3FFFFFC));
|
||||
break;
|
||||
|
|
|
@ -76,3 +76,15 @@ mystr:
|
|||
# CHECK: Disassembly of section .R_PPC_ADDR32:
|
||||
# CHECK: .FR_PPC_ADDR32:
|
||||
# CHECK: 11024: 00 01 10 28
|
||||
|
||||
.align 2
|
||||
.section .R_PPC_PLTREL24,"ax",@progbits
|
||||
.globl .R_PPC_PLTREL24
|
||||
.FR_PPC_PLTREL24:
|
||||
b .Lfoox4@PLT
|
||||
.section .R_PPC_PLTREL24_2,"ax",@progbits
|
||||
.Lfoox4:
|
||||
|
||||
# CHECK: Disassembly of section .R_PPC_PLTREL24:
|
||||
# CHECK: .R_PPC_PLTREL24:
|
||||
# CHECK: 11028: 48 00 00 04 b .+4
|
||||
|
|
Loading…
Reference in New Issue