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

Fix #154361

Because the destruction processes for EXEs and DLLs differ on Windows, DLLs, as 
modules, require more additional processing in the CRT (Crt Request Tree). When 
RPMALLOC is enabled, it initializes from the CRT by calling 
`rpmalloc_initialize`, but because there's no explicit `dllmain`, it can't 
destroy the RPMALLOC data. This causes the problem, and this patch adds 
`dllmain` to fix it.

>From 782033f1eedce4d654704f057652069472d2c586 Mon Sep 17 00:00:00 2001
From: GkvJwa <[email protected]>
Date: Tue, 9 Dec 2025 23:55:02 +0800
Subject: [PATCH] Add DllMain entry point to libclang.dll

---
 clang/tools/libclang/CMakeLists.txt |  4 ++++
 clang/tools/libclang/DllMain.cpp    | 24 ++++++++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 clang/tools/libclang/DllMain.cpp

diff --git a/clang/tools/libclang/CMakeLists.txt 
b/clang/tools/libclang/CMakeLists.txt
index b0105f5a5f79f..a3b95fd49b68d 100644
--- a/clang/tools/libclang/CMakeLists.txt
+++ b/clang/tools/libclang/CMakeLists.txt
@@ -135,6 +135,7 @@ endif()
 add_clang_library(libclang ${ENABLE_SHARED} ${ENABLE_STATIC} 
INSTALL_WITH_TOOLCHAIN
   OUTPUT_NAME ${output_name}
   ${SOURCES}
+  PARTIAL_SOURCES_INTENDED
 
   DEPENDS
   ClangDriverOptions
@@ -168,6 +169,9 @@ if(ENABLE_SHARED)
       # If llvm/libclang-cpp dll is also being built for windows clang c++ 
symbols will still be
       # implicitly be exported from libclang.
       target_compile_definitions(libclang PRIVATE CLANG_BUILD_STATIC)
+      if(LLVM_ENABLE_RPMALLOC)
+        target_sources(libclang PRIVATE DllMain.cpp)
+      endif()
   elseif(APPLE)
     set(LIBCLANG_LINK_FLAGS " -Wl,-compatibility_version -Wl,1")
     set(LIBCLANG_LINK_FLAGS "${LIBCLANG_LINK_FLAGS} -Wl,-current_version 
-Wl,${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
diff --git a/clang/tools/libclang/DllMain.cpp b/clang/tools/libclang/DllMain.cpp
new file mode 100644
index 0000000000000..262525e65e055
--- /dev/null
+++ b/clang/tools/libclang/DllMain.cpp
@@ -0,0 +1,24 @@
+
+
+#include <windows.h>
+
+extern "C" {
+
+int rpmalloc_initialize(void);
+void rpmalloc_finalize(void);
+void rpmalloc_thread_initialize(void);
+void rpmalloc_thread_finalize(int release_caches);
+
+BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) {
+  if (reason == DLL_PROCESS_ATTACH) {
+    rpmalloc_initialize();
+  } else if (reason == DLL_PROCESS_DETACH) {
+    rpmalloc_finalize();
+  } else if (reason == DLL_THREAD_ATTACH) {
+    rpmalloc_thread_initialize();
+  } else if (reason == DLL_THREAD_DETACH) {
+    rpmalloc_thread_finalize(1);
+  }
+  return TRUE;
+}
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to