[PATCH] D76935: [COFF] Don't treat DWARF sections as GC roots

Reid Kleckner via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 27 09:41:23 PDT 2020


rnk created this revision.
rnk added reviewers: mstorsjo, MaskRay, dblaikie.
Herald added a subscriber: aprantl.
Herald added a project: LLVM.

DWARF sections are typically live and not COMDAT, so they would be
treated as GC roots. Enabling DWARF would essentially keep all code with
debug info alive, preventing any section GC.

Fixes PR45273


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D76935

Files:
  lld/COFF/MarkLive.cpp
  lld/test/COFF/gc-dwarf.s


Index: lld/test/COFF/gc-dwarf.s
===================================================================
--- /dev/null
+++ lld/test/COFF/gc-dwarf.s
@@ -0,0 +1,49 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=x86_64-windows-msvc %s -filetype=obj -o %t.obj
+# RUN: lld-link -lldmap:%t.map -out:%t.exe -opt:ref -entry:main %t.obj -verbose 2>&1 | FileCheck %s
+# RUN: cat %t.map | FileCheck %s --check-prefix=MAP
+
+# CHECK: Discarded unused1
+# CHECK: Discarded unused2
+
+# MAP: main
+# MAP: used
+
+	.def	 @feat.00; .scl	3; .type	0; .endef
+	.globl	@feat.00
+.set @feat.00, 0
+
+	.def	 main; .scl	2; .type	32; .endef
+	.section	.text,"xr",one_only,main
+	.globl	main
+main:
+	callq used
+	xorl	%eax, %eax
+	retq
+
+	.def	 used; .scl	2; .type	32; .endef
+	.section	.text,"xr",one_only,used
+	.globl	used
+used:
+	retq
+
+
+	.def	 unused1; .scl	2; .type	32; .endef
+	.section	.text,"xr",one_only,unused1
+	.globl	unused1
+unused1:
+	retq
+
+	.def	 unused2; .scl	2; .type	32; .endef
+	.section	.text,"xr",one_only,unused2
+	.globl	unused2
+unused2:
+	retq
+
+# This isn't valid DWARF, but LLD doesn't care. Make up some data that
+# references the functions above.
+.section .debug_info,"r"
+.long main at IMGREL
+.long unused1 at IMGREL
+.long unused2 at IMGREL
Index: lld/COFF/MarkLive.cpp
===================================================================
--- lld/COFF/MarkLive.cpp
+++ lld/COFF/MarkLive.cpp
@@ -28,10 +28,12 @@
   // as we push, so sections never appear twice in the list.
   SmallVector<SectionChunk *, 256> worklist;
 
-  // COMDAT section chunks are dead by default. Add non-COMDAT chunks.
+  // COMDAT section chunks are dead by default. Add non-COMDAT chunks. Do not
+  // traverse DWARF sections. They are live, but they should not keep other
+  // sections alive.
   for (Chunk *c : chunks)
     if (auto *sc = dyn_cast<SectionChunk>(c))
-      if (sc->live)
+      if (sc->live && !sc->isDWARF())
         worklist.push_back(sc);
 
   auto enqueue = [&](SectionChunk *c) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76935.253141.patch
Type: text/x-patch
Size: 1984 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200327/07d6a61f/attachment.bin>


More information about the llvm-commits mailing list