Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package llvm21 for openSUSE:Factory checked in at 2025-10-27 14:38:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/llvm21 (Old) and /work/SRC/openSUSE:Factory/.llvm21.new.1980 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "llvm21" Mon Oct 27 14:38:35 2025 rev:5 rq:1313505 version:21.1.4 Changes: -------- --- /work/SRC/openSUSE:Factory/llvm21/llvm21.changes 2025-10-13 15:34:12.510386259 +0200 +++ /work/SRC/openSUSE:Factory/.llvm21.new.1980/llvm21.changes 2025-10-27 14:39:30.318041548 +0100 @@ -1,0 +2,14 @@ +Fri Oct 24 14:22:12 UTC 2025 - Aaron Puchert <[email protected]> + +- Update to version 21.1.4. + * This release contains bug-fixes for the LLVM 21.1.0 release. + This release is API and ABI compatible with 21.1.0. +- Simplify script for building documentation. +- Use %ldconfig_scriptlets to automatically generate post + scriptlets. This doesn't work with %{multisource} in Leap 15.6 + though, so we leave a fallback for that. +- Drop post scriptlets for gold and polly, which provide only + plugin libraries that ldconfig doesn't care about. +- Rebase llvm-do-not-install-static-libraries.patch. + +------------------------------------------------------------------- Old: ---- clang-21.1.3.src.tar.xz clang-21.1.3.src.tar.xz.sig clang-docs-21.1.3.src.tar.xz clang-tools-extra-21.1.3.src.tar.xz clang-tools-extra-21.1.3.src.tar.xz.sig cmake-21.1.3.src.tar.xz cmake-21.1.3.src.tar.xz.sig compiler-rt-21.1.3.src.tar.xz compiler-rt-21.1.3.src.tar.xz.sig libc-21.1.3.src.tar.xz libcxx-21.1.3.src.tar.xz libcxx-21.1.3.src.tar.xz.sig libcxxabi-21.1.3.src.tar.xz libcxxabi-21.1.3.src.tar.xz.sig lld-21.1.3.src.tar.xz lld-21.1.3.src.tar.xz.sig lldb-21.1.3.src.tar.xz lldb-21.1.3.src.tar.xz.sig llvm-21.1.3.src.tar.xz llvm-21.1.3.src.tar.xz.sig llvm-docs-21.1.3.src.tar.xz openmp-21.1.3.src.tar.xz openmp-21.1.3.src.tar.xz.sig polly-21.1.3.src.tar.xz polly-21.1.3.src.tar.xz.sig runtimes-21.1.3.src.tar.xz runtimes-21.1.3.src.tar.xz.sig third-party-21.1.3.src.tar.xz third-party-21.1.3.src.tar.xz.sig New: ---- clang-21.1.4.src.tar.xz clang-21.1.4.src.tar.xz.sig clang-docs-21.1.4.src.tar.xz clang-tools-extra-21.1.4.src.tar.xz clang-tools-extra-21.1.4.src.tar.xz.sig cmake-21.1.4.src.tar.xz cmake-21.1.4.src.tar.xz.sig compiler-rt-21.1.4.src.tar.xz compiler-rt-21.1.4.src.tar.xz.sig libc-21.1.4.src.tar.xz libcxx-21.1.4.src.tar.xz libcxx-21.1.4.src.tar.xz.sig libcxxabi-21.1.4.src.tar.xz libcxxabi-21.1.4.src.tar.xz.sig lld-21.1.4.src.tar.xz lld-21.1.4.src.tar.xz.sig lldb-21.1.4.src.tar.xz lldb-21.1.4.src.tar.xz.sig llvm-21.1.4.src.tar.xz llvm-21.1.4.src.tar.xz.sig llvm-docs-21.1.4.src.tar.xz openmp-21.1.4.src.tar.xz openmp-21.1.4.src.tar.xz.sig polly-21.1.4.src.tar.xz polly-21.1.4.src.tar.xz.sig runtimes-21.1.4.src.tar.xz runtimes-21.1.4.src.tar.xz.sig third-party-21.1.4.src.tar.xz third-party-21.1.4.src.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ llvm21.spec ++++++ --- /var/tmp/diff_new_pack.DNSTIp/_old 2025-10-27 14:39:33.538177525 +0100 +++ /var/tmp/diff_new_pack.DNSTIp/_new 2025-10-27 14:39:33.542177694 +0100 @@ -19,7 +19,7 @@ %global _sonum 21 %global _minor %{_sonum}.1 %global _soname %{_minor}%{?_rc:-rc%_rc} -%global _patch_level 3 +%global _patch_level 4 %global _relver %{_minor}.%{_patch_level} %global _version %_relver%{?_rc:-rc%_rc} %global _itsme21 1 @@ -1200,12 +1200,10 @@ # tar xf ../../clang-%{_version}.src.tar.xz # mv clang-%{_version}.src clang # cd .. -# ln -s ../../../build/tools/clang/docs/{Attribute,Diagnostics}Reference.rst tools/clang/docs # mkdir build; cd build # cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_SPHINX:BOOL=ON -DLLVM_BUILD_DOCS:BOOL=ON \ # -DSPHINX_WARNINGS_AS_ERRORS:BOOL=OFF -DLLVM_INCLUDE_TESTS:BOOL=OFF -DLLVM_INCLUDE_BENCHMARKS:BOOL=OFF .. -# ninja gen-{Attribute,Diagnostics}Reference.rst -# ninja -j1 docs-{llvm,clang}-{html,man} +# ninja docs-{llvm,clang}-{html,man} # popd # tar --sort=name --owner=0 --group=0 --mtime="@${SOURCE_DATE_EPOCH}" \ # --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \ @@ -1508,33 +1506,34 @@ # creating the final RPMs. rm -rf ./stage1 ./build -%post -n libLLVM%{_sonum} -p /sbin/ldconfig -%postun -n libLLVM%{_sonum} -p /sbin/ldconfig +%ldconfig_scriptlets -n libLLVM%{_sonum} +%if %{?suse_version} >= 1600 +%ldconfig_scriptlets %{multisource libclang%{_soclang}} libclang%{_soclang} +%else %post %{multisource libclang%{_soclang}} libclang%{_soclang} -p /sbin/ldconfig %postun %{multisource libclang%{_soclang}} libclang%{_soclang} -p /sbin/ldconfig -%post -n libclang-cpp%{_sonum} -p /sbin/ldconfig -%postun -n libclang-cpp%{_sonum} -p /sbin/ldconfig -%post -n libLTO%{_sonum} -p /sbin/ldconfig -%postun -n libLTO%{_sonum} -p /sbin/ldconfig -%post -n clang%{_sonum}-devel -p /sbin/ldconfig -%postun -n clang%{_sonum}-devel -p /sbin/ldconfig +%endif +%ldconfig_scriptlets -n libclang-cpp%{_sonum} +%ldconfig_scriptlets -n libLTO%{_sonum} +%ldconfig_scriptlets -n clang%{_sonum}-devel %if %{with lldb} -%post -n liblldb%{_sonum} -p /sbin/ldconfig -%postun -n liblldb%{_sonum} -p /sbin/ldconfig +%ldconfig_scriptlets -n liblldb%{_sonum} %endif -%post gold -p /sbin/ldconfig -%postun gold -p /sbin/ldconfig -%post devel -p /sbin/ldconfig -%postun devel -p /sbin/ldconfig +%ldconfig_scriptlets devel %if %{with openmp} -%post -n libomp%{_sonum}-devel -p /sbin/ldconfig -%postun -n libomp%{_sonum}-devel -p /sbin/ldconfig +%ldconfig_scriptlets -n libomp%{_sonum}-devel %endif %if %{with libcxx} +%if %{?suse_version} >= 1600 +%ldconfig_scriptlets %{multisource libcxx%{_socxx}} libc++%{_socxx} +%ldconfig_scriptlets %{multisource libcxxabi%{_socxx}} libc++abi%{_socxx} +%ldconfig_scriptlets %{multisource libcxx_devel} libc++-devel +%ldconfig_scriptlets %{multisource libcxx_devel} libc++abi-devel +%else %post %{multisource libcxx%{_socxx}} libc++%{_socxx} -p /sbin/ldconfig %postun %{multisource libcxx%{_socxx}} libc++%{_socxx} -p /sbin/ldconfig %post %{multisource libcxxabi%{_socxx}} libc++abi%{_socxx} -p /sbin/ldconfig @@ -1544,12 +1543,6 @@ %post %{multisource libcxx_devel} libc++abi-devel -p /sbin/ldconfig %postun %{multisource libcxx_devel} libc++abi-devel -p /sbin/ldconfig %endif - -%if %{with polly} -%post polly -p /sbin/ldconfig -%postun polly -p /sbin/ldconfig -%post polly-devel -p /sbin/ldconfig -%postun polly-devel -p /sbin/ldconfig %endif %global ua_install() %{_sbindir}/update-alternatives \\\ ++++++ clang-21.1.3.src.tar.xz -> clang-21.1.4.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm21/clang-21.1.3.src.tar.xz /work/SRC/openSUSE:Factory/.llvm21.new.1980/clang-21.1.4.src.tar.xz differ: char 15, line 1 ++++++ clang-docs-21.1.3.src.tar.xz -> clang-docs-21.1.4.src.tar.xz ++++++ ++++ 8484 lines of diff (skipped) ++++++ clang-tools-extra-21.1.3.src.tar.xz -> clang-tools-extra-21.1.4.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-21.1.3.src/clangd/ClangdLSPServer.cpp new/clang-tools-extra-21.1.4.src/clangd/ClangdLSPServer.cpp --- old/clang-tools-extra-21.1.3.src/clangd/ClangdLSPServer.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/clang-tools-extra-21.1.4.src/clangd/ClangdLSPServer.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -81,7 +81,7 @@ const URIForFile &File) { CodeAction CA; CA.title = R.FixMessage; - CA.kind = std::string(CodeAction::REFACTOR_KIND); + CA.kind = std::string(CodeAction::QUICKFIX_KIND); CA.command.emplace(); CA.command->title = R.FixMessage; CA.command->command = std::string(ApplyRenameCommand); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/clang-tools-extra-21.1.3.src/clangd/unittests/ClangdLSPServerTests.cpp new/clang-tools-extra-21.1.4.src/clangd/unittests/ClangdLSPServerTests.cpp --- old/clang-tools-extra-21.1.3.src/clangd/unittests/ClangdLSPServerTests.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/clang-tools-extra-21.1.4.src/clangd/unittests/ClangdLSPServerTests.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -235,7 +235,8 @@ .takeValue() .getAsArray())[0]; - ASSERT_EQ((*RenameCommand.getAsObject())["title"], "change 'foo' to 'Foo'"); + ASSERT_EQ((*RenameCommand.getAsObject())["title"], + "Apply fix: change 'foo' to 'Foo'"); Client.expectServerCall("workspace/applyEdit"); Client.call("workspace/executeCommand", RenameCommand); ++++++ cmake-21.1.3.src.tar.xz -> cmake-21.1.4.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cmake-21.1.3.src/Modules/LLVMVersion.cmake new/cmake-21.1.4.src/Modules/LLVMVersion.cmake --- old/cmake-21.1.3.src/Modules/LLVMVersion.cmake 2025-10-07 14:53:22.000000000 +0200 +++ new/cmake-21.1.4.src/Modules/LLVMVersion.cmake 2025-10-21 10:14:55.000000000 +0200 @@ -7,7 +7,7 @@ set(LLVM_VERSION_MINOR 1) endif() if(NOT DEFINED LLVM_VERSION_PATCH) - set(LLVM_VERSION_PATCH 3) + set(LLVM_VERSION_PATCH 4) endif() if(NOT DEFINED LLVM_VERSION_SUFFIX) set(LLVM_VERSION_SUFFIX) ++++++ compiler-rt-21.1.3.src.tar.xz -> compiler-rt-21.1.4.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/lib/gwp_asan/tests/basic.cpp new/compiler-rt-21.1.4.src/lib/gwp_asan/tests/basic.cpp --- old/compiler-rt-21.1.3.src/lib/gwp_asan/tests/basic.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/lib/gwp_asan/tests/basic.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -65,11 +65,12 @@ // Added multi-page slots? You'll need to expand this test. TEST_F(DefaultGuardedPoolAllocator, TooBigForSinglePageSlots) { - EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0)); - EXPECT_EQ(nullptr, GPA.allocate(0x1001, 1)); - EXPECT_EQ(nullptr, GPA.allocate(0x1001, 0x1000)); - EXPECT_EQ(nullptr, GPA.allocate(1, 0x2000)); - EXPECT_EQ(nullptr, GPA.allocate(0, 0x2000)); + size_t PageSize = sysconf(_SC_PAGESIZE); + EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, 0)); + EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, 1)); + EXPECT_EQ(nullptr, GPA.allocate(PageSize + 1, PageSize)); + EXPECT_EQ(nullptr, GPA.allocate(1, 2 * PageSize)); + EXPECT_EQ(nullptr, GPA.allocate(0, 2 * PageSize)); } TEST_F(CustomGuardedPoolAllocator, AllocAllSlots) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/lib/gwp_asan/tests/never_allocated.cpp new/compiler-rt-21.1.4.src/lib/gwp_asan/tests/never_allocated.cpp --- old/compiler-rt-21.1.3.src/lib/gwp_asan/tests/never_allocated.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/lib/gwp_asan/tests/never_allocated.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -13,8 +13,10 @@ #include "gwp_asan/tests/harness.h" TEST_P(BacktraceGuardedPoolAllocatorDeathTest, NeverAllocated) { + size_t PageSize = sysconf(_SC_PAGESIZE); + SCOPED_TRACE(""); - void *Ptr = GPA.allocate(0x1000); + void *Ptr = GPA.allocate(PageSize); GPA.deallocate(Ptr); std::string DeathNeedle = @@ -23,7 +25,7 @@ // Trigger a guard page in a completely different slot that's never allocated. // Previously, there was a bug that this would result in nullptr-dereference // in the posix crash handler. - char *volatile NeverAllocatedPtr = static_cast<char *>(Ptr) + 0x3000; + char *volatile NeverAllocatedPtr = static_cast<char *>(Ptr) + 3 * PageSize; if (!Recoverable) { EXPECT_DEATH(*NeverAllocatedPtr = 0, DeathNeedle); return; @@ -37,8 +39,8 @@ GetOutputBuffer().clear(); for (size_t i = 0; i < 100; ++i) { *NeverAllocatedPtr = 0; - *(NeverAllocatedPtr + 0x2000) = 0; - *(NeverAllocatedPtr + 0x3000) = 0; + *(NeverAllocatedPtr + 2 * PageSize) = 0; + *(NeverAllocatedPtr + 3 * PageSize) = 0; ASSERT_TRUE(GetOutputBuffer().empty()); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/asan/TestCases/Linux/release_to_os_test.cpp new/compiler-rt-21.1.4.src/test/asan/TestCases/Linux/release_to_os_test.cpp --- old/compiler-rt-21.1.3.src/test/asan/TestCases/Linux/release_to_os_test.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/asan/TestCases/Linux/release_to_os_test.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -6,6 +6,7 @@ // RUN: %env_asan_opts=allocator_release_to_os_interval_ms=-1 %run %t force 2>&1 | FileCheck %s --check-prefix=FORCE_RELEASE // REQUIRES: x86_64-target-arch +// REQUIRES: page-size-4096 #include <algorithm> #include <assert.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/cfi/cross-dso/lit.local.cfg.py new/compiler-rt-21.1.4.src/test/cfi/cross-dso/lit.local.cfg.py --- old/compiler-rt-21.1.3.src/test/cfi/cross-dso/lit.local.cfg.py 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/cfi/cross-dso/lit.local.cfg.py 2025-10-21 10:14:55.000000000 +0200 @@ -12,3 +12,7 @@ # Android O (API level 26) has support for cross-dso cfi in libdl.so. if config.android and "android-26" not in config.available_features: config.unsupported = True + +# The runtime library only supports 4K pages. +if "page-size-4096" not in config.available_features: + config.unsupported = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/dfsan/atomic.cpp new/compiler-rt-21.1.4.src/test/dfsan/atomic.cpp --- old/compiler-rt-21.1.3.src/test/dfsan/atomic.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/dfsan/atomic.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -1,9 +1,12 @@ -// RUN: %clangxx_dfsan %s -fno-exceptions -o %t && %run %t -// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -fno-exceptions -o %t && %run %t +// RUN: %clangxx_dfsan %s -fno-exceptions -D_GLIBCXX_NO_ASSERTIONS -o %t && %run %t +// RUN: %clangxx_dfsan -DORIGIN_TRACKING -mllvm -dfsan-track-origins=1 %s -fno-exceptions -D_GLIBCXX_NO_ASSERTIONS -o %t && %run %t // // Use -fno-exceptions to turn off exceptions to avoid instrumenting // __cxa_begin_catch, std::terminate and __gxx_personality_v0. // +// Use -D_GLIBCXX_NO_ASSERTIONS to avoid depending on +// std::__glibcxx_assert_fail with gcc >= 15. +// // TODO: Support builtin atomics. For example, https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html // DFSan instrumentation pass cannot identify builtin callsites yet. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/lit.common.cfg.py new/compiler-rt-21.1.4.src/test/lit.common.cfg.py --- old/compiler-rt-21.1.3.src/test/lit.common.cfg.py 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/lit.common.cfg.py 2025-10-21 10:14:55.000000000 +0200 @@ -965,6 +965,23 @@ else: config.available_features.add("memprof-shadow-scale-3") + +def target_page_size(): + try: + proc = subprocess.Popen( + f"{emulator or ''} python3", + shell=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + ) + out, err = proc.communicate(b'import os; print(os.sysconf("SC_PAGESIZE"))') + return int(out) + except: + return 4096 + + +config.available_features.add(f"page-size-{target_page_size()}") + if config.expensive_checks: config.available_features.add("expensive_checks") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/msan/dtls_test.c new/compiler-rt-21.1.4.src/test/msan/dtls_test.c --- old/compiler-rt-21.1.3.src/test/msan/dtls_test.c 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/msan/dtls_test.c 2025-10-21 10:14:55.000000000 +0200 @@ -11,6 +11,7 @@ // Reports use-of-uninitialized-value, not analyzed XFAIL: target={{.*netbsd.*}} + UNSUPPORTED: aarch64-target-arch */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp --- old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/odd_stack_size.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -1,4 +1,5 @@ // RUN: %clangxx -O1 %s -o %t && %run %t +// REQUIRES: page-size-4096 // UNSUPPORTED: android // Fail on powerpc64 bots with: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp --- old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/release_to_os_test.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -11,6 +11,9 @@ // FIXME: This mode uses 32bit allocator without purge. // UNSUPPORTED: hwasan-aliasing +// Page size is hardcoded below, but test still fails even if not hardcoded. +// REQUIRES: page-size-4096 + #include <algorithm> #include <assert.h> #include <fcntl.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp --- old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/resize_tls_dynamic.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -11,6 +11,9 @@ // FIXME: Investigate // UNSUPPORTED: target=powerpc64{{.*}} +// Fails because AArch64 uses TLSDESC instead of __tls_get_addr. +// UNSUPPORTED: aarch64-target-arch + #include <string.h> #ifndef BUILD_DSO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/tls_get_addr.c new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/tls_get_addr.c --- old/compiler-rt-21.1.3.src/test/sanitizer_common/TestCases/Linux/tls_get_addr.c 2025-10-07 14:53:22.000000000 +0200 +++ new/compiler-rt-21.1.4.src/test/sanitizer_common/TestCases/Linux/tls_get_addr.c 2025-10-21 10:14:55.000000000 +0200 @@ -13,6 +13,9 @@ // FIXME: Fails for unknown reasons. // UNSUPPORTED: powerpc64le-target-arch +// Fails because AArch64 uses TLSDESC instead of __tls_get_addr. +// UNSUPPORTED: aarch64-target-arch + #ifndef BUILD_SO # include <assert.h> # include <dlfcn.h> ++++++ libc-21.1.3.src.tar.xz -> libc-21.1.4.src.tar.xz ++++++ ++++++ libcxx-21.1.3.src.tar.xz -> libcxx-21.1.4.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/docs/ReleaseNotes/21.rst new/libcxx-21.1.4.src/docs/ReleaseNotes/21.rst --- old/libcxx-21.1.3.src/docs/ReleaseNotes/21.rst 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/docs/ReleaseNotes/21.rst 2025-10-21 10:14:55.000000000 +0200 @@ -53,6 +53,7 @@ - P2711R1: Making multi-param constructors of ``views`` ``explicit`` (`Github <https://github.com/llvm/llvm-project/issues/105252>`__) - P2770R0: Stashing stashing ``iterators`` for proper flattening (`Github <https://github.com/llvm/llvm-project/issues/105250>`__) - P2655R3: ``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type (`Github <https://github.com/llvm/llvm-project/issues/105260>`__) +- P3379R0: Constrain ``std::expected`` equality operators (`Github <https://github.com/llvm/llvm-project/issues/118135>`__) Improvements and New Features ----------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/include/__config new/libcxx-21.1.4.src/include/__config --- old/libcxx-21.1.3.src/include/__config 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/include/__config 2025-10-21 10:14:55.000000000 +0200 @@ -28,7 +28,7 @@ // _LIBCPP_VERSION represents the version of libc++, which matches the version of LLVM. // Given a LLVM release LLVM XX.YY.ZZ (e.g. LLVM 17.0.1 == 17.00.01), _LIBCPP_VERSION is // defined to XXYYZZ. -# define _LIBCPP_VERSION 210103 +# define _LIBCPP_VERSION 210104 # define _LIBCPP_CONCAT_IMPL(_X, _Y) _X##_Y # define _LIBCPP_CONCAT(_X, _Y) _LIBCPP_CONCAT_IMPL(_X, _Y) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/include/__configuration/abi.h new/libcxx-21.1.4.src/include/__configuration/abi.h --- old/libcxx-21.1.3.src/include/__configuration/abi.h 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/include/__configuration/abi.h 2025-10-21 10:14:55.000000000 +0200 @@ -30,8 +30,20 @@ #elif _LIBCPP_ABI_FORCE_MICROSOFT # define _LIBCPP_ABI_MICROSOFT #else +// Windows uses the Microsoft ABI # if defined(_WIN32) && defined(_MSC_VER) # define _LIBCPP_ABI_MICROSOFT + +// 32-bit ARM uses the Itanium ABI with a few differences (array cookies, etc), +// and so does 64-bit ARM on Apple platforms. +# elif defined(__arm__) || (defined(__APPLE__) && defined(__aarch64__)) +# define _LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES + +// Non-Apple 64-bit ARM uses the vanilla Itanium ABI +# elif defined(__aarch64__) +# define _LIBCPP_ABI_ITANIUM + +// We assume that other architectures also use the vanilla Itanium ABI too # else # define _LIBCPP_ABI_ITANIUM # endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/include/__memory/array_cookie.h new/libcxx-21.1.4.src/include/__memory/array_cookie.h --- old/libcxx-21.1.3.src/include/__memory/array_cookie.h 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/include/__memory/array_cookie.h 2025-10-21 10:14:55.000000000 +0200 @@ -13,6 +13,7 @@ #include <__config> #include <__configuration/abi.h> #include <__cstddef/size_t.h> +#include <__memory/addressof.h> #include <__type_traits/integral_constant.h> #include <__type_traits/is_trivially_destructible.h> #include <__type_traits/negation.h> @@ -26,14 +27,15 @@ // Trait representing whether a type requires an array cookie at the start of its allocation when // allocated as `new T[n]` and deallocated as `delete[] array`. // -// Under the Itanium C++ ABI [1], we know that an array cookie is available unless `T` is trivially -// destructible and the call to `operator delete[]` is not a sized operator delete. Under ABIs other -// than the Itanium ABI, we assume there are no array cookies. +// Under the Itanium C++ ABI [1] and the ARM ABI which derives from it, we know that an array cookie is available +// unless `T` is trivially destructible and the call to `operator delete[]` is not a sized operator delete. Under +// other ABIs, we assume there are no array cookies. // // [1]: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies -#ifdef _LIBCPP_ABI_ITANIUM +#if defined(_LIBCPP_ABI_ITANIUM) || defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES) // TODO: Use a builtin instead -// TODO: We should factor in the choice of the usual deallocation function in this determination. +// TODO: We should factor in the choice of the usual deallocation function in this determination: +// a cookie may be available in more cases but we ignore those for now. template <class _Tp> struct __has_array_cookie : _Not<is_trivially_destructible<_Tp> > {}; #else @@ -41,13 +43,79 @@ struct __has_array_cookie : false_type {}; #endif +struct __itanium_array_cookie { + size_t __element_count; +}; + +template <class _Tp> +struct [[__gnu__::__aligned__(_LIBCPP_ALIGNOF(_Tp))]] __arm_array_cookie { + size_t __element_size; + size_t __element_count; +}; + +// Return the element count in the array cookie located before the given pointer. +// +// In the Itanium ABI [1] +// ---------------------- +// The element count is stored immediately before the first element of the array. If the preferred alignment +// of array elements (which is different from the ABI alignment) is more than that of size_t, additional +// padding bytes exist before the array cookie. Assuming array elements of size and alignment 16 bytes, that +// gives us the following layout: +// +// |ooooooooxxxxxxxxaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd| +// ^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// | ^^^^^^^^ | +// | | array elements +// padding | +// element count +// +// +// In the Itanium ABI with ARM differences [2] +// ------------------------------------------- +// The array cookie is stored at the very start of the allocation and it has the following form: +// +// struct array_cookie { +// std::size_t element_size; // element_size != 0 +// std::size_t element_count; +// }; +// +// Assuming elements of size and alignment 32 bytes, this gives us the following layout: +// +// |xxxxxxxxXXXXXXXXooooooooooooooooaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb| +// ^^^^^^^^ ^^^^^^^^^^^^^^^^ +// | ^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// element size | padding | +// element count array elements +// +// We must be careful to take into account the alignment of the array cookie, which may result in padding +// bytes between the element count and the first element of the array. Note that for ARM, the compiler +// aligns the array cookie using the ABI alignment, not the preferred alignment of array elements. +// +// [1]: https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies +// [2]: https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Handle-C++-differences template <class _Tp> // Avoid failures when -fsanitize-address-poison-custom-array-cookie is enabled -_LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie(_Tp const* __ptr) { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_NO_SANITIZE("address") size_t __get_array_cookie([[__maybe_unused__]] _Tp const* __ptr) { static_assert( __has_array_cookie<_Tp>::value, "Trying to access the array cookie of a type that is not guaranteed to have one"); - size_t const* __cookie = reinterpret_cast<size_t const*>(__ptr) - 1; // TODO: Use a builtin instead - return *__cookie; + +#if defined(_LIBCPP_ABI_ITANIUM) + using _ArrayCookie = __itanium_array_cookie; +#elif defined(_LIBCPP_ABI_ITANIUM_WITH_ARM_DIFFERENCES) + using _ArrayCookie = __arm_array_cookie<_Tp>; +#else + static_assert(false, "The array cookie layout is unknown on this ABI"); + struct _ArrayCookie { // dummy definition required to make the function parse + size_t element_count; + }; +#endif + + char const* __array_cookie_start = reinterpret_cast<char const*>(__ptr) - sizeof(_ArrayCookie); + _ArrayCookie __cookie; + // This is necessary to avoid violating strict aliasing. It's valid because _ArrayCookie is an + // implicit lifetime type. + __builtin_memcpy(std::addressof(__cookie), __array_cookie_start, sizeof(_ArrayCookie)); + return __cookie.__element_count; } _LIBCPP_END_NAMESPACE_STD diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/include/__ranges/join_view.h new/libcxx-21.1.4.src/include/__ranges/join_view.h --- old/libcxx-21.1.3.src/include/__ranges/join_view.h 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/include/__ranges/join_view.h 2025-10-21 10:14:55.000000000 +0200 @@ -410,8 +410,13 @@ static constexpr _LIBCPP_HIDE_FROM_ABI _JoinViewIterator __compose(__segment_iterator __seg_iter, __local_iterator __local_iter) { - return _JoinViewIterator( - std::move(__seg_iter).__get_data(), std::move(__seg_iter).__get_iter(), std::move(__local_iter)); + auto&& __parent = std::move(__seg_iter).__get_data(); + auto&& __outer = std::move(__seg_iter).__get_iter(); + if (__local_iter == ranges::end(*__outer)) { + ++__outer; + return _JoinViewIterator(*__parent, __outer); + } + return _JoinViewIterator(__parent, __outer, std::move(__local_iter)); } }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/test/std/algorithms/alg.nonmodifying/alg.find/ranges.find.pass.cpp new/libcxx-21.1.4.src/test/std/algorithms/alg.nonmodifying/alg.find/ranges.find.pass.cpp --- old/libcxx-21.1.3.src/test/std/algorithms/alg.nonmodifying/alg.find/ranges.find.pass.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/test/std/algorithms/alg.nonmodifying/alg.find/ranges.find.pass.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -272,57 +272,100 @@ friend bool operator==(const Comparable& lhs, long long rhs) { return comparable_data[lhs.index_] == rhs; } }; -void test_deque() { - { // empty deque - std::deque<int> data; - assert(std::ranges::find(data, 4) == data.end()); - assert(std::ranges::find(data.begin(), data.end(), 4) == data.end()); - } - - { // single element - match - std::deque<int> data = {4}; - assert(std::ranges::find(data, 4) == data.begin()); - assert(std::ranges::find(data.begin(), data.end(), 4) == data.begin()); - } - - { // single element - no match - std::deque<int> data = {3}; - assert(std::ranges::find(data, 4) == data.end()); - assert(std::ranges::find(data.begin(), data.end(), 4) == data.end()); - } - - // many elements - for (auto size : {2, 3, 1023, 1024, 1025, 2047, 2048, 2049}) { - { // last element match +void test_segmented_iterator_types() { + // Test the optimized find algorithm for types that implement the segment iterator trait + // deque + { + { // empty deque std::deque<int> data; - data.resize(size); - std::fill(data.begin(), data.end(), 3); - data[size - 1] = 4; - assert(std::ranges::find(data, 4) == data.end() - 1); - assert(std::ranges::find(data.begin(), data.end(), 4) == data.end() - 1); + assert(std::ranges::find(data, 4) == data.end()); + assert(std::ranges::find(data.begin(), data.end(), 4) == data.end()); } - { // second-last element match - std::deque<int> data; - data.resize(size); - std::fill(data.begin(), data.end(), 3); - data[size - 2] = 4; - assert(std::ranges::find(data, 4) == data.end() - 2); - assert(std::ranges::find(data.begin(), data.end(), 4) == data.end() - 2); + { // single element - match + std::deque<int> data = {4}; + assert(std::ranges::find(data, 4) == data.begin()); + assert(std::ranges::find(data.begin(), data.end(), 4) == data.begin()); } - { // no match - std::deque<int> data; - data.resize(size); - std::fill(data.begin(), data.end(), 3); + { // single element - no match + std::deque<int> data = {3}; assert(std::ranges::find(data, 4) == data.end()); assert(std::ranges::find(data.begin(), data.end(), 4) == data.end()); } + + // many elements + for (auto size : {2, 3, 1023, 1024, 1025, 2047, 2048, 2049}) { + { // last element match + std::deque<int> data; + data.resize(size); + std::fill(data.begin(), data.end(), 3); + data[size - 1] = 4; + assert(std::ranges::find(data, 4) == data.end() - 1); + assert(std::ranges::find(data.begin(), data.end(), 4) == data.end() - 1); + } + + { // second-last element match + std::deque<int> data; + data.resize(size); + std::fill(data.begin(), data.end(), 3); + data[size - 2] = 4; + assert(std::ranges::find(data, 4) == data.end() - 2); + assert(std::ranges::find(data.begin(), data.end(), 4) == data.end() - 2); + } + + { // no match + std::deque<int> data; + data.resize(size); + std::fill(data.begin(), data.end(), 3); + assert(std::ranges::find(data, 4) == data.end()); + assert(std::ranges::find(data.begin(), data.end(), 4) == data.end()); + } + } + } + // join_view ranges adaptor + { + { // single element - match + int data[1][1] = {{4}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::begin(joined)); + } + { // single element - no match + // (reproducer for https://llvm.org/PR158279, where the iterator would never reach the end sentinel) + int data[1][1] = {{3}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::end(joined)); + } + { // several sub-arrays of size 1 - match + int data[3][1] = {{0}, {4}, {0}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::next(std::ranges::begin(joined))); + } + { // several sub-arrays of size 2 - match in second element of an array + int data[3][2] = {{0, 0}, {0, 4}, {0, 0}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::next(std::ranges::begin(joined), 3)); + } + { // vector of empty vectors + std::vector<std::vector<int>> data = {{}, {}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::end(joined)); + } + { // vector of variably sized vectors - match + std::vector<std::vector<int>> data = {{}, {}, {3, 4}, {}, {}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::next(std::ranges::begin(joined))); + } + { // vector of variably sized vectors - no match + std::vector<std::vector<int>> data = {{}, {}, {3, 5}, {}, {}}; + auto joined = std::views::join(data); + assert(std::ranges::find(joined, 4) == std::ranges::end(joined)); + } } } int main(int, char**) { - test_deque(); + test_segmented_iterator_types(); test(); static_assert(test()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libcxx-21.1.3.src/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/assert.subscript.pass.cpp new/libcxx-21.1.4.src/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/assert.subscript.pass.cpp --- old/libcxx-21.1.3.src/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/assert.subscript.pass.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/libcxx-21.1.4.src/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/assert.subscript.pass.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -58,15 +58,18 @@ { { std::unique_ptr<WithCookie[]> ptr(new WithCookie[5]); + assert(&ptr[1] == ptr.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(ptr[6], "unique_ptr<T[]>::operator[](index): index out of range"); } { std::unique_ptr<WithCookie[]> ptr = std::make_unique<WithCookie[]>(5); + assert(&ptr[1] == ptr.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(ptr[6], "unique_ptr<T[]>::operator[](index): index out of range"); } #if TEST_STD_VER >= 20 { std::unique_ptr<WithCookie[]> ptr = std::make_unique_for_overwrite<WithCookie[]>(5); + assert(&ptr[1] == ptr.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(ptr[6] = WithCookie(), "unique_ptr<T[]>::operator[](index): index out of range"); } #endif @@ -82,11 +85,13 @@ { { std::unique_ptr<NoCookie[]> ptr = std::make_unique<NoCookie[]>(5); + assert(&ptr[1] == ptr.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(ptr[6], "unique_ptr<T[]>::operator[](index): index out of range"); } # if TEST_STD_VER >= 20 { std::unique_ptr<NoCookie[]> ptr = std::make_unique_for_overwrite<NoCookie[]>(5); + assert(&ptr[1] == ptr.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(ptr[6] = NoCookie(), "unique_ptr<T[]>::operator[](index): index out of range"); } # endif @@ -101,6 +106,7 @@ { std::unique_ptr<T[]> ptr = std::make_unique<T[]>(5); std::unique_ptr<T[]> other(std::move(ptr)); + assert(&other[1] == other.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(other[6], "unique_ptr<T[]>::operator[](index): index out of range"); } @@ -109,6 +115,7 @@ std::unique_ptr<T[]> ptr = std::make_unique<T[]>(5); std::unique_ptr<T[]> other; other = std::move(ptr); + assert(&other[1] == other.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(other[6], "unique_ptr<T[]>::operator[](index): index out of range"); } @@ -116,6 +123,7 @@ { std::unique_ptr<T[]> ptr = std::make_unique<T[]>(5); std::unique_ptr<T[], MyDeleter> other(std::move(ptr)); + assert(&other[1] == other.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(other[6], "unique_ptr<T[]>::operator[](index): index out of range"); } @@ -124,6 +132,7 @@ std::unique_ptr<T[]> ptr = std::make_unique<T[]>(5); std::unique_ptr<T[], MyDeleter> other; other = std::move(ptr); + assert(&other[1] == other.get() + 1); // ensure no assertion TEST_LIBCPP_ASSERT_FAILURE(other[6], "unique_ptr<T[]>::operator[](index): index out of range"); } }); @@ -144,6 +153,34 @@ char padding[Size]; }; +template <std::size_t Size> +struct alignas(128) OveralignedNoCookie { + char padding[Size]; +}; + +template <std::size_t Size> +struct alignas(128) OveralignedWithCookie { + OveralignedWithCookie() = default; + OveralignedWithCookie(OveralignedWithCookie const&) {} + OveralignedWithCookie& operator=(OveralignedWithCookie const&) { return *this; } + ~OveralignedWithCookie() {} + char padding[Size]; +}; + +// These types have a different ABI alignment (alignof) and preferred alignment (__alignof) on some platforms. +// Make sure things work with these types because array cookies can be sensitive to preferred alignment on some +// platforms. +struct WithCookiePreferredAlignment { + WithCookiePreferredAlignment() = default; + WithCookiePreferredAlignment(WithCookiePreferredAlignment const&) {} + WithCookiePreferredAlignment& operator=(WithCookiePreferredAlignment const&) { return *this; } + ~WithCookiePreferredAlignment() {} + long double data; +}; +struct NoCookiePreferredAlignment { + long double data; +}; + int main(int, char**) { test<WithCookie<1>, NoCookie<1>>(); test<WithCookie<2>, NoCookie<2>>(); @@ -153,7 +190,18 @@ test<WithCookie<16>, NoCookie<16>>(); test<WithCookie<32>, NoCookie<32>>(); test<WithCookie<256>, NoCookie<256>>(); + + test<OveralignedWithCookie<1>, OveralignedNoCookie<1>>(); + test<OveralignedWithCookie<2>, OveralignedNoCookie<2>>(); + test<OveralignedWithCookie<3>, OveralignedNoCookie<3>>(); + test<OveralignedWithCookie<4>, OveralignedNoCookie<4>>(); + test<OveralignedWithCookie<8>, OveralignedNoCookie<8>>(); + test<OveralignedWithCookie<16>, OveralignedNoCookie<16>>(); + test<OveralignedWithCookie<32>, OveralignedNoCookie<32>>(); + test<OveralignedWithCookie<256>, OveralignedNoCookie<256>>(); + test<std::string, int>(); + test<WithCookiePreferredAlignment, NoCookiePreferredAlignment>(); return 0; } ++++++ libcxxabi-21.1.3.src.tar.xz -> libcxxabi-21.1.4.src.tar.xz ++++++ ++++++ lld-21.1.3.src.tar.xz -> lld-21.1.4.src.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lld-21.1.3.src/COFF/DLL.cpp new/lld-21.1.4.src/COFF/DLL.cpp --- old/lld-21.1.3.src/COFF/DLL.cpp 2025-10-07 14:53:22.000000000 +0200 +++ new/lld-21.1.4.src/COFF/DLL.cpp 2025-10-21 10:14:55.000000000 +0200 @@ -320,30 +320,34 @@ }; static const uint8_t tailMergeARM64[] = { - 0xfd, 0x7b, 0xb3, 0xa9, // stp x29, x30, [sp, #-208]! + 0xfd, 0x7b, 0xb2, 0xa9, // stp x29, x30, [sp, #-224]! 0xfd, 0x03, 0x00, 0x91, // mov x29, sp 0xe0, 0x07, 0x01, 0xa9, // stp x0, x1, [sp, #16] 0xe2, 0x0f, 0x02, 0xa9, // stp x2, x3, [sp, #32] 0xe4, 0x17, 0x03, 0xa9, // stp x4, x5, [sp, #48] 0xe6, 0x1f, 0x04, 0xa9, // stp x6, x7, [sp, #64] - 0xe0, 0x87, 0x02, 0xad, // stp q0, q1, [sp, #80] - 0xe2, 0x8f, 0x03, 0xad, // stp q2, q3, [sp, #112] - 0xe4, 0x97, 0x04, 0xad, // stp q4, q5, [sp, #144] - 0xe6, 0x9f, 0x05, 0xad, // stp q6, q7, [sp, #176] + 0xe8, 0x2b, 0x00, 0xf9, // str x8, [sp, #80] + 0xe0, 0x07, 0x03, 0xad, // stp q0, q1, [sp, #96] + 0xe2, 0x0f, 0x04, 0xad, // stp q2, q3, [sp, #128] + 0xe4, 0x17, 0x05, 0xad, // stp q4, q5, [sp, #160] + 0xe6, 0x1f, 0x06, 0xad, // stp q6, q7, [sp, #192] 0xe1, 0x03, 0x11, 0xaa, // mov x1, x17 0x00, 0x00, 0x00, 0x90, // adrp x0, #0 DELAY_IMPORT_DESCRIPTOR 0x00, 0x00, 0x00, 0x91, // add x0, x0, #0 :lo12:DELAY_IMPORT_DESCRIPTOR - 0x00, 0x00, 0x00, 0x94, // bl #0 __delayLoadHelper2 + 0x02, 0x00, 0x00, 0x90, // adrp x2, #0 __delayLoadHelper2 + 0x42, 0x00, 0x00, 0x91, // add x2, x2, #0 :lo12:__delayLoadHelper2 + 0x40, 0x00, 0x3f, 0xd6, // blr x2 0xf0, 0x03, 0x00, 0xaa, // mov x16, x0 - 0xe6, 0x9f, 0x45, 0xad, // ldp q6, q7, [sp, #176] - 0xe4, 0x97, 0x44, 0xad, // ldp q4, q5, [sp, #144] - 0xe2, 0x8f, 0x43, 0xad, // ldp q2, q3, [sp, #112] - 0xe0, 0x87, 0x42, 0xad, // ldp q0, q1, [sp, #80] + 0xe6, 0x1f, 0x46, 0xad, // ldp q6, q7, [sp, #192] + 0xe4, 0x17, 0x45, 0xad, // ldp q4, q5, [sp, #160] + 0xe2, 0x0f, 0x44, 0xad, // ldp q2, q3, [sp, #128] + 0xe0, 0x07, 0x43, 0xad, // ldp q0, q1, [sp, #96] + 0xe8, 0x2b, 0x40, 0xf9, // ldr x8, [sp, #80] 0xe6, 0x1f, 0x44, 0xa9, // ldp x6, x7, [sp, #64] 0xe4, 0x17, 0x43, 0xa9, // ldp x4, x5, [sp, #48] 0xe2, 0x0f, 0x42, 0xa9, // ldp x2, x3, [sp, #32] 0xe0, 0x07, 0x41, 0xa9, // ldp x0, x1, [sp, #16] - 0xfd, 0x7b, 0xcd, 0xa8, // ldp x29, x30, [sp], #208 + 0xfd, 0x7b, 0xce, 0xa8, // ldp x29, x30, [sp], #224 0x00, 0x02, 0x1f, 0xd6, // br x16 }; @@ -554,10 +558,12 @@ void writeTo(uint8_t *buf) const override { memcpy(buf, tailMergeARM64, sizeof(tailMergeARM64)); - applyArm64Addr(buf + 44, desc->getRVA(), rva + 44, 12); - applyArm64Imm(buf + 48, desc->getRVA() & 0xfff, 0); - if (helper) - applyArm64Branch26(buf + 52, helper->getRVA() - rva - 52); + applyArm64Addr(buf + 48, desc->getRVA(), rva + 48, 12); + applyArm64Imm(buf + 52, desc->getRVA() & 0xfff, 0); + if (helper) { + applyArm64Addr(buf + 56, helper->getRVA(), rva + 56, 12); + applyArm64Imm(buf + 60, helper->getRVA() & 0xfff, 0); + } } Chunk *desc = nullptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lld-21.1.3.src/test/COFF/arm64-delayimport.yaml new/lld-21.1.4.src/test/COFF/arm64-delayimport.yaml --- old/lld-21.1.3.src/test/COFF/arm64-delayimport.yaml 2025-10-07 14:53:22.000000000 +0200 +++ new/lld-21.1.4.src/test/COFF/arm64-delayimport.yaml 2025-10-21 10:14:55.000000000 +0200 @@ -8,31 +8,35 @@ # DISASM: 140001014: d0000011 adrp x17, 0x140003000 # DISASM: 140001018: 91002231 add x17, x17, #8 # DISASM: 14000101c: 14000001 b 0x140001020 <.text+0x20> -# DISASM: 140001020: a9b37bfd stp x29, x30, [sp, #-208]! +# DISASM: 140001020: a9b27bfd stp x29, x30, [sp, #-224]! # DISASM: 140001024: 910003fd mov x29, sp # DISASM: 140001028: a90107e0 stp x0, x1, [sp, #16] # DISASM: 14000102c: a9020fe2 stp x2, x3, [sp, #32] # DISASM: 140001030: a90317e4 stp x4, x5, [sp, #48] # DISASM: 140001034: a9041fe6 stp x6, x7, [sp, #64] -# DISASM: 140001038: ad0287e0 stp q0, q1, [sp, #80] -# DISASM: 14000103c: ad038fe2 stp q2, q3, [sp, #112] -# DISASM: 140001040: ad0497e4 stp q4, q5, [sp, #144] -# DISASM: 140001044: ad059fe6 stp q6, q7, [sp, #176] -# DISASM: 140001048: aa1103e1 mov x1, x17 -# DISASM: 14000104c: b0000000 adrp x0, 0x140002000 -# DISASM: 140001050: 91000000 add x0, x0, #0 -# DISASM: 140001054: 97ffffeb bl 0x140001000 <.text> -# DISASM: 140001058: aa0003f0 mov x16, x0 -# DISASM: 14000105c: ad459fe6 ldp q6, q7, [sp, #176] -# DISASM: 140001060: ad4497e4 ldp q4, q5, [sp, #144] -# DISASM: 140001064: ad438fe2 ldp q2, q3, [sp, #112] -# DISASM: 140001068: ad4287e0 ldp q0, q1, [sp, #80] -# DISASM: 14000106c: a9441fe6 ldp x6, x7, [sp, #64] -# DISASM: 140001070: a94317e4 ldp x4, x5, [sp, #48] -# DISASM: 140001074: a9420fe2 ldp x2, x3, [sp, #32] -# DISASM: 140001078: a94107e0 ldp x0, x1, [sp, #16] -# DISASM: 14000107c: a8cd7bfd ldp x29, x30, [sp], #208 -# DISASM: 140001080: d61f0200 br x16 +# DISASM: 140001038: f9002be8 str x8, [sp, #80] +# DISASM: 14000103c: ad0307e0 stp q0, q1, [sp, #96] +# DISASM: 140001040: ad040fe2 stp q2, q3, [sp, #128] +# DISASM: 140001044: ad0517e4 stp q4, q5, [sp, #160] +# DISASM: 140001048: ad061fe6 stp q6, q7, [sp, #192] +# DISASM: 14000104c: aa1103e1 mov x1, x17 +# DISASM: 140001050: b0000000 adrp x0, 0x140002000 +# DISASM: 140001054: 91000000 add x0, x0, #0 +# DISASM: 140001058: 90000002 adrp x2, 0x140001000 <.text> +# DISASM: 14000105c: 91000042 add x2, x2, #0 +# DISASM: 140001060: d63f0040 blr x2 +# DISASM: 140001064: aa0003f0 mov x16, x0 +# DISASM: 140001068: ad461fe6 ldp q6, q7, [sp, #192] +# DISASM: 14000106c: ad4517e4 ldp q4, q5, [sp, #160] +# DISASM: 140001070: ad440fe2 ldp q2, q3, [sp, #128] +# DISASM: 140001074: ad4307e0 ldp q0, q1, [sp, #96] +# DISASM: 140001078: f9402be8 ldr x8, [sp, #80] +# DISASM: 14000107c: a9441fe6 ldp x6, x7, [sp, #64] +# DISASM: 140001080: a94317e4 ldp x4, x5, [sp, #48] +# DISASM: 140001084: a9420fe2 ldp x2, x3, [sp, #32] +# DISASM: 140001088: a94107e0 ldp x0, x1, [sp, #16] +# DISASM: 14000108c: a8ce7bfd ldp x29, x30, [sp], #224 +# DISASM: 140001090: d61f0200 br x16 # IMPORTS: Format: COFF-ARM64 # IMPORTS: Arch: aarch64 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lld-21.1.3.src/test/COFF/arm64x-delayimport.test new/lld-21.1.4.src/test/COFF/arm64x-delayimport.test --- old/lld-21.1.3.src/test/COFF/arm64x-delayimport.test 2025-10-07 14:53:22.000000000 +0200 +++ new/lld-21.1.4.src/test/COFF/arm64x-delayimport.test 2025-10-21 10:14:55.000000000 +0200 @@ -61,31 +61,35 @@ DISASM-NEXT: 180001014: b0000031 adrp x17, 0x180006000 DISASM-NEXT: 180001018: 91022231 add x17, x17, #0x88 DISASM-NEXT: 18000101c: 14000001 b 0x180001020 <.text+0x20> -DISASM-NEXT: 180001020: a9b37bfd stp x29, x30, [sp, #-0xd0]! +DISASM-NEXT: 180001020: a9b27bfd stp x29, x30, [sp, #-0xe0]! DISASM-NEXT: 180001024: 910003fd mov x29, sp DISASM-NEXT: 180001028: a90107e0 stp x0, x1, [sp, #0x10] DISASM-NEXT: 18000102c: a9020fe2 stp x2, x3, [sp, #0x20] DISASM-NEXT: 180001030: a90317e4 stp x4, x5, [sp, #0x30] DISASM-NEXT: 180001034: a9041fe6 stp x6, x7, [sp, #0x40] -DISASM-NEXT: 180001038: ad0287e0 stp q0, q1, [sp, #0x50] -DISASM-NEXT: 18000103c: ad038fe2 stp q2, q3, [sp, #0x70] -DISASM-NEXT: 180001040: ad0497e4 stp q4, q5, [sp, #0x90] -DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0] -DISASM-NEXT: 180001048: aa1103e1 mov x1, x17 -DISASM-NEXT: 18000104c: f0000000 adrp x0, 0x180004000 -DISASM-NEXT: 180001050: 910d2000 add x0, x0, #0x348 -DISASM-NEXT: 180001054: 97ffffeb bl 0x180001000 <.text> -DISASM-NEXT: 180001058: aa0003f0 mov x16, x0 -DISASM-NEXT: 18000105c: ad459fe6 ldp q6, q7, [sp, #0xb0] -DISASM-NEXT: 180001060: ad4497e4 ldp q4, q5, [sp, #0x90] -DISASM-NEXT: 180001064: ad438fe2 ldp q2, q3, [sp, #0x70] -DISASM-NEXT: 180001068: ad4287e0 ldp q0, q1, [sp, #0x50] -DISASM-NEXT: 18000106c: a9441fe6 ldp x6, x7, [sp, #0x40] -DISASM-NEXT: 180001070: a94317e4 ldp x4, x5, [sp, #0x30] -DISASM-NEXT: 180001074: a9420fe2 ldp x2, x3, [sp, #0x20] -DISASM-NEXT: 180001078: a94107e0 ldp x0, x1, [sp, #0x10] -DISASM-NEXT: 18000107c: a8cd7bfd ldp x29, x30, [sp], #0xd0 -DISASM-NEXT: 180001080: d61f0200 br x16 +DISASM-NEXT: 180001038: f9002be8 str x8, [sp, #0x50] +DISASM-NEXT: 18000103c: ad0307e0 stp q0, q1, [sp, #0x60] +DISASM-NEXT: 180001040: ad040fe2 stp q2, q3, [sp, #0x80] +DISASM-NEXT: 180001044: ad0517e4 stp q4, q5, [sp, #0xa0] +DISASM-NEXT: 180001048: ad061fe6 stp q6, q7, [sp, #0xc0] +DISASM-NEXT: 18000104c: aa1103e1 mov x1, x17 +DISASM-NEXT: 180001050: f0000000 adrp x0, 0x180004000 +DISASM-NEXT: 180001054: 910d2000 add x0, x0, #0x348 +DISASM-NEXT: 180001058: 90000002 adrp x2, 0x180001000 <.text> +DISASM-NEXT: 18000105c: 91000042 add x2, x2, #0x0 +DISASM-NEXT: 180001060: d63f0040 blr x2 +DISASM-NEXT: 180001064: aa0003f0 mov x16, x0 +DISASM-NEXT: 180001068: ad461fe6 ldp q6, q7, [sp, #0xc0] +DISASM-NEXT: 18000106c: ad4517e4 ldp q4, q5, [sp, #0xa0] +DISASM-NEXT: 180001070: ad440fe2 ldp q2, q3, [sp, #0x80] +DISASM-NEXT: 180001074: ad4307e0 ldp q0, q1, [sp, #0x60] +DISASM-NEXT: 180001078: f9402be8 ldr x8, [sp, #0x50] +DISASM-NEXT: 18000107c: a9441fe6 ldp x6, x7, [sp, #0x40] +DISASM-NEXT: 180001080: a94317e4 ldp x4, x5, [sp, #0x30] +DISASM-NEXT: 180001084: a9420fe2 ldp x2, x3, [sp, #0x20] +DISASM-NEXT: 180001088: a94107e0 ldp x0, x1, [sp, #0x10] +DISASM-NEXT: 18000108c: a8ce7bfd ldp x29, x30, [sp], #0xe0 +DISASM-NEXT: 180001090: d61f0200 br x16 DISASM-NEXT: ... DISASM-NEXT: 180002000: 52800040 mov w0, #0x2 // =2 DISASM-NEXT: 180002004: d65f03c0 ret @@ -184,31 +188,35 @@ NATIVE-DISASM-NEXT: 180001014: 90000031 adrp x17, 0x180005000 NATIVE-DISASM-NEXT: 180001018: 91022231 add x17, x17, #0x88 NATIVE-DISASM-NEXT: 18000101c: 14000001 b 0x180001020 <.text+0x20> -NATIVE-DISASM-NEXT: 180001020: a9b37bfd stp x29, x30, [sp, #-0xd0]! +NATIVE-DISASM-NEXT: 180001020: a9b27bfd stp x29, x30, [sp, #-0xe0]! NATIVE-DISASM-NEXT: 180001024: 910003fd mov x29, sp NATIVE-DISASM-NEXT: 180001028: a90107e0 stp x0, x1, [sp, #0x10] NATIVE-DISASM-NEXT: 18000102c: a9020fe2 stp x2, x3, [sp, #0x20] NATIVE-DISASM-NEXT: 180001030: a90317e4 stp x4, x5, [sp, #0x30] NATIVE-DISASM-NEXT: 180001034: a9041fe6 stp x6, x7, [sp, #0x40] -NATIVE-DISASM-NEXT: 180001038: ad0287e0 stp q0, q1, [sp, #0x50] -NATIVE-DISASM-NEXT: 18000103c: ad038fe2 stp q2, q3, [sp, #0x70] -NATIVE-DISASM-NEXT: 180001040: ad0497e4 stp q4, q5, [sp, #0x90] -NATIVE-DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0] -NATIVE-DISASM-NEXT: 180001048: aa1103e1 mov x1, x17 -NATIVE-DISASM-NEXT: 18000104c: d0000000 adrp x0, 0x180003000 -NATIVE-DISASM-NEXT: 180001050: 910cc000 add x0, x0, #0x330 -NATIVE-DISASM-NEXT: 180001054: 97ffffeb bl 0x180001000 <.text> -NATIVE-DISASM-NEXT: 180001058: aa0003f0 mov x16, x0 -NATIVE-DISASM-NEXT: 18000105c: ad459fe6 ldp q6, q7, [sp, #0xb0] -NATIVE-DISASM-NEXT: 180001060: ad4497e4 ldp q4, q5, [sp, #0x90] -NATIVE-DISASM-NEXT: 180001064: ad438fe2 ldp q2, q3, [sp, #0x70] -NATIVE-DISASM-NEXT: 180001068: ad4287e0 ldp q0, q1, [sp, #0x50] -NATIVE-DISASM-NEXT: 18000106c: a9441fe6 ldp x6, x7, [sp, #0x40] -NATIVE-DISASM-NEXT: 180001070: a94317e4 ldp x4, x5, [sp, #0x30] -NATIVE-DISASM-NEXT: 180001074: a9420fe2 ldp x2, x3, [sp, #0x20] -NATIVE-DISASM-NEXT: 180001078: a94107e0 ldp x0, x1, [sp, #0x10] -NATIVE-DISASM-NEXT: 18000107c: a8cd7bfd ldp x29, x30, [sp], #0xd0 -NATIVE-DISASM-NEXT: 180001080: d61f0200 br x16 +NATIVE-DISASM-NEXT: 180001038: f9002be8 str x8, [sp, #0x50] +NATIVE-DISASM-NEXT: 18000103c: ad0307e0 stp q0, q1, [sp, #0x60] +NATIVE-DISASM-NEXT: 180001040: ad040fe2 stp q2, q3, [sp, #0x80] +NATIVE-DISASM-NEXT: 180001044: ad0517e4 stp q4, q5, [sp, #0xa0] +NATIVE-DISASM-NEXT: 180001048: ad061fe6 stp q6, q7, [sp, #0xc0] +NATIVE-DISASM-NEXT: 18000104c: aa1103e1 mov x1, x17 +NATIVE-DISASM-NEXT: 180001050: d0000000 adrp x0, 0x180003000 +NATIVE-DISASM-NEXT: 180001054: 910cc000 add x0, x0, #0x330 +NATIVE-DISASM-NEXT: 180001058: 90000002 adrp x2, 0x180001000 <.text> +NATIVE-DISASM-NEXT: 18000105c: 91000042 add x2, x2, #0x0 +NATIVE-DISASM-NEXT: 180001060: d63f0040 blr x2 +NATIVE-DISASM-NEXT: 180001064: aa0003f0 mov x16, x0 +NATIVE-DISASM-NEXT: 180001068: ad461fe6 ldp q6, q7, [sp, #0xc0] +NATIVE-DISASM-NEXT: 18000106c: ad4517e4 ldp q4, q5, [sp, #0xa0] +NATIVE-DISASM-NEXT: 180001070: ad440fe2 ldp q2, q3, [sp, #0x80] +NATIVE-DISASM-NEXT: 180001074: ad4307e0 ldp q0, q1, [sp, #0x60] +NATIVE-DISASM-NEXT: 180001078: f9402be8 ldr x8, [sp, #0x50] +NATIVE-DISASM-NEXT: 18000107c: a9441fe6 ldp x6, x7, [sp, #0x40] +NATIVE-DISASM-NEXT: 180001080: a94317e4 ldp x4, x5, [sp, #0x30] +NATIVE-DISASM-NEXT: 180001084: a9420fe2 ldp x2, x3, [sp, #0x20] +NATIVE-DISASM-NEXT: 180001088: a94107e0 ldp x0, x1, [sp, #0x10] +NATIVE-DISASM-NEXT: 18000108c: a8ce7bfd ldp x29, x30, [sp], #0xe0 +NATIVE-DISASM-NEXT: 180001090: d61f0200 br x16 RUN: llvm-readobj --coff-load-config out-native.dll | FileCheck --check-prefix=NATIVE-LOADCFG %s NATIVE-LOADCFG: AuxiliaryDelayloadIAT: 0x4000 ++++++ lldb-21.1.3.src.tar.xz -> lldb-21.1.4.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm21/lldb-21.1.3.src.tar.xz /work/SRC/openSUSE:Factory/.llvm21.new.1980/lldb-21.1.4.src.tar.xz differ: char 15, line 1 ++++++ llvm-21.1.3.src.tar.xz -> llvm-21.1.4.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm21/llvm-21.1.3.src.tar.xz /work/SRC/openSUSE:Factory/.llvm21.new.1980/llvm-21.1.4.src.tar.xz differ: char 15, line 1 ++++++ llvm-do-not-install-static-libraries.patch ++++++ --- /var/tmp/diff_new_pack.DNSTIp/_old 2025-10-27 14:40:02.335393727 +0100 +++ /var/tmp/diff_new_pack.DNSTIp/_new 2025-10-27 14:40:02.343394065 +0100 @@ -2,10 +2,10 @@ want after installation. By not copying them in the first place we reduce the disk usage during installation. -Index: clang-21.1.3.src/cmake/modules/AddClang.cmake +Index: clang-21.1.4.src/cmake/modules/AddClang.cmake =================================================================== ---- a/clang-21.1.3.src/cmake/modules/AddClang.cmake -+++ b/clang-21.1.3.src/cmake/modules/AddClang.cmake +--- a/clang-21.1.4.src/cmake/modules/AddClang.cmake ++++ b/clang-21.1.4.src/cmake/modules/AddClang.cmake @@ -106,12 +106,15 @@ macro(add_clang_library name) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN) @@ -73,10 +73,10 @@ endif() get_subproject_title(subproject_title) -Index: lld-21.1.3.src/cmake/modules/AddLLD.cmake +Index: lld-21.1.4.src/cmake/modules/AddLLD.cmake =================================================================== ---- a/lld-21.1.3.src/cmake/modules/AddLLD.cmake -+++ b/lld-21.1.3.src/cmake/modules/AddLLD.cmake +--- a/lld-21.1.4.src/cmake/modules/AddLLD.cmake ++++ b/lld-21.1.4.src/cmake/modules/AddLLD.cmake @@ -14,13 +14,6 @@ macro(add_lld_library name) if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) @@ -91,10 +91,10 @@ if (NOT CMAKE_CONFIGURATION_TYPES) add_llvm_install_targets(install-${name} DEPENDS ${name} -Index: polly-21.1.3.src/cmake/polly_macros.cmake +Index: polly-21.1.4.src/cmake/polly_macros.cmake =================================================================== ---- a/polly-21.1.3.src/cmake/polly_macros.cmake -+++ b/polly-21.1.3.src/cmake/polly_macros.cmake +--- a/polly-21.1.4.src/cmake/polly_macros.cmake ++++ b/polly-21.1.4.src/cmake/polly_macros.cmake @@ -43,16 +43,18 @@ if (LLVM_POLLY_LINK_INTO_TOOLS) set(exports EXPORT LLVMExports) @@ -125,10 +125,10 @@ endmacro(add_polly_library) macro(add_polly_loadable_module name) -Index: polly-21.1.3.src/lib/CMakeLists.txt +Index: polly-21.1.4.src/lib/CMakeLists.txt =================================================================== ---- a/polly-21.1.3.src/lib/CMakeLists.txt -+++ b/polly-21.1.3.src/lib/CMakeLists.txt +--- a/polly-21.1.4.src/lib/CMakeLists.txt ++++ b/polly-21.1.4.src/lib/CMakeLists.txt @@ -109,7 +109,7 @@ set_target_properties(PollyCore PROPERTI # It depends on all library it needs, such that with # LLVM_POLLY_LINK_INTO_TOOLS=ON, its dependencies like PollyISL are linked as ++++++ llvm-docs-21.1.3.src.tar.xz -> llvm-docs-21.1.4.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm21/llvm-docs-21.1.3.src.tar.xz /work/SRC/openSUSE:Factory/.llvm21.new.1980/llvm-docs-21.1.4.src.tar.xz differ: char 15, line 1 ++++++ openmp-21.1.3.src.tar.xz -> openmp-21.1.4.src.tar.xz ++++++ ++++++ polly-21.1.3.src.tar.xz -> polly-21.1.4.src.tar.xz ++++++ /work/SRC/openSUSE:Factory/llvm21/polly-21.1.3.src.tar.xz /work/SRC/openSUSE:Factory/.llvm21.new.1980/polly-21.1.4.src.tar.xz differ: char 15, line 1 ++++++ runtimes-21.1.3.src.tar.xz -> runtimes-21.1.4.src.tar.xz ++++++ ++++++ third-party-21.1.3.src.tar.xz -> third-party-21.1.4.src.tar.xz ++++++
