mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
Don't be over eager in evaluating a subtraction with a weak symbol.
In a subtraction of the form A - B, if B is weak, there is no way to represent that on ELF since all relocations add the value of a symbol. llvm-svn: 233139
This commit is contained in:
parent
b3c593a951
commit
0f74449354
@ -803,6 +803,10 @@ static const MCSymbol *getWeakRef(const MCSymbolRefExpr &Ref) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static bool isWeak(const MCSymbolData &D) {
|
||||
return D.getFlags() & ELF_STB_Weak || MCELF::GetType(D) == ELF::STT_GNU_IFUNC;
|
||||
}
|
||||
|
||||
void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
|
||||
const MCAsmLayout &Layout,
|
||||
const MCFragment *Fragment,
|
||||
@ -843,6 +847,10 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
|
||||
Fixup.getLoc(), "Cannot represent a difference across sections");
|
||||
|
||||
const MCSymbolData &SymBD = Asm.getSymbolData(SymB);
|
||||
if (isWeak(SymBD))
|
||||
Asm.getContext().FatalError(
|
||||
Fixup.getLoc(), "Cannot represent a subtraction with a weak symbol");
|
||||
|
||||
uint64_t SymBOffset = Layout.getSymbolOffset(&SymBD);
|
||||
uint64_t K = SymBOffset - FixupOffset;
|
||||
IsPCRel = true;
|
||||
@ -1809,7 +1817,7 @@ ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool IsPCRel) const {
|
||||
if (DataA.getFlags() & ELF_STB_Weak || MCELF::GetType(DataA) == ELF::STT_GNU_IFUNC)
|
||||
if (isWeak(DataA))
|
||||
return false;
|
||||
return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
Asm, DataA, FB,InSet, IsPCRel);
|
||||
|
12
test/MC/ELF/weak-diff.s
Normal file
12
test/MC/ELF/weak-diff.s
Normal file
@ -0,0 +1,12 @@
|
||||
// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t 2>&1 | FileCheck %s
|
||||
|
||||
// CHECK: error: Cannot represent a subtraction with a weak symbol
|
||||
|
||||
.weak f
|
||||
.weak g
|
||||
f:
|
||||
nop
|
||||
g:
|
||||
nop
|
||||
|
||||
.quad g - f
|
Loading…
Reference in New Issue
Block a user