diff options
| -rw-r--r-- | clang/include/clang/Driver/ArgList.h | 22 | ||||
| -rw-r--r-- | clang/lib/Driver/ArgList.cpp | 27 | ||||
| -rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 115 | 
3 files changed, 92 insertions, 72 deletions
| diff --git a/clang/include/clang/Driver/ArgList.h b/clang/include/clang/Driver/ArgList.h index 0a8eaeaf238..7a14ae84d46 100644 --- a/clang/include/clang/Driver/ArgList.h +++ b/clang/include/clang/Driver/ArgList.h @@ -17,12 +17,15 @@  #include <list>  #include <string> +#include <vector>  namespace llvm {    class Twine;  }  namespace clang { +  class Diagnostic; +  namespace driver {    class Arg;    class ArgList; @@ -175,6 +178,25 @@ namespace driver {      /// getArgString - Return the input argument string at \arg Index.      virtual const char *getArgString(unsigned Index) const = 0; + +    /// @} +    /// @name Argument Lookup Utilities +    /// @{ + +    /// getLastArgValue - Return the value of the last argument, or a default. +    llvm::StringRef getLastArgValue(OptSpecifier Id, +                                    llvm::StringRef Default = "") const; + +    /// getLastArgValue - Return the value of the last argument as an integer, +    /// or a default. Emits an error if the argument is given, but non-integral. +    int getLastArgIntValue(OptSpecifier Id, int Default, +                           Diagnostic &Diags) const; + +    /// getAllArgValues - Get the values of all instances of the given argument +    /// as strings. +    std::vector<std::string> getAllArgValues(OptSpecifier Id) const; + +    /// @}      /// @name Translation Utilities      /// @{ diff --git a/clang/lib/Driver/ArgList.cpp b/clang/lib/Driver/ArgList.cpp index 95805b016b1..9ca710f5095 100644 --- a/clang/lib/Driver/ArgList.cpp +++ b/clang/lib/Driver/ArgList.cpp @@ -9,6 +9,7 @@  #include "clang/Driver/ArgList.h"  #include "clang/Driver/Arg.h" +#include "clang/Driver/DriverDiagnostic.h"  #include "clang/Driver/Option.h"  #include "llvm/ADT/SmallString.h" @@ -108,6 +109,32 @@ bool ArgList::hasFlag(OptSpecifier Pos, OptSpecifier Neg, bool Default) const {    return Default;  } +llvm::StringRef ArgList::getLastArgValue(OptSpecifier Id, +                                         llvm::StringRef Default) const { +  if (Arg *A = getLastArg(Id)) +    return A->getValue(*this); +  return Default; +} + +int ArgList::getLastArgIntValue(OptSpecifier Id, int Default, +                                Diagnostic &Diags) const { +  int Res = Default; + +  if (Arg *A = getLastArg(Id)) { +    if (llvm::StringRef(A->getValue(*this)).getAsInteger(10, Res)) +      Diags.Report(diag::err_drv_invalid_int_value) +        << A->getAsString(*this) << A->getValue(*this); +  } + +  return Res; +} + +std::vector<std::string> ArgList::getAllArgValues(OptSpecifier Id) const { +  llvm::SmallVector<const char *, 16> Values; +  AddAllArgValues(Values, Id); +  return std::vector<std::string>(Values.begin(), Values.end()); +} +  void ArgList::AddLastArg(ArgStringList &Output, OptSpecifier Id) const {    if (Arg *A = getLastArg(Id)) {      A->claim(); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 65d2f06c6c6..6239caf3948 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -700,34 +700,6 @@ void CompilerInvocation::toArgs(std::vector<std::string> &Res) {  using namespace clang::driver;  using namespace clang::driver::cc1options; -static llvm::StringRef getLastArgValue(ArgList &Args, cc1options::ID ID, -                                       llvm::StringRef Default = "") { -  if (Arg *A = Args.getLastArg(ID)) -    return A->getValue(Args); -  return Default; -} - -static int getLastArgIntValue(ArgList &Args, cc1options::ID ID, -                              int Default, Diagnostic &Diags) { -  Arg *A = Args.getLastArg(ID); -  if (!A) -    return Default; - -  int Res = Default; -  if (llvm::StringRef(A->getValue(Args)).getAsInteger(10, Res)) -    Diags.Report(diag::err_drv_invalid_int_value) -        << A->getAsString(Args) << A->getValue(Args); - -  return Res; -} - -static std::vector<std::string> -getAllArgValues(ArgList &Args, cc1options::ID ID) { -  llvm::SmallVector<const char *, 16> Values; -  Args.AddAllArgValues(Values, ID); -  return std::vector<std::string>(Values.begin(), Values.end()); -} -  //  static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, @@ -792,13 +764,13 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,      Args.hasArg(OPT_analyzer_opt_analyze_nested_blocks);    Opts.PurgeDead = !Args.hasArg(OPT_analyzer_no_purge_dead);    Opts.EagerlyAssume = Args.hasArg(OPT_analyzer_eagerly_assume); -  Opts.AnalyzeSpecificFunction = getLastArgValue(Args, OPT_analyze_function); +  Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function);    Opts.EnableExperimentalChecks = Args.hasArg(OPT_analyzer_experimental_checks);    Opts.EnableExperimentalInternalChecks =      Args.hasArg(OPT_analyzer_experimental_internal_checks);    Opts.TrimGraph = Args.hasArg(OPT_trim_egraph); -  Opts.MaxNodes = getLastArgIntValue(Args, OPT_analyzer_max_nodes,150000,Diags); -  Opts.MaxLoop = getLastArgIntValue(Args, OPT_analyzer_max_loop, 3, Diags); +  Opts.MaxNodes = Args.getLastArgIntValue(OPT_analyzer_max_nodes, 150000,Diags); +  Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 3, Diags);    Opts.InlineCall = Args.hasArg(OPT_analyzer_inline_call);  } @@ -809,7 +781,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,    if (Args.hasArg(OPT_Os))      Opts.OptimizationLevel = 2;    else { -    Opts.OptimizationLevel = getLastArgIntValue(Args, OPT_O, 0, Diags); +    Opts.OptimizationLevel = Args.getLastArgIntValue(OPT_O, 0, Diags);      if (Opts.OptimizationLevel > 3) {        Diags.Report(diag::err_drv_invalid_value)          << Args.getLastArg(OPT_O)->getAsString(Args) << Opts.OptimizationLevel; @@ -824,7 +796,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,    Opts.DebugInfo = Args.hasArg(OPT_g);    Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);    Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); -  Opts.DwarfDebugFlags = getLastArgValue(Args, OPT_dwarf_debug_flags); +  Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);    Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);    Opts.NoCommon = Args.hasArg(OPT_fno_common);    Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float); @@ -834,20 +806,20 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,    Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);    Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);    Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases); -  Opts.CodeModel = getLastArgValue(Args, OPT_mcode_model); -  Opts.DebugPass = getLastArgValue(Args, OPT_mdebug_pass); +  Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model); +  Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass);    Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim); -  Opts.FloatABI = getLastArgValue(Args, OPT_mfloat_abi); -  Opts.LimitFloatPrecision = getLastArgValue(Args, OPT_mlimit_float_precision); +  Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi); +  Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);    Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);    Opts.SoftFloat = Args.hasArg(OPT_msoft_float);    Opts.UnwindTables = Args.hasArg(OPT_munwind_tables); -  Opts.RelocationModel = getLastArgValue(Args, OPT_mrelocation_model, "pic"); +  Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");    Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections);    Opts.DataSections = Args.hasArg(OPT_fdata_sections); -  Opts.MainFileName = getLastArgValue(Args, OPT_main_file_name); +  Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name);    Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);    if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) { @@ -867,8 +839,8 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,  static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,                                        ArgList &Args) {    using namespace cc1options; -  Opts.OutputFile = getLastArgValue(Args, OPT_dependency_file); -  Opts.Targets = getAllArgValues(Args, OPT_MT); +  Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file); +  Opts.Targets = Args.getAllArgValues(OPT_MT);    Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);    Opts.UsePhonyTargets = Args.hasArg(OPT_MP);  } @@ -888,7 +860,7 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option);    llvm::StringRef ShowCategory = -    getLastArgValue(Args, OPT_fdiagnostics_show_category, "none"); +    Args.getLastArgValue(OPT_fdiagnostics_show_category, "none");    if (ShowCategory == "none")      Opts.ShowCategories = 0;    else if (ShowCategory == "id") @@ -903,24 +875,24 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);    Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);    Opts.BinaryOutput = Args.hasArg(OPT_fdiagnostics_binary); -  Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags); +  Opts.ErrorLimit = Args.getLastArgIntValue(OPT_ferror_limit, 0, Diags);    Opts.MacroBacktraceLimit -    = getLastArgIntValue(Args, OPT_fmacro_backtrace_limit,  +    = Args.getLastArgIntValue(OPT_fmacro_backtrace_limit,                            DiagnosticOptions::DefaultMacroBacktraceLimit, Diags);    Opts.TemplateBacktraceLimit -    = getLastArgIntValue(Args, OPT_ftemplate_backtrace_limit,  +    = Args.getLastArgIntValue(OPT_ftemplate_backtrace_limit,                            DiagnosticOptions::DefaultTemplateBacktraceLimit,                            Diags); -  Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop, +  Opts.TabStop = Args.getLastArgIntValue(OPT_ftabstop,                                      DiagnosticOptions::DefaultTabStop, Diags);    if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {      Diags.Report(diag::warn_ignoring_ftabstop_value)        << Opts.TabStop << DiagnosticOptions::DefaultTabStop;      Opts.TabStop = DiagnosticOptions::DefaultTabStop;    } -  Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags); -  Opts.DumpBuildInformation = getLastArgValue(Args, OPT_dump_build_information); -  Opts.Warnings = getAllArgValues(Args, OPT_W); +  Opts.MessageLength = Args.getLastArgIntValue(OPT_fmessage_length, 0, Diags); +  Opts.DumpBuildInformation = Args.getLastArgValue(OPT_dump_build_information); +  Opts.Warnings = Args.getAllArgValues(OPT_W);  }  static FrontendOptions::InputKind @@ -1006,17 +978,17 @@ ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Diagnostic &Diags) {      !Args.hasArg(OPT_no_code_completion_debug_printer);    Opts.DisableFree = Args.hasArg(OPT_disable_free); -  Opts.OutputFile = getLastArgValue(Args, OPT_o); -  Opts.Plugins = getAllArgValues(Args, OPT_load); +  Opts.OutputFile = Args.getLastArgValue(OPT_o); +  Opts.Plugins = Args.getAllArgValues(OPT_load);    Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch);    Opts.ShowHelp = Args.hasArg(OPT_help);    Opts.ShowMacrosInCodeCompletion = Args.hasArg(OPT_code_completion_macros);    Opts.ShowStats = Args.hasArg(OPT_print_stats);    Opts.ShowTimers = Args.hasArg(OPT_ftime_report);    Opts.ShowVersion = Args.hasArg(OPT_version); -  Opts.ViewClassInheritance = getLastArgValue(Args, OPT_cxx_inheritance_view); -  Opts.ASTMergeFiles = getAllArgValues(Args, OPT_ast_merge); -  Opts.LLVMArgs = getAllArgValues(Args, OPT_mllvm); +  Opts.ViewClassInheritance = Args.getLastArgValue(OPT_cxx_inheritance_view); +  Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge); +  Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);    FrontendOptions::InputKind DashX = FrontendOptions::IK_None;    if (const Arg *A = Args.getLastArg(OPT_x)) { @@ -1045,7 +1017,7 @@ ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, Diagnostic &Diags) {    }    // '-' is the default input if none is given. -  std::vector<std::string> Inputs = getAllArgValues(Args, OPT_INPUT); +  std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);    Opts.Inputs.clear();    if (Inputs.empty())      Inputs.push_back("-"); @@ -1083,12 +1055,12 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0,  static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {    using namespace cc1options; -  Opts.Sysroot = getLastArgValue(Args, OPT_isysroot, "/"); +  Opts.Sysroot = Args.getLastArgValue(OPT_isysroot, "/");    Opts.Verbose = Args.hasArg(OPT_v);    Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc);    Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc);    Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx); -  Opts.ResourceDir = getLastArgValue(Args, OPT_resource_dir); +  Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir);    // Add -I... and -F... options in order.    for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F), @@ -1227,8 +1199,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,    if (Args.hasArg(OPT_pthread))      Opts.POSIXThreads = 1; -  llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, -                                        "default"); +  llvm::StringRef Vis = Args.getLastArgValue(OPT_fvisibility, "default");    if (Vis == "default")      Opts.setVisibilityMode(LangOptions::Default);    else if (Vis == "hidden") @@ -1270,18 +1241,18 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,    Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);    Opts.MathErrno = Args.hasArg(OPT_fmath_errno); -  Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 1024, +  Opts.InstantiationDepth = Args.getLastArgIntValue(OPT_ftemplate_depth, 1024,                                                 Diags);    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); -  Opts.ObjCConstantStringClass = getLastArgValue(Args, -                                                 OPT_fconstant_string_class); +  Opts.ObjCConstantStringClass = +    Args.getLastArgValue(OPT_fconstant_string_class);    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);    Opts.ObjCNonFragileABI2 = Args.hasArg(OPT_fobjc_nonfragile_abi2);    if (Opts.ObjCNonFragileABI2)      Opts.ObjCNonFragileABI = true;    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); -  Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); +  Opts.PICLevel = Args.getLastArgIntValue(OPT_pic_level, 0, Diags);    Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions);    Opts.Static = Args.hasArg(OPT_static_define);    Opts.DumpRecordLayouts = Args.hasArg(OPT_fdump_record_layouts); @@ -1291,7 +1262,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,    // FIXME: Eliminate this dependency.    unsigned Opt = -    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); +    Args.hasArg(OPT_Os) ? 2 : Args.getLastArgIntValue(OPT_O, 0, Diags);    Opts.Optimize = Opt != 0;    // This is the __NO_INLINE__ define, which just depends on things like the @@ -1301,7 +1272,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,    // FIXME: This is affected by other options (-fno-inline).    Opts.NoInline = !Opt; -  unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); +  unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags);    switch (SSP) {    default:      Diags.Report(diag::err_drv_invalid_value) @@ -1316,8 +1287,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args,  static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,                                    Diagnostic &Diags) {    using namespace cc1options; -  Opts.ImplicitPCHInclude = getLastArgValue(Args, OPT_include_pch); -  Opts.ImplicitPTHInclude = getLastArgValue(Args, OPT_include_pth); +  Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch); +  Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth);    if (const Arg *A = Args.getLastArg(OPT_token_cache))        Opts.TokenCache = A->getValue(Args);    else @@ -1333,7 +1304,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,        Opts.addMacroUndef(it->getValue(Args));    } -  Opts.MacroIncludes = getAllArgValues(Args, OPT_imacros); +  Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);    // Add the ordered list of -includes.    for (arg_iterator it = Args.filtered_begin(OPT_include, OPT_include_pch, @@ -1381,10 +1352,10 @@ static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,  static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {    using namespace cc1options; -  Opts.ABI = getLastArgValue(Args, OPT_target_abi); -  Opts.CPU = getLastArgValue(Args, OPT_target_cpu); -  Opts.Triple = getLastArgValue(Args, OPT_triple); -  Opts.Features = getAllArgValues(Args, OPT_target_feature); +  Opts.ABI = Args.getLastArgValue(OPT_target_abi); +  Opts.CPU = Args.getLastArgValue(OPT_target_cpu); +  Opts.Triple = Args.getLastArgValue(OPT_triple); +  Opts.Features = Args.getAllArgValues(OPT_target_feature);    // Use the host triple if unspecified.    if (Opts.Triple.empty()) | 

