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.

llvm-svn: 235300
This commit is contained in:
Rafael Espindola 2015-04-20 12:44:06 +00:00
parent ffa272ebbb
commit 29c8270916
2 changed files with 10 additions and 9 deletions

View File

@ -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<MCSectionELF>(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<MCSectionELF>(Sym.getSection());
return Sec.getGroup();
}
MCObjectWriter *llvm::createELFObjectWriter(MCELFObjectTargetWriter *MOTW,

View File

@ -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 [