Don't walk aliases from global to local symbols in comdats.

This fixes pr23196.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235167 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-04-17 08:46:11 +00:00
parent b4b0b34181
commit 2298ce3d6a
2 changed files with 48 additions and 1 deletions

View File

@ -769,7 +769,36 @@ static const MCSymbol *getWeakRef(const MCSymbolRefExpr &Ref) {
}
static bool isWeak(const MCSymbolData &D) {
return D.getFlags() & ELF_STB_Weak || MCELF::GetType(D) == ELF::STT_GNU_IFUNC;
if (MCELF::GetType(D) == ELF::STT_GNU_IFUNC)
return true;
switch (MCELF::GetBinding(D)) {
default:
llvm_unreachable("Unknown binding");
case ELF::STB_LOCAL:
return false;
case ELF::STB_GLOBAL:
break;
case ELF::STB_WEAK:
case ELF::STB_GNU_UNIQUE:
return true;
}
const MCSymbol &Sym = D.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;
}
void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,

View File

@ -0,0 +1,18 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu < %s | llvm-readobj -r | FileCheck %s
// CHECK: Relocations [
// CHECK-NEXT: Section {{.*}} .rela.text {
// CHECK-NEXT: 0x1 R_X86_64_32 zed 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
foo:
movl $zed, %eax
.section .data.bar,"aGw",@progbits,zed,comdat
bar:
.byte 42
.globl zed
zed = bar