diff options
| author | Hans Wennborg <hans@hanshq.net> | 2013-08-12 23:26:25 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2013-08-12 23:26:25 +0000 |
| commit | 13b7fe72a72119917eddd61877389da04b0ba237 (patch) | |
| tree | ef5755a57b8b69d1fd960bd05326185232274575 /clang/lib | |
| parent | dfe6ed96607eace64ca50c49b9bc7befbeffa8a9 (diff) | |
| download | bcm5719-llvm-13b7fe72a72119917eddd61877389da04b0ba237.tar.gz bcm5719-llvm-13b7fe72a72119917eddd61877389da04b0ba237.zip | |
clang-cl: Sink /Fe and /Fo diagnostic code into BuildActions
Differential Revision: http://llvm-reviews.chandlerc.com/D1370
llvm-svn: 188226
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Driver/Driver.cpp | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a6fe4f0ec2e..bbdb6fb8d17 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -377,31 +377,6 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { InputList Inputs; BuildInputs(C->getDefaultToolChain(), C->getArgs(), Inputs); - if (Arg *A = C->getArgs().getLastArg(options::OPT__SLASH_Fo)) { - DiagnoseOptionOverride(*this, C->getArgs(), options::OPT__SLASH_Fo); - StringRef V = A->getValue(); - if (V.empty()) { - // It has to have a value. - Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1; - C->getArgs().eraseArg(options::OPT__SLASH_Fo); - } else if (Inputs.size() > 1 && !llvm::sys::path::is_separator(V.back())) { - // Check whether /Fo tries to name an output file for multiple inputs. - Diag(clang::diag::err_drv_obj_file_argument_with_multiple_sources) - << A->getSpelling() << V; - C->getArgs().eraseArg(options::OPT__SLASH_Fo); - } - } - - if (Arg *A = C->getArgs().getLastArg(options::OPT__SLASH_Fe)) { - DiagnoseOptionOverride(*this, C->getArgs(), options::OPT__SLASH_Fe); - - if (A->getValue()[0] == '\0') { - // It has to have a value. - Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1; - C->getArgs().eraseArg(options::OPT__SLASH_Fe); - } - } - // Construct the list of abstract actions to perform for this compilation. On // Darwin target OSes this uses the driver-driver and universal actions. if (TC.getTriple().isOSDarwin()) @@ -893,7 +868,7 @@ static bool ContainsCompileOrAssembleAction(const Action *A) { } void Driver::BuildUniversalActions(const ToolChain &TC, - const DerivedArgList &Args, + DerivedArgList &Args, const InputList &BAInputs, ActionList &Actions) const { llvm::PrettyStackTraceString CrashInfo("Building universal build actions"); @@ -1169,7 +1144,7 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args, } } -void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, +void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const { llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); @@ -1186,6 +1161,32 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, if (Arg *A = Args.getLastArg(options::OPT_Z_Joined)) Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args); + // Diagnose misuse of /Fo. + if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fo)) { + DiagnoseOptionOverride(*this, Args, options::OPT__SLASH_Fo); + StringRef V = A->getValue(); + if (V.empty()) { + // It has to have a value. + Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1; + Args.eraseArg(options::OPT__SLASH_Fo); + } else if (Inputs.size() > 1 && !llvm::sys::path::is_separator(V.back())) { + // Check whether /Fo tries to name an output file for multiple inputs. + Diag(clang::diag::err_drv_obj_file_argument_with_multiple_sources) + << A->getSpelling() << V; + Args.eraseArg(options::OPT__SLASH_Fo); + } + } + + // Diagnose misuse of /Fe. + if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fe)) { + DiagnoseOptionOverride(*this, Args, options::OPT__SLASH_Fe); + if (A->getValue()[0] == '\0') { + // It has to have a value. + Diag(clang::diag::err_drv_missing_argument) << A->getSpelling() << 1; + Args.eraseArg(options::OPT__SLASH_Fe); + } + } + // Construct the actions to perform. ActionList LinkerInputs; ActionList SplitInputs; |

