[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