Simplifiy target feature handling by coalescing all the logic into
InitializeCompileOptions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86826 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp
index 973b53a..7b22d28 100644
--- a/tools/clang-cc/Options.cpp
+++ b/tools/clang-cc/Options.cpp
@@ -530,15 +530,13 @@
 // Option Object Construction
 //===----------------------------------------------------------------------===//
 
-/// ComputeTargetFeatures - Recompute the target feature list to only
-/// be the list of things that are enabled, based on the target cpu
-/// and feature list.
-void clang::ComputeFeatureMap(TargetInfo &Target,
-                              llvm::StringMap<bool> &Features) {
+void clang::InitializeCompileOptions(CompileOptions &Opts,
+                                     const TargetInfo &Target) {
   using namespace codegenoptions;
-  assert(Features.empty() && "invalid map");
 
-  // Initialize the feature map based on the target.
+  // Compute the target features, we need the target to handle this because
+  // features may have dependencies on one another.
+  llvm::StringMap<bool> Features;
   Target.getDefaultFeatures(TargetCPU, Features);
 
   // Apply the user specified deltas.
@@ -552,20 +550,22 @@
               Name);
       exit(1);
     }
+
+    // Apply the feature via the target.
     if (!Target.setFeatureEnabled(Features, Name + 1, (Name[0] == '+'))) {
       fprintf(stderr, "error: clang-cc: invalid target feature name: %s\n",
               Name + 1);
       exit(1);
     }
   }
-}
 
-void clang::InitializeCompileOptions(CompileOptions &Opts,
-                                     const llvm::StringMap<bool> &Features) {
-  using namespace codegenoptions;
-  Opts.OptimizeSize = OptSize;
-  Opts.DebugInfo = GenerateDebugInfo;
-  Opts.DisableLLVMOpts = DisableLLVMOptimizations;
+  // Add the features to the compile options.
+  //
+  // FIXME: If we are completely confident that we have the right set, we only
+  // need to pass the minuses.
+  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
+         ie = Features.end(); it != ie; ++it)
+    Opts.Features.push_back(std::string(it->second ? "+" : "-") + it->first());
 
   // -Os implies -O2
   Opts.OptimizationLevel = OptSize ? 2 : OptLevel;
@@ -574,30 +574,20 @@
   Opts.Inlining = (Opts.OptimizationLevel > 1) ? CompileOptions::NormalInlining
     : CompileOptions::OnlyAlwaysInlining;
 
-  Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !OptSize);
+  Opts.CPU = TargetCPU;
+  Opts.DebugInfo = GenerateDebugInfo;
+  Opts.DisableLLVMOpts = DisableLLVMOptimizations;
+  Opts.DisableRedZone = DisableRedZone;
+  Opts.MergeAllConstants = !NoMergeConstants;
+  Opts.NoCommon = NoCommon;
+  Opts.NoImplicitFloat = NoImplicitFloat;
+  Opts.OptimizeSize = OptSize;
   Opts.SimplifyLibCalls = 1;
+  Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !OptSize);
 
 #ifdef NDEBUG
   Opts.VerifyModule = 0;
 #endif
-
-  Opts.CPU = TargetCPU;
-  Opts.Features.clear();
-  for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
-         ie = Features.end(); it != ie; ++it) {
-    // FIXME: If we are completely confident that we have the right set, we only
-    // need to pass the minuses.
-    std::string Name(it->second ? "+" : "-");
-    Name += it->first();
-    Opts.Features.push_back(Name);
-  }
-
-  Opts.NoCommon = NoCommon;
-
-  Opts.DisableRedZone = DisableRedZone;
-  Opts.NoImplicitFloat = NoImplicitFloat;
-
-  Opts.MergeAllConstants = !NoMergeConstants;
 }
 
 void clang::InitializeDiagnosticOptions(DiagnosticOptions &Opts) {
@@ -769,8 +759,7 @@
 
 void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
                                   TargetInfo &Target,
-                                  const CompileOptions &CompileOpts,
-                                  const llvm::StringMap<bool> &Features) {
+                                  const CompileOptions &CompileOpts) {
   using namespace langoptions;
 
   bool NoPreprocess = false;
@@ -836,7 +825,7 @@
 
   // Pass the map of target features to the target for validation and
   // processing.
-  Target.HandleTargetFeatures(Features);
+  Target.HandleTargetFeatures(CompileOpts.Features);
 
   if (LangStd == lang_unspecified) {
     // Based on the base language, pick one.
diff --git a/tools/clang-cc/Options.h b/tools/clang-cc/Options.h
index aacf0a3..6d1447d 100644
--- a/tools/clang-cc/Options.h
+++ b/tools/clang-cc/Options.h
@@ -10,7 +10,7 @@
 #ifndef LLVM_CLANGCC_OPTIONS_H
 #define LLVM_CLANGCC_OPTIONS_H
 
-#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
 
 namespace clang {
 
@@ -39,14 +39,10 @@
 
 void InitializeAnalyzerOptions(AnalyzerOptions &Opts);
 
-// FIXME: This can be sunk into InitializeCompileOptions now that that happens
-// before language initialization?
-void ComputeFeatureMap(TargetInfo &Target, llvm::StringMap<bool> &Features);
-
 void InitializeDiagnosticOptions(DiagnosticOptions &Opts);
 
 void InitializeCompileOptions(CompileOptions &Opts,
-                              const llvm::StringMap<bool> &Features);
+                              const TargetInfo &Target);
 
 void InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
                                    llvm::StringRef BuiltinIncludePath,
@@ -55,8 +51,7 @@
 
 void InitializeLangOptions(LangOptions &Options, LangKind LK,
                            TargetInfo &Target,
-                           const CompileOptions &CompileOpts,
-                           const llvm::StringMap<bool> &Features);
+                           const CompileOptions &CompileOpts);
 
 void InitializePreprocessorOptions(PreprocessorOptions &Opts);
 
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 2a40656..fd1153c 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -1099,12 +1099,9 @@
 
   Opts.getOutputFile() = OutputFile;
 
-  // Compute the feature set, which may effect the language.
-  ComputeFeatureMap(Target, Opts.getTargetFeatures());
-
   // Initialize backend options, which may also be used to key some language
   // options.
-  InitializeCompileOptions(Opts.getCompileOpts(), Opts.getTargetFeatures());
+  InitializeCompileOptions(Opts.getCompileOpts(), Target);
 
   // Initialize language options.
   LangOptions LangInfo;
@@ -1113,7 +1110,7 @@
   // code path to make this obvious.
   if (LK != langkind_ast)
     InitializeLangOptions(Opts.getLangOpts(), LK, Target,
-                          Opts.getCompileOpts(), Opts.getTargetFeatures());
+                          Opts.getCompileOpts());
 
   // Initialize the header search options.
   InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(),