diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 1646fe59ce4..2dd5afcb40e 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -1683,22 +1683,21 @@ bool ELFObjectWriter::isWeak(const MCSymbolData &SD) const { if (::isWeak(SD)) return true; - const MCSymbol &Sym = SD.getSymbol(); - if (!Sym.isInSection()) - return false; - - const auto &Sec = cast(Sym.getSection()); - if (!Sec.getGroup()) - return false; - // It is invalid to replace a reference to a global in a comdat // with a reference to a local since out of comdat references // to a local are forbidden. // We could try to return false for more cases, like the reference // being in the same comdat or Sym being an alias to another global, // but it is not clear if it is worth the effort. - return true; + if (MCELF::GetBinding(SD) != ELF::STB_GLOBAL) + return false; + const MCSymbol &Sym = SD.getSymbol(); + if (!Sym.isInSection()) + return false; + + const auto &Sec = cast(Sym.getSection()); + return Sec.getGroup(); } MCObjectWriter *llvm::createELFObjectWriter(MCELFObjectTargetWriter *MOTW, diff --git a/test/MC/ELF/relocation.s b/test/MC/ELF/relocation.s index cd0cc45fc00..2841612f2e1 100644 --- a/test/MC/ELF/relocation.s +++ b/test/MC/ELF/relocation.s @@ -7,6 +7,7 @@ .globl pr23272 pr23272: pr23272_2: +pr23272_3 = pr23272_2 .text bar: @@ -52,6 +53,7 @@ bar: .long foo@plt .quad pr23272_2 - pr23272 + .quad pr23272_3 - pr23272 // CHECK: Section { // CHECK: Name: .rela.text // CHECK: Relocations [