mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 23:48:56 +00:00
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
This commit is contained in:
parent
7ab9941632
commit
ca3837369f
@ -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,
|
||||
|
@ -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 [
|
||||
|
Loading…
Reference in New Issue
Block a user