Commit Graph

1631 Commits

Author SHA1 Message Date
Evan Wilde
a884e7faec This should work on Windows
After talking with compnerd, because we're passing this directly to the
swift driver, we shouldn't have to do anything weird with the flags and
it should "just work". I'm frustrated enough with Windows that I'm just
going to go with that and go to bed. If I broke something, I'm sorry. I
tried as far as my sanity would allow.
2021-06-16 21:59:15 -07:00
Evan Wilde
90abf31d6f Pass sanitizer flags to swift on Unix-y systems
This patch fixes the part of the build system where we aren't passing
the sanitizer flags to swift, so the linker isn't linking against the
sanitizer libraries.
2021-06-16 16:42:53 -07:00
Mishal Shah
d914ac25ee Update the macOS arch list to x86_64 and arm64 2021-06-15 23:02:02 -07:00
swift-ci
8687e61bb8 Merge pull request #36971 from rollmind/main 2021-06-13 23:46:29 -07:00
Erik Eckstein
809ce72e05 libswift: build support for the initial libswift
* add the (still empty) libswift package
* add build support for libswift in CMake
* add libswift to swift-frontend and sil-opt

The build can be controlled with the LIBSWIFT_BUILD_MODE cmake variable: by default it’s “DISABLE”, which means that libswift is not built. If it’s “HOSTTOOLS”, libswift is built with a pre-installed toolchain on the host system.
2021-06-09 11:25:15 +02:00
3405691582
c0c93fa0bc [cmake] Copy Dispatch to the SDK subdir on host.
We have two directories for Swift libraries,
* `SWIFT_SDK_<platform>_LIB_SUBDIR`, a.k.a., the SDK subdir,
  a.k.a., `swift-<platform>-<arch>/lib/swift/<platform>`, and
* `SWIFTLIB_SINGLE_SUBDIR`,
  a.k.a., `swift-<platform>-<arch>/lib/swift/<platform>/<arch>`.

Through the Swift build, libraries are emitted to both
`.../lib/swift/<platform>` and `.../lib/swift/<platform>/<arch>`.
However, when building toolchains, only `.../lib/swift/<platform>/` is
populated with libraries.

None of this normally isn't a problem; the Swift libraries do not have
inherent interdependencies. This however changes with Concurrency:
Concurrency has an implicit dependency on libdispatch.

When Swift is built, we have two copies of `libswift_Concurrency.so`:
one in `.../lib/swift/<platform>` and one in
`.../lib/swift/<platform>/<arch>`. Prior to this commit, we
unconditionally copy `libdispatch.so` and `libBlocksRuntime.so` to only
_one_ place -- that is, `.../lib/swift/<platform>/<arch>`.

swiftc emits binaries on ELF systems with an rpath of
`.../lib/swift/<platform>`. These binaries implicitly import
Concurrency, so they link against `libswift_Concurrency.so` (whether
they use Concurrency features or not). The library's `$ORIGIN` is
searched to find `libdispatch.so`.

Now, nothing breaks on Linux because there the loader, when given an
rpath, searches both `.../lib/swift/<platform>` and
`.../lib/swift/<platform>/<arch>` even though the rpath only specifies
one directory..

However, on other platforms, only the given rpath is searched.
`libdispatch.so` does not reside next to `libswift_Concurrency.so`
because it has been copied to  `.../lib/swift/<platform>/<arch>`; not in
the rpath.

There are a few ways to solve this: change the way rpaths are
configured, only emit libraries into one place, copy `libdispatch.so`
only to the path matching the rpath, or copy `libdispatch.so` wherever
`libswift_Concurrency.so` is copied,

Because the toolchain file layout is different to the file layout when
only Swift is built, hacking the rpath is brittle. Presumably, the
reason why we have a `libswift_Concurrency.so` residing in two places is
to support builds where multiple architectures are supported in the one
build directory, so we cannot just copy `libdispatch.so` _only_ to
`.../lib/swift/<platform>`.

Ultimately, We need to ensure that every instance where
`libswift_Concurrency.so` can be used has `libdispatch.so` residing next
to it, which we do here.

