[libunwind] 223ccaa - [libc++] Harden the test suite for running against older libc++ versions (#214820)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 12 05:42:45 PDT 2026
Author: Louis Dionne
Date: 2026-08-12T08:42:37-04:00
New Revision: 223ccaa185a036d08de1222b270bc2f132ca8ab6
URL: https://github.com/llvm/llvm-project/commit/223ccaa185a036d08de1222b270bc2f132ca8ab6
DIFF: https://github.com/llvm/llvm-project/commit/223ccaa185a036d08de1222b270bc2f132ca8ab6.diff
LOG: [libc++] Harden the test suite for running against older libc++ versions (#214820)
When running against older libc++ versions, the test suite had problems
when sniffing carve-out macros. Since we changed from e.g.
_LIBCPP_HAS_NO_LOCALIZATION to _LIBCPP_HAS_LOCALIZATION == 0|1, we would
mis-detect the absence of _LIBCPP_HAS_NO_LOCALIZATION being defined for
localization being supported.
Fix this by explicitly handling checks for older versions. Note that
this also simplifies how we deal with the C++03 frozen headers, since in
most cases the same handling covers both the frozen headers and older
versions of the library.
Also, move the detection of Lit features for carve-outs from ad-hoc
Python checks to using <test_macros.h> directly, since that centralizes
the logic in a single place. This requires making "test_macros.h"
available to libunwind tests, which previously didn't have the proper
include path.
Added:
libcxx/utils/libcxx/test/features/carveouts.py
Modified:
libcxx/test/support/test_macros.h
libcxx/utils/libcxx/test/dsl.py
libcxx/utils/libcxx/test/features/__init__.py
libcxx/utils/libcxx/test/features/libcxx_macros.py
libcxx/utils/libcxx/test/features/localization.py
libcxx/utils/libcxx/test/features/misc.py
libunwind/test/configs/apple-libunwind-system.cfg.in
libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
libunwind/test/configs/cmake-bridge.cfg.in
libunwind/test/configs/ibm-libunwind-shared.cfg.in
libunwind/test/configs/llvm-libunwind-merged.cfg.in
libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.in
libunwind/test/configs/llvm-libunwind-shared.cfg.in
libunwind/test/configs/llvm-libunwind-static-mingw.cfg.in
libunwind/test/configs/llvm-libunwind-static.cfg.in
Removed:
################################################################################
diff --git a/libcxx/test/support/test_macros.h b/libcxx/test/support/test_macros.h
index 82975a38884f0..de6fa29234106 100644
--- a/libcxx/test/support/test_macros.h
+++ b/libcxx/test/support/test_macros.h
@@ -13,7 +13,7 @@
#ifdef __has_include
# if __has_include(<version>)
# include <version>
-# else
+# elif __has_include(<ciso646>)
# include <ciso646>
# endif
#else
@@ -229,11 +229,9 @@
# define TEST_IS_EXECUTED_IN_A_SLOW_ENVIRONMENT
#endif
-#ifdef _LIBCPP_USE_FROZEN_CXX03_HEADERS
-# ifdef _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
-# define TEST_HAS_NO_ALIGNED_ALLOCATION
-# endif
-#elif defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_ALIGNED_ALLOCATION
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_ALIGNED_ALLOCATION) && !_LIBCPP_HAS_ALIGNED_ALLOCATION
+# define TEST_HAS_NO_ALIGNED_ALLOCATION
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) /* old libc++ version */
# define TEST_HAS_NO_ALIGNED_ALLOCATION
#elif TEST_STD_VER < 17 && (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606L)
# define TEST_HAS_NO_ALIGNED_ALLOCATION
@@ -287,9 +285,12 @@
#define TEST_IGNORE_NODISCARD (void)
-#ifdef _LIBCPP_USE_FROZEN_CXX03_HEADERS
-// from-chars is a C++17 feature, so it's never available anyways
-#elif !defined(_LIBCPP_VERSION) || _LIBCPP_AVAILABILITY_HAS_FROM_CHARS_FLOATING_POINT
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_AVAILABILITY_HAS_FROM_CHARS_FLOATING_POINT) && \
+ !_LIBCPP_AVAILABILITY_HAS_FROM_CHARS_FLOATING_POINT
+// not available
+#elif defined(_LIBCPP_VERSION) && !defined(_LIBCPP_AVAILABILITY_HAS_FROM_CHARS_FLOATING_POINT) /* old libc++ version */
+// not available
+#else
# define TEST_HAS_FROM_CHARS_FLOATING_POINT
#endif
@@ -420,11 +421,15 @@ inline Tp const& DoNotOptimize(Tp const& value) {
#endif
// Support for carving out parts of the test suite, like removing wide characters, etc.
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_WIDE_CHARACTERS
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_WIDE_CHARACTERS) && !_LIBCPP_HAS_WIDE_CHARACTERS
+# define TEST_HAS_NO_WIDE_CHARACTERS
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) /* old libc++ version */
# define TEST_HAS_NO_WIDE_CHARACTERS
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_UNICODE
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_UNICODE) && !_LIBCPP_HAS_UNICODE
+# define TEST_HAS_NO_UNICODE
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_UNICODE) /* old libc++ version */
# define TEST_HAS_NO_UNICODE
#elif defined(_MSVC_EXECUTION_CHARACTER_SET) && _MSVC_EXECUTION_CHARACTER_SET != 65001
# define TEST_HAS_NO_UNICODE
@@ -434,7 +439,7 @@ inline Tp const& DoNotOptimize(Tp const& value) {
# ifdef _LIBCPP_HAS_OPEN_WITH_WCHAR
# define TEST_HAS_OPEN_WITH_WCHAR
# endif
-#elif defined(_LIBCPP_VERSION) && _LIBCPP_HAS_OPEN_WITH_WCHAR
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_OPEN_WITH_WCHAR) && _LIBCPP_HAS_OPEN_WITH_WCHAR
# define TEST_HAS_OPEN_WITH_WCHAR
#endif
@@ -442,11 +447,17 @@ inline Tp const& DoNotOptimize(Tp const& value) {
# ifdef _LIBCPP_HAS_NO_INT128
# define TEST_HAS_NO_INT128
# endif
-#elif (defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_INT128) || defined(_MSVC_STL_VERSION)
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_INT128) && !_LIBCPP_HAS_INT128
+# define TEST_HAS_NO_INT128
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_INT128) /* old libc++ version */
+# define TEST_HAS_NO_INT128
+#elif defined(_MSVC_STL_VERSION)
# define TEST_HAS_NO_INT128
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_LOCALIZATION
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_LOCALIZATION) && !_LIBCPP_HAS_LOCALIZATION
+# define TEST_HAS_NO_LOCALIZATION
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_LOCALIZATION) /* old libc++ version */
# define TEST_HAS_NO_LOCALIZATION
#endif
@@ -454,34 +465,39 @@ inline Tp const& DoNotOptimize(Tp const& value) {
# define TEST_HAS_NO_CHAR8_T
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_THREADS
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_THREADS) && !_LIBCPP_HAS_THREADS
+# define TEST_HAS_NO_THREADS
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_THREADS) /* old libc++ version */
# define TEST_HAS_NO_THREADS
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_FILESYSTEM
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_FILESYSTEM) && !_LIBCPP_HAS_FILESYSTEM
+# define TEST_HAS_NO_FILESYSTEM
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_FILESYSTEM) /* old libc++ version */
# define TEST_HAS_NO_FILESYSTEM
#endif
-#ifdef _LIBCPP_USE_FROZEN_CXX03_HEADERS
-# ifdef _LIBCPP_HAS_NO_C8RTOMB_MBRTOC8
-# define TEST_HAS_NO_C8RTOMB_MBRTOC8
-# endif
-#elif defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_C8RTOMB_MBRTOC8
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_C8RTOMB_MBRTOC8) && !_LIBCPP_HAS_C8RTOMB_MBRTOC8
+# define TEST_HAS_NO_C8RTOMB_MBRTOC8
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_C8RTOMB_MBRTOC8) /* old libc++ version */
# define TEST_HAS_NO_C8RTOMB_MBRTOC8
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_RANDOM_DEVICE
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_RANDOM_DEVICE) && !_LIBCPP_HAS_RANDOM_DEVICE
+# define TEST_HAS_NO_RANDOM_DEVICE
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_RANDOM_DEVICE) /* old libc++ version */
# define TEST_HAS_NO_RANDOM_DEVICE
#endif
-#ifdef _LIBCPP_USE_FROZEN_CXX03_HEADERS
-// This is a C++20 feature, so it's never available anyways
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_EXPERIMENTAL_TZDB) && !_LIBCPP_HAS_EXPERIMENTAL_TZDB
# define TEST_HAS_NO_EXPERIMENTAL_TZDB
-#elif defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_EXPERIMENTAL_TZDB
+#elif defined(_LIBCPP_VERSION) && !defined(_LIBCPP_HAS_EXPERIMENTAL_TZDB) /* old libc++ version */
# define TEST_HAS_NO_EXPERIMENTAL_TZDB
#endif
-#if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_TIME_ZONE_DATABASE
+#if defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_TIME_ZONE_DATABASE) && !_LIBCPP_HAS_TIME_ZONE_DATABASE
+# define TEST_HAS_NO_TIME_ZONE_DATABASE
+#elif defined(_LIBCPP_VERSION) && defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) /* old libc++ version */
# define TEST_HAS_NO_TIME_ZONE_DATABASE
#endif
diff --git a/libcxx/utils/libcxx/test/dsl.py b/libcxx/utils/libcxx/test/dsl.py
index c7db35fd629b6..bc65c9b74219f 100644
--- a/libcxx/utils/libcxx/test/dsl.py
+++ b/libcxx/utils/libcxx/test/dsl.py
@@ -307,7 +307,10 @@ def hasAnyLocale(config, locales):
program = (
"""
#include <stddef.h>
- #if defined(_LIBCPP_VERSION) && !_LIBCPP_HAS_LOCALIZATION
+
+ #include "test_macros.h"
+
+ #ifdef TEST_HAS_NO_LOCALIZATION
int main(int, char**) { return 1; }
#else
#include <locale.h>
@@ -330,32 +333,22 @@ def hasAnyLocale(config, locales):
return programSucceeds(config, program)
- at _memoizeExpensiveOperation(lambda c, flags="": (c.substitutions, c.environment, flags))
-def compilerMacros(config, flags=""):
+def _macrosFromSource(config, source, flags=""):
"""
- Return a dictionary of predefined compiler macros.
+ Preprocess the given source and return a dictionary of the macros it defines.
The keys are strings representing macros, and the values are strings
representing what each macro is defined to.
-
- If the optional `flags` argument (a string) is provided, these flags will
- be added to the compiler invocation when generating the macros.
"""
with _makeConfigTest(config) as test:
with open(test.getSourcePath(), "w") as sourceFile:
- sourceFile.write(
- """
- #if __has_include(<__config>)
- # include <__config>
- #endif
- """
- )
+ sourceFile.write(source)
unparsedOutput, err, exitCode, _, cmd, _ = _executeWithFakeConfig(
test, ["%{{cxx}} %s -dM -E %{{flags}} %{{compile_flags}} {}".format(flags)]
)
if exitCode != 0:
raise ConfigurationCompilationError(
- "Failed to retrieve compiler macros, compiler invocation is:\n{}\nstderr is:\n{}".format(
+ "Failed to retrieve macros, compiler invocation is:\n{}\nstderr is:\n{}".format(
cmd, err
)
)
@@ -370,6 +363,39 @@ def compilerMacros(config, flags=""):
return parsedMacros
+ at _memoizeExpensiveOperation(lambda c, flags="": (c.substitutions, c.environment, flags))
+def compilerMacros(config, flags=""):
+ """
+ Return a dictionary of predefined compiler macros.
+
+ The keys are strings representing macros, and the values are strings
+ representing what each macro is defined to.
+
+ If the optional `flags` argument (a string) is provided, these flags will
+ be added to the compiler invocation when generating the macros.
+ """
+ source = """
+ #if __has_include(<__config>)
+ # include <__config>
+ #endif
+ """
+ return _macrosFromSource(config, source, flags)
+
+
+ at _memoizeExpensiveOperation(lambda c, flags="": (c.substitutions, c.environment, flags))
+def testMacros(config, flags=""):
+ """
+ Return a dictionary of the macros defined by the test suite's <test_macros.h>.
+
+ The keys are strings representing macros, and the values are strings
+ representing what each macro is defined to.
+
+ If the optional `flags` argument (a string) is provided, these flags will
+ be added to the compiler invocation when generating the macros.
+ """
+ return _macrosFromSource(config, "#include <test_macros.h>\n", flags)
+
+
def featureTestMacros(config, flags=""):
"""
Return a dictionary of feature test macros.
diff --git a/libcxx/utils/libcxx/test/features/__init__.py b/libcxx/utils/libcxx/test/features/__init__.py
index 8e9bc0e97b2d6..7516f4fc2f188 100644
--- a/libcxx/utils/libcxx/test/features/__init__.py
+++ b/libcxx/utils/libcxx/test/features/__init__.py
@@ -6,7 +6,15 @@
#
# ===----------------------------------------------------------------------===##
-from . import availability, compiler, gdb, hardening, libcxx_macros, localization, misc, platform
+from . import availability
+from . import carveouts
+from . import compiler
+from . import gdb
+from . import hardening
+from . import libcxx_macros
+from . import localization
+from . import misc
+from . import platform
# Lit features are evaluated in order. Some features depend on other features, so
# we are careful to define them in the correct order. For example, several features
@@ -14,6 +22,7 @@
DEFAULT_FEATURES = []
DEFAULT_FEATURES += compiler.features
DEFAULT_FEATURES += libcxx_macros.features
+DEFAULT_FEATURES += carveouts.features
DEFAULT_FEATURES += platform.features
DEFAULT_FEATURES += localization.features
DEFAULT_FEATURES += gdb.features
diff --git a/libcxx/utils/libcxx/test/features/carveouts.py b/libcxx/utils/libcxx/test/features/carveouts.py
new file mode 100644
index 0000000000000..f485b15cdf464
--- /dev/null
+++ b/libcxx/utils/libcxx/test/features/carveouts.py
@@ -0,0 +1,34 @@
+# ===----------------------------------------------------------------------===##
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+# ===----------------------------------------------------------------------===##
+
+from libcxx.test.dsl import Feature, testMacros
+
+features = []
+
+# Features describing parts of the library that can be carved out, like localization
+# or threading support.
+#
+# These are detected by asking <test_macros.h> whether it considers the carve-out to be
+# in effect. This keeps the logic for determining whether a carve-out applies in a single
+# place, and it guarantees that these Lit features agree with what the tests use.
+carveouts = {
+ "TEST_HAS_NO_FILESYSTEM": "no-filesystem",
+ "TEST_HAS_NO_LOCALIZATION": "no-localization",
+ "TEST_HAS_NO_RANDOM_DEVICE": "no-random-device",
+ "TEST_HAS_NO_THREADS": "no-threads",
+ "TEST_HAS_NO_TIME_ZONE_DATABASE": "no-tzdb",
+ "TEST_HAS_NO_UNICODE": "libcpp-has-no-unicode",
+ "TEST_HAS_NO_WIDE_CHARACTERS": "no-wide-characters",
+}
+for macro, feature in carveouts.items():
+ features.append(
+ Feature(
+ name=feature,
+ when=lambda cfg, m=macro: m in testMacros(cfg),
+ )
+ )
diff --git a/libcxx/utils/libcxx/test/features/libcxx_macros.py b/libcxx/utils/libcxx/test/features/libcxx_macros.py
index ec149bef1a40e..9ac22e07c549c 100644
--- a/libcxx/utils/libcxx/test/features/libcxx_macros.py
+++ b/libcxx/utils/libcxx/test/features/libcxx_macros.py
@@ -60,15 +60,8 @@
)
inverted_macros = {
- "_LIBCPP_HAS_TIME_ZONE_DATABASE": "no-tzdb",
- "_LIBCPP_HAS_FILESYSTEM": "no-filesystem",
- "_LIBCPP_HAS_LOCALIZATION": "no-localization",
- "_LIBCPP_HAS_THREADS": "no-threads",
"_LIBCPP_HAS_MONOTONIC_CLOCK": "no-monotonic-clock",
- "_LIBCPP_HAS_WIDE_CHARACTERS": "no-wide-characters",
"_LIBCPP_HAS_VENDOR_AVAILABILITY_ANNOTATIONS": "libcpp-has-no-availability-markup",
- "_LIBCPP_HAS_RANDOM_DEVICE": "no-random-device",
- "_LIBCPP_HAS_UNICODE": "libcpp-has-no-unicode",
}
for macro, feature in inverted_macros.items():
features.append(
diff --git a/libcxx/utils/libcxx/test/features/localization.py b/libcxx/utils/libcxx/test/features/localization.py
index 95e1bb5c1afa4..b45c0bf5fd8c0 100644
--- a/libcxx/utils/libcxx/test/features/localization.py
+++ b/libcxx/utils/libcxx/test/features/localization.py
@@ -6,7 +6,7 @@
#
# ===----------------------------------------------------------------------===##
-from libcxx.test.dsl import compilerMacros, Feature, programSucceeds, hasAnyLocale, programOutput, AddSubstitution
+from libcxx.test.dsl import Feature, programSucceeds, hasAnyLocale, programOutput, testMacros, AddSubstitution
import re
features = [
@@ -23,8 +23,10 @@
#include <locale.h>
#endif
+ #include "test_macros.h"
+
int main(int, char**) {
- #if __has_include(<locale.h>) && (!defined(_LIBCPP_HAS_LOCALIZATION) || _LIBCPP_HAS_LOCALIZATION == 1)
+ #if __has_include(<locale.h>) && !defined(TEST_HAS_NO_LOCALIZATION)
setlocale(LC_ALL, "ru_RU.UTF-8");
return strcmp(localeconv()->mon_decimal_point, ".") == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
#else
@@ -63,8 +65,7 @@
cfg, locale, alts, _provide_locale_conversions[locale]
)
if locale in _provide_locale_conversions
- and ("_LIBCPP_HAS_WIDE_CHARACTERS" not in compilerMacros(cfg) or
- compilerMacros(cfg)["_LIBCPP_HAS_WIDE_CHARACTERS"] == "1")
+ and "TEST_HAS_NO_WIDE_CHARACTERS" not in testMacros(cfg)
else [],
),
)
diff --git a/libcxx/utils/libcxx/test/features/misc.py b/libcxx/utils/libcxx/test/features/misc.py
index 318765e527089..1f4b808e40820 100644
--- a/libcxx/utils/libcxx/test/features/misc.py
+++ b/libcxx/utils/libcxx/test/features/misc.py
@@ -132,8 +132,10 @@ def _mingwSupportsModules(cfg):
#include <stdlib.h>
#include <wctype.h>
+ #include "test_macros.h"
+
int main(int, char**) {
- #if !defined(_LIBCPP_VERSION) || (defined(_LIBCPP_HAS_LOCALIZATION) && _LIBCPP_HAS_LOCALIZATION)
+ #ifndef TEST_HAS_NO_LOCALIZATION
setlocale(LC_ALL, "en_US.UTF-8");
return towlower(L'\\xDA') == L'\\xFA' ? EXIT_FAILURE : EXIT_SUCCESS;
#else
diff --git a/libunwind/test/configs/apple-libunwind-system.cfg.in b/libunwind/test/configs/apple-libunwind-system.cfg.in
index 2349ca394b58b..d0465d5550fdc 100644
--- a/libunwind/test/configs/apple-libunwind-system.cfg.in
+++ b/libunwind/test/configs/apple-libunwind-system.cfg.in
@@ -13,7 +13,7 @@ config.substitutions.append(('%{flags}',
'-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else ''
))
-compile_flags = ['-nostdinc++', '-I', '%{include}']
+compile_flags = ['-nostdinc++', '-I', '%{include}', '-I', '%{libcxx}/test/support']
if @HAVE_CFI_SET_RA_STATE@:
compile_flags.append('-DHAVE_CFI_SET_RA_STATE')
diff --git a/libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in b/libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
index 6ffdd70c6177e..11a0f61f5720e 100644
--- a/libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
+++ b/libunwind/test/configs/armv7m-picolibc-libunwind.cfg.in
@@ -5,7 +5,7 @@ libc_linker_script = '@CMAKE_INSTALL_PREFIX@/lib/picolibcpp.ld'
config.substitutions.append(('%{flags}', '--sysroot=@CMAKE_INSTALL_PREFIX@'))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include}'
+ '-nostdinc++ -I %{include} -I %{libcxx}/test/support'
))
config.substitutions.append(('%{link_flags}',
'-fuse-ld=lld -nostdlib -nostdlib++ -L %{lib} -lunwind'
diff --git a/libunwind/test/configs/cmake-bridge.cfg.in b/libunwind/test/configs/cmake-bridge.cfg.in
index 09bd92ab9fee2..ed0b2afbc0c0d 100644
--- a/libunwind/test/configs/cmake-bridge.cfg.in
+++ b/libunwind/test/configs/cmake-bridge.cfg.in
@@ -41,6 +41,7 @@ if _norm_triple != config.target_triple:
config.available_features.add('target={}'.format(_norm_triple))
# Add substitutions for bootstrapping the test suite configuration
+config.substitutions.append(('%{libcxx}', '@LIBUNWIND_LIBCXX_PATH@'))
config.substitutions.append(('%{install-prefix}', '@LIBUNWIND_TESTING_INSTALL_PREFIX@'))
config.substitutions.append(('%{include}', '@LIBUNWIND_TESTING_INSTALL_PREFIX@/include'))
config.substitutions.append(('%{lib}', '@LIBUNWIND_TESTING_INSTALL_PREFIX@/@LIBUNWIND_INSTALL_LIBRARY_DIR@'))
diff --git a/libunwind/test/configs/ibm-libunwind-shared.cfg.in b/libunwind/test/configs/ibm-libunwind-shared.cfg.in
index 99f4a9061d19a..6848bf9dbbc45 100644
--- a/libunwind/test/configs/ibm-libunwind-shared.cfg.in
+++ b/libunwind/test/configs/ibm-libunwind-shared.cfg.in
@@ -11,7 +11,7 @@ if lit.util.isAIXTriple(config.target_triple):
config.substitutions.append(('%{flags}', ''))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include}'
+ '-nostdinc++ -I %{include} -I %{libcxx}/test/support'
))
config.substitutions.append(('%{link_flags}',
'-nostdlib++ -L %{lib} -lunwind -ldl -Wl,-bbigtoc'
diff --git a/libunwind/test/configs/llvm-libunwind-merged.cfg.in b/libunwind/test/configs/llvm-libunwind-merged.cfg.in
index 231849f5c4e56..b05a55e40559b 100644
--- a/libunwind/test/configs/llvm-libunwind-merged.cfg.in
+++ b/libunwind/test/configs/llvm-libunwind-merged.cfg.in
@@ -38,7 +38,7 @@ config.substitutions.append(('%{flags}',
'-isysroot {}'.format(local_sysroot) if local_sysroot else ''
))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{{include}} {}'.format(' '.join(compile_flags))
+ '-nostdinc++ -I %{{include}} -I %{{libcxx}}/test/support {}'.format(' '.join(compile_flags))
))
config.substitutions.append(('%{link_flags}',
'-L %{{lib}} -Wl,-rpath,%{{lib}} -lc++ {}'.format(' '.join(link_flags))
diff --git a/libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.in b/libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.in
index 1e77638b8cee3..de3029d579921 100644
--- a/libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.in
+++ b/libunwind/test/configs/llvm-libunwind-shared-mingw.cfg.in
@@ -5,7 +5,7 @@ lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')
config.substitutions.append(('%{flags}', ''))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include} -funwind-tables'
+ '-nostdinc++ -I %{include} -I %{libcxx}/test/support -funwind-tables'
))
config.substitutions.append(('%{link_flags}',
'-L %{lib} -lunwind'
diff --git a/libunwind/test/configs/llvm-libunwind-shared.cfg.in b/libunwind/test/configs/llvm-libunwind-shared.cfg.in
index 0a7a24eb08c5e..8ae618fd7f6ae 100644
--- a/libunwind/test/configs/llvm-libunwind-shared.cfg.in
+++ b/libunwind/test/configs/llvm-libunwind-shared.cfg.in
@@ -37,7 +37,7 @@ config.substitutions.append(('%{flags}',
'-isysroot {}'.format(local_sysroot) if local_sysroot else ''
))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{{include}} {}'.format(' '.join(compile_flags))
+ '-nostdinc++ -I %{{include}} -I %{{libcxx}}/test/support {}'.format(' '.join(compile_flags))
))
config.substitutions.append(('%{link_flags}',
'-L %{{lib}} -Wl,-rpath,%{{lib}} -lunwind {}'.format(' '.join(link_flags))
diff --git a/libunwind/test/configs/llvm-libunwind-static-mingw.cfg.in b/libunwind/test/configs/llvm-libunwind-static-mingw.cfg.in
index 37d20a7c9a449..47921e9c32a36 100644
--- a/libunwind/test/configs/llvm-libunwind-static-mingw.cfg.in
+++ b/libunwind/test/configs/llvm-libunwind-static-mingw.cfg.in
@@ -5,7 +5,7 @@ lit_config.load_config(config, '@CMAKE_CURRENT_BINARY_DIR@/cmake-bridge.cfg')
config.substitutions.append(('%{flags}', ''))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{include} -funwind-tables'
+ '-nostdinc++ -I %{include} -I %{libcxx}/test/support -funwind-tables'
))
config.substitutions.append(('%{link_flags}',
'-L %{lib} -lunwind'
diff --git a/libunwind/test/configs/llvm-libunwind-static.cfg.in b/libunwind/test/configs/llvm-libunwind-static.cfg.in
index f831c74948579..f4b8e1b03b9b5 100644
--- a/libunwind/test/configs/llvm-libunwind-static.cfg.in
+++ b/libunwind/test/configs/llvm-libunwind-static.cfg.in
@@ -40,7 +40,7 @@ config.substitutions.append(('%{flags}',
'-isysroot {}'.format(local_sysroot) if local_sysroot else ''
))
config.substitutions.append(('%{compile_flags}',
- '-nostdinc++ -I %{{include}} {}'.format(' '.join(compile_flags))
+ '-nostdinc++ -I %{{include}} -I %{{libcxx}}/test/support {}'.format(' '.join(compile_flags))
))
config.substitutions.append(('%{link_flags}',
'%{{lib}}/libunwind.a {}'.format(' '.join(link_flags))
More information about the cfe-commits
mailing list