Skip to content

Commit e3c2913

Browse files
authored
Merge pull request #2765 from swiftwasm/swiftwasm-release/5.4-tooling
Merge SwiftWasm build scripts, thin CMO to 5.4 release
2 parents 8b892e4 + 6f588a3 commit e3c2913

32 files changed

+295
-296
lines changed

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ jobs:
141141
- name: Pack test results
142142
working-directory: ${{ github.workspace }}/../
143143
run: |
144-
tar cJf ./swift/swift-test-results.tar.gz target-build/*/swift-macosx-x86_64/swift-test-results
144+
tar cJf ./swift/swift-test-results.tar.gz target-build/swift-stdlib-wasi-wasm32/swift-test-results
145145
- name: Upload test results
146146
uses: actions/upload-artifact@v1
147147
with:

CMakeLists.txt

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -903,36 +903,6 @@ function(swift_icu_variables_set sdk arch result)
903903
endif()
904904
endfunction()
905905

906-
if(SWIFT_PRIMARY_VARIANT_SDK STREQUAL "WASI")
907-
set(WASI_ICU_URL "" CACHE STRING
908-
"Download URL for the WASI ICU distribution")
909-
set(WASI_ICU_MD5 "" CACHE STRING
910-
"The expected MD5 hash of the WASI ICU distribution archive")
911-
912-
file(DOWNLOAD "${WASI_ICU_URL}" "${SWIFT_SOURCE_DIR}/../icu.tar.xz"
913-
EXPECTED_HASH MD5=${WASI_ICU_MD5})
914-
915-
get_filename_component(SWIFT_SOURCE_BASEDIR "${SWIFT_SOURCE_DIR}" DIRECTORY)
916-
set(WASI_ICU_OUT_LIB "${SWIFT_SOURCE_BASEDIR}/icu_out/lib")
917-
set(SWIFT_WASI_wasm32_ICU_UC_INCLUDE "${SWIFT_SOURCE_BASEDIR}/icu_out/include")
918-
set(SWIFT_WASI_wasm32_ICU_I18N_INCLUDE "${SWIFT_SOURCE_BASEDIR}/icu_out/include")
919-
set(SWIFT_WASI_wasm32_ICU_UC "${WASI_ICU_OUT_LIB}/libicuuc.a")
920-
set(SWIFT_WASI_wasm32_ICU_I18N "${WASI_ICU_OUT_LIB}/libicui18n.a")
921-
set(SWIFT_WASI_wasm32_ICU_DATA "${WASI_ICU_OUT_LIB}/libicudata.a")
922-
923-
set(WASI_ICU_DISTRIBUTION_TARGET)
924-
add_custom_command_target(WASI_ICU_DISTRIBUTION_TARGET
925-
COMMAND
926-
${CMAKE_COMMAND} -E
927-
tar xfv "${SWIFT_SOURCE_BASEDIR}/icu.tar.xz"
928-
WORKING_DIRECTORY
929-
"${SWIFT_SOURCE_BASEDIR}"
930-
OUTPUT
931-
"${SWIFT_WASI_wasm32_ICU_DATA}"
932-
"${SWIFT_WASI_wasm32_ICU_I18N}"
933-
"${SWIFT_WASI_wasm32_ICU_UC}")
934-
endif()
935-
936906
# ICU is provided through CoreFoundation on Darwin. On other hosts, if the ICU
937907
# unicode and i18n include and library paths are not defined, perform a standard
938908
# package lookup. Otherwise, rely on the paths specified by the user. These
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
set(SWIFT_PRIMARY_VARIANT_SDK WASI CACHE STRING "")
2+
set(SWIFT_PRIMARY_VARIANT_ARCH wasm32 CACHE STRING "")
3+
set(SWIFT_HOST_VARIANT_SDK NONE CACHE STRING "")
4+
set(SWIFT_HOST_VARIANT_ARCH NONE CACHE STRING "")
5+
6+
set(SWIFT_SDKS WASI CACHE STRING "")
7+
8+
set(SWIFT_INCLUDE_TOOLS NO CACHE BOOL "")
9+
set(SWIFT_INCLUDE_TESTS TRUE CACHE BOOL "")
10+
set(SWIFT_INCLUDE_DOCS NO CACHE BOOL "")
11+
12+
set(SWIFT_BUILD_SYNTAXPARSERLIB NO CACHE BOOL "")
13+
set(SWIFT_BUILD_SOURCEKIT NO CACHE BOOL "")
14+
set(SWIFT_ENABLE_SOURCEKIT_TESTS NO CACHE BOOL "")
15+
16+
set(SWIFTWASM_DISABLE_REFLECTION_TEST YES CACHE BOOL "")
17+
18+
# stdlib configurations
19+
set(SWIFT_BUILD_STATIC_STDLIB YES CACHE BOOL "")
20+
set(SWIFT_BUILD_DYNAMIC_STDLIB NO CACHE BOOL "")
21+
set(SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY YES CACHE BOOL "")
22+
# TODO(katei): This should get turned off, as this is not an ABI stable platform.
23+
# But current CMake build system doesn't support SWIFT_STDLIB_STABLE_ABI=NO
24+
set(SWIFT_STDLIB_STABLE_ABI YES CACHE BOOL "")
25+
26+
# build with the host compiler
27+
set(SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER YES CACHE BOOL "")
28+
29+
set(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME YES CACHE BOOL "")

cmake/modules/SwiftConfigureSDK.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,10 +352,10 @@ macro(configure_sdk_unix name architectures)
352352
if(NOT arch STREQUAL wasm32)
353353
message(FATAL_ERROR "unsupported arch for WebAssembly: ${arch}")
354354
endif()
355-
set(SWIFT_SDK_WASI_ARCH_wasm32_PATH "${SWIFT_WASI_SDK_PATH}/share/wasi-sysroot")
355+
set(SWIFT_SDK_WASI_ARCH_wasm32_PATH "${SWIFT_WASI_SYSROOT_PATH}")
356356
set(SWIFT_SDK_WASI_ARCH_wasm32_TRIPLE "wasm32-unknown-wasi")
357-
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_INCLUDE_DIRECTORY "${SWIFT_WASI_SDK_PATH}/share/wasi-sysroot/include")
358-
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_WASI_SDK_PATH}/share/wasi-sysroot/include")
357+
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT_PATH}/include")
358+
set(SWIFT_SDK_WASI_ARCH_wasm32_LIBC_ARCHITECTURE_INCLUDE_DIRECTORY "${SWIFT_WASI_SYSROOT_PATH}/include")
359359
else()
360360
message(FATAL_ERROR "unknown Unix OS: ${prefix}")
361361
endif()

include/swift/AST/IRGenOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ class IRGenOptions {
238238
/// Frameworks that we should not autolink against.
239239
SmallVector<std::string, 1> DisableAutolinkFrameworks;
240240

241+
/// Disable autolinking swiftCore for stdlib thin CMO
242+
unsigned DisableAutolinkStdlib : 1;
243+
241244
/// Print the LLVM inline tree at the end of the LLVM pass pipeline.
242245
unsigned PrintInlineTree : 1;
243246

@@ -351,6 +354,7 @@ class IRGenOptions {
351354
DisableLLVMOptzns(false), DisableSwiftSpecificLLVMOptzns(false),
352355
DisableLLVMSLPVectorizer(false), Playground(false),
353356
EmitStackPromotionChecks(false), FunctionSections(false),
357+
DisableAutolinkStdlib(false),
354358
PrintInlineTree(false), EmbedMode(IRGenEmbedMode::None),
355359
LLVMLTOKind(IRGenLLVMLTOKind::None), HasValueNamesSetting(false),
356360
ValueNames(false), EnableReflectionMetadata(true),

include/swift/Option/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,10 @@ def no_stdlib_rpath: Flag<["-"], "no-stdlib-rpath">,
718718
Flags<[HelpHidden,DoesNotAffectIncrementalBuild]>,
719719
HelpText<"Don't add any rpath entries.">;
720720

721+
def no_stdlib_link: Flag<["-"], "no-stdlib-link">,
722+
Flags<[FrontendOption, DoesNotAffectIncrementalBuild]>,
723+
HelpText<"Don't link stdlib.">;
724+
721725
def static_executable : Flag<["-"], "static-executable">,
722726
HelpText<"Statically link the executable">;
723727
def no_static_executable : Flag<["-"], "no-static-executable">,

lib/Driver/ToolChains.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
304304
}
305305

306306
addLTOArgs(OI, arguments);
307+
inputArgs.AddLastArg(arguments, options::OPT_no_stdlib_link);
307308

308309
// -g implies -enable-anonymous-context-mangled-names, because the extra
309310
// metadata aids debugging.

lib/Driver/WebAssemblyToolChains.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ toolchains::WebAssembly::constructInvocation(const DynamicLinkJobAction &job,
163163
llvm::report_fatal_error(linkFile + " not found");
164164
}
165165

166+
if (context.Args.hasArg(options::OPT_no_stdlib_link)) {
167+
Arguments.push_back("-lswiftStandaloneRuntime");
168+
} else {
169+
Arguments.push_back("-lswiftCore");
170+
}
171+
166172
// Explicitly pass the target to the linker
167173
Arguments.push_back(
168174
context.Args.MakeArgString("--target=" + getTriple().str()));

lib/Frontend/CompilerInvocation.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1553,6 +1553,10 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args,
15531553
A->getAsString(Args), A->getValue());
15541554
}
15551555

1556+
if (Args.hasArg(OPT_no_stdlib_link)) {
1557+
Opts.DisableAutolinkStdlib = true;
1558+
}
1559+
15561560
if (const Arg *A = Args.getLastArg(options::OPT_sanitize_coverage_EQ)) {
15571561
Opts.SanitizeCoverage =
15581562
parseSanitizerCoverageArgValue(A, Triple, Diags, Opts.Sanitizers);

lib/IRGen/GenCall.cpp

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1956,27 +1956,42 @@ std::pair<llvm::Value *, llvm::Value *> irgen::getAsyncFunctionAndSize(
19561956
{ // thin
19571957
IGF.Builder.emitBlock(thinBlock);
19581958
auto *ptr = functionPointer.getRawPointer();
1959-
if (auto authInfo = functionPointer.getAuthInfo()) {
1960-
ptr = emitPointerAuthAuth(IGF, ptr, authInfo);
1961-
}
1962-
auto *afpPtr =
1963-
IGF.Builder.CreateBitCast(ptr, IGF.IGM.AsyncFunctionPointerPtrTy);
1964-
if (emitFunction) {
1965-
llvm::Value *addrPtr = IGF.Builder.CreateStructGEP(afpPtr, 0);
1966-
auto *uncastFnPtr = IGF.emitLoadOfRelativePointer(
1967-
Address(addrPtr, IGF.IGM.getPointerAlignment()), /*isFar*/ false,
1968-
/*expectedType*/ functionPointer.getFunctionType()->getPointerTo());
1969-
auto *fnPtr = IGF.Builder.CreateBitCast(uncastFnPtr, IGF.IGM.Int8PtrTy);
1959+
1960+
// If function pointer is a direct pointer to a function, it could not be
1961+
// an async function pointer. And additive operation to function address is
1962+
// illegal on some archs like wasm32, so emit undefs instead.
1963+
if (isa<llvm::Function>(ptr)) {
1964+
if (emitFunction) {
1965+
auto *undef = llvm::UndefValue::get(IGF.IGM.Int8PtrTy);
1966+
fnPhiValues.push_back({thinBlock, undef});
1967+
}
1968+
if (emitSize) {
1969+
auto *undef = llvm::UndefValue::get(IGF.IGM.Int32Ty);
1970+
sizePhiValues.push_back({thinBlock, undef});
1971+
}
1972+
} else {
19701973
if (auto authInfo = functionPointer.getAuthInfo()) {
1971-
fnPtr = emitPointerAuthSign(IGF, fnPtr, authInfo);
1974+
ptr = emitPointerAuthAuth(IGF, ptr, authInfo);
1975+
}
1976+
auto *afpPtr =
1977+
IGF.Builder.CreateBitCast(ptr, IGF.IGM.AsyncFunctionPointerPtrTy);
1978+
if (emitFunction) {
1979+
llvm::Value *addrPtr = IGF.Builder.CreateStructGEP(afpPtr, 0);
1980+
auto *uncastFnPtr = IGF.emitLoadOfRelativePointer(
1981+
Address(addrPtr, IGF.IGM.getPointerAlignment()), /*isFar*/ false,
1982+
/*expectedType*/ functionPointer.getFunctionType()->getPointerTo());
1983+
auto *fnPtr = IGF.Builder.CreateBitCast(uncastFnPtr, IGF.IGM.Int8PtrTy);
1984+
if (auto authInfo = functionPointer.getAuthInfo()) {
1985+
fnPtr = emitPointerAuthSign(IGF, fnPtr, authInfo);
1986+
}
1987+
fnPhiValues.push_back({thinBlock, fnPtr});
1988+
}
1989+
if (emitSize) {
1990+
auto *sizePtr = IGF.Builder.CreateStructGEP(afpPtr, 1);
1991+
auto *size =
1992+
IGF.Builder.CreateLoad(sizePtr, IGF.IGM.getPointerAlignment());
1993+
sizePhiValues.push_back({thinBlock, size});
19721994
}
1973-
fnPhiValues.push_back({thinBlock, fnPtr});
1974-
}
1975-
if (emitSize) {
1976-
auto *sizePtr = IGF.Builder.CreateStructGEP(afpPtr, 1);
1977-
auto *size =
1978-
IGF.Builder.CreateLoad(sizePtr, IGF.IGM.getPointerAlignment());
1979-
sizePhiValues.push_back({thinBlock, size});
19801995
}
19811996
IGF.Builder.CreateBr(joinBlock);
19821997
}

0 commit comments

Comments
 (0)