From: Hans Wennborg Date: Mon, 12 Aug 2013 23:26:25 +0000 (+0000) Subject: clang-cl: Sink /Fe and /Fo diagnostic code into BuildActions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c0ed9122da2ec12798459328ba63511b1aab7d4;p=clang clang-cl: Sink /Fe and /Fo diagnostic code into BuildActions Differential Revision: http://llvm-reviews.chandlerc.com/D1370 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188226 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index dad25e8be6..5dc9437366 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -266,7 +266,7 @@ public: /// \param TC - The default host tool chain. /// \param Args - The input arguments. /// \param Actions - The list to store the resulting actions onto. - void BuildActions(const ToolChain &TC, const llvm::opt::DerivedArgList &Args, + void BuildActions(const ToolChain &TC, llvm::opt::DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const; /// BuildUniversalActions - Construct the list of actions to perform @@ -276,7 +276,7 @@ public: /// \param Args - The input arguments. /// \param Actions - The list to store the resulting actions onto. void BuildUniversalActions(const ToolChain &TC, - const llvm::opt::DerivedArgList &Args, + llvm::opt::DerivedArgList &Args, const InputList &BAInputs, ActionList &Actions) const; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index a6fe4f0ec2..bbdb6fb8d1 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -377,31 +377,6 @@ Compilation *Driver::BuildCompilation(ArrayRef 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;