]> granicus.if.org Git - clang/commitdiff
Fix more fallout from the introduction of "macosx" and "ios" triples.
authorBob Wilson <bob.wilson@apple.com>
Tue, 31 Jan 2012 21:30:03 +0000 (21:30 +0000)
committerBob Wilson <bob.wilson@apple.com>
Tue, 31 Jan 2012 21:30:03 +0000 (21:30 +0000)
The Darwin toolchain constructor was assuming that all Darwin triples would
have an OS string starting with "darwin".  Triples starting with "macosx"
would misinterpret the version number, and "ios" triples would completely
miss the version number (or worse) because the OS name is not 6 characters
long.  We lose some sanity checking of triple strings here, since the
Triple.getOSVersion function doesn't do all the checking that the previous
code did, but this still seems like a step in the right direction.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149422 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp
test/Driver/darwin-ld.c
test/Driver/rewrite-objc.m

index b4273f8c2e4c87c577a55ff8103660eaef2584f5..9cc29cd5459304bfd2eb3cd5d1257d339b709fa8 100644 (file)
@@ -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 {
index da8f4e0e6b6f6046556743136c679fb7c8ad3cbe..056d34706aa335d011d055a3d854b22af24c22db 100644 (file)
 // 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"
index c1336acad6c81d03c9a46d090bcf6fb5c733b441..9e779f76b13164dc393fb123054b118b78f77d56 100644 (file)
@@ -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 | \