diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-04-17 11:27:13 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-04-17 11:27:13 +0000 |
| commit | 88af411117b2fb52d3140579243bdfaa4a5369d6 (patch) | |
| tree | 3bfeb7a0056eddae8ae5147f938c8b741ffc976f /llvm | |
| parent | 3b5f7e99652cffda7417b5d5919fb8b408143a76 (diff) | |
| download | bcm5719-llvm-88af411117b2fb52d3140579243bdfaa4a5369d6.tar.gz bcm5719-llvm-88af411117b2fb52d3140579243bdfaa4a5369d6.zip | |
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
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 20 | ||||
| -rw-r--r-- | 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 fcd8219abd4..a4b6bf9b08f 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<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(), diff --git a/llvm/test/MC/COFF/pr23025.s b/llvm/test/MC/COFF/pr23025.s index 35bf6c7fb1d..f0d007543a4 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 |

