summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/MarkLive.cpp8
-rw-r--r--lld/test/ELF/gc-sections-lsda.s21
2 files changed, 26 insertions, 3 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp
index f8000007913..dc653d9697a 100644
--- a/lld/ELF/MarkLive.cpp
+++ b/lld/ELF/MarkLive.cpp
@@ -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});
}
diff --git a/lld/test/ELF/gc-sections-lsda.s b/lld/test/ELF/gc-sections-lsda.s
new file mode 100644
index 00000000000..b5bed8f0c81
--- /dev/null
+++ b/lld/test/ELF/gc-sections-lsda.s
@@ -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:
OpenPOWER on IntegriCloud