Add a proper fix for pr23025.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Apr 2015 11:27:13 +0000 (11:27 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 17 Apr 2015 11:27:13 +0000 (11:27 +0000)
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
test/MC/COFF/pr23025.s

index fcd8219abd423ab233fa0a20826df45dece0d941..a4b6bf9b08fc8b9ab05e0eddf948feb02c144474 100644 (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(),
index 35bf6c7fb1d91f505e490986630a5c11e5b93f0e..f0d007543a4765a885d525cce4171eba31b3b986 100644 (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