Centralize the logic for handling -m* options and fix pr16943.
This moves the logic for handling -mfoo -mno-foo from the driver to -cc1. It
also changes -cc1 to apply the options in order, fixing pr16943.
The handling of -mno-mmx -msse is now an explicit special case.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188817 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 788579d..9d6406b 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -2089,7 +2089,8 @@
case SSE2:
Features["sse2"] = true;
case SSE1:
- setMMXLevel(Features, MMX, Enabled);
+ if (!Features.count("mmx"))
+ setMMXLevel(Features, MMX, Enabled);
Features["sse"] = true;
case NoSSE:
break;
@@ -5468,34 +5469,29 @@
llvm::StringMap<bool> Features;
Target->getDefaultFeatures(Features);
- // Apply the user specified deltas.
- // First the enables.
- for (std::vector<std::string>::const_iterator
- it = Opts->FeaturesAsWritten.begin(),
- ie = Opts->FeaturesAsWritten.end();
- it != ie; ++it) {
- const char *Name = it->c_str();
-
- if (Name[0] != '+')
- continue;
-
- // Apply the feature via the target.
- Target->setFeatureEnabled(Features, Name + 1, true);
+ // Fist the last of each option;
+ llvm::StringMap<unsigned> LastOpt;
+ for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
+ I < N; ++I) {
+ const char *Name = Opts->FeaturesAsWritten[I].c_str() + 1;
+ LastOpt[Name] = I;
}
- // Then the disables.
- for (std::vector<std::string>::const_iterator
- it = Opts->FeaturesAsWritten.begin(),
- ie = Opts->FeaturesAsWritten.end();
- it != ie; ++it) {
- const char *Name = it->c_str();
+ // Apply the user specified deltas.
+ for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
+ I < N; ++I) {
+ const char *Name = Opts->FeaturesAsWritten[I].c_str();
- if (Name[0] == '+')
+ // If this option was overridden, ignore it.
+ llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
+ assert(LastI != LastOpt.end());
+ unsigned Last = LastI->second;
+ if (Last != I)
continue;
// Apply the feature via the target.
- assert(Name[0] == '-');
- Target->setFeatureEnabled(Features, Name + 1, false);
+ bool Enabled = Name[0] == '+';
+ Target->setFeatureEnabled(Features, Name + 1, Enabled);
}
// Add the features to the compile options.