From 88af411117b2fb52d3140579243bdfaa4a5369d6 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 17 Apr 2015 11:27:13 +0000 Subject: [PATCH] Add a proper fix for pr23025. Instead of avoiding looking past every global symbol, only do so if the symbol is in a comdat. llvm-svn: 235181 --- llvm/lib/MC/WinCOFFObjectWriter.cpp | 20 ++++++++++++++++---- llvm/test/MC/COFF/pr23025.s | 5 +++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index fcd8219..a4b6bf9 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/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/llvm/test/MC/COFF/pr23025.s b/llvm/test/MC/COFF/pr23025.s index 35bf6c7..f0d0075 100644 --- a/llvm/test/MC/COFF/pr23025.s +++ b/llvm/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 -- 2.7.4