From 23b1a6b87afee535296a786dcdd2a6d0e65d67ef Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Tue, 3 Dec 2019 18:12:24 -0800 Subject: [PATCH] Driver: add support for WASI/WASM toolchain Treat WASM/WASI as a generic Unix toolchain. This adds the necessary support to build a toolchain for WASM/WASI. --- lib/Basic/Platform.cpp | 3 ++- lib/Driver/Driver.cpp | 2 ++ test/Driver/linker.swift | 12 +++++++++++- test/Driver/profiling.swift | 6 ++++++ test/Driver/sdk.swift | 9 +++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/Basic/Platform.cpp b/lib/Basic/Platform.cpp index 10ebfd36c53b5..06bc996822217 100644 --- a/lib/Basic/Platform.cpp +++ b/lib/Basic/Platform.cpp @@ -163,7 +163,6 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) { case llvm::Triple::AMDPAL: case llvm::Triple::HermitCore: case llvm::Triple::Hurd: - case llvm::Triple::WASI: return ""; case llvm::Triple::Darwin: case llvm::Triple::MacOSX: @@ -191,6 +190,8 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) { return "ps4"; case llvm::Triple::Haiku: return "haiku"; + case llvm::Triple::WASI: + return "wasi"; } llvm_unreachable("unsupported OS"); } diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 75dc1e933a1e5..b91e3a14ee233 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -265,6 +265,8 @@ Driver::buildToolChain(const llvm::opt::InputArgList &ArgList) { return llvm::make_unique(*this, target); case llvm::Triple::Haiku: return llvm::make_unique(*this, target); + case llvm::Triple::WASI: + return llvm::make_unique(*this, target); default: Diags.diagnose(SourceLoc(), diag::error_unknown_target, ArgList.getLastArg(options::OPT_target)->getValue()); diff --git a/test/Driver/linker.swift b/test/Driver/linker.swift index e71525aa69789..7b5f0c3425a8d 100644 --- a/test/Driver/linker.swift +++ b/test/Driver/linker.swift @@ -56,6 +56,8 @@ // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-windows-msvc -Xclang-linker -foo -Xclang-linker foopath %s 2>&1 > %t.windows.txt // RUN: %FileCheck -check-prefix WINDOWS-clang-linker-order %s < %t.windows.txt +// RUN: %swiftc_driver -driver-print-jobs -target wasm32-unknown-wasi -Xclang-linker -flag -Xclang-linker arg %s 2>&1 | %FileCheck -check-prefix WASI-clang-linker-order %s + // RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.9 -g %s | %FileCheck -check-prefix DEBUG %s // RUN: %empty-directory(%t) @@ -83,6 +85,7 @@ // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-linux-gnu -emit-library %s -module-name LINKER | %FileCheck -check-prefix INFERRED_NAME_LINUX %s // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-windows-cygnus -emit-library %s -module-name LINKER | %FileCheck -check-prefix INFERRED_NAME_WINDOWS %s // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-windows-msvc -emit-library %s -module-name LINKER | %FileCheck -check-prefix INFERRED_NAME_WINDOWS %s +// RUN: %swiftc_driver -driver-print-jobs -target wasm32-unknown-wasi -emit-library %s -module-name LINKER | %FileCheck -check-prefix INFERRED_NAME_WASI %s // Here we specify an output file name using '-o'. For ease of writing these // tests, we happen to specify the same file name as is inferred in the @@ -322,6 +325,13 @@ // WINDOWS-clang-linker-order: -foo foopath // WINDOWS-clang-linker-order: -o {{.*}} +// WASI-clang-linker-order: swift +// WASI-clang-linker-order: -o [[OBJECTFILE:.*]] + +// WASI-clang-linker-order: clang{{"? }} +// WASI-clang-linker-order: -flag arg +// WASI-clang-linker-order: -o {{.*}} + // DEBUG: bin{{/|\\\\}}swift{{c?(\.EXE)?}} // DEBUG-NEXT: bin{{/|\\\\}}swift{{c?(\.EXE)?}} // DEBUG-NEXT: {{(bin/)?}}ld{{"? }} @@ -362,7 +372,7 @@ // INFERRED_NAME_DARWIN: -o libLINKER.dylib // INFERRED_NAME_LINUX: -o libLINKER.so // INFERRED_NAME_WINDOWS: -o LINKER.dll - +// INFERRED_NAME_WASI: -o libLINKER.so // Test ld detection. We use hard links to make sure // the Swift driver really thinks it's been moved. diff --git a/test/Driver/profiling.swift b/test/Driver/profiling.swift index 75dab36e7323b..f70ec0fe63fae 100644 --- a/test/Driver/profiling.swift +++ b/test/Driver/profiling.swift @@ -20,6 +20,8 @@ // RUN: %swiftc_driver -driver-print-jobs -profile-generate -target x86_64-unknown-linux-gnu %s | %FileCheck -check-prefix=CHECK -check-prefix=LINUX %s // RUN: %swiftc_driver -driver-print-jobs -profile-generate -target x86_64-unknown-windows-msvc %s | %FileCheck -check-prefix=CHECK -check-prefix=WINDOWS %s +// RUN: %swiftc_driver -driver-print-jobs -profile-generate -target wasm32-unknown-wasi %s | %FileCheck -check-prefix CHECK -check-prefix WASI %s + // CHECK: swift // CHECK: -profile-generate @@ -52,6 +54,10 @@ // WINDOWS: lib{{(\\\\|/)}}swift{{(\\\\|/)}}clang{{(\\\\|/)}}lib{{(\\\\|/)}}windows{{(\\\\|/)}}clang_rt.profile-x86_64.lib // WINDOWS: -u__llvm_profile_runtime +// WASI: clang{{(\.exe)?"? }} +// WASI: lib{{(\\\\|/)}}swift{{(\\\\|/)}}clang{{(\\\\|/)}}lib{{(\\\\|/)}}wasi{{(\\\\|/)}}libclang_rt.profile-wasm32.a +// WASI: -u__llvm_profile_runtime + // RUN: not %swiftc_driver -driver-print-jobs -profile-generate -profile-use=/dev/null %s 2>&1 | %FileCheck -check-prefix=MIX_GEN_USE %s // MIX_GEN_USE: conflicting options '-profile-generate' and '-profile-use' diff --git a/test/Driver/sdk.swift b/test/Driver/sdk.swift index 2accb502e4319..98cc05c55160c 100644 --- a/test/Driver/sdk.swift +++ b/test/Driver/sdk.swift @@ -2,6 +2,7 @@ // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-linux-gnu -g -sdk %S/../Inputs/clang-importer-sdk %s 2>&1 | %FileCheck %s --check-prefix LINUX // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-freebsd -g -sdk %S/../Inputs/clang-importer-sdk %s 2>&1 | %FileCheck %s --check-prefix FREEBSD // RUN: %swiftc_driver -driver-print-jobs -target x86_64-unknown-windows-msvc -g -sdk %S/../Inputs/clang-importer-sdk %s 2>&1 | %FileCheck %s --check-prefix WINDOWS +// RUN: %swiftc_driver -driver-print-jobs -target wasm32-unknown-wasi -g -sdk %S/../Inputs/clang-importer-sdk %s 2>&1 | %FileCheck %s --check-prefix WASI // RUN: env SDKROOT=%S/../Inputs/clang-importer-sdk %swiftc_driver_plain -target x86_64-apple-macosx10.9 -g -driver-print-jobs %s 2>&1 | %FileCheck %s --check-prefix OSX // RUN: env SDKROOT=%S/../Inputs/clang-importer-sdk %swiftc_driver_plain -target x86_64-unknown-linux-gnu -g -driver-print-jobs %s 2>&1 | %FileCheck %s --check-prefix LINUX @@ -44,6 +45,14 @@ // WINDOWS: {{.*}}Inputs/clang-importer-sdk{{.*}}swiftrt.o // WINDOWS: {{-I}} {{.*}}/Inputs/clang-importer-sdk +// WASI-NOT: warning: no such SDK: +// WASI: bin{{/|\\\\}}swift +// WASI: Driver{{/|\\\\}}sdk.swift +// WASI: -sdk {{.*}}/Inputs/clang-importer-sdk +// WASI-NEXT: bin{{/|\\\\}}swift +// WASI: -sdk {{.*}}/Inputs/clang-importer-sdk +// WASI: {{-syslibroot|--sysroot}} {{.*}}/Inputs/clang-importer-sdk + // RUN: %swift_driver -driver-print-jobs -repl -sdk %S/Inputs/nonexistent-sdk 2>&1 | %FileCheck %s --check-prefix=SDKWARNING // RUN: %swift_driver -driver-print-jobs -sdk %S/Inputs/nonexistent-sdk 2>&1 | %FileCheck %s --check-prefix=SDKWARNING // RUN: env SDKROOT=%S/Inputs/nonexistent-sdk %swift_driver_plain -driver-print-jobs -repl 2>&1 | %FileCheck %s --check-prefix=SDKWARNING