Fix --gc-sections when .eh_frame has a lsda.

We have to add sections to the work list, not just mark them live.

llvm-svn: 268628
This commit is contained in:
Rafael Espindola 2016-05-05 13:51:14 +00:00
parent 9254ebe3c0
commit d89fbca21d
2 changed files with 26 additions and 3 deletions

View File

@ -94,7 +94,9 @@ static void forEachSuccessor(InputSection<ELFT> *Sec,
run(Obj, Sec, RelSec, Fn);
}
template <class ELFT> static void scanEhFrameSection(EHInputSection<ELFT> &EH) {
template <class ELFT>
static void scanEhFrameSection(EHInputSection<ELFT> &EH,
std::function<void(ResolvedReloc<ELFT>)> Fn) {
if (!EH.RelocSection)
return;
ELFFile<ELFT> &EObj = EH.getFile()->getObj();
@ -103,7 +105,7 @@ template <class ELFT> static void scanEhFrameSection(EHInputSection<ELFT> &EH) {
return;
if (R.Sec->getSectionHdr()->sh_flags & SHF_EXECINSTR)
return;
R.Sec->Live = true;
Fn({R.Sec, 0});
});
}
@ -181,7 +183,7 @@ template <class ELFT> void elf::markLive() {
// sections that contain personality. We preserve all non-text sections
// referred by .eh_frame here.
if (auto *EH = dyn_cast_or_null<EHInputSection<ELFT>>(Sec))
scanEhFrameSection<ELFT>(*EH);
scanEhFrameSection<ELFT>(*EH, Enqueue);
if (isReserved(Sec) || Script<ELFT>::X->shouldKeep(Sec))
Enqueue({Sec, 0});
}

View File

@ -0,0 +1,21 @@
// REQUIRES: x86
// RUN: llvm-mc %s -o %t.o -filetype=obj -triple=x86_64-pc-linux
// RUN: ld.lld -shared --gc-sections %t.o -o %t
// Test that we handle .eh_frame keeping sections alive. We could be more
// precise and gc the entire contents of this file, but test that at least
// we are consistent: if we keep .abc, we have to keep .foo
// RUN: llvm-readobj -s %t | FileCheck %s
// CHECK: Name: .abc
// CHECK: Name: .foo (38)
.cfi_startproc
.cfi_lsda 0x1b,zed
.cfi_endproc
.section .abc,"a"
zed:
.long bar-.
.section .foo,"ax"
bar: