llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (GkvJwa) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/171465.diff 2 Files Affected: - (modified) clang/tools/libclang/CMakeLists.txt (+4) - (added) clang/tools/libclang/DllMain.cpp (+24) ``````````diff 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; +} +} `````````` </details> https://github.com/llvm/llvm-project/pull/171465 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
