mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
Be consistent when deciding if a relocation is needed.
Before when deciding if we needed a relocation in A-B, we wore only checking if A was weak. This fixes the asymmetry. The "InSet" argument should probably be renamed to "ForValue", since InSet is very MachO specific, but doing so in this patch would make it hard to read. This fixes PR22815. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234165 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6dc9f59df9
commit
9428f184be
@ -262,6 +262,7 @@ public:
|
||||
|
||||
bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool IsPCRel) const override;
|
||||
|
@ -91,9 +91,9 @@ public:
|
||||
const MCSymbolRefExpr *B,
|
||||
bool InSet) const;
|
||||
|
||||
virtual bool
|
||||
IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
virtual bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool IsPCRel) const;
|
||||
|
@ -300,6 +300,7 @@ class ELFObjectWriter : public MCObjectWriter {
|
||||
bool
|
||||
IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool IsPCRel) const override;
|
||||
@ -619,7 +620,7 @@ void ELFObjectWriter::WriteSymbol(SymbolTableWriter &Writer, ELFSymbolData &MSD,
|
||||
|
||||
if (ESize) {
|
||||
int64_t Res;
|
||||
if (!ESize->EvaluateAsAbsolute(Res, Layout))
|
||||
if (!ESize->evaluateKnownAbsolute(Res, Layout))
|
||||
report_fatal_error("Size expression must be absolute.");
|
||||
Size = Res;
|
||||
}
|
||||
@ -1765,16 +1766,14 @@ void ELFObjectWriter::WriteObject(MCAssembler &Asm,
|
||||
WriteDataSectionData(Asm, Layout, *Sections[i]);
|
||||
}
|
||||
|
||||
bool
|
||||
ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
const MCAssembler &Asm, const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB, const MCFragment &FB, bool InSet,
|
||||
bool IsPCRel) const {
|
||||
if (::isWeak(DataA))
|
||||
if (!InSet && (::isWeak(DataA) || (DataB && ::isWeak(*DataB))))
|
||||
return false;
|
||||
return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
Asm, DataA, FB,InSet, IsPCRel);
|
||||
Asm, DataA, DataB, FB, InSet, IsPCRel);
|
||||
}
|
||||
|
||||
bool ELFObjectWriter::isWeak(const MCSymbolData &SD) const {
|
||||
|
@ -502,9 +502,8 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
|
||||
IsResolved = false;
|
||||
} else {
|
||||
const MCSymbolData &DataA = getSymbolData(SA);
|
||||
IsResolved =
|
||||
getWriter().IsSymbolRefDifferenceFullyResolvedImpl(*this, DataA,
|
||||
*DF, false, true);
|
||||
IsResolved = getWriter().IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
*this, DataA, nullptr, *DF, false, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -35,17 +35,13 @@ bool MCObjectWriter::IsSymbolRefDifferenceFullyResolved(
|
||||
if(!DataA.getFragment() || !DataB.getFragment())
|
||||
return false;
|
||||
|
||||
return IsSymbolRefDifferenceFullyResolvedImpl(Asm, DataA,
|
||||
*DataB.getFragment(),
|
||||
InSet,
|
||||
false);
|
||||
return IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
Asm, DataA, &DataB, *DataB.getFragment(), InSet, false);
|
||||
}
|
||||
|
||||
bool
|
||||
MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
const MCAssembler &Asm, const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB, const MCFragment &FB, bool InSet,
|
||||
bool IsPCRel) const {
|
||||
const MCSection &SecA = DataA.getSymbol().AliasedSymbol().getSection();
|
||||
const MCSection &SecB = FB.getParent()->getSection();
|
||||
|
@ -660,6 +660,7 @@ void MachObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
|
||||
bool MachObjectWriter::
|
||||
IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB,
|
||||
const MCFragment &FB,
|
||||
bool InSet,
|
||||
bool IsPCRel) const {
|
||||
|
@ -172,6 +172,7 @@ public:
|
||||
|
||||
bool IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
|
||||
const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB,
|
||||
const MCFragment &FB, bool InSet,
|
||||
bool IsPCRel) const override;
|
||||
|
||||
@ -649,16 +650,17 @@ void WinCOFFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
|
||||
}
|
||||
|
||||
bool WinCOFFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
const MCAssembler &Asm, const MCSymbolData &DataA, const MCFragment &FB,
|
||||
bool InSet, bool IsPCRel) const {
|
||||
const MCAssembler &Asm, const MCSymbolData &DataA,
|
||||
const MCSymbolData *DataB, const MCFragment &FB, bool InSet,
|
||||
bool IsPCRel) const {
|
||||
// MS LINK expects to be able to replace all references to a function with a
|
||||
// thunk to implement their /INCREMENTAL feature. Make sure we don't optimize
|
||||
// away any relocations to functions.
|
||||
if ((((DataA.getFlags() & COFF::SF_TypeMask) >> COFF::SF_TypeShift) >>
|
||||
COFF::SCT_COMPLEX_TYPE_SHIFT) == COFF::IMAGE_SYM_DTYPE_FUNCTION)
|
||||
return false;
|
||||
return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(Asm, DataA, FB,
|
||||
InSet, IsPCRel);
|
||||
return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
|
||||
Asm, DataA, DataB, FB, InSet, IsPCRel);
|
||||
}
|
||||
|
||||
bool WinCOFFObjectWriter::isWeak(const MCSymbolData &SD) const {
|
||||
|
10
test/MC/ELF/weak-diff2.s
Normal file
10
test/MC/ELF/weak-diff2.s
Normal file
@ -0,0 +1,10 @@
|
||||
// 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
|
||||
f:
|
||||
nop
|
||||
g:
|
||||
nop
|
||||
.quad g - f
|
Loading…
x
Reference in New Issue
Block a user