From: Akira Hatanaka Date: Wed, 6 May 2015 23:49:24 +0000 (+0000) Subject: Factor out a function which determines the cpu and feature strings based on X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=4f28a76c2564066e23a7925738b11c3e933c5902;p=oota-llvm.git Factor out a function which determines the cpu and feature strings based on command line options -mcpu and -mattr. NFC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236671 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/CommandFlags.h b/include/llvm/CodeGen/CommandFlags.h index 7fed8261e68..8d206ec0226 100644 --- a/include/llvm/CodeGen/CommandFlags.h +++ b/include/llvm/CodeGen/CommandFlags.h @@ -17,8 +17,10 @@ #define LLVM_CODEGEN_COMMANDFLAGS_H #include "llvm/MC/MCTargetOptionsCommandFlags.h" +#include "llvm//MC/SubtargetFeature.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Host.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include @@ -260,4 +262,33 @@ static inline TargetOptions InitTargetOptionsFromCodeGenFlags() { return Options; } +static inline std::string getCPUStr() { + // If user asked for the 'native' CPU, autodetect here. If autodection fails, + // this will set the CPU to an empty string which tells the target to + // pick a basic default. + if (MCPU == "native") + return sys::getHostCPUName(); + + return MCPU; +} + +static inline std::string getFeaturesStr() { + 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, + 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]); + + return Features.getString(); +} + #endif diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index ab50f2a7802..7ef45b3feca 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -248,32 +248,7 @@ static int compileModule(char **argv, LLVMContext &Context) { return 1; } - // Package up features to be passed to target/subtarget - std::string FeaturesStr; - if (!MAttrs.empty() || 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 user asked for the 'native' CPU, autodetect here. If autodection fails, - // this will set the CPU to an empty string which tells the target to - // pick a basic default. - if (MCPU == "native") - MCPU = sys::getHostCPUName(); + std::string CPUStr = getCPUStr(), FeaturesStr = getFeaturesStr(); CodeGenOpt::Level OLvl = CodeGenOpt::Default; switch (OptLevel) { @@ -294,8 +269,9 @@ static int compileModule(char **argv, LLVMContext &Context) { Options.MCOptions.AsmVerbose = AsmVerbose; std::unique_ptr Target( - TheTarget->createTargetMachine(TheTriple.getTriple(), MCPU, FeaturesStr, + TheTarget->createTargetMachine(TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RelocModel, CMModel, OLvl)); + assert(Target && "Could not allocate target machine!"); // If we don't have a module then just exit now. We do this down diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp index 80b1934366a..8f2b3f7a72b 100644 --- a/tools/opt/opt.cpp +++ b/tools/opt/opt.cpp @@ -264,7 +264,8 @@ static CodeGenOpt::Level GetCodeGenOptLevel() { } // Returns the TargetMachine instance or zero if no triple is provided. -static TargetMachine* GetTargetMachine(Triple TheTriple) { +static TargetMachine* GetTargetMachine(Triple TheTriple, StringRef CPUStr, + StringRef FeaturesStr) { std::string Error; const Target *TheTarget = TargetRegistry::lookupTarget(MArch, TheTriple, Error); @@ -273,32 +274,8 @@ static TargetMachine* GetTargetMachine(Triple TheTriple) { return nullptr; } - // Package up features to be passed to target/subtarget - std::string FeaturesStr; - 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, + CPUStr, FeaturesStr, InitTargetOptionsFromCodeGenFlags(), RelocModel, CMModel, GetCodeGenOptLevel()); @@ -407,9 +384,14 @@ int main(int argc, char **argv) { } Triple ModuleTriple(M->getTargetTriple()); + std::string CPUStr, FeaturesStr; TargetMachine *Machine = nullptr; - if (ModuleTriple.getArch()) - Machine = GetTargetMachine(ModuleTriple); + if (ModuleTriple.getArch()) { + CPUStr = getCPUStr(); + FeaturesStr = getFeaturesStr(); + Machine = GetTargetMachine(ModuleTriple, CPUStr, FeaturesStr); + } + std::unique_ptr TM(Machine); // If the output is set to be emitted to standard out, and standard out is a