r188817 - Centralize the logic for handling -m* options and fix pr16943.

Rafael Espindola rafael.espindola at gmail.com
Tue Aug 20 11:57:55 PDT 2013


Author: rafael
Date: Tue Aug 20 13:57:55 2013
New Revision: 188817

URL: http://llvm.org/viewvc/llvm-project?rev=188817&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Basic/Targets.cpp
    cfe/trunk/lib/Driver/Tools.cpp
    cfe/trunk/test/Driver/x86_features.c
    cfe/trunk/test/Preprocessor/x86_target_features.c

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=188817&r1=188816&r2=188817&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Tue Aug 20 13:57:55 2013
@@ -2089,7 +2089,8 @@ void X86TargetInfo::setSSELevel(llvm::St
     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
   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.

Modified: cfe/trunk/lib/Driver/Tools.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=188817&r1=188816&r2=188817&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Tue Aug 20 13:57:55 2013
@@ -1335,14 +1335,6 @@ void Clang::AddX86TargetArgs(const ArgLi
     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 ArgLi
     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));
   }
 }
 

Modified: cfe/trunk/test/Driver/x86_features.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/x86_features.c?rev=188817&r1=188816&r2=188817&view=diff
==============================================================================
--- cfe/trunk/test/Driver/x86_features.c (original)
+++ cfe/trunk/test/Driver/x86_features.c Tue Aug 20 13:57:55 2013
@@ -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"

Modified: cfe/trunk/test/Preprocessor/x86_target_features.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/x86_target_features.c?rev=188817&r1=188816&r2=188817&view=diff
==============================================================================
--- cfe/trunk/test/Preprocessor/x86_target_features.c (original)
+++ cfe/trunk/test/Preprocessor/x86_target_features.c Tue Aug 20 13:57:55 2013
@@ -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





More information about the cfe-commits mailing list