diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index b4273f8c2e4c..9cc29cd54593 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -50,17 +50,44 @@ Darwin::Darwin(const Driver &D, const llvm::Triple& Triple) ARCRuntimeForSimulator(ARCSimulator_None), LibCXXForSimulator(LibCXXSimulator_None) { - // Compute the initial Darwin version based on the host. - bool HadExtra; - std::string OSName = Triple.getOSName(); - if (!Driver::GetReleaseVersion(&OSName.c_str()[6], - DarwinVersion[0], DarwinVersion[1], - DarwinVersion[2], HadExtra)) - getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName; - + // Compute the initial Darwin version from the triple + unsigned Major, Minor, Micro; + Triple.getOSVersion(Major, Minor, Micro); + switch (Triple.getOS()) { + default: assert(0 && "unexpected OS for Darwin triple"); + case llvm::Triple::Darwin: + // Default to darwin4, i.e., MacOSX 10.0.0. + if (Major == 0) + Major = 4; + if (Major < 4) + getDriver().Diag(diag::err_drv_invalid_darwin_version) << + Triple.getOSName(); + Micro = 0; + Minor = Major - 4; + Major = 10; + break; + case llvm::Triple::MacOSX: + // Default to MacOSX 10. + if (Major == 0) + Major = 10; + if (Major != 10) + getDriver().Diag(diag::err_drv_invalid_darwin_version) << + Triple.getOSName(); + break; + case llvm::Triple::IOS: + // Ignore the version from the triple. + Major = 10; + Minor = 0; + Micro = 0; + break; + } + // FIXME: DarwinVersion is only used to find GCC's libexec directory. + // It should be removed when we stop supporting that. + DarwinVersion[0] = Minor + 4; + DarwinVersion[1] = Micro; + DarwinVersion[2] = 0; llvm::raw_string_ostream(MacosxVersionMin) - << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.' - << DarwinVersion[1]; + << Major << '.' << Minor << '.' << Micro; } types::ID Darwin::LookupTypeForExtension(const char *Ext) const { diff --git a/clang/test/Driver/darwin-ld.c b/clang/test/Driver/darwin-ld.c index da8f4e0e6b6f..056d34706aa3 100644 --- a/clang/test/Driver/darwin-ld.c +++ b/clang/test/Driver/darwin-ld.c @@ -109,3 +109,11 @@ // RUN: FileCheck -check-prefix=LINK_LAZY_LIBRARY %s < %t.log // LINK_LAZY_LIBRARY: {{ld(.exe)?"}} // LINK_LAZY_LIBRARY: "-lazy_library" "Library" + +// RUN: %clang -target x86_64-apple-darwin10 -### %t.o 2> %t.log +// RUN: %clang -target x86_64-apple-macosx10.7 -### %t.o 2>> %t.log +// RUN: FileCheck -check-prefix=LINK_VERSION_MIN %s < %t.log +// LINK_VERSION_MIN: {{ld(.exe)?"}} +// LINK_VERSION_MIN: "-macosx_version_min" "10.6.0" +// LINK_VERSION_MIN: {{ld(.exe)?"}} +// LINK_VERSION_MIN: "-macosx_version_min" "10.7.0" diff --git a/clang/test/Driver/rewrite-objc.m b/clang/test/Driver/rewrite-objc.m index c1336acad6c8..9e779f76b131 100644 --- a/clang/test/Driver/rewrite-objc.m +++ b/clang/test/Driver/rewrite-objc.m @@ -3,7 +3,7 @@ // TEST0: clang{{.*}}" "-cc1" // TEST0: "-rewrite-objc" // FIXME: CHECK-NOT is broken somehow, it doesn't work here. Check adjacency instead. -// TEST0: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-fragile-abi" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions" "-fdiagnostics-show-option" +// TEST0: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime-has-arc" "-fobjc-runtime-has-weak" "-fobjc-fragile-abi" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions" "-fdiagnostics-show-option" // TEST0: rewrite-objc.m" // RUN: not %clang -ccc-no-clang -target unknown -rewrite-objc %s -o - -### 2>&1 | \