r257537 - clang-cl: Support /Dfoo#bar (PR25984)

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 12 15:17:03 PST 2016


Author: hans
Date: Tue Jan 12 17:17:03 2016
New Revision: 257537

URL: http://llvm.org/viewvc/llvm-project?rev=257537&view=rev
Log:
clang-cl: Support /Dfoo#bar (PR25984)

Such flags will now be translated to -Dfoo=bar.

Modified:
    cfe/trunk/lib/Driver/MSVCToolChain.cpp
    cfe/trunk/test/Driver/cl-options.c

Modified: cfe/trunk/lib/Driver/MSVCToolChain.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/MSVCToolChain.cpp?rev=257537&r1=257536&r2=257537&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/MSVCToolChain.cpp (original)
+++ cfe/trunk/lib/Driver/MSVCToolChain.cpp Tue Jan 12 17:17:03 2016
@@ -634,6 +634,96 @@ SanitizerMask MSVCToolChain::getSupporte
   return Res;
 }
 
+static void TranslateOptArg(Arg *A, llvm::opt::DerivedArgList &DAL,
+                            bool SupportsForcingFramePointer,
+                            const char *ExpandChar, const OptTable &Opts) {
+  assert(A->getOption().matches(options::OPT__SLASH_O));
+
+  StringRef OptStr = A->getValue();
+  for (size_t I = 0, E = OptStr.size(); I != E; ++I) {
+    const char &OptChar = *(OptStr.data() + I);
+    switch (OptChar) {
+    default:
+      break;
+    case '1':
+    case '2':
+    case 'x':
+    case 'd':
+      if (&OptChar == ExpandChar) {
+        if (OptChar == 'd') {
+          DAL.AddFlagArg(A, Opts.getOption(options::OPT_O0));
+        } else {
+          if (OptChar == '1') {
+            DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "s");
+          } else if (OptChar == '2' || OptChar == 'x') {
+            DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
+            DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2");
+          }
+          if (SupportsForcingFramePointer)
+            DAL.AddFlagArg(A,
+                           Opts.getOption(options::OPT_fomit_frame_pointer));
+          if (OptChar == '1' || OptChar == '2')
+            DAL.AddFlagArg(A,
+                           Opts.getOption(options::OPT_ffunction_sections));
+        }
+      }
+      break;
+    case 'b':
+      if (I + 1 != E && isdigit(OptStr[I + 1]))
+        ++I;
+      break;
+    case 'g':
+      break;
+    case 'i':
+      if (I + 1 != E && OptStr[I + 1] == '-') {
+        ++I;
+        DAL.AddFlagArg(A, Opts.getOption(options::OPT_fno_builtin));
+      } else {
+        DAL.AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
+      }
+      break;
+    case 's':
+      DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "s");
+      break;
+    case 't':
+      DAL.AddJoinedArg(A, Opts.getOption(options::OPT_O), "2");
+      break;
+    case 'y': {
+      bool OmitFramePointer = true;
+      if (I + 1 != E && OptStr[I + 1] == '-') {
+        OmitFramePointer = false;
+        ++I;
+      }
+      if (SupportsForcingFramePointer) {
+        if (OmitFramePointer)
+          DAL.AddFlagArg(A,
+                         Opts.getOption(options::OPT_fomit_frame_pointer));
+        else
+          DAL.AddFlagArg(
+              A, Opts.getOption(options::OPT_fno_omit_frame_pointer));
+      }
+      break;
+    }
+    }
+  }
+}
+
+static void TranslateDArg(Arg *A, llvm::opt::DerivedArgList &DAL,
+                          const OptTable &Opts) {
+  assert(A->getOption().matches(options::OPT_D));
+
+  StringRef Val = A->getValue();
+  size_t Hash = Val.find('#');
+  if (Hash == StringRef::npos || Hash > Val.find('=')) {
+    DAL.append(A);
+    return;
+  }
+
+  std::string NewVal = Val;
+  NewVal[Hash] = '=';
+  DAL.AddJoinedArg(A, Opts.getOption(options::OPT_D), NewVal);
+}
+
 llvm::opt::DerivedArgList *
 MSVCToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
                              const char *BoundArch) const {
@@ -664,81 +754,18 @@ MSVCToolChain::TranslateArgs(const llvm:
     }
   }
 
