Add a proper fix for pr23025.

Instead of avoiding looking past every global symbol, only do so
if the symbol is in a comdat.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-04-17 11:27:13 +00:00
parent 1e5490b167
commit c59decb902
2 changed files with 21 additions and 4 deletions

View File

@ -663,9 +663,21 @@ bool WinCOFFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
}
bool WinCOFFObjectWriter::isWeak(const MCSymbolData &SD) const {
// FIXME: this is for PR23025. Write a good description on
// why this is needed.
return SD.isExternal();
if (!SD.isExternal())
return false;
const MCSymbol &Sym = SD.getSymbol();
if (!Sym.isInSection())
return false;
const auto &Sec = cast<MCSectionCOFF>(Sym.getSection());
if (!Sec.getCOMDATSymbol())
return false;
// It looks like for COFF it is invalid to replace a reference to a global
// in a comdat with a reference to a local.
// FIXME: Add a specification reference if available.
return true;
}
void WinCOFFObjectWriter::RecordRelocation(
@ -674,7 +686,7 @@ void WinCOFFObjectWriter::RecordRelocation(
assert(Target.getSymA() && "Relocation must reference a symbol!");
const MCSymbol &Symbol = Target.getSymA()->getSymbol();
const MCSymbol &A = Symbol.AliasedSymbol();
const MCSymbol &A = Symbol;
if (!Asm.hasSymbolData(A))
Asm.getContext().FatalError(
Fixup.getLoc(),

View File

@ -3,11 +3,13 @@
// CHECK: Relocations [
// CHECK-NEXT: Section {{.*}} .text {
// CHECK-NEXT: 0x3 IMAGE_REL_AMD64_REL32 zed
// CHECK-NEXT: 0xA IMAGE_REL_AMD64_REL32 zed2
// CHECK-NEXT: }
// CHECK-NEXT: ]
foo:
leaq zed(%rip), %rax
leaq zed2(%rip), %rax
retq
.section .rdata,"dr",discard,zed
@ -16,3 +18,6 @@ Lbar:
.globl zed
zed = Lbar+1
.globl zed2
zed2 = Lbar