diff --git a/include/swift/AST/DiagnosticsDriver.def b/include/swift/AST/DiagnosticsDriver.def index 033bdf555e343..021d446abd0d9 100644 --- a/include/swift/AST/DiagnosticsDriver.def +++ b/include/swift/AST/DiagnosticsDriver.def @@ -162,6 +162,9 @@ ERROR(cannot_find_migration_script, none, ERROR(error_darwin_static_stdlib_not_supported, none, "-static-stdlib is no longer supported on Apple platforms", ()) +WARNING(warn_darwin_link_objc_deprecated, none, + "-link-objc-runtime is no longer supported on Apple platforms", ()) + ERROR(error_darwin_only_supports_libcxx, none, "The only C++ standard library supported on Apple platforms is libc++", ()) diff --git a/include/swift/Option/Options.td b/include/swift/Option/Options.td index 02300bd795117..116f760a3f74c 100644 --- a/include/swift/Option/Options.td +++ b/include/swift/Option/Options.td @@ -805,11 +805,14 @@ def L_EQ : Joined<["-"], "L=">, Group, Flags<[FrontendOption, DoesNotAffectIncrementalBuild, ArgumentIsPath]>, Alias; +// Accept but ignore these flags. They were once used to control +// linking of arclite, which is no longer used on Darwin. def link_objc_runtime : Flag<["-"], "link-objc-runtime">, - Flags<[DoesNotAffectIncrementalBuild]>; + Flags<[DoesNotAffectIncrementalBuild]>, + HelpText<"Deprecated">; def no_link_objc_runtime : Flag<["-"], "no-link-objc-runtime">, Flags<[HelpHidden, DoesNotAffectIncrementalBuild]>, - HelpText<"Don't link in additions to the Objective-C runtime">; + HelpText<"Deprecated">; def static_stdlib: Flag<["-"], "static-stdlib">, Flags<[DoesNotAffectIncrementalBuild]>, diff --git a/lib/Driver/DarwinToolChains.cpp b/lib/Driver/DarwinToolChains.cpp index 18ae1ac67b9af..2dc483ec85de7 100644 --- a/lib/Driver/DarwinToolChains.cpp +++ b/lib/Driver/DarwinToolChains.cpp @@ -221,27 +221,6 @@ static void addVersionString(const ArgList &inputArgs, ArgStringList &arguments, arguments.push_back(inputArgs.MakeArgString(os.str())); } -/// Returns true if the compiler depends on features provided by the ObjC -/// runtime that are not present on the deployment target indicated by -/// \p triple. -static bool wantsObjCRuntime(const llvm::Triple &triple) { - assert((!triple.isTvOS() || triple.isiOS()) && - "tvOS is considered a kind of iOS"); - - // When updating the versions listed here, please record the most recent - // feature being depended on and when it was introduced: - // - // - Make assigning 'nil' to an NSMutableDictionary subscript delete the - // entry, like it does for Swift.Dictionary, rather than trap. - if (triple.isiOS()) - return triple.isOSVersionLT(9); - if (triple.isMacOSX()) - return triple.isMacOSXVersionLT(10, 11); - if (triple.isWatchOS()) - return false; - llvm_unreachable("unknown Darwin OS"); -} - void toolchains::Darwin::addLinkerInputArgs(InvocationInfo &II, const JobContext &context) const { @@ -278,48 +257,6 @@ toolchains::Darwin::addLinkerInputArgs(InvocationInfo &II, file_types::TY_SwiftModuleFile, "-add_ast_path"); } -static void findARCLiteLibPath(const toolchains::Darwin &TC, - llvm::SmallVectorImpl &ARCLiteLib) { - auto& D = TC.getDriver(); - llvm::sys::path::append(ARCLiteLib, D.getSwiftProgramPath()); - - llvm::sys::path::remove_filename(ARCLiteLib); // 'swift' - llvm::sys::path::remove_filename(ARCLiteLib); // 'bin' - llvm::sys::path::append(ARCLiteLib, "lib", "arc"); - - if (!llvm::sys::fs::is_directory(ARCLiteLib)) { - // If we don't have a 'lib/arc/' directory, find the "arclite" library - // relative to the Clang in the active Xcode. - ARCLiteLib.clear(); - findXcodeClangLibPath("arc", ARCLiteLib); - } -} - -void -toolchains::Darwin::addArgsToLinkARCLite(ArgStringList &Arguments, - const JobContext &context) const { - if (!context.Args.hasFlag(options::OPT_link_objc_runtime, - options::OPT_no_link_objc_runtime, - /*Default=*/wantsObjCRuntime(getTriple()))) - return; - - llvm::SmallString<128> ARCLiteLib; - findARCLiteLibPath(*this, ARCLiteLib); - - if (!ARCLiteLib.empty()) { - llvm::sys::path::append(ARCLiteLib, "libarclite_"); - ARCLiteLib += getPlatformNameForTriple(getTriple()); - ARCLiteLib += ".a"; - - Arguments.push_back("-force_load"); - Arguments.push_back(context.Args.MakeArgString(ARCLiteLib)); - - // Arclite depends on CoreFoundation. - Arguments.push_back("-framework"); - Arguments.push_back("CoreFoundation"); - } -} - void toolchains::Darwin::addLTOLibArgs(ArgStringList &Arguments, const JobContext &context) const { if (!context.OI.LibLTOPath.empty()) { @@ -741,8 +678,6 @@ toolchains::Darwin::constructInvocation(const DynamicLinkJobAction &job, if (llvm::sys::fs::exists(CompilerRTPath)) Arguments.push_back(context.Args.MakeArgString(CompilerRTPath)); - addArgsToLinkARCLite(Arguments, context); - if (job.shouldPerformLTO()) { addLTOLibArgs(Arguments, context); } @@ -857,23 +792,6 @@ std::string toolchains::Darwin::getGlobalDebugPathRemapping() const { return {}; } -static void validateLinkObjcRuntimeARCLiteLib(const toolchains::Darwin &TC, - DiagnosticEngine &diags, - const llvm::opt::ArgList &args) { - auto Triple = TC.getTriple(); - if (args.hasFlag(options::OPT_link_objc_runtime, - options::OPT_no_link_objc_runtime, - /*Default=*/wantsObjCRuntime(Triple))) { - llvm::SmallString<128> ARCLiteLib; - findARCLiteLibPath(TC, ARCLiteLib); - - if (ARCLiteLib.empty()) { - diags.diagnose(SourceLoc(), - diag::warn_arclite_not_found_when_link_objc_runtime); - } - } -} - static void validateDeploymentTarget(const toolchains::Darwin &TC, DiagnosticEngine &diags, const llvm::opt::ArgList &args) { @@ -927,15 +845,6 @@ void toolchains::Darwin::validateArguments(DiagnosticEngine &diags, const llvm::opt::ArgList &args, StringRef defaultTarget) const { - if (!getDriver().isDummyDriverForFrontendInvocation()) { - // Validating arclite library path when link-objc-runtime. - // If the driver is just set up to retrieve the swift-frontend invocation, - // we don't care about link-time, so we can skip this step, which may be - // expensive since it might call to `xcrun` to find `clang` and `arclite` - // relative to `clang`. - validateLinkObjcRuntimeARCLiteLib(*this, diags, args); - } - // Validating apple platforms deployment targets. validateDeploymentTarget(*this, diags, args); validateTargetVariant(*this, diags, args, defaultTarget); @@ -945,6 +854,12 @@ toolchains::Darwin::validateArguments(DiagnosticEngine &diags, diags.diagnose(SourceLoc(), diag::error_darwin_static_stdlib_not_supported); } + // Validating darwin deprecated -link-objc-runtime. + if (args.hasArg(options::OPT_link_objc_runtime, + options::OPT_no_link_objc_runtime)) { + diags.diagnose(SourceLoc(), diag::warn_darwin_link_objc_deprecated); + } + // If a C++ standard library is specified, it has to be libc++. if (auto arg = args.getLastArg(options::OPT_experimental_cxx_stdlib)) { if (StringRef(arg->getValue()) != "libc++") { diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 33e38ec83a5fa..c30b04809e4f1 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -31,9 +31,6 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { void addLinkerInputArgs(InvocationInfo &II, const JobContext &context) const; - void addArgsToLinkARCLite(llvm::opt::ArgStringList &Arguments, - const JobContext &context) const; - void addSanitizerArgs(llvm::opt::ArgStringList &Arguments, const DynamicLinkJobAction &job, const JobContext &context) const; diff --git a/test/Driver/linker-arclite.swift b/test/Driver/linker-arclite.swift index 1ffc63c46ebe3..20d7fc4f6f228 100644 --- a/test/Driver/linker-arclite.swift +++ b/test/Driver/linker-arclite.swift @@ -2,31 +2,14 @@ // Note: This is really about the /host/ environment, but since there are RUN // lines for multiple targets anyway it doesn't make a huge difference. -// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.9 %S/../Inputs/empty.swift | %FileCheck %s - -// CHECK: bin/ld{{"? }} -// CHECK-SAME: -force_load {{[^ ]+/lib/arc/libarclite_macosx.a}} -framework CoreFoundation -// CHECK-SAME: -o {{[^ ]+}} - - -// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios8.0-simulator %S/../Inputs/empty.swift | %FileCheck -check-prefix IOS_ARCLITE %s - -// IOS_ARCLITE: bin/ld{{"? }} -// IOS_ARCLITE: -force_load {{[^ ]+/lib/arc/libarclite_iphonesimulator.a}} -// IOS_ARCLITE: -o {{[^ ]+}} - +// The libarclite library is no longer used for any Darwin platform, so this now just verifies that we never request it // RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.11 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s -// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-macosx10.10 %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s // RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios9-simulator %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s -// RUN: %swiftc_driver -driver-print-jobs -target x86_64-apple-ios8-simulator %S/../Inputs/empty.swift | %FileCheck -check-prefix ANY_ARCLITE %s // RUN: %swiftc_driver -driver-print-jobs -target arm64-apple-tvos9 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s // RUN: %swiftc_driver -driver-print-jobs -target armv7k-apple-watchos2 %S/../Inputs/empty.swift | %FileCheck -check-prefix NO_ARCLITE %s // NO_ARCLITE: bin/ld{{"? }} // NO_ARCLITE-NOT: arclite +// NO_ARCLITE-NOT: CoreFoundation // NO_ARCLITE: -o {{[^ ]+}} - -// ANY_ARCLITE: bin/ld{{"? }} -// ANY_ARCLITE: -force_load {{[^ ]+}}/lib/arc/libarclite_{{.+}}.a -// ANY_ARCLITE: -o {{[^ ]+}} diff --git a/test/Driver/options-apple.swift b/test/Driver/options-apple.swift new file mode 100644 index 0000000000000..007da68e4b86c --- /dev/null +++ b/test/Driver/options-apple.swift @@ -0,0 +1,6 @@ +// REQUIRES: swift_interpreter +// REQUIRES: OS=macosx + +// RUN: %swift_driver -link-objc-runtime %s 2>&1 | %FileCheck -check-prefix LINK_OBJC_RUNTIME_WARNING %s +// RUN: %swift_driver -no-link-objc-runtime %s 2>&1 | %FileCheck -check-prefix LINK_OBJC_RUNTIME_WARNING %s +// LINK_OBJC_RUNTIME_WARNING: warning: -link-objc-runtime is no longer supported on Apple platforms diff --git a/test/Driver/options-interpreter.swift b/test/Driver/options-interpreter.swift index 436c345d3e66b..c5b0598ea59f1 100644 --- a/test/Driver/options-interpreter.swift +++ b/test/Driver/options-interpreter.swift @@ -28,7 +28,6 @@ // CHECK-L2: # DYLD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/macosx$}} // RUN: env DYLD_LIBRARY_PATH=/abc/ SDKROOT=/sdkroot %swift_driver_plain -### -target x86_64-apple-macosx10.9 -L/foo/ -L/bar/ %s 2>&1 | %FileCheck -check-prefix=CHECK-L2-ENV %s -// CHECK-L2-ENV: warning: unable to find Objective-C runtime support library 'arclite'; pass '-no-link-objc-runtime' to silence this warning // CHECK-L2-ENV: # DYLD_LIBRARY_PATH={{/foo/:/bar/:[^:]+/lib/swift/macosx:/sdkroot/usr/lib/swift:/abc/$}} // RUN: %swift_driver_plain -### -target x86_64-apple-macosx10.9 %s | %FileCheck -check-prefix=CHECK-NO-FRAMEWORKS %s @@ -53,7 +52,6 @@ // CHECK-F2-ENV: DYLD_FRAMEWORK_PATH=/foo/:/bar/:/abc/{{$}} // RUN: env DYLD_FRAMEWORK_PATH=/abc/ SDKROOT=/sdkroot %swift_driver_plain -### -target x86_64-apple-macosx10.9 -F/foo/ -F/bar/ -L/foo2/ -L/bar2/ %s 2>&1 | %FileCheck -check-prefix=CHECK-COMPLEX %s -// CHECK-COMPLEX: warning: unable to find Objective-C runtime support library 'arclite'; pass '-no-link-objc-runtime' to silence this warning // CHECK-COMPLEX: -F /foo/ // CHECK-COMPLEX: -F /bar/ // CHECK-COMPLEX: #