From 0547e573c555445e37db5c3bc92ee72274e19b69 Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Mon, 30 Sep 2024 17:08:44 -0400 Subject: [PATCH] [runtimes] Run backdeployment CI on Github hosted runners (#109984) This removes the need for macOS nodes in Buildkite. It also moves to the proper way of testing backdeployment, which is to actually run on the target OS itself, instead of using packaged dylibs from previous OS versions and trying to emulate backdeployment with DYLD_LIBRARY_PATH. As a drive-by change, also fix a few back-deployment annotations that were incorrect and add support for minor versions in the Lit feature determining availability from the target triple. --- .github/workflows/libcxx-build-and-test.yaml | 23 ++- .../apple-libc++-backdeployment.cfg.in | 65 -------- .../test/configs/apple-libc++-system.cfg.in | 33 +++++ .../filebuf.members/open_pointer.pass.cpp | 3 + .../fstreams/filebuf.virtuals/setbuf.pass.cpp | 3 + .../fstreams/fstream.cons/pointer.pass.cpp | 3 + .../fstream.members/open_pointer.pass.cpp | 3 + .../fstreams/ofstream.cons/pointer.pass.cpp | 3 + .../ofstream.members/open_pointer.pass.cpp | 3 + .../stringstream.members/gcount.pass.cpp | 3 + libcxx/utils/ci/buildkite-pipeline.yml | 42 ------ libcxx/utils/ci/run-buildbot | 140 ++++++++++-------- libcxx/utils/libcxx/test/features.py | 36 ++--- .../apple-libc++abi-backdeployment.cfg.in | 66 --------- .../configs/apple-libc++abi-system.cfg.in | 34 +++++ libcxxabi/test/test_demangle.pass.cpp | 5 +- .../apple-libunwind-backdeployment.cfg.in | 67 --------- .../configs/apple-libunwind-system.cfg.in | 41 +++++ 18 files changed, 241 insertions(+), 332 deletions(-) delete mode 100644 libcxx/test/configs/apple-libc++-backdeployment.cfg.in create mode 100644 libcxx/test/configs/apple-libc++-system.cfg.in delete mode 100644 libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in create mode 100644 libcxxabi/test/configs/apple-libc++abi-system.cfg.in delete mode 100644 libunwind/test/configs/apple-libunwind-backdeployment.cfg.in create mode 100644 libunwind/test/configs/apple-libunwind-system.cfg.in diff --git a/.github/workflows/libcxx-build-and-test.yaml b/.github/workflows/libcxx-build-and-test.yaml index b5e60781e000..184fed2268e8 100644 --- a/.github/workflows/libcxx-build-and-test.yaml +++ b/.github/workflows/libcxx-build-and-test.yaml @@ -193,17 +193,24 @@ jobs: **/crash_diagnostics/* macos: - runs-on: macos-14 needs: [ stage1 ] strategy: - fail-fast: true + fail-fast: false matrix: - config: [ - generic-cxx03, - generic-cxx23, - generic-modules, - apple-configuration - ] + include: + - config: generic-cxx03 + os: macos-latest + - config: generic-cxx23 + os: macos-latest + - config: generic-modules + os: macos-latest + - config: apple-configuration + os: macos-latest + - config: apple-system + os: macos-13 + - config: apple-system-hardened + os: macos-13 + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: maxim-lobanov/setup-xcode@v1 diff --git a/libcxx/test/configs/apple-libc++-backdeployment.cfg.in b/libcxx/test/configs/apple-libc++-backdeployment.cfg.in deleted file mode 100644 index 9843c4a9ad70..000000000000 --- a/libcxx/test/configs/apple-libc++-backdeployment.cfg.in +++ /dev/null @@ -1,65 +0,0 @@ -# Testing configuration for back-deployment against older Apple system libc++. -# -# Under this configuration, we compile and link all the test suite against the latest libc++, -# however we run against the libc++ on a different platform. This emulates the workflow of -# a developer building their application using recent tools but with the goal of deploying -# on existing devices running an older OS (and hence an older dylib). - -import os, site -site.addsitedir(os.path.join('@LIBCXX_SOURCE_DIR@', 'utils')) -import libcxx.test.params, libcxx.test.config, libcxx.test.dsl - -lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') - -BACKDEPLOYMENT_PARAMETERS = [ - libcxx.test.dsl.Parameter(name='cxx_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{cxx-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++) when running tests. - - This should be a directory hierarchy under which the libc++ dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='abi_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{abi-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++abi) when running tests. - - This should be a directory hierarchy under which the libc++abi dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='unwind_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{unwind-runtime-root}', root)], - help=""" - The simulated root of the system (for libunwind) when running tests. - - This should be a directory hierarchy under which the libunwind dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), -] - -config.substitutions.append(('%{flags}', - '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' -)) -config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -I %{include-dir} -I %{libcxx-dir}/test/support' -)) -config.substitutions.append(('%{link_flags}', - '-nostdlib++ -L %{lib-dir} -lc++' -)) -config.substitutions.append(('%{exec}', - '%{executor} --execdir %T --env DYLD_LIBRARY_PATH="%{cxx-runtime-root}:%{abi-runtime-root}:%{unwind-runtime-root}" -- ' -)) - -config.stdlib = 'apple-libc++' -config.using_system_stdlib = True - -libcxx.test.config.configure( - libcxx.test.params.DEFAULT_PARAMETERS + BACKDEPLOYMENT_PARAMETERS, - libcxx.test.features.DEFAULT_FEATURES, - config, - lit_config -) diff --git a/libcxx/test/configs/apple-libc++-system.cfg.in b/libcxx/test/configs/apple-libc++-system.cfg.in new file mode 100644 index 000000000000..b59506f375c4 --- /dev/null +++ b/libcxx/test/configs/apple-libc++-system.cfg.in @@ -0,0 +1,33 @@ +# Testing configuration for back-deployment against the system-provided libc++. +# +# Under this configuration, we compile and link all the test suite against the just-built +# libc++, but we run against the system libc++. + +import os, site +site.addsitedir(os.path.join('@LIBCXX_SOURCE_DIR@', 'utils')) +import libcxx.test.params, libcxx.test.config, libcxx.test.dsl + +lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') + +config.substitutions.append(('%{flags}', + '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' +)) +config.substitutions.append(('%{compile_flags}', + '-nostdinc++ -I %{include-dir} -I %{libcxx-dir}/test/support' +)) +config.substitutions.append(('%{link_flags}', + '-nostdlib++ -L %{lib-dir} -lc++' +)) +config.substitutions.append(('%{exec}', + '%{executor} --execdir %T -- ' +)) + +config.stdlib = 'apple-libc++' +config.using_system_stdlib = True + +libcxx.test.config.configure( + libcxx.test.params.DEFAULT_PARAMETERS, + libcxx.test.features.DEFAULT_FEATURES, + config, + lit_config +) diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp index f070762b3b94..9f617dc1e5a8 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp @@ -10,6 +10,9 @@ // basic_filebuf* open(const char* s, ios_base::openmode mode); +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + // XFAIL: LIBCXX-AIX-FIXME #include diff --git a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp index 8bcce2816203..10435dc48236 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/filebuf.virtuals/setbuf.pass.cpp @@ -10,6 +10,9 @@ // basic_streambuf* setbuf(char_type* s, streamsize n) override; +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + #include #include #include diff --git a/libcxx/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp index df7d3b948e32..2e0ebcd684d7 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp @@ -13,6 +13,9 @@ // explicit basic_fstream(const char* s, ios_base::openmode mode = ios_base::in | ios_base::out); +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + // XFAIL: LIBCXX-AIX-FIXME #include diff --git a/libcxx/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp index 790b9ef02f90..0d83d681b1df 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp @@ -13,6 +13,9 @@ // void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out); +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + // XFAIL: LIBCXX-AIX-FIXME #include diff --git a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp index af43ffdbf800..fbb03f1e8584 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp @@ -13,6 +13,9 @@ // explicit basic_ofstream(const char* s, ios_base::openmode mode = ios_base::out); +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + // XFAIL: LIBCXX-AIX-FIXME #include diff --git a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp index b0a68fd4340b..73a474277a93 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp @@ -13,6 +13,9 @@ // void open(const char* s, ios_base::openmode mode = ios_base::out); +// In C++23 and later, this test requires support for P2467R1 in the dylib (a3f17ba3febbd546f2342ffc780ac93b694fdc8d) +// XFAIL: (!c++03 && !c++11 && !c++14 && !c++17 && !c++20) && using-built-library-before-llvm-18 + // XFAIL: LIBCXX-AIX-FIXME #include diff --git a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/gcount.pass.cpp b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/gcount.pass.cpp index a9079dc63b6b..84004dc12f11 100644 --- a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/gcount.pass.cpp +++ b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/gcount.pass.cpp @@ -9,6 +9,9 @@ // UNSUPPORTED: 32-bit-pointer // REQUIRES: large_tests +// This bug was fixed in the dylib by 53aed4759b33e33614e0f4e321bc1ef764b6d5b6. +// XFAIL: using-built-library-before-llvm-17 + // Android devices frequently don't have enough memory to run this test. Rather // than throw std::bad_alloc, exhausting memory triggers the OOM Killer. // UNSUPPORTED: LIBCXX-ANDROID-FIXME diff --git a/libcxx/utils/ci/buildkite-pipeline.yml b/libcxx/utils/ci/buildkite-pipeline.yml index 906df734bc42..d1465721cf16 100644 --- a/libcxx/utils/ci/buildkite-pipeline.yml +++ b/libcxx/utils/ci/buildkite-pipeline.yml @@ -37,48 +37,6 @@ definitions: - "**/crash_diagnostics/*" steps: -- group: ':mac: Apple' - steps: - - label: Apple back-deployment macosx10.13 - command: libcxx/utils/ci/run-buildbot apple-system-backdeployment-10.13 - agents: - queue: libcxx-builders - os: macos - arch: x86_64 # We need to use x86_64 for back-deployment CI on this target since macOS didn't support arm64 back then - <<: *common - - - label: Apple back-deployment macosx10.15 - command: libcxx/utils/ci/run-buildbot apple-system-backdeployment-10.15 - agents: - queue: libcxx-builders - os: macos - arch: x86_64 # We need to use x86_64 for back-deployment CI on this target since macOS didn't support arm64 back then - <<: *common - - - label: Apple back-deployment with hardening enabled - command: libcxx/utils/ci/run-buildbot apple-system-backdeployment-hardened-11.0 - agents: - queue: libcxx-builders - os: macos - arch: x86_64 # TODO: Remove this once we are able to run back-deployment on arm64 again, since this isn't x86_64 specific - <<: *common - - # TODO: Re-enable this once we've figured out how to run back-deployment testing on arm64 on recent OSes - # - label: "Apple back-deployment macosx11.0 arm64" - # command: "libcxx/utils/ci/run-buildbot apple-system-backdeployment-11.0" - # artifact_paths: - # - "**/test-results.xml" - # - "**/*.abilist" - # agents: - # queue: "libcxx-builders" - # os: "macos" - # arch: "arm64" - # retry: - # automatic: - # - exit_status: -1 # Agent was lost - # limit: 2 - # timeout_in_minutes: 120 - - group: ARM steps: - label: AArch64 diff --git a/libcxx/utils/ci/run-buildbot b/libcxx/utils/ci/run-buildbot index b0533cb9a49c..a82d12183870 100755 --- a/libcxx/utils/ci/run-buildbot +++ b/libcxx/utils/ci/run-buildbot @@ -522,80 +522,94 @@ apple-configuration) # TODO: It would be better to run the tests against the fake-installed version of libc++ instead xcrun --sdk macosx ninja -vC "${BUILD_DIR}/${arch}" check-cxx check-cxxabi check-cxx-abilist ;; -apple-system-backdeployment-hardened-*) +apple-system-hardened) clean - if [[ "${OSX_ROOTS}" == "" ]]; then - echo "--- Downloading previous macOS dylibs" - PREVIOUS_DYLIBS_URL="https://dl.dropboxusercontent.com/s/gmcfxwgl9f9n6pu/libcxx-roots.tar.gz" - OSX_ROOTS="${BUILD_DIR}/macos-roots" - mkdir -p "${OSX_ROOTS}" - curl "${PREVIOUS_DYLIBS_URL}" | tar -xz --strip-components=1 -C "${OSX_ROOTS}" - fi - - DEPLOYMENT_TARGET="${BUILDER#apple-system-backdeployment-hardened-}" - - # TODO: On Apple platforms, we never produce libc++abi.1.dylib or libunwind.1.dylib, - # only libc++abi.dylib and libunwind.dylib. Fix that in the build so that the - # tests stop searching for @rpath/libc++abi.1.dylib and @rpath/libunwind.1.dylib. - cp "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.dylib" \ - "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.1.dylib" - cp "${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}/libunwind.dylib" \ - "${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}/libunwind.1.dylib" - arch="$(uname -m)" - PARAMS="target_triple=${arch}-apple-macosx${DEPLOYMENT_TARGET}" - PARAMS+=";cxx_runtime_root=${OSX_ROOTS}/macOS/libc++/${DEPLOYMENT_TARGET}" - PARAMS+=";abi_runtime_root=${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}" - PARAMS+=";unwind_runtime_root=${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}" - PARAMS+=";hardening_mode=fast" + version="$(sw_vers --productVersion)" + params="target_triple=${arch}-apple-macosx${version}" + params+=";hardening_mode=fast" - generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ - -DLIBCXX_TEST_CONFIG="apple-libc++-backdeployment.cfg.in" \ - -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-backdeployment.cfg.in" \ - -DLIBUNWIND_TEST_CONFIG="apple-libunwind-backdeployment.cfg.in" \ - -DLIBCXX_TEST_PARAMS="${PARAMS}" \ - -DLIBCXXABI_TEST_PARAMS="${PARAMS}" \ - -DLIBUNWIND_TEST_PARAMS="${PARAMS}" + # In the Apple system configuration, we build libc++ and libunwind separately. + ${CMAKE} \ + -S "${MONOREPO_ROOT}/runtimes" \ + -B "${BUILD_DIR}/cxx" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/cxx" \ + -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ + -DLIBCXX_TEST_CONFIG="apple-libc++-system.cfg.in" \ + -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-system.cfg.in" \ + -DLIBCXX_TEST_PARAMS="${params}" \ + -DLIBCXXABI_TEST_PARAMS="${params}" - check-runtimes + ${CMAKE} \ + -S "${MONOREPO_ROOT}/runtimes" \ + -B "${BUILD_DIR}/unwind" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/unwind" \ + -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ + -DLLVM_ENABLE_RUNTIMES="libunwind" \ + -DLIBUNWIND_TEST_CONFIG="apple-libunwind-system.cfg.in" \ + -DLIBUNWIND_TEST_PARAMS="${params}" \ + -DCMAKE_INSTALL_NAME_DIR="/usr/lib/system" + + echo "+++ Running the libc++ tests" + ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxx + + echo "+++ Running the libc++abi tests" + ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxxabi + + echo "+++ Running the libunwind tests" + ${NINJA} -vC "${BUILD_DIR}/unwind" check-unwind ;; -apple-system-backdeployment-*) +apple-system) clean - if [[ "${OSX_ROOTS}" == "" ]]; then - echo "--- Downloading previous macOS dylibs" - PREVIOUS_DYLIBS_URL="https://dl.dropboxusercontent.com/s/gmcfxwgl9f9n6pu/libcxx-roots.tar.gz" - OSX_ROOTS="${BUILD_DIR}/macos-roots" - mkdir -p "${OSX_ROOTS}" - curl "${PREVIOUS_DYLIBS_URL}" | tar -xz --strip-components=1 -C "${OSX_ROOTS}" - fi - - DEPLOYMENT_TARGET="${BUILDER#apple-system-backdeployment-}" - - # TODO: On Apple platforms, we never produce libc++abi.1.dylib or libunwind.1.dylib, - # only libc++abi.dylib and libunwind.dylib. Fix that in the build so that the - # tests stop searching for @rpath/libc++abi.1.dylib and @rpath/libunwind.1.dylib. - cp "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.dylib" \ - "${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}/libc++abi.1.dylib" - cp "${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}/libunwind.dylib" \ - "${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}/libunwind.1.dylib" - arch="$(uname -m)" - PARAMS="target_triple=${arch}-apple-macosx${DEPLOYMENT_TARGET}" - PARAMS+=";cxx_runtime_root=${OSX_ROOTS}/macOS/libc++/${DEPLOYMENT_TARGET}" - PARAMS+=";abi_runtime_root=${OSX_ROOTS}/macOS/libc++abi/${DEPLOYMENT_TARGET}" - PARAMS+=";unwind_runtime_root=${OSX_ROOTS}/macOS/libunwind/${DEPLOYMENT_TARGET}" + version="$(sw_vers --productVersion)" + params="target_triple=${arch}-apple-macosx${version}" - generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ - -DLIBCXX_TEST_CONFIG="apple-libc++-backdeployment.cfg.in" \ - -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-backdeployment.cfg.in" \ - -DLIBUNWIND_TEST_CONFIG="apple-libunwind-backdeployment.cfg.in" \ - -DLIBCXX_TEST_PARAMS="${PARAMS}" \ - -DLIBCXXABI_TEST_PARAMS="${PARAMS}" \ - -DLIBUNWIND_TEST_PARAMS="${PARAMS}" + # In the Apple system configuration, we build libc++ and libunwind separately. + ${CMAKE} \ + -S "${MONOREPO_ROOT}/runtimes" \ + -B "${BUILD_DIR}/cxx" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/cxx" \ + -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ + -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \ + -DLIBCXX_CXX_ABI=libcxxabi \ + -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \ + -DLIBCXX_TEST_CONFIG="apple-libc++-system.cfg.in" \ + -DLIBCXXABI_TEST_CONFIG="apple-libc++abi-system.cfg.in" \ + -DLIBCXX_TEST_PARAMS="${params}" \ + -DLIBCXXABI_TEST_PARAMS="${params}" - check-runtimes + ${CMAKE} \ + -S "${MONOREPO_ROOT}/runtimes" \ + -B "${BUILD_DIR}/unwind" \ + -GNinja -DCMAKE_MAKE_PROGRAM="${NINJA}" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/unwind" \ + -DLLVM_LIT_ARGS="-sv --xunit-xml-output test-results.xml --timeout=1500 --time-tests" \ + -DLLVM_ENABLE_RUNTIMES="libunwind" \ + -DLIBUNWIND_TEST_CONFIG="apple-libunwind-system.cfg.in" \ + -DLIBUNWIND_TEST_PARAMS="${params}" \ + -DCMAKE_INSTALL_NAME_DIR="/usr/lib/system" + + echo "+++ Running the libc++ tests" + ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxx + + echo "+++ Running the libc++abi tests" + ${NINJA} -vC "${BUILD_DIR}/cxx" check-cxxabi + + echo "+++ Running the libunwind tests" + ${NINJA} -vC "${BUILD_DIR}/unwind" check-unwind ;; benchmarks) clean diff --git a/libcxx/utils/libcxx/test/features.py b/libcxx/utils/libcxx/test/features.py index 29810c8ffee5..735eb5ac949d 100644 --- a/libcxx/utils/libcxx/test/features.py +++ b/libcxx/utils/libcxx/test/features.py @@ -620,21 +620,21 @@ DEFAULT_FEATURES += [ Feature( name="_target-has-llvm-17", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.0)?}} || target={{.+}}-apple-macosx{{1[5-9]([.].+)?}}", + "_target-has-llvm-18 || target={{.+}}-apple-macosx{{14.[4-9](.[0-9]+)?}} || target={{.+}}-apple-macosx{{1[5-9]([.].+)?}}", cfg.available_features, ), ), Feature( name="_target-has-llvm-16", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-17 || target={{.+}}-apple-macosx{{14.[0-3](.0)?}}", + "_target-has-llvm-17 || target={{.+}}-apple-macosx{{14.[0-3](.[0-9]+)?}}", cfg.available_features, ), ), Feature( name="_target-has-llvm-15", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-16 || target={{.+}}-apple-macosx{{13.[4-9](.0)?}}", + "_target-has-llvm-16 || target={{.+}}-apple-macosx{{13.[4-9](.[0-9]+)?}}", cfg.available_features, ), ), @@ -648,21 +648,21 @@ DEFAULT_FEATURES += [ Feature( name="_target-has-llvm-13", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-14 || target={{.+}}-apple-macosx{{13.[0-3](.0)?}}", + "_target-has-llvm-14 || target={{.+}}-apple-macosx{{13.[0-3](.[0-9]+)?}}", cfg.available_features, ), ), Feature( name="_target-has-llvm-12", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-13 || target={{.+}}-apple-macosx{{12.[3-9](.0)?}}", + "_target-has-llvm-13 || target={{.+}}-apple-macosx{{12.[3-9](.[0-9]+)?}}", cfg.available_features, ), ), Feature( name="_target-has-llvm-11", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-12 || target={{.+}}-apple-macosx{{(11.[0-9]|12.[0-2])(.0)?}}", + "_target-has-llvm-12 || target={{.+}}-apple-macosx{{(11.[0-9]|12.[0-2])(.[0-9]+)?}}", cfg.available_features, ), ), @@ -676,7 +676,7 @@ DEFAULT_FEATURES += [ Feature( name="_target-has-llvm-9", when=lambda cfg: BooleanExpression.evaluate( - "_target-has-llvm-10 || target={{.+}}-apple-macosx{{10.15(.0)?}}", + "_target-has-llvm-10 || target={{.+}}-apple-macosx{{10.15(.[0-9]+)?}}", cfg.available_features, ), ), @@ -719,7 +719,7 @@ DEFAULT_FEATURES += [ # a libc++ flavor that enables availability markup. Similarly, a test could fail when # run against the system library of an older version of FreeBSD, even though FreeBSD # doesn't provide availability markup at the time of writing this. -for version in ("9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"): +for version in ("9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"): DEFAULT_FEATURES.append( Feature( name="using-built-library-before-llvm-{}".format(version), @@ -755,11 +755,19 @@ DEFAULT_FEATURES += [ cfg.available_features, ), ), + # Tests that require std::to_chars(floating-point) in the built library + Feature( + name="availability-fp_to_chars-missing", + when=lambda cfg: BooleanExpression.evaluate( + "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-14)", + cfg.available_features, + ), + ), # Tests that require __libcpp_verbose_abort support in the built library Feature( name="availability-verbose_abort-missing", when=lambda cfg: BooleanExpression.evaluate( - "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-13)", + "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-15)", cfg.available_features, ), ), @@ -767,15 +775,7 @@ DEFAULT_FEATURES += [ Feature( name="availability-pmr-missing", when=lambda cfg: BooleanExpression.evaluate( - "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-13)", - cfg.available_features, - ), - ), - # Tests that require std::to_chars(floating-point) in the built library - Feature( - name="availability-fp_to_chars-missing", - when=lambda cfg: BooleanExpression.evaluate( - "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-14)", + "!libcpp-has-no-availability-markup && (stdlib=apple-libc++ && !_target-has-llvm-16)", cfg.available_features, ), ), diff --git a/libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in b/libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in deleted file mode 100644 index 9e725c523f29..000000000000 --- a/libcxxabi/test/configs/apple-libc++abi-backdeployment.cfg.in +++ /dev/null @@ -1,66 +0,0 @@ -# Testing configuration for back-deployment against older Apple system libc++abi. -# -# Under this configuration, we compile and link all the test suite against the latest libc++abi, -# however we run against the libc++abi on a different platform. This emulates the workflow of -# a developer building their application using recent tools but with the goal of deploying -# on existing devices running an older OS (and hence an older dylib). - -import os, site -site.addsitedir(os.path.join('@LIBCXXABI_LIBCXX_PATH@', 'utils')) -import libcxx.test.params, libcxx.test.config, libcxx.test.dsl - -lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') - -BACKDEPLOYMENT_PARAMETERS = [ - libcxx.test.dsl.Parameter(name='cxx_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{cxx-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++) when running tests. - - This should be a directory hierarchy under which the libc++ dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='abi_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{abi-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++abi) when running tests. - - This should be a directory hierarchy under which the libc++abi dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='unwind_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{unwind-runtime-root}', root)], - help=""" - The simulated root of the system (for libunwind) when running tests. - - This should be a directory hierarchy under which the libunwind dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), -] - -config.substitutions.append(('%{flags}', - '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' -)) -config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} %{maybe-include-libunwind} -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' + - '-I %{libcxx}/test/support -I %{libcxx}/src' -)) -config.substitutions.append(('%{link_flags}', - '-nostdlib++ -L %{lib} -lc++ -lc++abi' -)) -config.substitutions.append(('%{exec}', - '%{executor} --execdir %T --env DYLD_LIBRARY_PATH="%{cxx-runtime-root}:%{abi-runtime-root}:%{unwind-runtime-root}" -- ' -)) - -config.stdlib = 'apple-libc++' -config.using_system_stdlib = True - -libcxx.test.config.configure( - libcxx.test.params.DEFAULT_PARAMETERS + BACKDEPLOYMENT_PARAMETERS, - libcxx.test.features.DEFAULT_FEATURES, - config, - lit_config -) diff --git a/libcxxabi/test/configs/apple-libc++abi-system.cfg.in b/libcxxabi/test/configs/apple-libc++abi-system.cfg.in new file mode 100644 index 000000000000..1e80eee4f8d0 --- /dev/null +++ b/libcxxabi/test/configs/apple-libc++abi-system.cfg.in @@ -0,0 +1,34 @@ +# Testing configuration for back-deployment against the system-provided libc++abi. +# +# Under this configuration, we compile and link all the test suite against the just-built +# libc++abi, but we run against the system libc++abi. + +import os, site +site.addsitedir(os.path.join('@LIBCXXABI_LIBCXX_PATH@', 'utils')) +import libcxx.test.params, libcxx.test.config, libcxx.test.dsl + +lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') + +config.substitutions.append(('%{flags}', + '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' +)) +config.substitutions.append(('%{compile_flags}', + '-nostdinc++ -I %{include} -I %{cxx-include} -I %{cxx-target-include} %{maybe-include-libunwind} -D_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS ' + + '-I %{libcxx}/test/support -I %{libcxx}/src' +)) +config.substitutions.append(('%{link_flags}', + '-nostdlib++ -L %{lib} -lc++' +)) +config.substitutions.append(('%{exec}', + '%{executor} --execdir %T -- ' +)) + +config.stdlib = 'apple-libc++' +config.using_system_stdlib = True + +libcxx.test.config.configure( + libcxx.test.params.DEFAULT_PARAMETERS, + libcxx.test.features.DEFAULT_FEATURES, + config, + lit_config +) diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp index eb32b4679aff..ad131bb3a8a7 100644 --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -9,9 +9,8 @@ // This test is too big for most embedded devices. // XFAIL: LIBCXX-PICOLIBC-FIXME -// https://llvm.org/PR51407 was not fixed in some previously-released -// demanglers, which causes them to run into the infinite loop. -// UNSUPPORTED: using-built-library-before-llvm-14 +// This test exercises support for char array initializer lists added in dd8b266ef. +// UNSUPPORTED: using-built-library-before-llvm-20 // Android's long double on x86[-64] is (64/128)-bits instead of Linux's usual // 80-bit format, and this demangling test is failing on it. diff --git a/libunwind/test/configs/apple-libunwind-backdeployment.cfg.in b/libunwind/test/configs/apple-libunwind-backdeployment.cfg.in deleted file mode 100644 index 013c43ae7800..000000000000 --- a/libunwind/test/configs/apple-libunwind-backdeployment.cfg.in +++ /dev/null @@ -1,67 +0,0 @@ -# Testing configuration for back-deployment against older Apple system libunwind. -# -# Under this configuration, we compile and link all the test suite against the latest libunwind, -# however we run against the libunwind on a different platform. This emulates the workflow of -# a developer building their application using recent tools but with the goal of deploying -# on existing devices running an older OS (and hence an older dylib). - -import os, site -site.addsitedir(os.path.join('@LIBUNWIND_LIBCXX_PATH@', 'utils')) -import libcxx.test.params, libcxx.test.config, libcxx.test.dsl - -lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') - -BACKDEPLOYMENT_PARAMETERS = [ - libcxx.test.dsl.Parameter(name='cxx_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{cxx-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++) when running tests. - - This should be a directory hierarchy under which the libc++ dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='abi_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{abi-runtime-root}', root)], - help=""" - The simulated root of the system (for libc++abi) when running tests. - - This should be a directory hierarchy under which the libc++abi dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), - libcxx.test.dsl.Parameter(name='unwind_runtime_root', type=str, - actions=lambda root: [libcxx.test.dsl.AddSubstitution('%{unwind-runtime-root}', root)], - help=""" - The simulated root of the system (for libunwind) when running tests. - - This should be a directory hierarchy under which the libunwind dylib can be found. - The dylib in that hierarchy is the one that will be used at runtime when running - the tests. - """), -] - -config.substitutions.append(('%{flags}', - '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' -)) -config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -I %{include}' -)) -config.substitutions.append(('%{link_flags}', - '-nostdlib++ -L %{lib} -lc++ -lc++abi -lunwind' -)) -config.substitutions.append(('%{exec}', - '%{executor} --execdir %T --env DYLD_LIBRARY_PATH="%{cxx-runtime-root}:%{abi-runtime-root}:%{unwind-runtime-root}" -- ' -)) - -config.stdlib = 'apple-libc++' -config.using_system_stdlib = True - -import os, site -import libcxx.test.params, libcxx.test.config -libcxx.test.config.configure( - libcxx.test.params.DEFAULT_PARAMETERS + BACKDEPLOYMENT_PARAMETERS, - libcxx.test.features.DEFAULT_FEATURES, - config, - lit_config -) diff --git a/libunwind/test/configs/apple-libunwind-system.cfg.in b/libunwind/test/configs/apple-libunwind-system.cfg.in new file mode 100644 index 000000000000..e5a7c983562a --- /dev/null +++ b/libunwind/test/configs/apple-libunwind-system.cfg.in @@ -0,0 +1,41 @@ +# Testing configuration for back-deployment against the system-provided libunwind. +# +# Under this configuration, we compile and link all the test suite against the just-built +# libunwind, but we run against the system libunwind. + +import os, site +site.addsitedir(os.path.join('@LIBUNWIND_LIBCXX_PATH@', 'utils')) +import libcxx.test.params, libcxx.test.config, libcxx.test.dsl + +lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg') + +config.substitutions.append(('%{flags}', + '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' +)) +config.substitutions.append(('%{compile_flags}', + '-nostdinc++ -I %{include}' +)) +config.substitutions.append(('%{link_flags}', + '-nostdlib++ -L %{lib} -lc++ -lunwind' +)) +config.substitutions.append(('%{exec}', + '%{executor} --execdir %T -- ' +)) + +config.stdlib = 'apple-libc++' +config.using_system_stdlib = True + +# TODO: This is a giant hack, but we need to change the install_name of libunwind.dylib because the +# upstream configuration can't currently produce a libunwind.dylib that is compatible with the +# Apple system one. +import subprocess +subprocess.check_call(['install_name_tool', '-id', '/usr/lib/system/libunwind.dylib', '@LIBUNWIND_TESTING_INSTALL_PREFIX@/lib/libunwind.dylib']) + +import os, site +import libcxx.test.params, libcxx.test.config +libcxx.test.config.configure( + libcxx.test.params.DEFAULT_PARAMETERS, + libcxx.test.features.DEFAULT_FEATURES, + config, + lit_config +)