From 57ff12075158bd952553e6fed86833140828fd15 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 1 Apr 2015 05:32:04 +0000 Subject: [PATCH] Add -mcpu=native support to opt. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233789 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/opt/opt.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index c64e907af22..af86e2dbd60 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -39,6 +39,7 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/Host.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" @@ -266,13 +267,28 @@ static TargetMachine* GetTargetMachine(Triple TheTriple) { // Package up features to be passed to target/subtarget std::string FeaturesStr; - if (MAttrs.size()) { + if (MAttrs.size() || MCPU == "native") { SubtargetFeatures Features; + + // If user asked for the 'native' CPU, we need to autodetect features. + // This is necessary for x86 where the CPU might not support all the + // features the autodetected CPU name lists in the target. For example, + // not all Sandybridge processors support AVX. + if (MCPU == "native") { + StringMap HostFeatures; + if (sys::getHostCPUFeatures(HostFeatures)) + for (auto &F : HostFeatures) + Features.AddFeature(F.first(), F.second); + } + for (unsigned i = 0; i != MAttrs.size(); ++i) Features.AddFeature(MAttrs[i]); FeaturesStr = Features.getString(); } + if (MCPU == "native") + MCPU = sys::getHostCPUName(); + return TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr, InitTargetOptionsFromCodeGenFlags(),