[PATCH] D30964: [ELF] Restore GC handling of LINK_ORDER, C-named sections

Evgeniy Stepanov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 14 18:17:20 PDT 2017


eugenis created this revision.

__start_xxx symbol keeps section xxx alive only if it is not
SHF_LINK_ORDER. Such sections can be used for user metadata, when
__start_xxx is used to iterate over section contents at runtime, and
the liveness is determined solely by the linked (associated) section.

This was earlier implemented in r294592, and broken in r296723.


Repository:
  rL LLVM

https://reviews.llvm.org/D30964

Files:
  ELF/MarkLive.cpp
  test/ELF/gc-sections-metadata-startstop.s


Index: test/ELF/gc-sections-metadata-startstop.s
===================================================================
--- /dev/null
+++ test/ELF/gc-sections-metadata-startstop.s
@@ -0,0 +1,28 @@
+# LINK_ORDER cnamed sections are not kept alive by the __start_* reference.
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld --gc-sections %t.o -o %t
+# RUN: llvm-objdump -section-headers %t | FileCheck  %s
+
+# CHECK-NOT: zz
+# CHECK: xx
+# CHECK-NOT: zz
+
+.weak __start_xx
+.weak __start_zz
+
+.global _start
+_start:
+.quad __start_xx
+.quad __start_zz
+
+.section xx,"a"
+.quad 0
+
+.section .foo,"a"
+.quad 0
+
+.section yy,"am", at progbits,.foo
+.quad 0
+
Index: ELF/MarkLive.cpp
===================================================================
--- ELF/MarkLive.cpp
+++ ELF/MarkLive.cpp
@@ -175,9 +175,6 @@
   case SHT_PREINIT_ARRAY:
     return true;
   default:
-    if (Sec->Flags & SHF_LINK_ORDER)
-      return false;
-
     if (!(Sec->Flags & SHF_ALLOC))
       return true;
 
@@ -247,6 +244,8 @@
     // referred by .eh_frame here.
     if (auto *EH = dyn_cast_or_null<EhInputSection>(Sec))
       scanEhFrameSection<ELFT>(*EH, Enqueue);
+    if (Sec->Flags & SHF_LINK_ORDER)
+      continue;
     if (isReserved<ELFT>(Sec) || Script<ELFT>::X->shouldKeep(Sec))
       Enqueue({Sec, 0});
     else if (isValidCIdentifier(Sec->Name)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D30964.91806.patch
Type: text/x-patch
Size: 1394 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170315/4fc021af/attachment.bin>


More information about the llvm-commits mailing list