From 6aa03cc05b3082a4e37349944b1f403350069c0a Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 16 Oct 2025 14:44:25 +0330 Subject: [PATCH 1/7] squash wip --- .drone.yml | 1 + modules/assets/private/shader.cpp | 98 ++++- modules/assets/private/shader.test.cpp | 13 +- modules/assets/public/shader.hpp | 68 +--- .../private/backend/vk/context/instance.cpp | 15 +- .../private/backend/vk/context/instance.hpp | 12 +- modules/surface/private/linux/system.cpp | 30 +- modules/surface/private/system.test.cpp | 1 - modules/surface/public/system.hpp | 9 +- tools/ci/amd64/Dockerfile | 382 +++++++++++++----- tools/ci/amd64/clang/msan.supp | 3 + 11 files changed, 440 insertions(+), 192 deletions(-) create mode 100644 tools/ci/amd64/clang/msan.supp diff --git a/.drone.yml b/.drone.yml index c637bb1..68cefa5 100644 --- a/.drone.yml +++ b/.drone.yml @@ -155,3 +155,4 @@ steps: - rm -rf /light_docs/* - mv ./html/* /light_docs/ + diff --git a/modules/assets/private/shader.cpp b/modules/assets/private/shader.cpp index 53c3b1a..0a568ef 100644 --- a/modules/assets/private/shader.cpp +++ b/modules/assets/private/shader.cpp @@ -2,18 +2,25 @@ namespace lt::assets { +constexpr auto total_metadata_size = // + sizeof(AssetMetadata::type) // + + sizeof(AssetMetadata::version) // + + sizeof(ShaderAsset::Metadata::type) // + + sizeof(BlobMetadata::tag) // + + sizeof(BlobMetadata::offset) // + + sizeof(BlobMetadata::compression_type) // + + sizeof(BlobMetadata::compressed_size) // + + sizeof(BlobMetadata::uncompressed_size); + ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) { - constexpr auto total_metadata_size = // - sizeof(AssetMetadata) // - + sizeof(Metadata) // - + sizeof(BlobMetadata); - ensure(m_stream.is_open(), "Failed to open shader asset at: {}", path.string()); + const auto read = [this](auto &field) { + m_stream.read(std::bit_cast(&field), sizeof(field)); + }; m_stream.seekg(0, std::ifstream::end); const auto file_size = static_cast(m_stream.tellg()); - ensure( file_size > total_metadata_size, "Failed to open shader asset at: {}, file smaller than metadata: {} < {}", @@ -22,12 +29,15 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) file_size ); - // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) m_stream.seekg(0, std::ifstream::beg); - m_stream.read((char *)&m_asset_metadata, sizeof(m_asset_metadata)); - m_stream.read((char *)&m_metadata, sizeof(m_metadata)); - m_stream.read((char *)&m_code_blob_metadata, sizeof(m_code_blob_metadata)); - // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) + read(m_asset_metadata.type); + read(m_asset_metadata.version); + read(m_metadata.type); + read(m_code_blob_metadata.tag); + read(m_code_blob_metadata.offset); + read(m_code_blob_metadata.compression_type); + read(m_code_blob_metadata.compressed_size); + read(m_code_blob_metadata.uncompressed_size); ensure( m_asset_metadata.type == asset_type_identifier, @@ -69,4 +79,70 @@ ShaderAsset::ShaderAsset(const std::filesystem::path &path): m_stream(path) ); } +/* static */ void ShaderAsset::pack( + const std::filesystem::path &destination, + AssetMetadata asset_metadata, + Metadata metadata, + Blob code_blob +) +{ + auto stream = std::ofstream { + destination, + std::ios::binary | std::ios::trunc, + }; + + const auto code_blob_metadata = BlobMetadata { + .tag = std::to_underlying(BlobTag::code), + .offset = total_metadata_size, + .compression_type = CompressionType::none, + .compressed_size = code_blob.size(), + .uncompressed_size = code_blob.size(), + }; + + ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string()); + const auto write = [&stream](auto &field) { + stream.write(std::bit_cast(&field), sizeof(field)); + }; + write(asset_metadata.type); + write(asset_metadata.version); + write(metadata.type); + write(code_blob_metadata.tag); + write(code_blob_metadata.offset); + write(code_blob_metadata.compression_type); + write(code_blob_metadata.compressed_size); + write(code_blob_metadata.uncompressed_size); + stream.write(std::bit_cast(code_blob.data()), static_cast(code_blob.size())); +} + +void ShaderAsset::unpack_to(BlobTag tag, std::span destination) const +{ + ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag)); + + ensure( + destination.size() >= m_code_blob_metadata.uncompressed_size, + "Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller " + "than the blobl's uncompressed size: {}", + std::to_underlying(tag), + std::bit_cast(destination.data()), + destination.size(), + m_code_blob_metadata.uncompressed_size + ); + + m_stream.seekg(static_cast(m_code_blob_metadata.offset)); + m_stream.read( + std::bit_cast(destination.data()), + static_cast(m_code_blob_metadata.uncompressed_size) + ); +} + +[[nodiscard]] auto ShaderAsset::unpack(BlobTag tag) const -> Blob +{ + ensure(tag == BlobTag::code, "Invalid blob tag for shader asset: {}", std::to_underlying(tag)); + + auto blob = Blob(m_code_blob_metadata.uncompressed_size); + unpack_to(tag, blob); + + return blob; +} + } // namespace lt::assets diff --git a/modules/assets/private/shader.test.cpp b/modules/assets/private/shader.test.cpp index 357bec8..32ce6cb 100644 --- a/modules/assets/private/shader.test.cpp +++ b/modules/assets/private/shader.test.cpp @@ -40,10 +40,15 @@ Suite packing = "shader_pack"_suite = [] { dummy_blob.emplace_back(static_cast(idx)); } - const auto expected_size = // - sizeof(AssetMetadata) // - + sizeof(ShaderAsset::Metadata) // - + sizeof(BlobMetadata) // + const auto expected_size = // + sizeof(AssetMetadata::type) // + + sizeof(AssetMetadata::version) // + + sizeof(ShaderAsset::Metadata::type) // + + sizeof(BlobMetadata::tag) // + + sizeof(BlobMetadata::offset) // + + sizeof(BlobMetadata::compression_type) // + + sizeof(BlobMetadata::compressed_size) // + + sizeof(BlobMetadata::uncompressed_size) // + dummy_blob.size(); ShaderAsset::pack( diff --git a/modules/assets/public/shader.hpp b/modules/assets/public/shader.hpp index ab68014..c8f6061 100644 --- a/modules/assets/public/shader.hpp +++ b/modules/assets/public/shader.hpp @@ -32,33 +32,14 @@ public: AssetMetadata asset_metadata, Metadata metadata, Blob code_blob - ) - { - auto stream = std::ofstream { - destination, - std::ios::binary | std::ios::trunc, - }; - ensure(stream.is_open(), "Failed to pack shader asset to {}", destination.string()); - - // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) - stream.write((char *)&asset_metadata, sizeof(asset_metadata)); - stream.write((char *)&metadata, sizeof(metadata)); - - auto code_blob_metadata = BlobMetadata { - .tag = std::to_underlying(BlobTag::code), - .offset = static_cast(stream.tellp()) + sizeof(BlobMetadata), - .compression_type = CompressionType::none, - .compressed_size = code_blob.size(), - .uncompressed_size = code_blob.size(), - }; - stream.write((char *)&code_blob_metadata, sizeof(BlobMetadata)); - - stream.write((char *)code_blob.data(), static_cast(code_blob.size())); - // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) - } + ); ShaderAsset(const std::filesystem::path &path); + void unpack_to(BlobTag tag, std::span destination) const; + + [[nodiscard]] auto unpack(BlobTag tag) const -> Blob; + [[nodiscard]] auto get_asset_metadata() const -> const AssetMetadata & { return m_asset_metadata; @@ -80,45 +61,6 @@ public: return m_code_blob_metadata; } - void unpack_to(BlobTag tag, std::span destination) const - { - ensure( - tag == BlobTag::code, - "Invalid blob tag for shader asset: {}", - std::to_underlying(tag) - ); - - ensure( - destination.size() >= m_code_blob_metadata.uncompressed_size, - "Failed to unpack shader blob {} to destination ({}) of size {} since it's smaller " - "than the blobl's uncompressed size: {}", - std::to_underlying(tag), - (size_t)(destination.data()), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) - destination.size(), - m_code_blob_metadata.uncompressed_size - ); - - m_stream.seekg(static_cast(m_code_blob_metadata.offset)); - m_stream.read( - (char *)destination.data(), // NOLINT(cppcoreguidelines-pro-type-cstyle-cast) - static_cast(m_code_blob_metadata.uncompressed_size) - ); - } - - [[nodiscard]] auto unpack(BlobTag tag) const -> Blob - { - ensure( - tag == BlobTag::code, - "Invalid blob tag for shader asset: {}", - std::to_underlying(tag) - ); - - auto blob = Blob(m_code_blob_metadata.uncompressed_size); - unpack_to(tag, blob); - - return blob; - } - private: AssetMetadata m_asset_metadata {}; diff --git a/modules/renderer/private/backend/vk/context/instance.cpp b/modules/renderer/private/backend/vk/context/instance.cpp index d4451b3..0f832c1 100644 --- a/modules/renderer/private/backend/vk/context/instance.cpp +++ b/modules/renderer/private/backend/vk/context/instance.cpp @@ -112,7 +112,7 @@ Instance::~Instance() unload_library(); } -void Instance::initialize_instance() +__attribute__((no_sanitize("memory"))) void Instance::initialize_instance() { auto app_info = VkApplicationInfo { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, @@ -217,6 +217,7 @@ void Instance::initialize_instance() vkc(vk_enumerate_instance_extension_properties(nullptr, &count, nullptr)); auto extensions = std::vector(count); + memset(extensions.data(), 0, extensions.size() * sizeof(VkExtensionProperties)); vkc(vk_enumerate_instance_extension_properties(nullptr, &count, extensions.data())); // log_inf("Available vulkan instance extensions:"); @@ -230,9 +231,9 @@ void Instance::initialize_instance() ensure(m_instance, "Failed to create vulkan instance"); } -void Instance::load_library() +__attribute__((no_sanitize("memory"))) void Instance::load_library() { - constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_DEEPBIND | RTLD_LOCAL | RTLD_NODELETE; + constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE; library = dlopen("libvulkan.so.1", runtime_loader_flags); if (!library) { @@ -247,7 +248,7 @@ void Instance::load_library() ensure(vk_get_instance_proc_address, "Failed to load vulkan function: vkGetInstanceProcAddr"); } -void Instance::unload_library() +__attribute__((no_sanitize("memory"))) void Instance::unload_library() { if (!library) { @@ -262,7 +263,7 @@ void Instance::unload_library() // library = nullptr; } -void Instance::load_global_functions() +__attribute__((no_sanitize("memory"))) void Instance::load_global_functions() { constexpr auto load_fn = [](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -276,7 +277,7 @@ void Instance::load_global_functions() load_fn(vk_enumerate_instance_layer_properties, "vkEnumerateInstanceLayerProperties"); } -void Instance::load_instance_functions() +__attribute__((no_sanitize("memory"))) void Instance::load_instance_functions() { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -320,7 +321,7 @@ void Instance::load_instance_functions() load_fn(vk_destroy_surface_khr, "vkDestroySurfaceKHR"); } -void Instance::load_device_functions_impl(VkDevice device) +__attribute__((no_sanitize("memory"))) void Instance::load_device_functions_impl(VkDevice device) { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) diff --git a/modules/renderer/private/backend/vk/context/instance.hpp b/modules/renderer/private/backend/vk/context/instance.hpp index a4b337a..0e86da2 100644 --- a/modules/renderer/private/backend/vk/context/instance.hpp +++ b/modules/renderer/private/backend/vk/context/instance.hpp @@ -64,17 +64,17 @@ private: Instance(); - void initialize_instance(); + __attribute__((no_sanitize("memory"))) void initialize_instance(); - void load_library(); + __attribute__((no_sanitize("memory"))) void load_library(); - void unload_library(); + __attribute__((no_sanitize("memory"))) void unload_library(); - void load_global_functions(); + __attribute__((no_sanitize("memory"))) void load_global_functions(); - void load_instance_functions(); + __attribute__((no_sanitize("memory"))) void load_instance_functions(); - void load_device_functions_impl(VkDevice device); + __attribute__((no_sanitize("memory"))) void load_device_functions_impl(VkDevice device); VkInstance m_instance = VK_NULL_HANDLE; diff --git a/modules/surface/private/linux/system.cpp b/modules/surface/private/linux/system.cpp index e1b44b2..b98ec6e 100644 --- a/modules/surface/private/linux/system.cpp +++ b/modules/surface/private/linux/system.cpp @@ -11,14 +11,19 @@ #include #include +// +#include + namespace lt::surface { template -int XEventTypeEquals(Display *, XEvent *event, XPointer winptr) +auto XEventTypeEquals(Display *display, XEvent *event, char *winptr) -> int { + std::ignore = display; return ( event->type == EventType - && *(reinterpret_cast(winptr)) == reinterpret_cast(event)->window + && *(std::bit_cast(winptr)) + == std::bit_cast(event)->window ); } @@ -100,7 +105,10 @@ void System::on_unregister() { } -void System::create_surface_component(ecs::EntityId entity, SurfaceComponent::CreateInfo info) +__attribute__((no_sanitize_memory)) void System::create_surface_component( + ecs::EntityId entity, + SurfaceComponent::CreateInfo info +) try { auto &component = m_registry->add(entity, info); @@ -160,9 +168,14 @@ try XSetWMProtocols(display, main_window, &surface.m_native_data.wm_delete_message, 1); // code to remove decoration - auto hints = std::array { 2, 0, 0, 0, 0 }; + auto hints = std::array { 2, 0, 0, 0, 0 }; const auto motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False); +#if defined(__clang__) && __has_feature(memory_sanitizer) + auto bytes = (size_t)(1u) * (size_t)hints.size(); + __msan_unpoison((void *)hints.data(), bytes); +#endif + XChangeProperty( display, surface.m_native_data.window, @@ -331,7 +344,10 @@ void System::modify_title(SurfaceComponent &surface, const ModifyTitleRequest &r XStoreName(display, window, request.title.c_str()); } -void System::modify_resolution(SurfaceComponent &surface, const ModifyResolutionRequest &request) +__attribute__((no_sanitize("memory"))) void System::modify_resolution( + SurfaceComponent &surface, + const ModifyResolutionRequest &request +) { // surface.m_resolution = request.resolution; @@ -340,7 +356,7 @@ void System::modify_resolution(SurfaceComponent &surface, const ModifyResolution // XResizeWindow(display, window, width, height); // get baseline serial number for X requests generated from XResizeWindow - uint64_t serial = NextRequest(display); + auto serial = NextRequest(display); // request a new window size from the X server XResizeWindow(display, window, static_cast(width), static_cast(height)); @@ -396,7 +412,7 @@ void System::modify_position(SurfaceComponent &surface, const ModifyPositionRequ const auto &[x, y] = request.position; // get baseline serial number for X requests generated from XResizeWindow - uint64_t serial = NextRequest(display); + auto serial = NextRequest(display); XMoveWindow(display, window, static_cast(x), static_cast(y)); // flush output queue and wait for X server to processes the request diff --git a/modules/surface/private/system.test.cpp b/modules/surface/private/system.test.cpp index fe9adb4..3ea6643 100644 --- a/modules/surface/private/system.test.cpp +++ b/modules/surface/private/system.test.cpp @@ -16,7 +16,6 @@ using test::expect_eq; using test::expect_ne; using test::expect_not_nullptr; using test::expect_throw; -using test::expect_true; using test::Suite; [[nodiscard]] auto tick_info() -> app::TickInfo diff --git a/modules/surface/public/system.hpp b/modules/surface/public/system.hpp index 24e36e9..6993d49 100644 --- a/modules/surface/public/system.hpp +++ b/modules/surface/public/system.hpp @@ -27,7 +27,10 @@ public: void on_unregister() override; - void create_surface_component(ecs::EntityId entity, SurfaceComponent::CreateInfo info); + __attribute__((no_sanitize("memory"))) void create_surface_component( + ecs::EntityId entity, + SurfaceComponent::CreateInfo info + ); void tick(app::TickInfo tick) override; @@ -45,12 +48,12 @@ private: void modify_title(struct SurfaceComponent &surface, const struct ModifyTitleRequest &request); - void modify_resolution( + __attribute__((no_sanitize("memory"))) void modify_resolution( struct SurfaceComponent &surface, const struct ModifyResolutionRequest &request ); - void modify_position( + __attribute__((no_sanitize("memory"))) void modify_position( struct SurfaceComponent &surface, const struct ModifyPositionRequest &request ); diff --git a/tools/ci/amd64/Dockerfile b/tools/ci/amd64/Dockerfile index e054f7d..1646e8f 100644 --- a/tools/ci/amd64/Dockerfile +++ b/tools/ci/amd64/Dockerfile @@ -1,99 +1,301 @@ FROM archlinux:latest +## Configurations ## +RUN \ +mkdir /msan \ +&& echo 'src:*' > /msan/ignorelist_all_sources \ +&& sed -i 's/^#ParallelDownloads = .*/ParallelDownloads = 8/' /etc/pacman.conf \ +&& echo 'NoExtract = usr/share/{man,doc,info}/*' >> /etc/pacman.conf + ## Packages ## RUN \ -sed -i 's/^#ParallelDownloads = .*/ParallelDownloads = 8/' /etc/pacman.conf \ -&& echo 'NoExtract = usr/share/{man,doc,info}/*' >> /etc/pacman.conf \ -&& pacman -Syyu --noconfirm --needed --disable-download-timeout \ -afl++ \ -afl-utils \ -base-devel \ -bash \ -clang \ -cmake \ -curl \ -expat \ -gcc \ -gdb \ -git \ -glm \ -libc++ \ -libinput \ -libpciaccess \ -libpng \ -libunwind \ -libx11 \ -libxcb \ -libxcursor \ -libxi \ -libxinerama \ -libxpresent \ -libxrandr \ -lz4 \ -mesa \ -mold \ -ninja \ -python \ -python-distlib \ -python-distutils-extra \ -python-jsonschema \ -qt5-base \ -qt6-base \ -valgrind \ -vulkan-headers \ -vulkan-icd-loader \ -vulkan-tools \ -vulkan-validation-layers \ -wayland \ -wayland-protocols \ -wget \ -xcb-util \ -xcb-util-cursor \ -xcb-util-keysyms \ -xcb-util-wm \ -xorg-server-xvfb \ -xorg-util-macros \ -xtrans \ -zlib \ -zstd \ +pacman -Syyu --noconfirm --needed --disable-download-timeout \ + afl++ \ + afl-utils \ + base-devel \ + bash \ + cbindgen \ + clang \ + cmake \ + curl \ + debuginfod \ + directx-headers \ + elfutils \ + expat \ + gcc \ + gcc-libs \ + gdb \ + git \ + glibc \ + glm \ + glslang \ + libc++ \ + libclc \ + libdrm \ + libelf \ + libglvnd \ + libinput \ + libpciaccess \ + libpng \ + libunwind \ + libva \ + libx11 \ + libxcb \ + libxdamage \ + libxext \ + libxfixes \ + libxi \ + libxinerama \ + libxml2 \ + libxpresent \ + libxrandr \ + libxshmfence \ + libxxf86vm \ + lm_sensors \ + llvm \ + lz4 \ + meson \ + mold \ + ninja \ + python \ + python-distlib \ + python-distutils-extra \ + python-jsonschema \ + python-mako \ + python-packaging \ + python-ply \ + python-pyaml \ + qt5-base \ + qt6-base \ + rust \ + rust-bindgen \ + spirv-llvm-translator \ + spirv-tools \ + systemd-libs \ + valgrind \ + vulkan-headers \ + vulkan-icd-loader \ + vulkan-tools \ + vulkan-validation-layers \ + wayland \ + wayland-protocols \ + wget \ + xcb-proto \ + xcb-util \ + xcb-util-cursor \ + xcb-util-keysyms \ + xcb-util-wm \ + xorg-server-xvfb \ + xorg-util-macros \ + xorgproto \ + xtrans \ + zlib \ + zstd \ && pacman -Scc --noconfirm -## Sanitizers ## +## Libc++ ## RUN \ -git clone --depth=1 https://github.com/llvm/llvm-project.git -b llvmorg-20.1.8 \ -&& mkdir llvm-project/build-lsan llvm-project/build-msan \ +git clone \ + --branch llvmorg-20.1.8 \ + --depth=1 \ + https://github.com/llvm/llvm-project.git + +RUN cd llvm-project/ \ \ -&& cd llvm-project/build-lsan \ -&& cmake -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_LINKER_TYPE="MOLD" \ - -DCMAKE_INSTALL_PREFIX=/libcxx_lsan \ - -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ - -DLLVM_ENABLE_PIC=ON \ - -DLIBCXX_INSTALL_MODULES=ON \ - -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ - -DLLVM_USE_SANITIZER=Leaks \ - ../runtimes \ -&& ninja cxx cxxabi \ -&& ninja install-cxx install-cxxabi \ +&& cmake \ + -S ./runtimes \ + -B ./build-lsan \ + -G Ninja \ + -D CMAKE_LINKER_TYPE="MOLD" \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_INSTALL_PREFIX=/libcxx_lsan \ + -D CMAKE_C_COMPILER=$(which clang) \ + -D CMAKE_CXX_COMPILER=$(which clang++) \ + -D LLVM_ENABLE_PROJECTS="clang;compiler-rt" \ + -D LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \ + -D LLVM_ENABLE_PIC=ON \ + -D LIBCXX_INSTALL_MODULES=ON \ + -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \ + -D LLVM_USE_SANITIZER=Leaks \ +&& cd ./build-lsan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../ \ \ -&& cd ../build-msan \ -&& cmake -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_LINKER_TYPE="MOLD" \ - -DCMAKE_INSTALL_PREFIX=/libcxx_msan \ - -DCMAKE_C_COMPILER=clang \ - -DCMAKE_CXX_COMPILER=clang++ \ - -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ - -DLLVM_ENABLE_PIC=ON \ - -DLIBCXX_INSTALL_MODULES=ON \ - -DLIBCXXABI_USE_LLVM_UNWINDER=OFF \ - -DLLVM_USE_SANITIZER=MemoryWithOrigins \ - ../runtimes \ -&& ninja cxx cxxabi \ -&& ninja install-cxx install-cxxabi \ -\ -&& cd ../.. \ -&& rm -rf llvm-project +&& cmake \ + -S ./runtimes \ + -B ./build-msan \ + -G Ninja \ + -D CMAKE_LINKER_TYPE="MOLD" \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_INSTALL_PREFIX=/libcxx_msan \ + -D CMAKE_C_COMPILER=$(which clang) \ + -D CMAKE_CXX_COMPILER=$(which clang++) \ + -D LLVM_ENABLE_PROJECTS="clang;compiler-rt" \ + -D LLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \ + -D LLVM_ENABLE_PIC=ON \ + -D LIBCXX_INSTALL_MODULES=ON \ + -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \ + -D LLVM_USE_SANITIZER=MemoryWithOrigins \ +&& cd ./build-msan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../ + +## libxcb ## +RUN \ +wget https://x.org/releases/individual/lib/libxcb-1.17.0.tar.xz \ +&& tar xf libxcb-1.17.0.tar.xz \ +&& cd libxcb-1.17.0 \ +&& export CC=clang \ +&& export CFLAGS=" \ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ + -fno-omit-frame-pointer \ + -g \ + -fPIC" \ +&& export LDFLAGS=" \ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ + -fno-omit-frame-pointer \ + -g \ + -fPIC" \ +&& ./configure \ + --prefix=/msan \ + --disable-static \ + --without-doxygen \ +&& make && make install \ +&& cd .. && rm -rf libxcb-1.17.0 libxcb-1.17.0.tar.xz + +## libx11 ## +RUN \ +wget https://x.org/releases/individual/lib/libX11-1.8.12.tar.xz \ +&& tar xf libX11-1.8.12.tar.xz \ +&& cd libX11-1.8.12 \ +&& export CC=clang \ +&& export CFLAGS=" \ +-fsanitize=memory \ +-fsanitize-memory-track-origins \ +-fsanitize-ignorelist=/msan/ignorelist_all_sources \ +-fno-omit-frame-pointer \ +-g \ +-fPIC" \ +&& export LDFLAGS=" \ +-fsanitize=memory \ +-fsanitize-memory-track-origins \ +-fsanitize-ignorelist=/msan/ignorelist_all_sources \ +-fno-omit-frame-pointer \ +-g \ +-fPIC" \ +&& export PKG_CONFIG_PATH=/msan/lib/pkgconfig:$PKG_CONFIG_PATH \ +&& ./configure \ + --prefix=/msan \ + --disable-static \ +&& make && make install \ +&& cd .. && rm -rf libX11-1.8.12 libX11-1.8.12.tar.xz + +RUN wget 'https://sdk.lunarg.com/sdk/download/1.4.328.1/linux/vulkansdk-linux-x86_64-1.4.328.1.tar.xz' +RUN tar xf vulkansdk-linux-x86_64-1.4.328.1.tar.xz + +## Vulkan SDK ## +RUN \ +cd /1.4.328.1 \ +&& chmod +x ./vulkansdk \ +&& chmod +x ./setup-env.sh \ +&& export CC="$(which clang)" \ +&& export CXX="$(which clang++)" \ +&& export CXXFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ + -fno-omit-frame-pointer \ + -g \ + -std=c++23 \ + -nostdinc++ \ + -isystem /libcxx_msan/include/c++/v1/"\ +&& export CFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fno-omit-frame-pointer \ + -g" \ +&& export LDFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ + -g \ + -std=c++23 \ + -L/msan/lib -Wl,-rpath,/msan/lib \ + -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \ + -lc++ \ + -lc++abi" \ +&& ./vulkansdk \ + --debug \ + --numjobs `nproc` \ + vulkan-loader + +## Mesa ## +RUN git clone \ + --branch='25.2'\ + --depth=1 \ + https://gitlab.freedesktop.org/mesa/mesa.git + +RUN \ +export CXX=$(which clang++) \ +&& export CC=$(which clang) \ +&& export CXXFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fno-omit-frame-pointer \ + -g \ + -nostdinc++ \ + -isystem /libcxx_msan/include/c++/v1/"\ +&& export CFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -fno-omit-frame-pointer \ + -g" \ +&& export LDFLAGS="\ + -fsanitize=memory \ + -fsanitize-memory-track-origins \ + -g \ + -L/msan/lib -Wl,-rpath,/msan/lib \ + -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \ + -lc++ \ + -lc++abi" \ +&& meson setup ./ _build \ + -D build-tests=false \ + -D enable-glcpp-tests=false \ + -D build-radv-tests=false \ + -D build-aco-tests=false \ + -D install-intel-gpu-tests=false \ + -D gallium-mediafoundation-test=false \ + -D android-libbacktrace=disabled \ + -D split-debug=disabled \ + -D b_ndebug=true \ + -D b_lto=false \ + -D egl=enabled \ + -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \ + -D gallium-extra-hud=true \ + -D gallium-rusticl=true \ + -D gallium-va=enabled \ + -D gbm=enabled \ + -D gles1=disabled \ + -D gles2=enabled \ + -D glvnd=enabled \ + -D glx=dri \ + -D libunwind=enabled \ + -D llvm=enabled \ + -D lmsensors=disabled \ + -D microsoft-clc=disabled \ + -D platforms=x11,wayland \ + -D valgrind=disabled \ + -D video-codecs=all \ + -D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \ + -D vulkan-layers=device-select,intel-nullhw,overlay \ + -D tools='' \ + -D zstd=enabled \ + -D buildtype=plain \ + -D prefix=/usr \ + -D sysconfdir=/etc \ + --wrap-mode=nofallback \ + --force-fallback-for=syn,paste,rustc-hash \ +&& ninja -C _build + diff --git a/tools/ci/amd64/clang/msan.supp b/tools/ci/amd64/clang/msan.supp new file mode 100644 index 0000000..05124f8 --- /dev/null +++ b/tools/ci/amd64/clang/msan.supp @@ -0,0 +1,3 @@ +src:* +obj:* +fun:* -- 2.45.3 From bcb1acbf755bdefc7e79e837e8df4a9e422534a0 Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 16 Oct 2025 14:46:14 +0330 Subject: [PATCH 2/7] wip --- .drone.yml | 290 ++++++++++++++++++++++++++--------------------------- 1 file changed, 145 insertions(+), 145 deletions(-) diff --git a/.drone.yml b/.drone.yml index 68cefa5..ddd6151 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,42 +1,42 @@ ---- -kind: pipeline -type: exec -name: amd64 — msvc -trigger: - branch: - - main -platform: - os: windows - arch: amd64 - -steps: -- name: unit tests - shell: powershell - commands: - - ./tools/ci/amd64/msvc/unit_tests.ps1 - ---- -kind: pipeline -type: docker -name: amd64 — gcc -trigger: - branch: - - main - -steps: -- name: unit tests - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/amd64/gcc/unit_tests.sh - -- name: valgrind - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/amd64/gcc/valgrind.sh - ---- +# --- +# kind: pipeline +# type: exec +# name: amd64 — msvc +# trigger: +# branch: +# - main +# platform: +# os: windows +# arch: amd64 +# +# steps: +# - name: unit tests +# shell: powershell +# commands: +# - ./tools/ci/amd64/msvc/unit_tests.ps1 +# +# --- +# kind: pipeline +# type: docker +# name: amd64 — gcc +# trigger: +# branch: +# - main +# +# steps: +# - name: unit tests +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/amd64/gcc/unit_tests.sh +# +# - name: valgrind +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/amd64/gcc/valgrind.sh +# +# --- kind: pipeline type: docker name: amd64 — clang @@ -45,114 +45,114 @@ trigger: - main steps: -- name: code coverage - image: ci:latest - pull: if-not-exists - environment: - CODECOV_TOKEN: - from_secret: CODECOV_TOKEN - commands: - - ./tools/ci/amd64/clang/coverage.sh - -- name: leak sanitizer - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/amd64/clang/lsan.sh - +# - name: code coverage +# image: ci:latest +# pull: if-not-exists +# environment: +# CODECOV_TOKEN: +# from_secret: CODECOV_TOKEN +# commands: +# - ./tools/ci/amd64/clang/coverage.sh +# +# - name: leak sanitizer +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/amd64/clang/lsan.sh +# - name: memory sanitizer image: ci:latest pull: if-not-exists commands: - ./tools/ci/amd64/clang/msan.sh - ---- -kind: pipeline -type: docker -name: static analysis -trigger: - branch: - - main - -steps: -- name: clang tidy - image: ci:latest - pull: if-not-exists - privileged: true - commands: - - ./tools/ci/static_analysis/clang_tidy.sh - -- name: shell check - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/static_analysis/shell_check.sh - -- name: clang format - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/static_analysis/clang_format.sh - -- name: cmake format - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/static_analysis/cmake_format.sh - -- name: shell format - image: ci:latest - pull: if-not-exists - commands: - - ./tools/ci/static_analysis/shell_format.sh - ---- -kind: pipeline -type: docker -name: documentation — development -node: - environment: ryali -trigger: - branch: - - main - -steps: -- name: build and deploy - image: documentation:latest - pull: if-not-exists - commands: - - pwd - - cd docs - - mkdir generated - - touch generated/changelogs.rst - - touch generated/api.rst - - sphinx-build -M html . . - - - rm -rf /light_docs_dev/* - - mv ./html/* /light_docs_dev/ - ---- - -kind: pipeline -type: docker -name: documentation — production -node: - environment: ryali -trigger: - event: - - tag - -steps: -- name: build and deploy - image: documentation:latest - pull: if-not-exists - commands: - - cd docs - - mkdir generated - - touch generated/changelogs.rst - - touch generated/api.rst - - sphinx-build -M html . . - - - rm -rf /light_docs/* - - mv ./html/* /light_docs/ - +# +# --- +# kind: pipeline +# type: docker +# name: static analysis +# trigger: +# branch: +# - main +# +# steps: +# - name: clang tidy +# image: ci:latest +# pull: if-not-exists +# privileged: true +# commands: +# - ./tools/ci/static_analysis/clang_tidy.sh +# +# - name: shell check +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/static_analysis/shell_check.sh +# +# - name: clang format +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/static_analysis/clang_format.sh +# +# - name: cmake format +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/static_analysis/cmake_format.sh +# +# - name: shell format +# image: ci:latest +# pull: if-not-exists +# commands: +# - ./tools/ci/static_analysis/shell_format.sh +# +# --- +# kind: pipeline +# type: docker +# name: documentation — development +# node: +# environment: ryali +# trigger: +# branch: +# - main +# +# steps: +# - name: build and deploy +# image: documentation:latest +# pull: if-not-exists +# commands: +# - pwd +# - cd docs +# - mkdir generated +# - touch generated/changelogs.rst +# - touch generated/api.rst +# - sphinx-build -M html . . +# +# - rm -rf /light_docs_dev/* +# - mv ./html/* /light_docs_dev/ +# +# --- +# +# kind: pipeline +# type: docker +# name: documentation — production +# node: +# environment: ryali +# trigger: +# event: +# - tag +# +# steps: +# - name: build and deploy +# image: documentation:latest +# pull: if-not-exists +# commands: +# - cd docs +# - mkdir generated +# - touch generated/changelogs.rst +# - touch generated/api.rst +# - sphinx-build -M html . . +# +# - rm -rf /light_docs/* +# - mv ./html/* /light_docs/ +# -- 2.45.3 From 2f7c729f88ce82bd430e0f640103a5752e8c4d26 Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 16 Oct 2025 14:52:32 +0330 Subject: [PATCH 3/7] wip --- tools/ci/amd64/clang/msan.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/ci/amd64/clang/msan.sh b/tools/ci/amd64/clang/msan.sh index 2bc47b2..4c01b7f 100755 --- a/tools/ci/amd64/clang/msan.sh +++ b/tools/ci/amd64/clang/msan.sh @@ -32,10 +32,12 @@ cmake \ -D CMAKE_EXE_LINKER_FLAGS=" \ -fsanitize=memory \ -fsanitize-memory-track-origins \ --L/libcxx_msan/lib \ +-g \ +-std=c++23 \ +-L/msan/lib -Wl,-rpath,/msan/lib \ +-L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \ -lc++ \ --lc++abi \ --Wl,-rpath,/libcxx_msan/lib" +-lc++abi" cmake --build ./build -j"$(nproc)" -- 2.45.3 From 5a922cac71de763e39c64880751e9bd00cb9845f Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 16 Oct 2025 14:55:49 +0330 Subject: [PATCH 4/7] wip --- tools/ci/amd64/clang/msan.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/ci/amd64/clang/msan.sh b/tools/ci/amd64/clang/msan.sh index 4c01b7f..7ea4eca 100755 --- a/tools/ci/amd64/clang/msan.sh +++ b/tools/ci/amd64/clang/msan.sh @@ -3,6 +3,8 @@ set -euo pipefail cd "$(git rev-parse --show-toplevel)/" +source '/1.4.328.1/setup-env.sh' + CC=$(which clang) export CC @@ -12,6 +14,9 @@ export CXX DISPLAY=:99 export DISPLAY +PKG_CONFIG_PATH="/msan/lib/pkgconfig:${PKG_CONFIG_PATH}" +export PKG_CONFIG_PATH + Xvfb :99 -screen 0 1024x768x16 & cmake \ -- 2.45.3 From 8c0dbdd52abfdb31bf5a51f09b7c27fb0eb294f8 Mon Sep 17 00:00:00 2001 From: light7734 Date: Thu, 16 Oct 2025 15:06:50 +0330 Subject: [PATCH 5/7] wip --- tools/ci/amd64/clang/msan.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/ci/amd64/clang/msan.sh b/tools/ci/amd64/clang/msan.sh index 7ea4eca..ec8c6d1 100755 --- a/tools/ci/amd64/clang/msan.sh +++ b/tools/ci/amd64/clang/msan.sh @@ -17,6 +17,9 @@ export DISPLAY PKG_CONFIG_PATH="/msan/lib/pkgconfig:${PKG_CONFIG_PATH}" export PKG_CONFIG_PATH +VK_ICD_FILENAMES='/usr/share/vulkan/icd.d/lvp_icd.x86_64.json' +export VK_ICD_FILENAMES + Xvfb :99 -screen 0 1024x768x16 & cmake \ -- 2.45.3 From 368ea7e1d0c0ef2e49be2c9143beb95e553d1cdd Mon Sep 17 00:00:00 2001 From: light7734 Date: Tue, 21 Oct 2025 13:14:28 +0330 Subject: [PATCH 6/7] refactor: remove msan specific code --- .../private/backend/vk/context/instance.cpp | 12 ++++++------ .../private/backend/vk/context/instance.hpp | 13 ++++++------- modules/surface/private/linux/system.cpp | 16 ++-------------- modules/surface/public/system.hpp | 9 +++------ 4 files changed, 17 insertions(+), 33 deletions(-) diff --git a/modules/renderer/private/backend/vk/context/instance.cpp b/modules/renderer/private/backend/vk/context/instance.cpp index 0f832c1..6ba6054 100644 --- a/modules/renderer/private/backend/vk/context/instance.cpp +++ b/modules/renderer/private/backend/vk/context/instance.cpp @@ -112,7 +112,7 @@ Instance::~Instance() unload_library(); } -__attribute__((no_sanitize("memory"))) void Instance::initialize_instance() +void Instance::initialize_instance() { auto app_info = VkApplicationInfo { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, @@ -231,7 +231,7 @@ __attribute__((no_sanitize("memory"))) void Instance::initialize_instance() ensure(m_instance, "Failed to create vulkan instance"); } -__attribute__((no_sanitize("memory"))) void Instance::load_library() +void Instance::load_library() { constexpr auto runtime_loader_flags = RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE; library = dlopen("libvulkan.so.1", runtime_loader_flags); @@ -248,7 +248,7 @@ __attribute__((no_sanitize("memory"))) void Instance::load_library() ensure(vk_get_instance_proc_address, "Failed to load vulkan function: vkGetInstanceProcAddr"); } -__attribute__((no_sanitize("memory"))) void Instance::unload_library() +void Instance::unload_library() { if (!library) { @@ -263,7 +263,7 @@ __attribute__((no_sanitize("memory"))) void Instance::unload_library() // library = nullptr; } -__attribute__((no_sanitize("memory"))) void Instance::load_global_functions() +void Instance::load_global_functions() { constexpr auto load_fn = [](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -277,7 +277,7 @@ __attribute__((no_sanitize("memory"))) void Instance::load_global_functions() load_fn(vk_enumerate_instance_layer_properties, "vkEnumerateInstanceLayerProperties"); } -__attribute__((no_sanitize("memory"))) void Instance::load_instance_functions() +void Instance::load_instance_functions() { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -321,7 +321,7 @@ __attribute__((no_sanitize("memory"))) void Instance::load_instance_functions() load_fn(vk_destroy_surface_khr, "vkDestroySurfaceKHR"); } -__attribute__((no_sanitize("memory"))) void Instance::load_device_functions_impl(VkDevice device) +void Instance::load_device_functions_impl(VkDevice device) { const auto load_fn = [&](T &pfn, const char *fn_name) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) diff --git a/modules/renderer/private/backend/vk/context/instance.hpp b/modules/renderer/private/backend/vk/context/instance.hpp index 0e86da2..05e7a76 100644 --- a/modules/renderer/private/backend/vk/context/instance.hpp +++ b/modules/renderer/private/backend/vk/context/instance.hpp @@ -64,18 +64,17 @@ private: Instance(); - __attribute__((no_sanitize("memory"))) void initialize_instance(); + void initialize_instance(); - __attribute__((no_sanitize("memory"))) void load_library(); + void load_library(); - __attribute__((no_sanitize("memory"))) void unload_library(); + void unload_library(); - __attribute__((no_sanitize("memory"))) void load_global_functions(); + void load_global_functions(); - __attribute__((no_sanitize("memory"))) void load_instance_functions(); - - __attribute__((no_sanitize("memory"))) void load_device_functions_impl(VkDevice device); + void load_instance_functions(); + void load_device_functions_impl(VkDevice device); VkInstance m_instance = VK_NULL_HANDLE; VkAllocationCallbacks *m_allocator = nullptr; diff --git a/modules/surface/private/linux/system.cpp b/modules/surface/private/linux/system.cpp index b98ec6e..ac310b6 100644 --- a/modules/surface/private/linux/system.cpp +++ b/modules/surface/private/linux/system.cpp @@ -12,7 +12,6 @@ #include // -#include namespace lt::surface { @@ -105,10 +104,7 @@ void System::on_unregister() { } -__attribute__((no_sanitize_memory)) void System::create_surface_component( - ecs::EntityId entity, - SurfaceComponent::CreateInfo info -) +void System::create_surface_component(ecs::EntityId entity, SurfaceComponent::CreateInfo info) try { auto &component = m_registry->add(entity, info); @@ -171,11 +167,6 @@ try auto hints = std::array { 2, 0, 0, 0, 0 }; const auto motif_hints = XInternAtom(display, "_MOTIF_WM_HINTS", False); -#if defined(__clang__) && __has_feature(memory_sanitizer) - auto bytes = (size_t)(1u) * (size_t)hints.size(); - __msan_unpoison((void *)hints.data(), bytes); -#endif - XChangeProperty( display, surface.m_native_data.window, @@ -344,10 +335,7 @@ void System::modify_title(SurfaceComponent &surface, const ModifyTitleRequest &r XStoreName(display, window, request.title.c_str()); } -__attribute__((no_sanitize("memory"))) void System::modify_resolution( - SurfaceComponent &surface, - const ModifyResolutionRequest &request -) +void System::modify_resolution(SurfaceComponent &surface, const ModifyResolutionRequest &request) { // surface.m_resolution = request.resolution; diff --git a/modules/surface/public/system.hpp b/modules/surface/public/system.hpp index 6993d49..24e36e9 100644 --- a/modules/surface/public/system.hpp +++ b/modules/surface/public/system.hpp @@ -27,10 +27,7 @@ public: void on_unregister() override; - __attribute__((no_sanitize("memory"))) void create_surface_component( - ecs::EntityId entity, - SurfaceComponent::CreateInfo info - ); + void create_surface_component(ecs::EntityId entity, SurfaceComponent::CreateInfo info); void tick(app::TickInfo tick) override; @@ -48,12 +45,12 @@ private: void modify_title(struct SurfaceComponent &surface, const struct ModifyTitleRequest &request); - __attribute__((no_sanitize("memory"))) void modify_resolution( + void modify_resolution( struct SurfaceComponent &surface, const struct ModifyResolutionRequest &request ); - __attribute__((no_sanitize("memory"))) void modify_position( + void modify_position( struct SurfaceComponent &surface, const struct ModifyPositionRequest &request ); -- 2.45.3 From f9b1ac8c846ad36d6a8b786a760cab9b49b36f16 Mon Sep 17 00:00:00 2001 From: light7734 Date: Tue, 21 Oct 2025 13:19:20 +0330 Subject: [PATCH 7/7] wip --- tools/ci/amd64/Dockerfile | 250 ++++++++++++++++++++++++++++++-------- 1 file changed, 198 insertions(+), 52 deletions(-) diff --git a/tools/ci/amd64/Dockerfile b/tools/ci/amd64/Dockerfile index 1646e8f..70c3922 100644 --- a/tools/ci/amd64/Dockerfile +++ b/tools/ci/amd64/Dockerfile @@ -100,6 +100,15 @@ git clone \ --depth=1 \ https://github.com/llvm/llvm-project.git +RUN git clone \ + --branch='25.2'\ + --depth=1 \ + https://gitlab.freedesktop.org/mesa/mesa.git + +RUN wget https://x.org/releases/individual/lib/libxcb-1.17.0.tar.xz +RUN wget https://x.org/releases/individual/lib/libX11-1.8.12.tar.xz +RUN wget 'https://sdk.lunarg.com/sdk/download/1.4.328.1/linux/vulkansdk-linux-x86_64-1.4.328.1.tar.xz' + RUN cd llvm-project/ \ \ && cmake \ @@ -118,6 +127,7 @@ RUN cd llvm-project/ \ -D LIBCXX_INSTALL_MODULES=ON \ -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \ -D LLVM_USE_SANITIZER=Leaks \ + -D LLVM_USE_LINKER="MOLD" \ && cd ./build-lsan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../ \ \ && cmake \ @@ -136,12 +146,15 @@ RUN cd llvm-project/ \ -D LIBCXX_INSTALL_MODULES=ON \ -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \ -D LLVM_USE_SANITIZER=MemoryWithOrigins \ + -D LLVM_USE_LINKER="MOLD" \ && cd ./build-msan/ && ninja cxx cxxabi && ninja install-cxx install-cxxabi && cd ../ +RUN cd llvm-project/ + + ## libxcb ## RUN \ -wget https://x.org/releases/individual/lib/libxcb-1.17.0.tar.xz \ -&& tar xf libxcb-1.17.0.tar.xz \ +tar xf libxcb-1.17.0.tar.xz \ && cd libxcb-1.17.0 \ && export CC=clang \ && export CFLAGS=" \ @@ -167,8 +180,7 @@ wget https://x.org/releases/individual/lib/libxcb-1.17.0.tar.xz \ ## libx11 ## RUN \ -wget https://x.org/releases/individual/lib/libX11-1.8.12.tar.xz \ -&& tar xf libX11-1.8.12.tar.xz \ +tar xf libX11-1.8.12.tar.xz \ && cd libX11-1.8.12 \ && export CC=clang \ && export CFLAGS=" \ @@ -192,12 +204,12 @@ wget https://x.org/releases/individual/lib/libX11-1.8.12.tar.xz \ && make && make install \ && cd .. && rm -rf libX11-1.8.12 libX11-1.8.12.tar.xz -RUN wget 'https://sdk.lunarg.com/sdk/download/1.4.328.1/linux/vulkansdk-linux-x86_64-1.4.328.1.tar.xz' -RUN tar xf vulkansdk-linux-x86_64-1.4.328.1.tar.xz + ## Vulkan SDK ## RUN \ -cd /1.4.328.1 \ +tar xf 'vulkansdk-linux-x86_64-1.4.328.1.tar.xz' \ +&& cd /1.4.328.1 \ && chmod +x ./vulkansdk \ && chmod +x ./setup-env.sh \ && export CC="$(which clang)" \ @@ -228,23 +240,39 @@ cd /1.4.328.1 \ -lc++abi" \ && ./vulkansdk \ --debug \ + --skip-installing-deps \ --numjobs `nproc` \ - vulkan-loader + vulkan-loader \ + spirv-tools ## Mesa ## -RUN git clone \ - --branch='25.2'\ - --depth=1 \ - https://gitlab.freedesktop.org/mesa/mesa.git + + RUN \ -export CXX=$(which clang++) \ -&& export CC=$(which clang) \ -&& export CXXFLAGS="\ +export build_llvm=/build-llvm \ +&& export build_path=/b_llvm_normal \ +&& export repo=/llvm-project \ +\ +&& cmake \ + -S $repo/llvm \ + -G Ninja \ + -B $build_path \ + -D CMAKE_BUILD_TYPE=Release \ + -D LLVM_ENABLE_PROJECTS="clang;lld;compiler-rt" \ + -D CMAKE_C_COMPILER=$(which clang) \ + -D CMAKE_CXX_COMPILER=$(which clang++) \ + -D CMAKE_INSTALL_PREFIX=/opt/llvm-normal \ +&& ninja -C $build_path install + +RUN \ +export CXXFLAGS="\ -fsanitize=memory \ -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ -fno-omit-frame-pointer \ -g \ + -std=c++23 \ -nostdinc++ \ -isystem /libcxx_msan/include/c++/v1/"\ && export CFLAGS="\ @@ -255,47 +283,165 @@ export CXX=$(which clang++) \ && export LDFLAGS="\ -fsanitize=memory \ -fsanitize-memory-track-origins \ + -fsanitize-ignorelist=/msan/ignorelist_all_sources \ -g \ + -std=c++23 \ -L/msan/lib -Wl,-rpath,/msan/lib \ -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \ -lc++ \ -lc++abi" \ -&& meson setup ./ _build \ - -D build-tests=false \ - -D enable-glcpp-tests=false \ - -D build-radv-tests=false \ - -D build-aco-tests=false \ - -D install-intel-gpu-tests=false \ - -D gallium-mediafoundation-test=false \ - -D android-libbacktrace=disabled \ - -D split-debug=disabled \ - -D b_ndebug=true \ - -D b_lto=false \ - -D egl=enabled \ - -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \ - -D gallium-extra-hud=true \ - -D gallium-rusticl=true \ - -D gallium-va=enabled \ - -D gbm=enabled \ - -D gles1=disabled \ - -D gles2=enabled \ - -D glvnd=enabled \ - -D glx=dri \ - -D libunwind=enabled \ - -D llvm=enabled \ - -D lmsensors=disabled \ - -D microsoft-clc=disabled \ - -D platforms=x11,wayland \ - -D valgrind=disabled \ - -D video-codecs=all \ - -D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \ - -D vulkan-layers=device-select,intel-nullhw,overlay \ - -D tools='' \ - -D zstd=enabled \ - -D buildtype=plain \ - -D prefix=/usr \ - -D sysconfdir=/etc \ - --wrap-mode=nofallback \ - --force-fallback-for=syn,paste,rustc-hash \ +&& export build_path=/b_llvm_msan \ +&& export repo=/llvm-project \ +\ +&& cmake \ + -S $repo/llvm \ + -G Ninja \ + -B $build_path \ + -D CMAKE_BUILD_TYPE=Release \ + -D LLVM_ENABLE_PROJECTS="clang;lld" \ + -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \ + -D LLVM_ENABLE_PIC=ON \ + -D LLVM_NATIVE_TOOL_DIR=/opt/llvm-normal/bin/ \ + -D LLVM_USE_SANITIZER=MemoryWithOrigins \ + -D LLVM_TABLEGEN=/opt/llvm-normal/bin/llvm-tblgen \ + -D LLVM_CONFIG_PATH=/opt/llvm-normal/bin/llvm-config \ + -D CMAKE_C_COMPILER=/opt/llvm-normal/bin/clang \ + -D CMAKE_CXX_COMPILER=/opt/llvm-normal/bin/clang++ \ + -D CMAKE_INSTALL_PREFIX=/opt/llvm-msan \ +&& ninja -C $build_path install + +# && cmake \ +# -G Ninja \ +# -S $llvm/llvm \ +# -B $build_llvm \ +# -D LLVM_INSTALL_UTILS=ON \ +# -D CMAKE_INSTALL_PREFIX=$installprefix \ +# -D CMAKE_BUILD_TYPE=Release \ +# -D LLVM_TARGETS_TO_BUILD="X86;SPIRV" \ +# -D CMAKE_C_COMPILER=$(which clang) \ +# -D CMAKE_CXX_COMPILER=$(which clang++) \ +# \ +# -D LLVM_USE_SANITIZER=MemoryWithOrigins \ +# -D LIBCXXABI_USE_LLVM_UNWINDER=OFF \ +# \ +# && ninja -C $build_llvm install +# +# && cmake \ +# -G Ninja \ +# -S $llvm/clang \ +# -B $build_clang \ +# -D LLVM_EXTERNAL_LIT=$build_llvm/utils/lit \ +# -D LLVM_ROOT=$installprefix \ +# \ +# && ninja -C $build_clang + +RUN \ +cd /mesa \ +&& export CXX='clang++' \ +&& export CC='clang' \ +&& export CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g" \ +&& export CXXFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -nostdinc++ -isystem /libcxx_msan/include/c++/v1/" \ +&& export LDFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -g -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib -L/msan/lib -Wl,-rpath,/msan/lib -lc++ -lc++abi" \ +&& export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" \ +&& meson setup ./ _build \ + -D build-tests=false \ + -D enable-glcpp-tests=false \ + -D build-radv-tests=false \ + -D build-aco-tests=false \ + -D install-intel-gpu-tests=false \ + -D gallium-mediafoundation-test=false \ + -D android-libbacktrace=disabled \ + -D split-debug=disabled \ + -D b_ndebug=true \ + -D b_lto=false \ + -D egl=enabled \ + -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \ + -D gallium-extra-hud=true \ + -D gallium-rusticl=true \ + -D gallium-va=enabled \ + -D gbm=enabled \ + -D gles1=disabled \ + -D gles2=enabled \ + -D glvnd=enabled \ + -D glx=dri \ + -D libunwind=enabled \ + -D llvm=enabled \ + -D lmsensors=disabled \ + -D microsoft-clc=disabled \ + -D platforms=x11,wayland \ + -D valgrind=disabled \ + -D video-codecs=all \ + -D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \ + -D vulkan-layers=device-select,intel-nullhw,overlay \ + -D tools='' \ + -D zstd=enabled \ + -D buildtype=plain \ + -D prefix=/usr \ + -D sysconfdir=/etc \ + --wrap-mode=nofallback \ + --force-fallback-for=syn,paste,rustc-hash \ && ninja -C _build +# RUN cd mesa/ \ +# && source '/1.4.328.1/setup-env.sh' \ +# && export CXX='clang++' \ +# && export CC='clang' \ +# && export CFLAGS="\ +# -fsanitize=memory \ +# -fsanitize-memory-track-origins \ +# -fno-omit-frame-pointer \ +# -g" \ +# && export CXXFLAGS="\ +# -fsanitize=memory \ +# -fsanitize-memory-track-origins \ +# -fno-omit-frame-pointer \ +# -g \ +# -nostdinc++ \ +# -isystem /libcxx_msan/include/c++/v1/"\ +# && export LDFLAGS="\ +# -fsanitize=memory \ +# -fsanitize-memory-track-origins \ +# -g \ +# -L/libcxx_msan/lib -Wl,-rpath,/libcxx_msan/lib \ +# -L/msan/lib -Wl,-rpath,/msan/lib \ +# -lc++ \ +# -lc++abi" \ +# && meson setup ./ _build \ +# -D build-tests=false \ +# -D enable-glcpp-tests=false \ +# -D build-radv-tests=false \ +# -D build-aco-tests=false \ +# -D install-intel-gpu-tests=false \ +# -D gallium-mediafoundation-test=false \ +# -D android-libbacktrace=disabled \ +# -D split-debug=disabled \ +# -D b_ndebug=true \ +# -D b_lto=false \ +# -D egl=enabled \ +# -D gallium-drivers=r300,r600,radeonsi,nouveau,virgl,svga,softpipe,llvmpipe,i915,iris,crocus,zink \ +# -D gallium-extra-hud=true \ +# -D gallium-rusticl=true \ +# -D gallium-va=enabled \ +# -D gbm=enabled \ +# -D gles1=disabled \ +# -D gles2=enabled \ +# -D glvnd=enabled \ +# -D glx=dri \ +# -D libunwind=enabled \ +# -D llvm=enabled \ +# -D lmsensors=disabled \ +# -D microsoft-clc=disabled \ +# -D platforms=x11,wayland \ +# -D valgrind=disabled \ +# -D video-codecs=all \ +# -D vulkan-drivers=amd,intel,intel_hasvk,swrast,virtio,nouveau \ +# -D vulkan-layers=device-select,intel-nullhw,overlay \ +# -D tools='' \ +# -D zstd=enabled \ +# -D buildtype=plain \ +# -D prefix=/usr \ +# -D sysconfdir=/etc \ +# --wrap-mode=nofallback \ +# --force-fallback-for=syn,paste,rustc-hash \ +# && ninja -C _build +# -- 2.45.3