diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index ca7baef..f1535d8 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1644,20 +1644,6 @@
   }
 }
 
-static bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
-  for (unsigned i=0; i < 3; ++i) {
-    if (A[i] > B[i]) return false;
-    if (A[i] < B[i]) return true;
-  }
-  return false;
-}
-
-static bool isMacosxVersionLT(unsigned (&A)[3],
-                              unsigned V0, unsigned V1=0, unsigned V2=0) {
-  unsigned B[3] = { V0, V1, V2 };
-  return isMacosxVersionLT(A, B);
-}
-
 // FIXME: Can we tablegen this?
 static const char *GetArmArchForMArch(llvm::StringRef Value) {
   if (Value == "armv6k")
@@ -1928,6 +1914,7 @@
   CmdArgs.push_back("-o");
   CmdArgs.push_back(Output.getFilename());
 
+
   unsigned MacosxVersionMin[3];
   getDarwinToolChain().getMacosxVersionMin(Args, MacosxVersionMin);
 
@@ -1937,15 +1924,15 @@
     // Derived from startfile spec.
     if (Args.hasArg(options::OPT_dynamiclib)) {
       // Derived from darwin_dylib1 spec.
-      if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
+      if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5))
         CmdArgs.push_back("-ldylib1.o");
-      else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
+      else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
         CmdArgs.push_back("-ldylib1.10.5.o");
     } else {
       if (Args.hasArg(options::OPT_bundle)) {
         if (!Args.hasArg(options::OPT_static)) {
           // Derived from darwin_bundle1 spec.
-          if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
+          if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6))
             CmdArgs.push_back("-lbundle1.o");
         }
       } else {
@@ -1968,9 +1955,11 @@
             // Derived from darwin_crt1 spec.
             if (getDarwinToolChain().isIPhone()) {
               CmdArgs.push_back("-lcrt1.o");
-            } else if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
+            } else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
+                                                              10, 5))
               CmdArgs.push_back("-lcrt1.o");
-            else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
+            else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
+                                                            10, 6))
               CmdArgs.push_back("-lcrt1.10.5.o");
             else
               CmdArgs.push_back("-lcrt1.10.6.o");
@@ -1983,7 +1972,7 @@
 
     if (Args.hasArg(options::OPT_shared_libgcc) &&
         !Args.hasArg(options::OPT_miphoneos_version_min_EQ) &&
-        isMacosxVersionLT(MacosxVersionMin, 10, 5)) {
+        getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5)) {
       const char *Str =
         Args.MakeArgString(getToolChain().GetFilePath(C, "crt3.o"));
       CmdArgs.push_back(Str);
@@ -2049,21 +2038,24 @@
                  Args.hasArg(options::OPT_fexceptions) ||
                  Args.hasArg(options::OPT_fgnu_runtime)) {
         // FIXME: This is probably broken on 10.3?
-        if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
+        if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 5))
           CmdArgs.push_back("-lgcc_s.10.4");
-        else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
+        else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
+                                                        10, 6))
           CmdArgs.push_back("-lgcc_s.10.5");
       } else {
-        if (isMacosxVersionLT(MacosxVersionMin, 10, 3, 9))
+        if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 3, 9))
           ; // Do nothing.
-        else if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
+        else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
+                                                        10, 5))
           CmdArgs.push_back("-lgcc_s.10.4");
-        else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
+        else if (getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin,
+                                                        10, 6))
           CmdArgs.push_back("-lgcc_s.10.5");
       }
 
       if (getDarwinToolChain().isIPhone() ||
-          isMacosxVersionLT(MacosxVersionMin, 10, 6)) {
+          getDarwinToolChain().isMacosxVersionLT(MacosxVersionMin, 10, 6)) {
         CmdArgs.push_back("-lgcc");
         CmdArgs.push_back("-lSystem");
       } else {
