blob: 586c793e9541946e0edeea42fe5c308d43da4aec [file] [log] [blame]
Mehdi Amini228053d2017-05-04 17:08:54 +00001===================
2Availability Markup
3===================
4
5.. contents::
6 :local:
7
8Overview
9========
10
11Libc++ is used as a system library on macOS and iOS (amongst others). In order
12for users to be able to compile a binary that is intended to be deployed to an
13older version of the platform, clang provides the
14`availability attribute <https://clang.llvm.org/docs/AttributeReference.html#availability>`_
15that can be placed on declarations to describe the lifecycle of a symbol in the
16library.
17
18Design
19======
20
21When a new feature is introduced that requires dylib support, a macro should be
22created in include/__config to mark this feature as unavailable for all the
23systems. For example::
24
25 // Define availability macros.
26 #if defined(_LIBCPP_USE_AVAILABILITY_APPLE)
Louis Dionned4fc5e52018-11-20 23:07:01 +000027 # define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS __attribute__((unavailable))
Mehdi Amini228053d2017-05-04 17:08:54 +000028 #else if defined(_LIBCPP_USE_AVAILABILITY_SOME_OTHER_VENDOR)
Louis Dionned4fc5e52018-11-20 23:07:01 +000029 # define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS __attribute__((unavailable))
30 #else
31 # define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
Mehdi Amini228053d2017-05-04 17:08:54 +000032 #endif
33
34When the library is updated by the platform vendor, the markup can be updated.
35For example::
36
37 #define _LIBCPP_AVAILABILITY_SHARED_MUTEX \
38 __attribute__((availability(macosx,strict,introduced=10.12))) \
39 __attribute__((availability(ios,strict,introduced=10.0))) \
40 __attribute__((availability(tvos,strict,introduced=10.0))) \
41 __attribute__((availability(watchos,strict,introduced=3.0)))
42
43In the source code, the macro can be added on a class if the full class requires
44type info from the library for example::
45
Louis Dionned4fc5e52018-11-20 23:07:01 +000046 _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
47 class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS bad_optional_access
48 : public std::logic_error {
Mehdi Amini228053d2017-05-04 17:08:54 +000049
50or on a particular symbol:
51
52 _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE void operator delete(void* __p, std::size_t __sz) _NOEXCEPT;
53
Louis Dionneb64592b2019-02-05 19:22:38 +000054Furthermore, a lit feature should be added to match that availability macro,
55so that tests depending on that feature can be marked to XFAIL if the feature
56is not supported. This way, the test suite will work on platforms that have
57not shipped the feature yet. This can be done by adding the appropriate lit
58feature in test/config.py.
59
Mehdi Amini228053d2017-05-04 17:08:54 +000060
61Testing
62=======
63
Louis Dionne4a838032018-12-07 21:48:39 +000064Some parameters can be passed to lit to run the test-suite and exercise the
Mehdi Amini228053d2017-05-04 17:08:54 +000065availability.
66
Bruce Mitchener2715e2c2018-02-13 08:12:00 +000067* The `platform` parameter controls the deployment target. For example lit can
Louis Dionne985ef732020-04-10 16:14:10 -040068 be invoked with `--param=platform=macosx10.12`. Default is the current host.
Mehdi Amini228053d2017-05-04 17:08:54 +000069* The `use_system_cxx_lib` parameter indicates to use another library than the
70 just built one. Invoking lit with `--param=use_system_cxx_lib=true` will run
71 the test-suite against the host system library. Alternatively a path to the
72 directory containing a specific prebuilt libc++ can be used, for example:
Louis Dionne985ef732020-04-10 16:14:10 -040073 `--param=use_system_cxx_lib=/path/to/macOS/10.12/`.
Mehdi Amini228053d2017-05-04 17:08:54 +000074
75Tests can be marked as XFAIL based on multiple features made available by lit:
76
77
Louis Dionne985ef732020-04-10 16:14:10 -040078* if `--param=platform=macosx10.12` is passed, the following features will be available:
Mehdi Amini228053d2017-05-04 17:08:54 +000079
Mehdi Amini228053d2017-05-04 17:08:54 +000080 - availability=macosx
Louis Dionne985ef732020-04-10 16:14:10 -040081 - availability=macosx10.12
Mehdi Amini228053d2017-05-04 17:08:54 +000082
Louis Dionned4fc5e52018-11-20 23:07:01 +000083 This feature is used to XFAIL a test that *is* using a class or a method marked
Mehdi Amini228053d2017-05-04 17:08:54 +000084 as unavailable *and* that is expected to *fail* if deployed on an older system.
85
Louis Dionne985ef732020-04-10 16:14:10 -040086* if `use_system_cxx_lib` and `--param=platform=macosx10.12` are passed to lit,
Louis Dionne4a838032018-12-07 21:48:39 +000087 the following features will also be available:
Mehdi Amini228053d2017-05-04 17:08:54 +000088
Mehdi Amini228053d2017-05-04 17:08:54 +000089 - with_system_cxx_lib=macosx
Louis Dionne985ef732020-04-10 16:14:10 -040090 - with_system_cxx_lib=macosx10.12
Louis Dionnec44138f2020-04-13 17:12:30 -040091 - with_system_cxx_lib=x86_64-apple-macosx10.12
Mehdi Amini228053d2017-05-04 17:08:54 +000092
Louis Dionned4fc5e52018-11-20 23:07:01 +000093 This feature is used to XFAIL a test that is *not* using a class or a method
Mehdi Amini228053d2017-05-04 17:08:54 +000094 marked as unavailable *but* that is expected to fail if deployed on an older
Louis Dionne4a838032018-12-07 21:48:39 +000095 system. For example, if the test exhibits a bug in the libc on a particular
96 system version, or if the test uses a symbol that is not available on an
97 older version of the dylib (but for which there is no availability markup,
98 otherwise the XFAIL should use `availability` above).