[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 12:36:13 PDT 2020


rnk updated this revision to Diff 253193.
rnk marked an inline comment as done.
rnk added a comment.

- Test .eh_frame refs


Repository:
  rG LLVM Github Monorepo

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

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,60 @@
+# 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: FileCheck %s --check-prefix=MAP --input-file=%t.map
+
+# CHECK:      Discarded unused1
+# CHECK-NEXT: Discarded unused2
+# CHECK-NOT: Discarded
+
+# MAP: In Symbol
+# MAP: gc-dwarf.s.tmp.obj:(.text)
+# MAP: {{ main$}}
+# MAP: gc-dwarf.s.tmp.obj:(.text)
+# 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
+
+# Similarly, .eh_frame unwind info should not keep functions alive. Again, this
+# is not valid unwind info, but it doesn't matter for testing purposes.
+.section .eh_frame,"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.253193.patch
Type: text/x-patch
Size: 2368 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200327/d7f4f5b8/attachment-0001.bin>


More information about the llvm-commits mailing list