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
