]> granicus.if.org Git - clang/commitdiff
[X86] Use getHostCPUFeatures when 'native' is specified for cpu.
authorCraig Topper <craig.topper@gmail.com>
Tue, 31 Mar 2015 05:45:00 +0000 (05:45 +0000)
committerCraig Topper <craig.topper@gmail.com>
Tue, 31 Mar 2015 05:45:00 +0000 (05:45 +0000)
This is necessary because not aall Sandybridge, Ivybrige, Haswell, and Broadwell CPUs support AVX. Currently we modify the CPU name back to Nehalem for this case, but that turns off additional features for these CPUs.

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

lib/Driver/Tools.cpp

index 0ec9e5067a57176e484ebdd07fd142b9bb948395..daaea63c7162dfcb5b340183fb5f9e680985bcef 100644 (file)
@@ -1566,6 +1566,17 @@ static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
 static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
                                  const ArgList &Args,
                                  std::vector<const char *> &Features) {
+  // If -march=native, autodetect the feature list.
+  if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
+    if (StringRef(A->getValue()) == "native") {
+      llvm::StringMap<bool> HostFeatures;
+      if (llvm::sys::getHostCPUFeatures(HostFeatures))
+        for (auto &F : HostFeatures)
+          Features.push_back(Args.MakeArgString((F.second ? "+" : "-") +
+                                                F.first()));
+    }
+  }
+
   if (Triple.getArchName() == "x86_64h") {
     // x86_64h implies quite a few of the more modern subtarget features
     // for Haswell class CPUs, but not all of them. Opt-out of a few.