No functionality change intended. Thanks, Matthew Curtis
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
>From a47935f7ae1e587773106eeaeff7ec6ef1b78e0f Mon Sep 17 00:00:00 2001 From: Matthew Curtis <[email protected]> Date: Mon, 4 Mar 2013 10:02:43 -0600 Subject: [PATCH] Move code to handle one input arg to its own function No functionality change intended. --- include/clang/Driver/Driver.h | 5 + lib/Driver/Driver.cpp | 172 ++++++++++++++++++++++------------------- 2 files changed, 97 insertions(+), 80 deletions(-) diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index c1f476f..32d250a 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -170,6 +170,11 @@ private: phases::ID getFinalPhase(const DerivedArgList &DAL, Arg **FinalPhaseArg = 0) const; + types::ID HandleInputArg(const ToolChain &TC, const DerivedArgList &Args, + const char *Value, + types::ID InputType, Arg *InputTypeArg) const; + + public: Driver(StringRef _ClangExecutable, StringRef _DefaultTargetTriple, diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 8229129..40288f9 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -893,6 +893,95 @@ void Driver::BuildUniversalActions(const ToolChain &TC, } } +// Helper function to handle a single input argument 'Value'. Returns the type +// ID for the 'Value' or TY_INVALID if it is not a valid input. May also claim +// 'InputTypeArg'. +types::ID Driver::HandleInputArg(const ToolChain &TC, + const DerivedArgList &Args, const char *Value, + types::ID InputType, Arg *InputTypeArg) const { + + types::ID Ty = types::TY_INVALID; + + // Infer the input type if necessary. + if (InputType == types::TY_Nothing) { + // If there was an explicit arg for this, claim it. + if (InputTypeArg) + InputTypeArg->claim(); + + // stdin must be handled specially. + if (memcmp(Value, "-", 2) == 0) { + // If running with -E, treat as a C input (this changes the builtin + // macros, for example). This may be overridden by -ObjC below. + // + // Otherwise emit an error but still use a valid type to avoid + // spurious errors (e.g., no inputs). + if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP) + Diag(clang::diag::err_drv_unknown_stdin_type); + Ty = types::TY_C; + } else { + // Otherwise lookup by extension. + // Fallback is C if invoked as C preprocessor or Object otherwise. + // We use a host hook here because Darwin at least has its own + // idea of what .s is. + if (const char *Ext = strrchr(Value, '.')) + Ty = TC.LookupTypeForExtension(Ext + 1); + + if (Ty == types::TY_INVALID) { + if (CCCIsCPP) + Ty = types::TY_C; + else + Ty = types::TY_Object; + } + + // If the driver is invoked as C++ compiler (like clang++ or c++) it + // should autodetect some input files as C++ for g++ compatibility. + if (CCCIsCXX) { + types::ID OldTy = Ty; + Ty = types::lookupCXXTypeForCType(Ty); + + if (Ty != OldTy) + Diag(clang::diag::warn_drv_treating_input_as_cxx) + << getTypeName(OldTy) << getTypeName(Ty); + } + } + + // -ObjC and -ObjC++ override the default language, but only for "source + // files". We just treat everything that isn't a linker input as a + // source file. + // + // FIXME: Clean this up if we move the phase sequence into the type. + if (Ty != types::TY_Object) { + if (Args.hasArg(options::OPT_ObjC)) + Ty = types::TY_ObjC; + else if (Args.hasArg(options::OPT_ObjCXX)) + Ty = types::TY_ObjCXX; + } + } else { + assert(InputTypeArg && "InputType set w/o InputTypeArg"); + InputTypeArg->claim(); + Ty = InputType; + } + + // Check that the file exists, if enabled. + if (CheckInputsExist && memcmp(Value, "-", 2) != 0) { + SmallString<64> Path(Value); + if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) { + if (!llvm::sys::path::is_absolute(Path.str())) { + SmallString<64> Directory(WorkDir->getValue()); + llvm::sys::path::append(Directory, Value); + Path.assign(Directory); + } + } + + bool exists = false; + if (llvm::sys::fs::exists(Path.c_str(), exists) || !exists) { + Diag(clang::diag::err_drv_no_such_file) << Path.str(); + Ty = types::TY_INVALID; + } + } + return Ty; +} + // Construct a the list of inputs and their types. void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args, InputList &Inputs) const { @@ -907,86 +996,9 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args, Arg *A = *it; if (A->getOption().getKind() == Option::InputClass) { - const char *Value = A->getValue(); - types::ID Ty = types::TY_INVALID; - - // Infer the input type if necessary. - if (InputType == types::TY_Nothing) { - // If there was an explicit arg for this, claim it. - if (InputTypeArg) - InputTypeArg->claim(); - - // stdin must be handled specially. - if (memcmp(Value, "-", 2) == 0) { - // If running with -E, treat as a C input (this changes the builtin - // macros, for example). This may be overridden by -ObjC below. - // - // Otherwise emit an error but still use a valid type to avoid - // spurious errors (e.g., no inputs). - if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP) - Diag(clang::diag::err_drv_unknown_stdin_type); - Ty = types::TY_C; - } else { - // Otherwise lookup by extension. - // Fallback is C if invoked as C preprocessor or Object otherwise. - // We use a host hook here because Darwin at least has its own - // idea of what .s is. - if (const char *Ext = strrchr(Value, '.')) - Ty = TC.LookupTypeForExtension(Ext + 1); - - if (Ty == types::TY_INVALID) { - if (CCCIsCPP) - Ty = types::TY_C; - else - Ty = types::TY_Object; - } - - // If the driver is invoked as C++ compiler (like clang++ or c++) it - // should autodetect some input files as C++ for g++ compatibility. - if (CCCIsCXX) { - types::ID OldTy = Ty; - Ty = types::lookupCXXTypeForCType(Ty); - - if (Ty != OldTy) - Diag(clang::diag::warn_drv_treating_input_as_cxx) - << getTypeName(OldTy) << getTypeName(Ty); - } - } - - // -ObjC and -ObjC++ override the default language, but only for "source - // files". We just treat everything that isn't a linker input as a - // source file. - // - // FIXME: Clean this up if we move the phase sequence into the type. - if (Ty != types::TY_Object) { - if (Args.hasArg(options::OPT_ObjC)) - Ty = types::TY_ObjC; - else if (Args.hasArg(options::OPT_ObjCXX)) - Ty = types::TY_ObjCXX; - } - } else { - assert(InputTypeArg && "InputType set w/o InputTypeArg"); - InputTypeArg->claim(); - Ty = InputType; - } - - // Check that the file exists, if enabled. - if (CheckInputsExist && memcmp(Value, "-", 2) != 0) { - SmallString<64> Path(Value); - if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) { - if (!llvm::sys::path::is_absolute(Path.str())) { - SmallString<64> Directory(WorkDir->getValue()); - llvm::sys::path::append(Directory, Value); - Path.assign(Directory); - } - } - - bool exists = false; - if (llvm::sys::fs::exists(Path.c_str(), exists) || !exists) - Diag(clang::diag::err_drv_no_such_file) << Path.str(); - else - Inputs.push_back(std::make_pair(Ty, A)); - } else + types::ID Ty; + Ty = HandleInputArg(TC, Args, A->getValue(), InputType, InputTypeArg); + if (Ty != types::TY_INVALID) Inputs.push_back(std::make_pair(Ty, A)); } else if (A->getOption().hasFlag(options::LinkerInput)) { -- 1.7.8.3
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
