mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-27 11:55:49 +00:00
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:
parent
9254ebe3c0
commit
d89fbca21d
@ -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});
|
||||
}
|
||||
|
21
lld/test/ELF/gc-sections-lsda.s
Normal file
21
lld/test/ELF/gc-sections-lsda.s
Normal 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:
|
Loading…
x
Reference in New Issue
Block a user