diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -151,6 +151,8 @@ std::pair Split = StringRef(MarchLowerCase).split("+"); llvm::AArch64::ArchKind ArchKind = llvm::AArch64::parseArch(Split.first); + if (Split.first == "native") + ArchKind = llvm::AArch64::getCPUArchKind(llvm::sys::getHostCPUName().str()); if (ArchKind == llvm::AArch64::ArchKind::INVALID || !llvm::AArch64::getArchFeatures(ArchKind, Features)) return false; diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -1299,11 +1299,7 @@ bool HaveVectorSupport = CVT[244] & 0x80; return getCPUNameFromS390Model(Id, HaveVectorSupport); } -#elif defined(__APPLE__) && defined(__aarch64__) -StringRef sys::getHostCPUName() { - return "cyclone"; -} -#elif defined(__APPLE__) && defined(__arm__) +#elif defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) StringRef sys::getHostCPUName() { host_basic_info_data_t hostInfo; mach_msg_type_number_t infoCount; @@ -1314,15 +1310,23 @@ &infoCount); mach_port_deallocate(mach_task_self(), hostPort); - if (hostInfo.cpu_type != CPU_TYPE_ARM) { - assert(false && "CPUType not equal to ARM should not be possible on ARM"); - return "generic"; - } - switch (hostInfo.cpu_subtype) { + if (hostInfo.cpu_type == CPU_TYPE_ARM) { + switch (hostInfo.cpu_subtype) { case CPU_SUBTYPE_ARM_V7S: return "swift"; - default:; + default: + break; } + } else if (hostInfo.cpu_type == CPU_TYPE_ARM64) { + switch (hostInfo.cpu_subtype) { + case CPU_SUBTYPE_ARM64E: + return "apple-m1"; + default: + return "cyclone"; + } + } else { + assert(false && "CPUType not equal to ARM/ARM64 should not be possible"); + } return "generic"; }