Fix PR23025.

There is something in link.exe that requires a relocation to use a
global symbol. Not doing so breaks the chrome build on windows.

This patch sets isWeak for that to work. To compensate,
we then need to look past those symbols when not creating relocations.

This patch includes an ELF test that matches GNU as behaviour.

I am still reducing the chrome build issue and will add a test
once that is done.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233318 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-03-26 21:11:00 +00:00
parent 61ac65ddec
commit 9d2f0da138
5 changed files with 35 additions and 5 deletions

View File

@ -105,6 +105,13 @@ public:
bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout,
const MCFixup *Fixup) const; const MCFixup *Fixup) const;
/// \brief Try to evaluate the expression to the form (a - b + constant) where
/// neither a nor b are variables.
///
/// This is a more aggressive variant of EvaluateAsRelocatable. The intended
/// use is for when relocations are not available, like the .size directive.
bool evaluateAsValue(MCValue &Res, const MCAsmLayout &Layout) const;
/// FindAssociatedSection - Find the "associated section" for this expression, /// FindAssociatedSection - Find the "associated section" for this expression,
/// which is currently defined as the absolute section for constants, or /// which is currently defined as the absolute section for constants, or
/// otherwise the section associated with the first defined symbol in the /// otherwise the section associated with the first defined symbol in the

View File

@ -188,7 +188,7 @@ const MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {
const MCExpr *Expr = Symbol.getVariableValue(); const MCExpr *Expr = Symbol.getVariableValue();
MCValue Value; MCValue Value;
if (!Expr->EvaluateAsRelocatable(Value, this, nullptr)) if (!Expr->evaluateAsValue(Value, *this))
llvm_unreachable("Invalid Expression"); llvm_unreachable("Invalid Expression");
const MCSymbolRefExpr *RefB = Value.getSymB(); const MCSymbolRefExpr *RefB = Value.getSymB();

View File

@ -584,7 +584,15 @@ bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
false); false);
} }
static bool canExpand(const MCSymbol &Sym, const MCAssembler *Asm) { bool MCExpr::evaluateAsValue(MCValue &Res, const MCAsmLayout &Layout) const {
MCAssembler *Assembler = &Layout.getAssembler();
return EvaluateAsRelocatableImpl(Res, Assembler, &Layout, nullptr, nullptr,
true);
}
static bool canExpand(const MCSymbol &Sym, const MCAssembler *Asm, bool InSet) {
if (InSet)
return true;
if (!Asm) if (!Asm)
return false; return false;
const MCSymbolData &SD = Asm->getSymbolData(Sym); const MCSymbolData &SD = Asm->getSymbolData(Sym);
@ -613,10 +621,11 @@ bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
// Evaluate recursively if this is a variable. // Evaluate recursively if this is a variable.
if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None && if (Sym.isVariable() && SRE->getKind() == MCSymbolRefExpr::VK_None &&
canExpand(Sym, Asm)) { canExpand(Sym, Asm, InSet)) {
bool IsMachO = SRE->hasSubsectionsViaSymbols();
if (Sym.getVariableValue()->EvaluateAsRelocatableImpl( if (Sym.getVariableValue()->EvaluateAsRelocatableImpl(
Res, Asm, Layout, Fixup, Addrs, true)) { Res, Asm, Layout, Fixup, Addrs, InSet || IsMachO)) {
if (!SRE->hasSubsectionsViaSymbols()) if (!IsMachO)
return true; return true;
const MCSymbolRefExpr *A = Res.getSymA(); const MCSymbolRefExpr *A = Res.getSymA();

View File

@ -175,6 +175,8 @@ public:
const MCFragment &FB, bool InSet, const MCFragment &FB, bool InSet,
bool IsPCRel) const override; bool IsPCRel) const override;
bool isWeak(const MCSymbolData &SD) const override;
void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout, void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
const MCFragment *Fragment, const MCFixup &Fixup, const MCFragment *Fragment, const MCFixup &Fixup,
MCValue Target, bool &IsPCRel, MCValue Target, bool &IsPCRel,
@ -661,6 +663,12 @@ bool WinCOFFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
InSet, IsPCRel); InSet, IsPCRel);
} }
bool WinCOFFObjectWriter::isWeak(const MCSymbolData &SD) const {
// FIXME: this is for PR23025. Write a good description on
// why this is needed.
return SD.isExternal();
}
void WinCOFFObjectWriter::RecordRelocation( void WinCOFFObjectWriter::RecordRelocation(
MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment, MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment *Fragment,
const MCFixup &Fixup, MCValue Target, bool &IsPCRel, uint64_t &FixedValue) { const MCFixup &Fixup, MCValue Target, bool &IsPCRel, uint64_t &FixedValue) {

View File

@ -10,3 +10,9 @@ a:
d = a d = a
.weak d .weak d
.long d + (b - c) .long d + (b - c)
a2:
.weak b2
b2 = a2
c2 = b2 - a2