diff --git a/include/clang/Driver/Options.h b/include/clang/Driver/Options.h
index 1186c84..f939a02 100644
--- a/include/clang/Driver/Options.h
+++ b/include/clang/Driver/Options.h
@@ -29,7 +29,9 @@ enum ClangFlags {
   NoForward = (1 << 7),
   Unsupported = (1 << 8),
   CC1Option = (1 << 9),
-  NoDriverOption = (1 << 10)
+  NoDriverOption = (1 << 10),
+  CLOption = (1 << 11),
+  GCCOption = (1 << 12)
 };
 
 enum ID {
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 2035bf8..ef49a01 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -42,6 +42,12 @@ def CC1Option : OptionFlag;
 // NoDriverOption - This option should not be accepted by the driver.
 def NoDriverOption : OptionFlag;
 
+// CLOption - This is a cl.exe compatibility option.
+def CLOption : OptionFlag;
+
+// Def GCCOption - This should only be available in gcc mode, not in cl mode.
+def GCCOption : OptionFlag;
+
 /////////
 // Groups
 
@@ -832,7 +838,7 @@ def gno_strict_dwarf : Flag<["-"], "gno-strict-dwarf">, Group<g_flags_Group>;
 def gcolumn_info : Flag<["-"], "gcolumn-info">, Group<g_flags_Group>;
 def gsplit_dwarf : Flag<["-"], "gsplit-dwarf">, Group<g_flags_Group>;
 def headerpad__max__install__names : Joined<["-"], "headerpad_max_install_names">;
-def help : Flag<["-", "--"], "help">, Flags<[CC1Option]>,
+def help : Flag<["-", "--"], "help">, Flags<[CC1Option, GCCOption]>,
   HelpText<"Display available options">;
 def index_header_map : Flag<["-"], "index-header-map">, Flags<[CC1Option]>,
   HelpText<"Make the next included directory (-I or -F) an indexer header map">;
@@ -1309,4 +1315,16 @@ def Z_reserved_lib_stdcxx : Flag<["-"], "Z-reserved-lib-stdc++">,
 def Z_reserved_lib_cckext : Flag<["-"], "Z-reserved-lib-cckext">,
     Flags<[LinkerInput, NoArgumentUnused, Unsupported]>, Group<reserved_lib_Group>;
 
+
+// clang-cl options.
+def cl_Group : OptionGroup<"<clang-cl options>">,
+    HelpText<"CL.EXE COMPATIBILITY OPTIONS">;
+
+class CLFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
+    Group<cl_Group>, Flags<[CLOption]>;
+
+def _QUESTION : CLFlag<"?">, Alias<help>, HelpText<"Display available options">;
+def cl_help : CLFlag<"help">, Alias<help>, HelpText<"Display available options">;
+
+
 include "CC1Options.td"
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index 98b87be..9d5ff63 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -108,9 +108,20 @@ void Driver::ParseDriverMode(ArrayRef<const char *> Args) {
 
 InputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) {
   llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
+
+  unsigned FlagsToInclude = 0;
+  unsigned FlagsToExclude = 0;
+
+  if (Mode != CLMode)
+    FlagsToExclude |= options::CLOption;
+
+  if (Mode == CLMode)
+    FlagsToExclude |= options::GCCOption;
+
   unsigned MissingArgIndex, MissingArgCount;
   InputArgList *Args = getOpts().ParseArgs(ArgList.begin(), ArgList.end(),
-                                           MissingArgIndex, MissingArgCount);
+                                           MissingArgIndex, MissingArgCount,
+                                           FlagsToInclude, FlagsToExclude);
 
   // Check for missing argument error.
   if (MissingArgCount)
@@ -608,9 +619,20 @@ void Driver::PrintOptions(const ArgList &Args) const {
 }
 
 void Driver::PrintHelp(bool ShowHidden) const {
-  getOpts().PrintHelp(
-      llvm::outs(), Name.c_str(), DriverTitle.c_str(), /*Include*/ 0,
-      /*Exclude*/ options::NoDriverOption | (ShowHidden ? 0 : HelpHidden));
+  unsigned FlagsToInclude = 0;
+  unsigned FlagsToExclude = options::NoDriverOption;
+
+  if (!ShowHidden)
+    FlagsToExclude |= HelpHidden;
+
+  if (Mode != CLMode)
+    FlagsToExclude |= options::CLOption;
+
+  if (Mode == CLMode)
+    FlagsToExclude |= options::GCCOption;
+
+  getOpts().PrintHelp(llvm::outs(), Name.c_str(), DriverTitle.c_str(),
+                      FlagsToInclude, FlagsToExclude);
 }
 
 void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const {
diff --git a/test/Driver/cl.c b/test/Driver/cl.c
index c527313..54657f0 100644
--- a/test/Driver/cl.c
+++ b/test/Driver/cl.c
@@ -1,3 +1,15 @@
-// RUN: %clang_cl -fsyntax-only -c %s
+// RUN: %clang -help | FileCheck %s -check-prefix=DEFAULT
+// DEFAULT-NOT: CL.EXE COMPATIBILITY OPTIONS
+// DEFAULT-NOT: {{/[?]}}
+// DEFAULT-NOT: /help
 
-void f();
+// RUN: %clang_cl /? | FileCheck %s -check-prefix=CL
+// RUN: %clang_cl /help | FileCheck %s -check-prefix=CL
+// RUN: %clang_cl -help | FileCheck %s -check-prefix=CL
+// CL: CL.EXE COMPATIBILITY OPTIONS
+// CL: {{/[?]}}
+// CL: /help
+
+// RUN: not %clang /?
+// RUN: not %clang -?
+// RUN: not %clang /help
