From c59decb902128c7b68baf98f5eadcf26fbfa5a08 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235181 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFObjectWriter.cpp | 20 ++++++++++++++++---- test/MC/COFF/pr23025.s | 5 +++++ 2 files changed, 21 insertions(+), 4 deletions(-) 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