Note that this implicit dependency resolution would not happen unless we
added a `-ldispatch` flag to make this all work, but other platforms are
instaed using `$ORIGIN` to get the search to work properly, so we also
do this for OpenBSD in this commit.
2021-06-08 22:20:47 -04:00
Michael Gottesman
98ab14d9ef [cmake] Rather than forcing parts of the build that don't depend on LLVM to define LLVM_COMMON_DEPENDS, just have add_swift_host_library respect the global if it is set. 2021-06-08 14:42:16 -07:00
Michael Gottesman
db370dec73 [cmake] Do not use the just built swift link directory for host side executables.
This is just cruft that remained from the time when swift's host/target used the
same cmake code. Host tools do not statically link against just built artifacts.
2021-06-08 14:42:16 -07:00
David Zarzycki
987faae14e [cmake] Fix fallout from pull request #37741 2021-06-03 14:37:19 -04:00
Michael Gottesman
8f876cf4ff Merge pull request #37721 from gottesmm/pr-a29fee875eff61d38bd51f7fff8c622eaf3d526e
[cmake] Work around a bug in the swift-driver by passing host side libraries from LLVMSupport to linker jobs via a -Xlinker flag.
2021-06-02 15:35:36 -07:00
Michael Gottesman
ef2b9d8631 [cmake] On Darwin, teach add_swift_host_tool how to find swift's SDK/compat libs, fix the rpath of tools, and add tests.
There are three things going on here (note all on Darwin):

1. If one compiles a swift static library and links the static library into a
   cxx executable, the cxx executable will need the -L flags to find the
   appropriate libraries in the SDK/toolchain.

2. I fixed an rpath issue where due to old code I didn't understand/propagated
   forward, we were setting the rpath to be the -L directory in the appropriate
   SDK. After reasoning about this a little bit I realized that this was code
   that was actually intended to be used for target libraries (for which the
   given rpath would be correct). On the host side though on Darwin, we want to
   use the rpath for the standard stabilized stdlib on the system.

3. I added Build System Unittests to ensure that this keeps on working. I also
   added test cases that I should have added before. I just had never thought
   about how to test this and I realized this method would work and would
   prevent regressions while I am waiting for a new swiftc with driver fixes to
   land.
2021-06-01 22:01:39 -07:00
Michael Gottesman
cf4cdf4670 [cmake] Now that we link with cxx and set the right load paths, use appropriate backdeployment target for swiftc.
Before a8ae9525aa, we could not do this since we
would fail to link since we didn't pass to clang the path to the toolchain dir
when the compatibility libraries live.
2021-06-01 19:05:26 -07:00
Michael Gottesman
4a189d8025 [cmake] Work around a bug in the swift-driver by passing host side libraries from LLVMSupport to linker jobs via a -Xlinker flag.
Clang and Swift both support this so we can do this until the actual fix lands
in a host toolchain to unblock ErikE.

The specific problem is the swift driver should just push tbd files through to
the linker, but it treats it as an input file. I am going to be putting a fix
into 5.5. This patch in the mean time filters out the tbd files in cmake. This
is a temporary fix.

I also had to add direct dependencies from swift-refactor and
libSwiftSyntaxParser on LLVMSupport to ensure that the right linker flags get to
them.
2021-06-01 18:43:12 -07:00
Michael Gottesman
a8ae9525aa Merge pull request #37696 from gottesmm/pr-ff93c482e7efc01aa8c1d7d9569fb74e41a65fdf
[cmake] When compiling swift libraries that are not pure swift on macOS be sure to set the linker language to cxx.
2021-06-01 16:47:03 -07:00
Karoy Lorentey
f3f8ade3f6 Update cmake/modules/AddSwiftUnittests.cmake
Co-authored-by: Eric Miotto <1094986+edymtt@users.noreply.github.com>
2021-06-01 10:54:32 -07:00
Michael Gottesman
0b8c39bb9f [cmake] When compiling swift libraries that are not pure swift on macOS be sure to set the linker language to cxx.
I already did this for executables. The reason why we must do this is that right
now there are bugs in cmake's swift support that makes it so that one can not
use swiftc to link targets with mixed c/c++/swift content even if the swift
content is indirectly added via linking. To work around this we must also ensure
that all libraries with mixed c/c++/swift objects link using clang. As an
additional side-effect of this, we must pass to the clang linker -L flags that
swiftc would normally provide for the linker. The two cases where I needed to do
this were:

