diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index fcd8219abd4..a4b6bf9b08f 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -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(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(), diff --git a/test/MC/COFF/pr23025.s b/test/MC/COFF/pr23025.s index 35bf6c7fb1d..f0d007543a4 100644 --- a/test/MC/COFF/pr23025.s +++ b/test/MC/COFF/pr23025.s @@ -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