[PATCH] D95749: [ELF] Make SHF_GNU_RETAIN sections GC roots

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 4 09:23:12 PST 2021


This revision was automatically updated to reflect the committed changes.
Closed by commit rGed399d508ff6: [ELF] Make SHF_GNU_RETAIN sections GC roots (authored by MaskRay).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D95749/new/

https://reviews.llvm.org/D95749

Files:
  lld/ELF/MarkLive.cpp
  lld/test/ELF/gc-sections-retain.s


Index: lld/test/ELF/gc-sections-retain.s
===================================================================
--- /dev/null
+++ lld/test/ELF/gc-sections-retain.s
@@ -0,0 +1,44 @@
+# REQUIRES: x86
+## SHF_GNU_RETAIN is a generic feature defined in the OS specific range. The
+## flag marks a section as a GC root.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld --gc-sections --print-gc-sections %t.o -o %t | count 0
+# RUN: llvm-readobj -hS %t | FileCheck %s
+# RUN: ld.lld -r -e _start --gc-sections --print-gc-sections %t.o -o %t.ro | count 0
+# RUN: llvm-readobj -hS %t.ro | FileCheck %s
+
+## SHF_GNU_RETAIN has no significance in executables/shared objects. Multiple
+## OSABI values can benefit from this flag. Test that we don't change EI_OSABI,
+## even for relocatable output.
+# CHECK:       OS/ABI: SystemV (0x0)
+
+# CHECK:      Name: .retain
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_GNU_RETAIN
+# CHECK-NEXT: ]
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 --defsym NONALLOC=1 %s -o %t1.o
+# RUN: not ld.lld --gc-sections %t1.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERR
+
+# ERR: error: {{.*}}.o:(.nonalloc): sh_link points to discarded section {{.*}}.o:(.discard)
+
+.global _start
+_start:
+
+.section .retain,"aR", at progbits
+.quad .foo
+
+.section .foo,"a", at progbits
+.quad 0
+
+.ifdef NONALLOC
+.section .discard,"a", at progbits
+
+## With SHF_GNU_RETAIN, .nonalloc is retained while its linked-to section
+## .discard is discarded, so there will be an error.
+.section .nonalloc,"oR", at progbits,.discard
+.quad .text
+.endif
Index: lld/ELF/MarkLive.cpp
===================================================================
--- lld/ELF/MarkLive.cpp
+++ lld/ELF/MarkLive.cpp
@@ -261,6 +261,10 @@
         scanEhFrameSection(*eh, eh->template rels<ELFT>());
     }
 
+    if (sec->flags & SHF_GNU_RETAIN) {
+      enqueue(sec, 0);
+      continue;
+    }
     if (sec->flags & SHF_LINK_ORDER)
       continue;
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95749.321485.patch
Type: text/x-patch
Size: 2021 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210204/f9728260/attachment.bin>


More information about the llvm-commits mailing list