<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h<br>
index 1459e0d..cd114b5 100644<br>--- a/include/clang/Driver/Driver.h<br>+++ b/include/clang/Driver/Driver.h<br>@@ -51,6 +51,13 @@ class Driver {<br> <br>   DiagnosticsEngine &Diags;<br> <br>+  enum CCCMode {<br>+    GCCMode,<br>
+    GXXMode,<br>+    CPPMode,<br>+    InvalidMode<br>+  } Mode;<br>+<br> public:<br>   // Diag - Forwarding function for diagnostics.<br>   DiagnosticBuilder Diag(unsigned DiagID) const {<br>@@ -117,10 +124,10 @@ public:<br>
       InputList;<br> <br>   /// Whether the driver should follow g++ like behavior.<br>-  unsigned CCCIsCXX : 1;<br>+  bool CCCIsCXX() const { return Mode == GXXMode; }<br> <br>   /// Whether the driver is just the preprocessor.<br>
-  unsigned CCCIsCPP : 1;<br>+  bool CCCIsCPP() const { return Mode == CPPMode; }<br> <br>   /// Echo commands while executing (in -v style).<br>   unsigned CCCEcho : 1;<br>@@ -236,6 +243,9 @@ public:<br>   /// @name Driver Steps<br>
   /// @{<br> <br>+  /// ParseCCCMode - Look for and handle the -ccc-mode= option in Args.<br>+  void ParseCCCMode(ArrayRef<const char *> Args);<br>+<br>   /// ParseArgStrings - Parse the given list of strings into an<br>
   /// ArgList.<br>   llvm::opt::InputArgList *ParseArgStrings(ArrayRef<const char *> Args);<br>diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td<br>index 7e7e111..7834ed7 100644<br>--- a/include/clang/Driver/Options.td<br>
+++ b/include/clang/Driver/Options.td<br>@@ -112,8 +112,8 @@ def ccc_debug_Group : OptionGroup<"<clang debug/development internal options>">,<br>   Group<ccc_Group>, HelpText<"DEBUG/DEVELOPMENT OPTIONS">;<br>
 <br> class CCCDriverOpt : Group<ccc_driver_Group>, Flags<[DriverOption, HelpHidden]>;<br>-def ccc_cxx : Flag<["-"], "ccc-cxx">, CCCDriverOpt,<br>-  HelpText<"Act as a C++ driver">;<br>
+def ccc_mode : Joined<["-"], "ccc-mode=">, CCCDriverOpt,<br>+  HelpText<"Set the ccc mode to either 'gcc', 'g++' or 'cpp'">;<br></blockquote><div><br></div>
<div>-ccc creates a nice namespace for clang, but I don't think it's at all intuitive and it's now a misnomer (clang "c" compiler) and I'm not sure if we want to promote it.</div><div><br></div><div>
There was also some discussion about preferring "--" prefixes for new long options, so I'd go with that.</div><div><br></div><div>lld calls this the driver "flavor" rather than mode.  It would be nice to stay consistent on terminology, if folks are OK with flavor over mode.</div>
<div><br></div><div>Putting it together, I was basically thinking of --driver-flavor=foo, but we should get more buy in.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
 def ccc_echo : Flag<["-"], "ccc-echo">, CCCDriverOpt,<br>   HelpText<"Echo commands before running them">;<br> def ccc_gcc_name : Separate<["-"], "ccc-gcc-name">, CCCDriverOpt,<br>
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp<br>index 1daabcb..8b01668 100644<br>--- a/lib/Driver/Driver.cpp<br>+++ b/lib/Driver/Driver.cpp<br>@@ -21,6 +21,7 @@<br> #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/OwningPtr.h"<br> #include "llvm/ADT/StringSet.h"<br>+#include "llvm/ADT/StringSwitch.h"<br> #include "llvm/Option/Arg.h"<br> #include "llvm/Option/ArgList.h"<br>
 #include "llvm/Option/OptTable.h"<br>@@ -53,8 +54,8 @@ Driver::Driver(StringRef ClangExecutable,<br>     DefaultImageName(DefaultImageName),<br>     DriverTitle("clang LLVM compiler"),<br>     CCPrintOptionsFilename(0), CCPrintHeadersFilename(0),<br>
-    CCLogDiagnosticsFilename(0), CCCIsCXX(false),<br>-    CCCIsCPP(false),CCCEcho(false), CCCPrintBindings(false),<br>+    CCLogDiagnosticsFilename(0), Mode(GCCMode),<br>+    CCCEcho(false), CCCPrintBindings(false),<br>     CCPrintOptions(false), CCPrintHeaders(false), CCLogDiagnostics(false),<br>
     CCGenDiagnostics(false), CCCGenericGCCName(""), CheckInputsExist(true),<br>     CCCUsePCH(true), SuppressMissingInputWarning(false) {<br>@@ -81,6 +82,29 @@ Driver::~Driver() {<br>     delete I->second;<br>
 }<br> <br>+void Driver::ParseCCCMode(ArrayRef<const char *> Args) {<br>+  const std::string CCCOptName =<br>+    getOpts().getOption(options::OPT_ccc_mode).getPrefixedName();<br>+<br>+  for (size_t I = 0, E = Args.size(); I != E; ++I) {<br>
+    const StringRef Arg = Args[I];<br>+    if (!Arg.startswith(CCCOptName))<br>+      continue;<br>+<br>+    const StringRef Value = Arg.drop_front(CCCOptName.size());<br>+    CCCMode M = llvm::StringSwitch<CCCMode>(Value)<br>
+        .Case("gcc", GCCMode)<br>+        .Case("g++", GXXMode)<br>+        .Case("cpp", CPPMode)<br>+        .Default(InvalidMode);<br></blockquote><div><br></div><div>I bet you can get rid of InvalidMode by making the switch type unsigned and returning ~0U in Default or something.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">+<br>+    if (M != InvalidMode)<br>+      Mode = M;<br>
+    else<br>+      Diag(diag::err_drv_unsupported_option_argument) << CCCOptName << Value;<br>+  }<br>+}<br>+<br></blockquote><div><br></div><div>.. snip</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
diff --git a/test/Driver/ccc-as-cpp.c b/test/Driver/ccc-as-cpp.c<br>index feead51..6c00433 100644<br>--- a/test/Driver/ccc-as-cpp.c<br>+++ b/test/Driver/ccc-as-cpp.c<br>@@ -1,6 +1,3 @@<br>-// REQUIRES: shell<br>-// RUN: ln -sf %clang %T/clang-cpp<br>
-<br> // PR13529: Don't crash.<br>-// RUN: %T/clang-cpp -lfoo -M %s 2>&1 | FileCheck --check-prefix=CHECK-PR13529 %s<br>+// RUN: %clang_cpp -lfoo -M %s 2>&1 | FileCheck --check-prefix=CHECK-PR13529 %s<br>
</blockquote><div><br></div><div>Nice.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jul 15, 2013 at 9:28 PM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On Mon, Jul 15, 2013 at 6:11 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>

> (not claiming ownership of this CR, but a few drive-by comments)<br>
><br>
> You could consider using a StringSwitch in Driver::ParseCCCMode.<br>
<br>
</div>Done. It's a little annoying that I need an invalid value for the<br>
default case, but on the other hand the StringSwitch is nice.<br>
<div class="im"><br>
> Is there any reason you need to remove support for "clangxx" (that's<br>
> causing you to need to update those hexagon tests?)?<br>
<br>
</div>I'm not, I'm switching those hexagon tests over to use clangxx instead<br>
of -ccc-cxx which I'm removing.<br>
<div class="im"><br>
> Would you mind updating immediate-options.c to use FileCheck rather<br>
> than multiple invocations with grep?<br>
<br>
</div>Sure. I'd like to do that in a separate patch, though.<br>
<br>
Thanks for the comments! New patch attached.<br>
<span class="HOEnZb"><font color="#888888"><br>
 - Hans<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
> On Mon, Jul 15, 2013 at 4:17 PM, Hans Wennborg <<a href="mailto:hans@chromium.org">hans@chromium.org</a>> wrote:<br>
>> Hi all,<br>
>><br>
>> This patch is a follow-up to the discussion in Reid's cl.exe<br>
>> compatible driver proposal [1].<br>
>><br>
>> Clang currently looks at argv[0] to switch between running in<br>
>> gcc/g++/cpp mode. This mode is represented in Driver by CCCIsCXX and<br>
>> CCCIsCPP. Since there is no overlap between the three modes, I have<br>
>> turned those two variables into an enum instead. The plan is to later<br>
>> extend this enum with a "cl.exe mode".<br>
>><br>
>> The patch also adds a new command line option, -ccc-mode, to set the<br>
>> mode. This replaces the current -ccc-cxx option (and also makes it<br>
>> easier to test the cpp mode). This option is special: because the mode<br>
>> can affect option parsing (the cl.exe mode will add new options), the<br>
>> -ccc-mode needs to be parsed early.<br>
>><br>
>> Please take a look!<br>
>><br>
>> Thanks,<br>
>> Hans<br>
>><br>
>> [1]. <a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-June/030439.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-June/030439.html</a><br>
>><br>
>> _______________________________________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
>><br>
</div></div></blockquote></div><br></div>