[llvm] Add DllMain entry point to `libclang.dll` (PR #171465)

via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 10 00:25:17 PST 2025


https://github.com/GkvJwa updated https://github.com/llvm/llvm-project/pull/171465

>From 93d6745318585c3a904d68bc61bd989b018f379c Mon Sep 17 00:00:00 2001
From: GkvJwa <gkvjwa at gmail.com>
Date: Wed, 10 Dec 2025 16:00:39 +0800
Subject: [PATCH 1/2] Add RPMALLOC TLS support for Windows

---
 llvm/lib/Support/rpmalloc/rpmalloc.c | 41 ++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/llvm/lib/Support/rpmalloc/rpmalloc.c b/llvm/lib/Support/rpmalloc/rpmalloc.c
index 6f8b29e31e8ca..fec33f33abae2 100644
--- a/llvm/lib/Support/rpmalloc/rpmalloc.c
+++ b/llvm/lib/Support/rpmalloc/rpmalloc.c
@@ -969,6 +969,47 @@ static void _rpmalloc_spin(void) {
 }
 
 #if defined(_WIN32) && (!defined(BUILD_DYNAMIC_LINK) || !BUILD_DYNAMIC_LINK)
+
+static void NTAPI RPMallocTlsOnThreadExit(PVOID module, DWORD reason,
+                                          PVOID reserved) {
+  switch (reason) {
+  case DLL_PROCESS_ATTACH:
+    break;
+  case DLL_PROCESS_DETACH:
+    rpmalloc_finalize();
+    break;
+  case DLL_THREAD_ATTACH:
+    break;
+  case DLL_THREAD_DETACH:
+    rpmalloc_thread_finalize(1);
+    break;
+  }
+}
+
+#ifdef _WIN64
+#pragma comment(linker, "/INCLUDE:_tls_used")
+#pragma comment(linker, "/INCLUDE:rpmalloc_tls_thread_exit_callback")
+
+#pragma const_seg(".CRT$XLY")
+
+extern const PIMAGE_TLS_CALLBACK rpmalloc_tls_thread_exit_callback;
+const PIMAGE_TLS_CALLBACK rpmalloc_tls_thread_exit_callback =
+    RPMallocTlsOnThreadExit;
+
+// Reset const section
+#pragma const_seg()
+#else // _WIN64
+#pragma comment(linker, "/INCLUDE:__tls_used")
+#pragma comment(linker, "/INCLUDE:_rpmalloc_tls_thread_exit_callback")
+
+#pragma data_seg(".CRT$XLY")
+
+PIMAGE_TLS_CALLBACK rpmalloc_tls_thread_exit_callback = RPMallocTlsOnThreadExit;
+
+// Reset data section
+#pragma data_seg()
+#endif // _WIN64
+
 static void NTAPI _rpmalloc_thread_destructor(void *value) {
 #if ENABLE_OVERRIDE
   // If this is called on main thread it means rpmalloc_finalize

>From f78c03dc418632d839519bfb8a737228d27a681f Mon Sep 17 00:00:00 2001
From: GkvJwa <gkvjwa at gmail.com>
Date: Wed, 10 Dec 2025 16:25:08 +0800
Subject: [PATCH 2/2] test

---
 llvm/lib/Support/rpmalloc/rpmalloc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Support/rpmalloc/rpmalloc.c b/llvm/lib/Support/rpmalloc/rpmalloc.c
index fec33f33abae2..6f495e4c7c532 100644
--- a/llvm/lib/Support/rpmalloc/rpmalloc.c
+++ b/llvm/lib/Support/rpmalloc/rpmalloc.c
@@ -969,7 +969,6 @@ static void _rpmalloc_spin(void) {
 }
 
 #if defined(_WIN32) && (!defined(BUILD_DYNAMIC_LINK) || !BUILD_DYNAMIC_LINK)
-
 static void NTAPI RPMallocTlsOnThreadExit(PVOID module, DWORD reason,
                                           PVOID reserved) {
   switch (reason) {
@@ -4035,3 +4034,4 @@ extern inline rpmalloc_heap_t *rpmalloc_get_heap_for_ptr(void *ptr) {
 #endif
 
 void rpmalloc_linker_reference(void) { (void)sizeof(_rpmalloc_initialized); }
+



More information about the llvm-commits mailing list