1. -L path for the compatibility libraries. This path points into the toolchain
where these live. This is important since otherwise we will fail to link given
the minimum deployment target that swift (both host/stdlib) target today (10.9).

2. -L path to the SDK. This path points to the SDKs lib/swift/${HOST_PLATFORM}
for swiftCore and friends.

That being said, we still want people to be able to link pure swift libraries
using swiftc, so we introduce an option called PURE_SWIFT to add_host_library
that preserves this and is used to also set
IGNORE_LLVM_UPDATE_COMPILE_FLAGS (which arguably should have been called
PURE_SWIFT).
2021-06-01 10:26:34 -07:00
Karoy Lorentey
f76539f416 [unittest] Add /usr/lib/swift to the rpath of unit test executables
As a postprocessing step for unittest executables, `utils/swift-rpathize.py` unconditionally rewrites the install name of any library linked from /usr/lib/swift to be `@rpath`-relative, in an effort to load the just-built libraries instead of the OS-supplied ones.

This works great for dylibs like libswiftCore.dylib that are built as part of the toolchain, but `/usr/lib/swift` also includes a huge number of overlay dylibs that are no longer part of this repository. These dylibs must ~always be loaded from the OS location.

In order to prevent load-time issues, we need to add /usr/lib/swift to the rpath, so any libraries that we haven’t built will be picked up from there.

We could also do this by extending swift-rpathize.py with an allow (or deny) list, but keeping the list up to date would generate a bunch of maintenance work we could do without.
2021-05-28 21:20:12 -07:00
Saleem Abdulrasool
2990e8bc07 build: repair the build with VS2019 16.10.0
The newest VS2019 release updates CMake to 3.20, which picks up
`llvm-mt` as a preferred manifest tool.  However, we do not build
`llvm-mt` with libxml2 support currently, which prevents the use of the
just built manifest tool for building libdispatch.  Explicitly opt into
using the MSVC manifest-tool.
2021-05-28 11:20:25 -07:00
Michael Gottesman
467b23ad9b Merge pull request #37577 from gottesmm/pr-1105250c37357c900a8232c2106cbb9fd68896f8
[cmake] Some more small changes to enable host side tools that use swift using standard cmake.
2021-05-23 11:43:04 -07:00
Argyrios Kyrtzidis
a3095e71aa [AddSwift.cmake] Unbreak non-assertions build
Fails to build with "error: macro name must be an identifier" due to trying to pass `-D-DNDEBUG` as compiler argument.
2021-05-21 21:57:48 -07:00
Michael Gottesman
53a7ccafba [cmake] Allow for add_swift_host_libraries to set that they shouldn't use llvm update flags.
This is specifically important for host libraries that include swift
content. llvm_update_compile_flags currently doesn't conditionalize the flags it
adds since it needs to be updated like I updated Swift's cmake in
558c9d4086.

In the short amount of time that I am dealing with upstream to patch those
flags, this patch will unblock eeckstein and let him continue with his libswift
work.
2021-05-21 15:20:30 -07:00
Michael Gottesman
245905d161 [cmake] Allow for host libraries to be object libraries by letting add_swift_host_library take an OBJECT parameter. 2021-05-21 15:20:30 -07:00
Michael Gottesman
0c1d8a6c6f [cmake] Enable cross-module-optimization when compiling swift libraries in release/relwithdebinfo. 2021-05-20 13:57:04 -07:00
Michael Gottesman
bc6dbd4a09 [cmake] Force the linker_language of host executables to be CXX.
In certain cases our executables are going to have a mix of cxx,swift. There are
current issues when linking cxx,swift code with swiftc itself, so this lets us
avoid that problem.
2021-05-20 13:57:04 -07:00
Michael Gottesman
7e439eed09 [cmake] For now when compiling host swift code into a library, put -gnone to prevent the driver from running dsymutil on static libraries.
Work around for this problem until rdar://78271443 (which tracks the underlying
issue) lands so this no longer happens.
2021-05-20 13:57:04 -07:00
Michael Gottesman
95aeaf7b64 Merge pull request #37510 from gottesmm/pr-af6b60d3b83155f33bb1d91e497422748ddcc917
[cmake] Use generator expressions to change conditionalize target_compile_definition that are for c/c++ only be used for c/c++
2021-05-19 19:01:57 -07:00
Michael Gottesman
558c9d4086 [cmake] Use generator expressions to change conditionalize target_compile_definition that are for c/c++ only be used for c/c++
I am in the process now of preparing the tree for the addition of Swift code in
the optimizer as a normal source of source file. The goal is to make it so that
one can just include a random swift library anywhere in the swift project host
build and the cmake will use the swift compiler from the host
toolchain/compile-link the code just as if it was a normal host side thing (1).

