diff --git a/include/clang/Basic/DiagnosticDriverKinds.td b/include/clang/Basic/DiagnosticDriverKinds.td
index f7f09da..41a2e4e 100644
--- a/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/include/clang/Basic/DiagnosticDriverKinds.td
@@ -123,6 +123,9 @@ def warn_ignored_gcc_optimization : Warning<"optimization flag '%0' is not suppo
   InGroup<IgnoredOptimizationArgument>;
 def warn_c_kext : Warning<
   "ignoring -fapple-kext which is valid for C++ and Objective-C++ only">;
+def warn_mcmodel_kernel_darwin : Warning<
+  "-mcmodel=kernel may not be fully supported on Darwin (see -fapple-kext)">,
+  InGroup<InvalidCommandLineArgument>;
 def warn_drv_input_file_unused : Warning<
   "%0: '%1' input unused%select{ when '%3' is present|}2">,
   InGroup<UnusedCommandLineArgument>;
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 6bab65a..6150923 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -3520,6 +3520,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     }
   }
 
+  if (getToolChain().getTriple().isOSDarwin() &&
+      Args.getLastArg(options::OPT_mcmodel_EQ))
+    D.Diag(diag::warn_mcmodel_kernel_darwin);
+
   Args.AddAllArgs(CmdArgs, options::OPT_v);
   Args.AddLastArg(CmdArgs, options::OPT_H);
   if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
