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

Reply via email to