diff options
author | Hans Wennborg <hans@hanshq.net> | 2013-12-20 18:40:46 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2013-12-20 18:40:46 +0000 |
commit | e0053474b92ba0acf8399138db890e78523c5671 (patch) | |
tree | 99778fc446359e0297a163eb10a5b19285e0a0c5 | |
parent | c1fb2d61119d3a4bb7ffa453521b072949d77c19 (diff) | |
download | bcm5719-llvm-e0053474b92ba0acf8399138db890e78523c5671.tar.gz bcm5719-llvm-e0053474b92ba0acf8399138db890e78523c5671.zip |
clang-cl: Support /P and /E (preprocess to file or stdout)
llvm-svn: 197827
-rw-r--r-- | clang/include/clang/Driver/CLCompatOptions.td | 4 | ||||
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 13 | ||||
-rw-r--r-- | clang/test/Driver/cl-options.c | 8 | ||||
-rw-r--r-- | clang/test/Driver/cl-outputs.c | 4 |
4 files changed, 21 insertions, 8 deletions
diff --git a/clang/include/clang/Driver/CLCompatOptions.td b/clang/include/clang/Driver/CLCompatOptions.td index d17a63c62c9..09d48e80ec5 100644 --- a/clang/include/clang/Driver/CLCompatOptions.td +++ b/clang/include/clang/Driver/CLCompatOptions.td @@ -57,6 +57,7 @@ def _SLASH_C : CLFlag<"C">, HelpText<"Don't discard comments when preprocessing" def _SLASH_c : CLFlag<"c">, HelpText<"Compile only">, Alias<c>; def _SLASH_D : CLJoinedOrSeparate<"D">, HelpText<"Define macro">, MetaVarName<"<macro[=value]>">, Alias<D>; +def _SLASH_E : CLFlag<"E">, HelpText<"Preprocess to stdout">, Alias<E>; def _SLASH_GR : CLFlag<"GR">, HelpText<"Enable RTTI">, Alias<frtti>; def _SLASH_GR_ : CLFlag<"GR-">, HelpText<"Disable RTTI">, Alias<fno_rtti>; def _SLASH_GF_ : CLFlag<"GF-">, HelpText<"Disable string pooling">, @@ -88,7 +89,6 @@ def _SLASH_Oy : CLFlag<"Oy">, HelpText<"Enable frame pointer omission">, Alias<fomit_frame_pointer>; def _SLASH_Oy_ : CLFlag<"Oy-">, HelpText<"Disable frame pointer omission">, Alias<fno_omit_frame_pointer>; -def _SLASH_P : CLFlag<"P">, HelpText<"Only run the preprocessor">, Alias<E>; def _SLASH_QUESTION : CLFlag<"?">, Alias<help>, HelpText<"Display available options">; def _SLASH_showIncludes : CLFlag<"showIncludes">, @@ -142,6 +142,7 @@ def _SLASH_MT : Option<["/", "-"], "MT", KIND_FLAG>, Group<_SLASH_M_Group>, Flags<[CLOption, DriverOption]>, HelpText<"Use static run-time">; def _SLASH_MTd : Option<["/", "-"], "MTd", KIND_FLAG>, Group<_SLASH_M_Group>, Flags<[CLOption, DriverOption]>, HelpText<"Use static debug run-time">; +def _SLASH_P : CLFlag<"P">, HelpText<"Preprocess to file">; def _SLASH_Tc : CLCompileJoinedOrSeparate<"Tc">, HelpText<"Specify a C source file">, MetaVarName<"<filename>">; def _SLASH_TC : CLCompileFlag<"TC">, HelpText<"Treat all source files as C">; @@ -178,7 +179,6 @@ def _SLASH_arch : CLJoined<"arch:">; def _SLASH_bigobj : CLFlag<"bigobj">; def _SLASH_clr : CLJoined<"clr">; def _SLASH_doc : CLJoined<"doc">; -def _SLASH_E : CLFlag<"E">; def _SLASH_EH : CLJoined<"EH">; def _SLASH_EP : CLFlag<"EP">; def _SLASH_FA_joined : CLJoined<"FA">; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 7826cb30fcf..5ccd0412a8e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -159,10 +159,11 @@ const { 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 @@ const char *Driver::GetNamedOutputPath(Compilation &C, 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)) diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 01032bb38ee..b341a2d4f45 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -14,6 +14,10 @@ // RUN: %clang_cl /D foo=bar -### -- %s 2>&1 | FileCheck -check-prefix=D %s // D: "-D" "foo=bar" +// RUN: %clang_cl /E -### -- %s 2>&1 | FileCheck -check-prefix=E %s +// E: "-E" +// E: "-o" "-" + // RTTI is on by default; just check that we don't error. // RUN: %clang_cl /Zs /GR -- %s 2>&1 @@ -56,9 +60,6 @@ // RUN: %clang_cl /Oy- -### -- %s 2>&1 | FileCheck -check-prefix=Oy_ %s // Oy_: -mdisable-fp-elim -// RUN: %clang_cl /P -### -- %s 2>&1 | FileCheck -check-prefix=P %s -// P: -E - // RUN: %clang_cl /showIncludes -### -- %s 2>&1 | FileCheck -check-prefix=showIncludes %s // showIncludes: --show-includes @@ -140,7 +141,6 @@ // RUN: /arch:sse2 \ // RUN: /clr:pure \ // RUN: /docname \ -// RUN: /E \ // RUN: /EHsc \ // RUN: /EP \ // RUN: /F \ diff --git a/clang/test/Driver/cl-outputs.c b/clang/test/Driver/cl-outputs.c index 2ceaa85471b..ad4051d3b27 100644 --- a/clang/test/Driver/cl-outputs.c +++ b/clang/test/Driver/cl-outputs.c @@ -105,3 +105,7 @@ // FaDIRNAMEEXT: "-o" "foo.dir{{[/\\]+}}a.ext" // RUN: %clang_cl /Faa.asm -### -- %s %s 2>&1 | FileCheck -check-prefix=FaMULTIPLESOURCE %s // FaMULTIPLESOURCE: error: cannot specify '/Faa.asm' when compiling multiple source files + +// RUN: %clang_cl /P -### -- %s 2>&1 | FileCheck -check-prefix=P %s +// P: "-E" +// P: "-o" "cl-outputs.i" |