summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-08-20 18:57:55 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-08-20 18:57:55 +0000
commitdb0fcfbfaeb2e401c06ca55a431755f11af76720 (patch)
treed3e8950d691e4923c09083deb069c73c5d76ac73
parent9427939f65fd757da5b460ca923f1b56ae38a3a0 (diff)
downloadbcm5719-llvm-db0fcfbfaeb2e401c06ca55a431755f11af76720.tar.gz
bcm5719-llvm-db0fcfbfaeb2e401c06ca55a431755f11af76720.zip
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. llvm-svn: 188817
-rw-r--r--clang/lib/Basic/Targets.cpp44
-rw-r--r--clang/lib/Driver/Tools.cpp21
-rw-r--r--clang/test/Driver/x86_features.c5
-rw-r--r--clang/test/Preprocessor/x86_target_features.c12
4 files changed, 36 insertions, 46 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 788579de7a1..9d6406be257 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -2089,7 +2089,8 @@ void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
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 @@ TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
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();
-
- if (Name[0] == '+')
+ // 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 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.
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 3257946d28d..fc7c726a788 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -1335,14 +1335,6 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
CmdArgs.push_back(CPUName);
}
- // The required algorithm here is slightly strange: the options are applied
- // in order (so -mno-sse -msse2 disables SSE3), but any option that gets
- // directly overridden later is ignored (so "-mno-sse -msse2 -mno-sse2 -msse"
- // is equivalent to "-mno-sse2 -msse"). The -cc1 handling deals with the
- // former correctly, but not the latter; handle directly-overridden
- // attributes here.
- llvm::StringMap<unsigned> PrevFeature;
- std::vector<const char*> Features;
for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
ie = Args.filtered_end(); it != ie; ++it) {
StringRef Name = (*it)->getOption().getName();
@@ -1356,17 +1348,8 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
if (IsNegative)
Name = Name.substr(3);
- unsigned& Prev = PrevFeature[Name];
- if (Prev)
- Features[Prev - 1] = 0;
- Prev = Features.size() + 1;
- Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
- }
- for (unsigned i = 0; i < Features.size(); i++) {
- if (Features[i]) {
- CmdArgs.push_back("-target-feature");
- CmdArgs.push_back(Features[i]);
- }
+ CmdArgs.push_back("-target-feature");
+ CmdArgs.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
}
}
diff --git a/clang/test/Driver/x86_features.c b/clang/test/Driver/x86_features.c
index 5c65e31ff45..5470bbcdeaa 100644
--- a/clang/test/Driver/x86_features.c
+++ b/clang/test/Driver/x86_features.c
@@ -1,3 +1,2 @@
-// RUN: %clang -target i386-unknown-unknown -### -S %s -msse -msse4 -mno-sse -mno-mmx -msse 2> %t
-// RUN: grep '"pentium4" "-target-feature" "+sse4" "-target-feature" "-mmx" "-target-feature" "+sse"' %t
-// Note that we filter out all but the last -m(no)sse.
+// RUN: %clang -target i386-unknown-unknown -### -S %s -msse -msse4 -mno-sse -mno-mmx -msse 2>&1 | FileCheck %s
+// CHECK: "pentium4" "-target-feature" "+sse" "-target-feature" "+sse4" "-target-feature" "-sse" "-target-feature" "-mmx" "-target-feature" "+sse"
diff --git a/clang/test/Preprocessor/x86_target_features.c b/clang/test/Preprocessor/x86_target_features.c
index 036a5da1de5..4cdd3425cc9 100644
--- a/clang/test/Preprocessor/x86_target_features.c
+++ b/clang/test/Preprocessor/x86_target_features.c
@@ -30,3 +30,15 @@
// SSE2: #define __SSE_MATH__ 1
// SSE2: #define __SSE__ 1
// SSE2-NOT: #define __SSSE3__ 1
+
+// RUN: %clang -target i386-unknown-unknown -march=pentium-m -mno-sse -mavx -x c -E -dM -o - %s | FileCheck --check-prefix=AVX %s
+
+// AVX: #define __AVX__ 1
+// AVX: #define __SSE2_MATH__ 1
+// AVX: #define __SSE2__ 1
+// AVX: #define __SSE3__ 1
+// AVX: #define __SSE4_1__ 1
+// AVX: #define __SSE4_2__ 1
+// AVX: #define __SSE_MATH__ 1
+// AVX: #define __SSE__ 1
+// AVX: #define __SSSE3__ 1
OpenPOWER on IntegriCloud