From 19c7bb5a223b8cfe6a6807f030dd9a352c19a983 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 13 Feb 2021 10:27:57 -0800 Subject: [PATCH] Driver: add support for baremetal targets This allows building the Swift standard library for targets which may not have an actual OS running. This is identified by the OS field in the target triple being set to `none`. --- lib/Basic/LangOptions.cpp | 6 ++++++ lib/Basic/Platform.cpp | 4 ++-- lib/Driver/Driver.cpp | 2 ++ test/Driver/baremetal-target.swift | 4 ++++ test/Driver/options.swift | 4 ++-- 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 test/Driver/baremetal-target.swift diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp index 048f014fb7a35..4b0c4c1ba7b6d 100644 --- a/lib/Basic/LangOptions.cpp +++ b/lib/Basic/LangOptions.cpp @@ -327,6 +327,12 @@ std::pair LangOptions::setTarget(llvm::Triple triple) { case llvm::Triple::WASI: addPlatformConditionValue(PlatformConditionKind::OS, "WASI"); break; + case llvm::Triple::UnknownOS: + if (Target.getOSName() == "none") { + addPlatformConditionValue(PlatformConditionKind::OS, "none"); + break; + } + LLVM_FALLTHROUGH; default: UnsupportedOS = true; break; diff --git a/lib/Basic/Platform.cpp b/lib/Basic/Platform.cpp index 3c91d7f7d3b99..274a587e99803 100644 --- a/lib/Basic/Platform.cpp +++ b/lib/Basic/Platform.cpp @@ -175,8 +175,6 @@ static StringRef getPlatformNameForDarwin(const DarwinPlatformKind platform) { StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) { switch (triple.getOS()) { - case llvm::Triple::UnknownOS: - llvm_unreachable("unknown OS"); case llvm::Triple::ZOS: case llvm::Triple::Ananas: case llvm::Triple::CloudABI: @@ -234,6 +232,8 @@ StringRef swift::getPlatformNameForTriple(const llvm::Triple &triple) { return "haiku"; case llvm::Triple::WASI: return "wasi"; + case llvm::Triple::UnknownOS: + return "none"; } llvm_unreachable("unsupported OS"); } diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 4b3e384315fdb..bab897c8b4e89 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -368,6 +368,8 @@ Driver::buildToolChain(const llvm::opt::InputArgList &ArgList) { return std::make_unique(*this, target); case llvm::Triple::WASI: return std::make_unique(*this, target); + case llvm::Triple::UnknownOS: + return std::make_unique(*this, target); default: Diags.diagnose(SourceLoc(), diag::error_unknown_target, ArgList.getLastArg(options::OPT_target)->getValue()); diff --git a/test/Driver/baremetal-target.swift b/test/Driver/baremetal-target.swift new file mode 100644 index 0000000000000..25f292954a1c4 --- /dev/null +++ b/test/Driver/baremetal-target.swift @@ -0,0 +1,4 @@ +// RUN: %swiftc_driver_plain -target aarch64-unknwon-none-none -driver-print-jobs %s 2>&1 | %FileCheck %s + +// CHECK: {{.*}}swift{{c|-frontend}}{{(.exe)?"?}} -frontend -c +// CHECK: {{.*}}clang{{(.exe)?"?}} -fuse-ld=gold diff --git a/test/Driver/options.swift b/test/Driver/options.swift index 130eb959bf901..69de3189ad6f3 100644 --- a/test/Driver/options.swift +++ b/test/Driver/options.swift @@ -80,8 +80,8 @@ // RUN: %swift_driver -g -### %s 2>&1 | %FileCheck -check-prefix=OPTIONS_BEFORE_FILE %s // OPTIONS_BEFORE_FILE: -g -// RUN: not %swift_driver -target abc -### %s 2>&1 | %FileCheck -check-prefix=BAD_TARGET %s -// BAD_TARGET: error: unknown target 'abc' +// RUN: not %swiftc_driver_plain -target x86_64-unknown-hurd -### %s 2>&1 | %FileCheck -check-prefix=BAD_TARGET %s +// BAD_TARGET: error: unknown target 'x86_64-unknown-hurd' // RUN: %swiftc_driver -incremental %s -### 2>&1 | %FileCheck -check-prefix=INCREMENTAL_WITHOUT_OFM %s // INCREMENTAL_WITHOUT_OFM: warning: ignoring -incremental (currently requires an output file map)