-  // The -O flag actually takes an amalgam of other options.  For example,
-  // '/Ogyb2' is equivalent to '/Og' '/Oy' '/Ob2'.
   for (Arg *A : Args) {
-    if (!A->getOption().matches(options::OPT__SLASH_O)) {
+    if (A->getOption().matches(options::OPT__SLASH_O)) {
+      // The -O flag actually takes an amalgam of other options.  For example,
+      // '/Ogyb2' is equivalent to '/Og' '/Oy' '/Ob2'.
+      TranslateOptArg(A, *DAL, SupportsForcingFramePointer, ExpandChar, Opts);
+    } else if (A->getOption().matches(options::OPT_D)) {
+      // Translate -Dfoo#bar into -Dfoo=bar.
+      TranslateDArg(A, *DAL, Opts);
+    } else {
       DAL->append(A);
-      continue;
-    }
-
-    StringRef OptStr = A->getValue();
-    for (size_t I = 0, E = OptStr.size(); I != E; ++I) {
-      const char &OptChar = *(OptStr.data() + I);
-      switch (OptChar) {
-      default:
-        break;
-      case '1':
-      case '2':
-      case 'x':
-      case 'd':
-        if (&OptChar == ExpandChar) {
-          if (OptChar == 'd') {
-            DAL->AddFlagArg(A, Opts.getOption(options::OPT_O0));
-          } else {
-            if (OptChar == '1') {
-              DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "s");
-            } else if (OptChar == '2' || OptChar == 'x') {
-              DAL->AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
-              DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "2");
-            }
-            if (SupportsForcingFramePointer)
-              DAL->AddFlagArg(A,
-                              Opts.getOption(options::OPT_fomit_frame_pointer));
-            if (OptChar == '1' || OptChar == '2')
-              DAL->AddFlagArg(A,
-                              Opts.getOption(options::OPT_ffunction_sections));
-          }
-        }
-        break;
-      case 'b':
-        if (I + 1 != E && isdigit(OptStr[I + 1]))
-          ++I;
-        break;
-      case 'g':
-        break;
-      case 'i':
-        if (I + 1 != E && OptStr[I + 1] == '-') {
-          ++I;
-          DAL->AddFlagArg(A, Opts.getOption(options::OPT_fno_builtin));
-        } else {
-          DAL->AddFlagArg(A, Opts.getOption(options::OPT_fbuiltin));
-        }
-        break;
-      case 's':
-        DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "s");
-        break;
-      case 't':
-        DAL->AddJoinedArg(A, Opts.getOption(options::OPT_O), "2");
-        break;
-      case 'y': {
-        bool OmitFramePointer = true;
-        if (I + 1 != E && OptStr[I + 1] == '-') {
-          OmitFramePointer = false;
-          ++I;
-        }
-        if (SupportsForcingFramePointer) {
-          if (OmitFramePointer)
-            DAL->AddFlagArg(A,
-                            Opts.getOption(options::OPT_fomit_frame_pointer));
-          else
-            DAL->AddFlagArg(
-                A, Opts.getOption(options::OPT_fno_omit_frame_pointer));
-        }
-        break;
-      }
-      }
     }
   }
+
   return DAL;
 }

Modified: cfe/trunk/test/Driver/cl-options.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-options.c?rev=257537&r1=257536&r2=257537&view=diff
==============================================================================
--- cfe/trunk/test/Driver/cl-options.c (original)
+++ cfe/trunk/test/Driver/cl-options.c Tue Jan 12 17:17:03 2016
@@ -14,9 +14,13 @@
 // C_P: "-E"
 // C_P: "-C"
 
-// RUN: %clang_cl /Dfoo=bar -### -- %s 2>&1 | FileCheck -check-prefix=D %s
-// RUN: %clang_cl /D foo=bar -### -- %s 2>&1 | FileCheck -check-prefix=D %s
+// RUN: %clang_cl /Dfoo=bar /D bar=baz /DMYDEF#value /DMYDEF2=foo#bar /DMYDEF3#a=b \
+// RUN:    -### -- %s 2>&1 | FileCheck -check-prefix=D %s
 // D: "-D" "foo=bar"
+// D: "-D" "bar=baz"
+// D: "-D" "MYDEF=value"
+// D: "-D" "MYDEF2=foo#bar"
+// D: "-D" "MYDEF3=a=b"
 
 // RUN: %clang_cl /E -### -- %s 2>&1 | FileCheck -check-prefix=E %s
 // E: "-E"




More information about the cfe-commits mailing list