From ca3837369f8f705024aba9e01b9b5ccc88f04612 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 20 Apr 2015 12:44:06 +0000 Subject: [PATCH] Look past locals in comdats. We have to avoid converting a reference to a global into a reference to a local, but it is fine to look past a local. Patch by Vasileios Kalintiris. I just moved the comment and added thet test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235300 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 17 ++++++++--------- test/MC/ELF/relocation.s | 2 ++ 2 files changed, 10 insertions(+), 9 deletions(-) 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 [ -- 2.11.0