In order to do this though, we need to deal with the legacy of our cmake
creating compile flags without constraining the flags to only being used if
cmake is compiling c/c++ code. To fix this, I just inserted generator
expressions into the host side swift build's cmake that uses generator
expressions to perform such conditionalization. The result is that the parts of
a target that are c/c++ will get these flags, but these flags will not propagate
to any Swift files that we add.

(1) With time this implies that we will need to be able to bootstrap the swift
compiler. We are not crossing that bridge now since the only places that we are
going to use this today is in the SILOptimizer optimier passes. These can always
be disabled while cross compiling, meaning that we can make progress here
without having the bootstrapping completely ironed out.
2021-05-19 14:46:36 -07:00
Michael Gottesman
9412f19802 [cmake] Change set_swift_llvm_is_available to set definitions on a specific target.
Otherwise we set it on all targets/languages in a subdirectory (I forgot if it
propagates up). Regardless, this type of viral stuff is something we want to
move away from since it creates a code that is a "forall" piece of code rather
than a piece of code that only effects a single target.

I also conditionalized the actual definitions being added on the compiled file's
language being C,CXX,OBJC,OBJCXX since as we add Swift sources to the host side
of the compiler, we will not want these flags to propagate to Swift sources.
2021-05-19 13:22:02 -07:00
rollmind
87e3453f03 remove unnecessary scripts
gtest, gtest_main LINK_LIBRARIES dependencies changed by that removed scripts to absolute library file path. as a result losing necessary include path dirs.
2021-05-01 00:39:39 +09:00
Artem Chikin
ae2e856f9b Revert "Merge pull request #37114 from apple/revert-36377-NewDriverDefault"
This reverts commit 937e1a365c, reversing
changes made to a5440a8abd.
2021-04-28 15:11:36 -07:00
Artem Chikin
1e44ed00eb Revert "Always build SwiftDriver and use it as default compiler driver" 2021-04-28 11:20:21 -07:00
Artem Chikin
23452d5bad Merge pull request #36377 from artemcm/NewDriverDefault
Always build SwiftDriver and use it as default compiler driver
2021-04-27 09:53:06 -07:00
Artem Chikin
c2dc8e3d07 Always build (and use) the new SwiftDriver as the default compiler driver.
This will make sure that compiler developers are using the new driver when they build the compiler locally and use it.

- Adds a new build-script product category: before_build_script_impl for products we wish to build before the impl products.
- Adds a new EarlySwiftDriver product to that category, which gets built with the host toolchain.
- Adds an escape hatch: --skip-early-swift-driver
- Adjusts the swift CMake configuration with an additional step: swift_create_early_driver_symlinks which (if one was built) creates symlinks in the swift build bin directory to the EarlySwiftDriver swift-driver and swift-help executables.
- Adds a new test subset : only_early_swiftdriver, which will get built into a corresponding CMake test target: check-swift-only_early_swiftdriver-* which runs a small subset of driver-related tests against the Early SwiftDriver.
  - This subset is run always when the compiler itself is tested (--test is specified)
  - With an escape disable-switch: --skip-test-early-swift-driver
  - All tests outside of only_early_swiftdriver are forced to run using the legacy C++ driver (to ensure it gets tested, still).

NOTE: SwiftDriver product (no 'Early') is still the main product used to build the driver for toolchain installation into and for executing the product's own tests. This change does not affect that.
2021-04-26 12:17:32 -07:00
Mishal Shah
b5a01ba5e0 Support for x86_64 watchOS simulator
* Start testing watchOS simulator x86_64 and i386 by default

Users will require to install watchOS 6.2 or older simulator to support i386.

