[lld] [LLD] [COFF] Mark the symbol _tls_used as a GC root (PR #71336)

Martin Storsjö via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 5 14:35:00 PST 2023


https://github.com/mstorsjo created https://github.com/llvm/llvm-project/pull/71336

This is necessary if the object file containing _tls_used is built with -fdata-sections; if this symbol is present, lld is going to include references to it in the PE header, in the TLS_TABLE data directory.

Therefore, treat the symbol as a GC root, i.e. retain it (and whatever other symbols the section chunk references) when doing doing GC (/opt:ref), if the symbol is present.

>From b48e7af80fb446c60ddfe376afd7cf84c5ae3b88 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin at martin.st>
Date: Sat, 28 Oct 2023 13:12:34 +0300
Subject: [PATCH] [LLD] [COFF] Mark the symbol _tls_used as a GC root

This is necessary if the object file containing _tls_used is built
with -fdata-sections; if this symbol is present, lld is going to
include references to it in the PE header, in the TLS_TABLE data
directory.

Therefore, treat the symbol as a GC root, i.e. retain it (and whatever
other symbols the section chunk references) when doing doing GC
(/opt:ref), if the symbol is present.
---
 lld/COFF/Driver.cpp         |  4 ++++
 lld/test/COFF/tls-used-gc.s | 21 +++++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 lld/test/COFF/tls-used-gc.s

diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 5613c2e6993a5af..b2d0edd8cb2600e 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2472,6 +2472,10 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   // resolve symbols and write indices, but don't generate native code or link).
   ctx.symtab.compileBitcodeFiles();
 
+  if (Defined *d =
+          dyn_cast_or_null<Defined>(ctx.symtab.findUnderscore("_tls_used")))
+    config->gcroot.push_back(d);
+
   // If -thinlto-index-only is given, we should create only "index
   // files" and not object files. Index file creation is already done
   // in addCombinedLTOObject, so we are done if that's the case.
diff --git a/lld/test/COFF/tls-used-gc.s b/lld/test/COFF/tls-used-gc.s
new file mode 100644
index 000000000000000..4736be67494985f
--- /dev/null
+++ b/lld/test/COFF/tls-used-gc.s
@@ -0,0 +1,21 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu -filetype=obj -o %t.obj %s
+# RUN: lld-link %t.obj /out:%t.exe /entry:main /subsystem:console /opt:ref
+# RUN: llvm-readobj --file-headers %t.exe | FileCheck %s
+
+# CHECK: TLSTableRVA: 0x1000
+# CHECK: TLSTableSize: 0x28
+
+  .section .text at main,"xr",one_only,main
+  .globl main
+main:
+  ret
+
+  .section .tls$aaa
+tlsvar:
+  .long 1
+
+  .section .rdata$_tls_used,"dr",one_only,_tls_used
+  .globl _tls_used
+_tls_used:
+  .zero 40



More information about the llvm-commits mailing list