diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h
index 15fe55f..4690277 100644
--- a/include/llvm/ADT/Triple.h
+++ b/include/llvm/ADT/Triple.h
@@ -68,6 +68,39 @@ public:
     amdil,   // amdil: amd IL
     spir     // SPIR: standard portable IR for OpenCL
   };
+
+  enum CPUArch {
+    CA_PPC,
+    CA_PPC601,
+    CA_PPC603,
+    CA_PPC604,
+    CA_PPC604e,
+    CA_PPC750,
+    CA_PPC7400,
+    CA_PPC7450,
+    CA_PPC970,
+    CA_PPC64,
+    CA_I386,
+    CA_I486,
+    CA_I586,
+    CA_I686,
+    CA_Pentium,
+    CA_Pentium2,
+    CA_Pentpro,
+    CA_PentIIm3,
+    CA_X86_64,
+    CA_ARM,
+    CA_ARMv4t,
+    CA_ARMv5,
+    CA_XScale,
+    CA_ARMv6,
+    CA_ARMv7,
+    CA_ARMv7f,
+    CA_ARMv7k,
+    CA_ARMv7s,
+    CA_UnknownCPUArch
+  };
+
   enum VendorType {
     UnknownVendor,
 
@@ -429,7 +462,9 @@ public:
   /// getArchTypeForDarwinArchName - Get the architecture type for a "Darwin"
   /// architecture name, for example as accepted by "gcc -arch" (see also
   /// arch(3)).
+  static ArchType getArchTypeForDarwinCPUArch(CPUArch Arch);
   static ArchType getArchTypeForDarwinArchName(StringRef Str);
+  static CPUArch getCPUArchTypeForDarwinArchName(StringRef Str);
 
   /// @}
 };
diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp
index 2cc7a58..0f93eea 100644
--- a/lib/Support/Triple.cpp
+++ b/lib/Support/Triple.cpp
@@ -181,6 +181,56 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
 }
 
 Triple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
+  CPUArch CA = getCPUArchTypeForDarwinArchName(Str);
+  return getArchTypeForDarwinCPUArch(CA);
+}
+
+Triple::ArchType Triple::getArchTypeForDarwinCPUArch(Triple::CPUArch CA) {
+  switch (CA) {
+  case Triple::CA_UnknownCPUArch:
+    return Triple::UnknownArch;
+
+  case Triple::CA_PPC:
+  case Triple::CA_PPC601:
+  case Triple::CA_PPC603:
+  case Triple::CA_PPC604:
+  case Triple::CA_PPC604e:
+  case Triple::CA_PPC750:
+  case Triple::CA_PPC7400:
+  case Triple::CA_PPC7450:
+  case Triple::CA_PPC970:
+    return Triple::ppc;
+
+  case Triple::CA_PPC64:
+    return Triple::ppc64;
+
+  case Triple::CA_I386:
+  case Triple::CA_I486:
+  case Triple::CA_I586:
+  case Triple::CA_I686:
+  case Triple::CA_Pentium:
+  case Triple::CA_Pentium2:
+  case Triple::CA_Pentpro:
+  case Triple::CA_PentIIm3:
+    return Triple::x86;
+
+  case Triple::CA_X86_64:
+    return Triple::x86_64;
+
+  case Triple::CA_ARM:
+  case Triple::CA_ARMv4t:
+  case Triple::CA_ARMv5:
+  case Triple::CA_XScale:
+  case Triple::CA_ARMv6:
+  case Triple::CA_ARMv7:
+  case Triple::CA_ARMv7f:
+  case Triple::CA_ARMv7k:
+  case Triple::CA_ARMv7s:
+    return Triple::arm;
+  }
+}
+
+Triple::CPUArch Triple::getCPUArchTypeForDarwinArchName(StringRef Arch) {
   // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
   // archs which Darwin doesn't use.
 
@@ -190,26 +240,36 @@ Triple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
   // handling to the architecture name, so we need to be careful before removing
   // support for it.
 
-  // This code must be kept in sync with Clang's Darwin specific argument
-  // translation.
-
-  return StringSwitch<ArchType>(Str)
-    .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", Triple::ppc)
-    .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", Triple::ppc)
-    .Case("ppc64", Triple::ppc64)
-    .Cases("i386", "i486", "i486SX", "i586", "i686", Triple::x86)
-    .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
-           Triple::x86)
-    .Case("x86_64", Triple::x86_64)
-    // This is derived from the driver driver.
-    .Cases("arm", "armv4t", "armv5", "armv6", Triple::arm)
-    .Cases("armv7", "armv7f", "armv7k", "armv7s", "xscale", Triple::arm)
-    .Case("r600", Triple::r600)
-    .Case("nvptx", Triple::nvptx)
-    .Case("nvptx64", Triple::nvptx64)
-    .Case("amdil", Triple::amdil)
-    .Case("spir", Triple::spir)
-    .Default(Triple::UnknownArch);
+  return StringSwitch<CPUArch>(Arch)
+    .Case("ppc", Triple::CA_PPC)
+    .Case("ppc601", Triple::CA_PPC601)
+    .Case("ppc603", Triple::CA_PPC603)
+    .Case("ppc604", Triple::CA_PPC604)
+    .Case("ppc604e", Triple::CA_PPC604e)
+    .Case("ppc750", Triple::CA_PPC750)
+    .Case("ppc7400", Triple::CA_PPC7400)
+    .Case("ppc7450", Triple::CA_PPC7450)
+    .Case("ppc970", Triple::CA_PPC970)
+    .Case("ppc64", Triple::CA_PPC64)
+    .Case("i386", Triple::CA_I386)
+    .Case("i486", Triple::CA_I486)
+    .Case("i586", Triple::CA_I586)
+    .Case("i686", Triple::CA_I686)
+    .Case("pentium", Triple::CA_Pentium)
+    .Case("pentium2", Triple::CA_Pentium2)
+    .Case("pentpro", Triple::CA_Pentpro)
+    .Case("pentIIm3", Triple::CA_PentIIm3)
+    .Case("x86_64", Triple::CA_X86_64)
+    .Case("arm", Triple::CA_ARM)
+    .Case("armv4t", Triple::CA_ARMv4t)
+    .Case("armv5", Triple::CA_ARMv5)
+    .Case("xscale", Triple::CA_XScale)
+    .Case("armv6", Triple::CA_ARMv6)
+    .Case("armv7", Triple::CA_ARMv7)
+    .Case("armv7f", Triple::CA_ARMv7f)
+    .Case("armv7k", Triple::CA_ARMv7k)
+    .Case("armv7s", Triple::CA_ARMv7s)
+    .Default(Triple::CA_UnknownCPUArch);
 }
 
 // Returns architecture name that is understood by the target assembler.
