Skip to content

[android] don't enable WMO as the old driver fails to build with WMO … #851

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 22, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ if(NOT SWIFT_SYSTEM_NAME)
endif()
endif()

# Don't enable WMO on Windows due to linker failures
if(NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
# Don't enable WMO on Windows hosts due to linker failures, and the use of swift's
# old driver from build.ps1 when building for windows/android on a windows host.
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we just drop this or conditionalise it on the CMake version? CMake has had -wmo as the default since 3.26. The compilation mode defaults were also part of the release when CMP0157 was introduced. Effectively, this is just to enable -wmo with CMake 3.24..<3.26.

Copy link
Contributor

@jmschonfeld jmschonfeld Aug 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I originally tried dropping this conditional (and enabling WMO on Windows via this CMake code) and CI failed with errors such as the following:

FoundationEssentials-a79a82.o : error LNK2019: unresolved external symbol _foundation_uuid_unparse_upper referenced in function $s20FoundationEssentials4UUIDV10uuidStringSSvg
FoundationEssentials-a79a82.o : error LNK2019: unresolved external symbol _stringshims_strtod_l referenced in function $s20FoundationEssentials15JSONDecoderImpl33_B7023549748C8ED7BD56D5ACF500CBFALLC33_slowpath_unwrapFixedWidthInteger2as5json512numberBuffer10fullSource14digitBeginning3for_xxm_SbAA0T4ViewVys5UInt8VGApA0tZ5IndexVyAOGAA15_CodingPathNodeOq_SgtKs0noP0Rzs9CodingKeyR_r0_lFZ

It seemed there was an issue with WMO + the CShims on Windows. If we can find a way to enable WMO on these platforms I'm all for it, but we should double check that CI passes to make sure we don't hit these issues again

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, the problem is that WMO doesn't work very well with the old driver :(. When we build the toolchain, we don't yet have swift-driver as we need Foundation to build swift-driver. We can elide the WMO on Windows using -D CMAKE_Swift_COMPILER_USE_OLD_DRIVER=YES to workaround the issue for now. We will want to consider a multi-stage build so we can build with the new driver.

# Enable whole module optimization for release builds & incremental for debug builds
if(POLICY CMP0157)
set(CMAKE_Swift_COMPILATION_MODE "$<IF:$<CONFIG:Release>,wholemodule,incremental>")
Expand Down