Jelajahi Sumber

mallocvis: add new package (#7453)

* mallocvis: add new package

* retry for MinGW

* try freebsd

* try `vmactions/[email protected]`

* retry

* retry

* try fix bsd

* retry bsd

* re

* Try build for BSD without `MAY_OVERRIDE_MALLOC=0`

* re

* fixup

* strip export surface

* retry

* fixup

* fixup

* fixup

* cleanup

* revert
Saikari 1 bulan lalu
induk
melakukan
f0e0dac886

+ 70 - 0
packages/m/mallocvis/patches/2024.07.17/fix-build-mingw-bsd.diff

@@ -0,0 +1,70 @@
+diff --git a/malloc_hook.cpp b/malloc_hook.cpp
+index 14fae64..7de77d1 100644
+--- a/malloc_hook.cpp
++++ b/malloc_hook.cpp
+@@ -13,6 +13,10 @@
+ #if __unix__
+ # include <sys/mman.h>
+ # include <unistd.h>
++#if defined(__FreeBSD__)
++# include <pthread_np.h>
++# include <malloc_np.h>
++#endif
+ # define MALLOCVIS_EXPORT
+ #elif _WIN32
+ # include <windows.h>
+@@ -36,7 +40,9 @@
+ namespace {
+ 
+ uint32_t get_thread_id() {
+-#if __unix__
++#if defined(__FreeBSD__)
++    return pthread_getthreadid_np();
++#elif __unix__
+     return gettid();
+ #elif _WIN32
+     return GetCurrentThreadId();
+@@ -213,7 +219,17 @@ struct EnableGuard {
+ 
+ } // namespace
+ 
+-#if __GNUC__
++#if __GNUC__ && !_WIN32
++#if defined(__FreeBSD__)
++extern "C" void* malloc(size_t size);
++extern "C" void free(void* ptr);
++extern "C" void* calloc(size_t nmemb, size_t size);
++extern "C" void* realloc(void *ptr, size_t size);
++extern "C" void * reallocarray(void *ptr, size_t nmemb,
++                                     size_t size);
++extern "C" void * valloc(size_t size);
++extern "C" void* memalign(size_t alignment, size_t size);
++#else
+ extern "C" void *__libc_malloc(size_t size) noexcept;
+ extern "C" void __libc_free(void *ptr) noexcept;
+ extern "C" void *__libc_calloc(size_t nmemb, size_t size) noexcept;
+@@ -222,7 +238,12 @@ extern "C" void *__libc_reallocarray(void *ptr, size_t nmemb,
+                                      size_t size) noexcept;
+ extern "C" void *__libc_valloc(size_t size) noexcept;
+ extern "C" void *__libc_memalign(size_t align, size_t size) noexcept;
++#endif
++#if defined(__FreeBSD__)
++# define REAL_LIBC(name) name
++#else
+ # define REAL_LIBC(name) __libc_##name
++#endif
+ # ifndef MAY_OVERRIDE_MALLOC
+ #  define MAY_OVERRIDE_MALLOC 1
+ # endif
+@@ -246,7 +267,11 @@ extern "C" void *__libc_memalign(size_t align, size_t size) noexcept;
+ #  define RETURN_ADDRESS ((void *)0)
+ #  pragma message("Cannot find __builtin_return_address")
+ # endif
++#if defined(__FreeBSD__)
++# define CSTDLIB_NOEXCEPT
++#else
+ # define CSTDLIB_NOEXCEPT noexcept
++#endif
+ #elif _MSC_VER
+ static void *msvc_malloc(size_t size) noexcept {
+     return HeapAlloc(GetProcessHeap(), 0, size);

+ 16 - 0
packages/m/mallocvis/port/xmake.lua

@@ -0,0 +1,16 @@
+add_rules("mode.debug", "mode.release")
+
+target("mallocvis")
+    set_languages("c++17")
+    set_kind("$(kind)")
+    if is_plat("windows", "mingw") then
+        add_syslinks("dbghelp")
+    elseif is_plat("linux", "bsd") then
+        add_syslinks("pthread")
+    end
+    add_files("malloc_hook.cpp", "plot_actions.cpp")
+    add_headerfiles("*.hpp|debug.hpp")
+    if is_plat("windows") and is_kind("shared") then
+        add_rules("utils.symbols.export_all")
+    end
+    add_defines("HAS_THREADS=1")

+ 25 - 0
packages/m/mallocvis/xmake.lua

@@ -0,0 +1,25 @@
+package("mallocvis")
+    set_homepage("https://github.com/archibate/mallocvis")
+    set_description("allocation visualization in svg graph")
+
+    add_urls("https://github.com/archibate/mallocvis.git")
+    
+    add_versions("2024.07.17", "371e8dc21fec00adf2b45d7c7bb1b7cce8ac75ff")
+    add_patches("2024.07.17", "patches/2024.07.17/fix-build-mingw-bsd.diff", "7379a1a451fb0a69462efda693bab8b2342cfbdb18eb5e791bca4cc50e36ae38")
+
+    if is_plat("windows", "mingw") then
+        add_syslinks("dbghelp")
+    elseif is_plat("linux") then
+        add_syslinks("pthread")
+    elseif is_plat("bsd") then
+        add_syslinks("pthread", "execinfo")
+    end
+
+    on_install("!android and !wasm and !macosx and !iphoneos", function (package)
+        os.cp(path.join(package:scriptdir(), "port", "xmake.lua"), "xmake.lua")
+        import("package.tools.xmake").install(package)
+    end)
+
+    on_test(function (package)
+        assert(package:has_cxxfuncs("addr2sym", {configs = {languages = "c++17"}, includes = "addr2sym.hpp"}))
+    end)