clang-cl: Support /P and /E (preprocess to file or stdout)
llvm-svn: 197827
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 7826cb3..5ccd041 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -159,10 +159,11 @@
Arg *PhaseArg = 0;
phases::ID FinalPhase;
- // -{E,M,MM} only run the preprocessor.
+ // -{E,M,MM} and /P only run the preprocessor.
if (CCCIsCPP() ||
(PhaseArg = DAL.getLastArg(options::OPT_E)) ||
- (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM))) {
+ (PhaseArg = DAL.getLastArg(options::OPT_M, options::OPT_MM)) ||
+ (PhaseArg = DAL.getLastArg(options::OPT__SLASH_P))) {
FinalPhase = phases::Preprocess;
// -{fsyntax-only,-analyze,emit-ast,S} only run up to the compiler.
@@ -1627,6 +1628,14 @@
return C.addResultFile(FinalOutput->getValue(), &JA);
}
+ // For /P, preprocess to file named after BaseInput.
+ if (C.getArgs().hasArg(options::OPT__SLASH_P)) {
+ assert(AtTopLevel && isa<PreprocessJobAction>(JA));
+ StringRef BaseName = llvm::sys::path::filename(BaseInput);
+ return C.addResultFile(MakeCLOutputFilename(C.getArgs(), "", BaseName,
+ types::TY_PP_C), &JA);
+ }
+
// Default to writing to stdout?
if (AtTopLevel && !CCGenDiagnostics &&
(isa<PreprocessJobAction>(JA) || JA.getType() == types::TY_ModuleFile))