1. Install watchOS 6.2 or older simulator (Xcode -> Preferences -> Components -> Simulators).
2. Create a 32-bit watchOS device.
3. Run:
`xcrun simctl create 'Apple Watch Series 2 - 42mm' com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-2-42mm com.apple.CoreSimulator.SimRuntime.watchOS-6-2`
2021-04-22 20:06:17 -07:00
Robert Widmann
0149ccd0ca Add arm64_32 support for Swift
Commit the platform definition and build script work necessary to
cross-compile for arm64_32.

arm64_32 is a variant of AARCH64 that supports an ILP32 architecture.
2021-04-20 14:59:04 -07:00
rollmind
909898ed84 [cmake] [unittests] include googletest headers to Xcode project header search paths
add target include directories on AddSwiftUnittests.cmake module.
currently generated Xcode project doesn't include googletest headers after https://reviews.llvm.org/D86616
2021-04-20 20:12:16 +09:00
Dario Rexin
01298df2f5 Enable import of _Concurrency by default on Linux 2021-04-13 23:14:06 -07:00
Dario Rexin
1ae371b470 Re-add dependency on libatomic for 32-bit Linux platforms (#36659) 2021-03-31 13:31:58 -07:00
Saleem Abdulrasool
9b1eccc003 Merge pull request #35920 from compnerd/target-libdispatch
build: build target libdispatch as necessary
2021-02-11 17:57:16 -08:00
Daniel Rodríguez Troitiño
87a403e53f [Concurrency] Fix Android ARMv7 C libdispatch build (#35905)
For cross-compiling Android one can simply provide
CMAKE_ANDROID_ARCH_ABI and the right CMAKE_SYSTEM_PROCESSOR will be
chosen by CMake. Since the SDK arch names are not the expected ones by the Android NDK,
it is better not to use them. The change should keep sending the
CMAKE_SYSTEM_PROCESSOR for SDKs that are not ANDROID, while skipping it
for the ANDROID SDKs.
2021-02-11 09:17:02 -08:00
Saleem Abdulrasool
3b1f01d60e build: build target libdispatch as necessary
This should not be predicated on the host libdispatch being built, only
if concurrency is being built in multithreaded mode.
2021-02-11 09:10:10 -08:00
Dario Rexin
00117e8750 [Concurrency] Fix Android C libdispatch build (#35881)
* [Concurrency] Fix Android C libdispatch build

We need to pass CMAKE_ANDROID_NDK and CMAKE_ANDROID_ARCH_ABI to the
build.

* Set proper ANDROID_ARCH_ABI

* Add -DCMAKE_ANDROID_API to C libdispatch build

* Fix compiler config for Android
2021-02-10 17:35:14 -08:00
Dario Rexin
51bdfa1919 [Concurrency] Build C-only libdispatch as part of Swift build (#35837)
* [Concurrency] Build C-only libdispatch as part of Swift build
2021-02-09 14:24:52 -08:00
buttaface
e6f5913772 [android] Move to the NDK's unified sysroot (#34491)
Since the NDK removes the platforms/ and sysroot/ directories in the latest NDK
22, switch to the unified sysroot in toolchains/llvm/ and take advantage of a
bunch of simplification that's now possible.
2021-02-07 09:19:18 -08:00
swift-ci
e417124ea4 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-31 16:33:35 -08:00
Varun Gandhi
36b589d623 Merge pull request #35538 from mininny/disable-dead-stripping-option
[build-script] Add swift-disable-dead-stripping option for disabling dead stripping
2021-01-31 16:31:48 -08:00
Adrian Prantl
a9f05c8c30 Merge remote-tracking branch 'origin/main' into rebranch
Conflicts:
	lib/IRGen/IRGenDebugInfo.cpp
2021-01-29 16:17:10 -08:00
Erik Eckstein
adae4d7dc7 cmake: another fix for include all header files in Xcode projects.
Header files from within the lib directory were missing.
Also: use get_filename_component instead of regex matching.
2021-01-29 20:48:33 +01:00
swift-ci
e0f68c0b84 Merge remote-tracking branch 'origin/main' into rebranch 2021-01-29 10:12:33 -08:00
Erik Eckstein
3c90576db0 cmake: fix Xcode project generation to include all header files.
This was broken by commit cf1f240534.
This commit reverts the 2 lines which broke the inclusion of header files in the generated Xcode project.
2021-01-29 16:29:08 +01:00