1) Enable tests that use `import Dispatch` on Linux. Add substitution
`%import-libdispatch` that needs to be used for all cross-platform
tests (i.e., tests that are intended to be run on other platforms
than Darwin) that do `import Dispatch` or enable thread sanitizer.
2) Make sure as many existing Dispatch and TSan tests as possible run on
Linux. Mark tests that would require substantial work with
`UNSUPPORTED: OS=linux-gnu`.
3) Add integration-style Swift test that shows that TSan finds a simple
race when using `Dispatch.async` incorrectly. A more complete test
suite for TSan's libdispatch support lives on the LLVM/compiler-rt
side.
rdar://problem/49177535
A number of tests exercise features only available in Apple OSes that
shipped with Swift 5.0 in the OS; this includes the following versions:
- macOS 10.14.4
- iOS 12.2
- tvOS 12.2
- watchOS 5.2
Previously these tests were restricted to running on macOS only, with
an explicit -target x86_64-apple-macosx10.14.4. To get better test
coverage, add a new %target-stable-abi-triple substitution which
expands to a triple with the correct OS version on all Apple platforms.
On non-Apple platforms, this is the same as %target-variant-triple,
but for now any test that uses this exercises Apple platform features
anyway.
One caveat is that since iOS 12.2 does not have a 32-bit slice, we
have to skip any tests that use -target %target-stable-abi-triple
on this platform. A new swift_stable_abi feature flag can be tested
with 'REQUIRES: swift_stable_abi'. To get maximum test coverage,
I split off a 'stable_abi' version of a few tests that build with both
an old and new deployment target. This allows the old deployment
target case to still be tested on 32-bit iOS.
We use the just-built clang without any -target or -sdk flags. Keep things
simple and limit the test to macOS for now.
Fixes <rdar://problem/50586614>.
The objc_loadClassref() symbol is weak linked from Clang now, so we can
un-XFAIL this test. Note that we have to pass a special flag to Clang
since objc_loadClassref() is not in the SDK's TBD files yet.
Also, change the test to use its own asserts instead of FileCheck since
there's no output unless a new libobjc is available.
The lit feature `objc_interop` is used as a proxy for the availability
of libdispatch and Foundation.
Although we don't support Obj-C on non-Apple platforms, we support
libdispatch and Foundation. Let's break up `objc_interop` into
finer-grained categories so we can run more tests on non-Apple
platforms.
This patch adds lit features `libdispatch` and `foundation` (currently
only enabled on Apple platforms) and removes the `objc_interop`
dependency from libdispatch tests.
@_optimize(none) does not prevent LLVM from optimizing the function, and the LLVM
optimizer was able to inline blackHole() and elide the metadata access altogether.
This initialization pattern can only be used if there is a backward deployment
layout (IRGen calls this ClassMetadataStrategy::FixedOrUpdate) or if we are
running on a newer Objective-C runtime that supports class metadata update
hooks (IRGen calls this ClassMetadataStrategy::Update).
If neither condition holds, we must trap here to avoid undefined behavior.
If we know our deployment target has a new Objective-C runtime, we can
emit fixed metadata for classes with resilient types even if those
types do not appear in the YAML legacy type info.
Fixes <rdar://problem/47649465>.
Specifically, when the class is referenced from Objective-C first,
before being referenced from Swift in any way. This is important for
resilience, since up until now Objective-C isn't used to the size of a
class changing based on anything other than a superclass's size
changing.
This is basically the test that would have gone with 9024768b0 had
there been a build of libobjc to test it with.
rdar://problem/45718008
Create a new RuntimeUnittest library alongside the other stdlib unit
tests so we can write C++ runtime unit tests callable from lit.
Move runtime exclusivity tests into the stdlib unittest library and
create lit tests so we can verify that the runtime crashes with an
error message.