diff options
Diffstat (limited to 'lib/Frontend/CompilerInvocation.cpp')
| -rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 326 | 
1 files changed, 255 insertions, 71 deletions
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 4c5b063f7d41..d39679caf13e 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -13,7 +13,7 @@  #include "clang/Basic/FileManager.h"  #include "clang/Driver/Arg.h"  #include "clang/Driver/ArgList.h" -#include "clang/Driver/CC1Options.h" +#include "clang/Driver/Options.h"  #include "clang/Driver/DriverDiagnostic.h"  #include "clang/Driver/OptTable.h"  #include "clang/Driver/Option.h" @@ -181,8 +181,21 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, ToArgsList &Res) {  }  static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) { -  if (Opts.DebugInfo) -    Res.push_back("-g"); +  switch (Opts.DebugInfo) { +    case CodeGenOptions::NoDebugInfo: +      break; +    case CodeGenOptions::DebugLineTablesOnly: +      Res.push_back("-gline-tables-only"); +      break; +    case CodeGenOptions::LimitedDebugInfo: +      Res.push_back("-g"); +      Res.push_back("-flimit-debug-info"); +      break; +    case CodeGenOptions::FullDebugInfo: +      Res.push_back("-g"); +      Res.push_back("-fno-limit-debug-info"); +      break; +  }    if (Opts.DisableLLVMOpts)      Res.push_back("-disable-llvm-optzns");    if (Opts.DisableRedZone) @@ -193,14 +206,12 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {      Res.push_back("-fdebug-compilation-dir", Opts.DebugCompilationDir);    if (!Opts.DwarfDebugFlags.empty())      Res.push_back("-dwarf-debug-flags", Opts.DwarfDebugFlags); -  if (Opts.ObjCRuntimeHasARC) -    Res.push_back("-fobjc-runtime-has-arc"); -  if (Opts.ObjCRuntimeHasTerminate) -    Res.push_back("-fobjc-runtime-has-terminate");    if (Opts.EmitGcovArcs)      Res.push_back("-femit-coverage-data");    if (Opts.EmitGcovNotes)      Res.push_back("-femit-coverage-notes"); +  if (Opts.EmitOpenCLArgMetadata) +    Res.push_back("-cl-kernel-arg-info");    if (!Opts.MergeAllConstants)      Res.push_back("-fno-merge-all-constants");    if (Opts.NoCommon) @@ -270,6 +281,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {      Res.push_back("-fobjc-dispatch-method=non-legacy");      break;    } +  if (Opts.BoundsChecking > 0) +    Res.push_back("-fbounds-checking=" + llvm::utostr(Opts.BoundsChecking));    if (Opts.NumRegisterParameters)      Res.push_back("-mregparm", llvm::utostr(Opts.NumRegisterParameters));    if (Opts.NoGlobalMerge) @@ -296,6 +309,20 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {      Res.push_back("-disable-llvm-verifier");    for (unsigned i = 0, e = Opts.BackendOptions.size(); i != e; ++i)      Res.push_back("-backend-option", Opts.BackendOptions[i]); + +  switch (Opts.DefaultTLSModel) { +  case CodeGenOptions::GeneralDynamicTLSModel: +    break; +  case CodeGenOptions::LocalDynamicTLSModel: +    Res.push_back("-ftls-model=local-dynamic"); +    break; +  case CodeGenOptions::InitialExecTLSModel: +    Res.push_back("-ftls-model=initial-exec"); +    break; +  case CodeGenOptions::LocalExecTLSModel: +    Res.push_back("-ftls-model=local-exec"); +    break; +  }  }  static void DependencyOutputOptsToArgs(const DependencyOutputOptions &Opts, @@ -407,6 +434,7 @@ static const char *getActionName(frontend::ActionKind Kind) {    case frontend::PluginAction:      llvm_unreachable("Invalid kind!"); +  case frontend::ASTDeclList:            return "-ast-list";    case frontend::ASTDump:                return "-ast-dump";    case frontend::ASTDumpXML:             return "-ast-dump-xml";    case frontend::ASTPrint:               return "-ast-print"; @@ -445,6 +473,18 @@ static void FileSystemOptsToArgs(const FileSystemOptions &Opts, ToArgsList &Res)      Res.push_back("-working-directory", Opts.WorkingDir);  } +static void CodeCompleteOptionsToArgs(const CodeCompleteOptions &Opts, +                                      ToArgsList &Res) { +  if (Opts.IncludeMacros) +    Res.push_back("-code-completion-macros"); +  if (Opts.IncludeCodePatterns) +    Res.push_back("-code-completion-patterns"); +  if (!Opts.IncludeGlobals) +    Res.push_back("-no-code-completion-globals"); +  if (Opts.IncludeBriefComments) +    Res.push_back("-code-completion-brief-comments"); +} +  static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {    if (Opts.DisableFree)      Res.push_back("-disable-free"); @@ -452,12 +492,6 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {      Res.push_back("-relocatable-pch");    if (Opts.ShowHelp)      Res.push_back("-help"); -  if (Opts.ShowMacrosInCodeCompletion) -    Res.push_back("-code-completion-macros"); -  if (Opts.ShowCodePatternsInCodeCompletion) -    Res.push_back("-code-completion-patterns"); -  if (!Opts.ShowGlobalSymbolsInCodeCompletion) -    Res.push_back("-no-code-completion-globals");    if (Opts.ShowStats)      Res.push_back("-print-stats");    if (Opts.ShowTimers) @@ -485,6 +519,7 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {      Res.push_back("-arcmt-migrate");      break;    } +  CodeCompleteOptionsToArgs(Opts.CodeCompleteOpts, Res);    if (!Opts.MTMigrateDir.empty())      Res.push_back("-mt-migrate-directory", Opts.MTMigrateDir);    if (!Opts.ARCMTMigrateReportOut.empty()) @@ -524,6 +559,8 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts, ToArgsList &Res) {      for(unsigned i = 0, e = Opts.PluginArgs.size(); i != e; ++i)        Res.push_back("-plugin-arg-" + Opts.ActionName, Opts.PluginArgs[i]);    } +  if (!Opts.ASTDumpFilter.empty()) +    Res.push_back("-ast-dump-filter", Opts.ASTDumpFilter);    for (unsigned i = 0, e = Opts.Plugins.size(); i != e; ++i)      Res.push_back("-load", Opts.Plugins[i]);    for (unsigned i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) { @@ -608,6 +645,16 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,      Res.push_back(E.Path);    } +  /// User-specified system header prefixes. +  for (unsigned i = 0, e = Opts.SystemHeaderPrefixes.size(); i != e; ++i) { +    if (Opts.SystemHeaderPrefixes[i].IsSystemHeader) +      Res.push_back("-isystem-prefix"); +    else +      Res.push_back("-ino-system-prefix"); + +    Res.push_back(Opts.SystemHeaderPrefixes[i].Prefix); +  } +    if (!Opts.ResourceDir.empty())      Res.push_back("-resource-dir", Opts.ResourceDir);    if (!Opts.ModuleCachePath.empty()) @@ -653,8 +700,6 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {      Res.push_back("-fmsc-version=" + llvm::utostr(Opts.MSCVersion));    if (Opts.Borland)      Res.push_back("-fborland-extensions"); -  if (!Opts.ObjCNonFragileABI) -    Res.push_back("-fobjc-fragile-abi");    if (Opts.ObjCDefaultSynthProperties)      Res.push_back("-fobjc-default-synthesize-properties");    // NoInline is implicit. @@ -690,8 +735,6 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {      Res.push_back("-fno-rtti");    if (Opts.MSBitfields)      Res.push_back("-mms-bitfields"); -  if (!Opts.NeXTRuntime) -    Res.push_back("-fgnu-runtime");    if (Opts.Freestanding)      Res.push_back("-ffreestanding");    if (Opts.NoBuiltin) @@ -721,6 +764,11 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {        Res.push_back("-ftrapv-handler", Opts.OverflowHandler);      break;    } +  switch (Opts.getFPContractMode()) { +  case LangOptions::FPC_Off:  Res.push_back("-ffp-contract=off"); break; +  case LangOptions::FPC_On:   Res.push_back("-ffp-contract=on"); break; +  case LangOptions::FPC_Fast: Res.push_back("-ffp-contract=fast"); break; +  }    if (Opts.HeinousExtensions)      Res.push_back("-fheinous-gnu-extensions");    // Optimize is implicit. @@ -761,6 +809,7 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {        Res.push_back("-fobjc-gc-only");      }    } +  Res.push_back("-fobjc-runtime=" + Opts.ObjCRuntime.getAsString());    if (Opts.ObjCAutoRefCount)      Res.push_back("-fobjc-arc");    if (Opts.ObjCRuntimeHasWeak) @@ -770,7 +819,7 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {    if (Opts.AppleKext)      Res.push_back("-fapple-kext"); -   +    if (Opts.getVisibilityMode() != DefaultVisibility) {      Res.push_back("-fvisibility");      if (Opts.getVisibilityMode() == HiddenVisibility) { @@ -880,7 +929,7 @@ static void TargetOptsToArgs(const TargetOptions &Opts,      Res.push_back("-target-feature", Opts.Features[i]);  } -void CompilerInvocation::toArgs(std::vector<std::string> &Res) { +void CompilerInvocation::toArgs(std::vector<std::string> &Res) const {    ToArgsList List(Res);    AnalyzerOptsToArgs(getAnalyzerOpts(), List);    CodeGenOptsToArgs(getCodeGenOpts(), List); @@ -900,7 +949,7 @@ void CompilerInvocation::toArgs(std::vector<std::string> &Res) {  //===----------------------------------------------------------------------===//  using namespace clang::driver; -using namespace clang::driver::cc1options; +using namespace clang::driver::options;  // @@ -909,14 +958,66 @@ static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,    unsigned DefaultOpt = 0;    if (IK == IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable))      DefaultOpt = 2; -  // -Os/-Oz implies -O2 -  return (Args.hasArg(OPT_Os) || Args.hasArg (OPT_Oz)) ? 2 : -    Args.getLastArgIntValue(OPT_O, DefaultOpt, Diags); + +  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { +    if (A->getOption().matches(options::OPT_O0)) +      return 0; + +    assert (A->getOption().matches(options::OPT_O)); + +    llvm::StringRef S(A->getValue(Args)); +    if (S == "s" || S == "z" || S.empty()) +      return 2; + +    return Args.getLastArgIntValue(OPT_O, DefaultOpt, Diags); +  } + +  return DefaultOpt; +} + +static unsigned getOptimizationLevelSize(ArgList &Args, InputKind IK, +                                         DiagnosticsEngine &Diags) { +  if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { +    if (A->getOption().matches(options::OPT_O)) { +      switch (A->getValue(Args)[0]) { +      default: +        return 0; +      case 's': +        return 1; +      case 'z': +        return 2; +      } +    } +  } +  return 0; +} + +static void addWarningArgs(ArgList &Args, std::vector<std::string> &Warnings) { +  for (arg_iterator I = Args.filtered_begin(OPT_W_Group), +         E = Args.filtered_end(); I != E; ++I) { +    Arg *A = *I; +    // If the argument is a pure flag, add its name (minus the "-W" at the beginning) +    // to the warning list. Else, add its value (for the OPT_W case). +    if (A->getOption().getKind() == Option::FlagClass) { +      Warnings.push_back(A->getOption().getName().substr(2)); +    } else { +      for (unsigned Idx = 0, End = A->getNumValues(); +           Idx < End; ++Idx) { +        StringRef V = A->getValue(Args, Idx); +        // "-Wl," and such are not warning options. +        // FIXME: Should be handled by putting these in separate flags. +        if (V.startswith("l,") || V.startswith("a,") || V.startswith("p,")) +          continue; + +        Warnings.push_back(V); +      } +    } +  }  }  static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,                                DiagnosticsEngine &Diags) { -  using namespace cc1options; +  using namespace options;    bool Success = true;    if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {      StringRef Name = A->getValue(Args); @@ -1026,7 +1127,6 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function);    Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG);    Opts.CFGAddImplicitDtors = Args.hasArg(OPT_analysis_CFGAddImplicitDtors); -  Opts.CFGAddInitializers = Args.hasArg(OPT_analysis_CFGAddInitializers);    Opts.TrimGraph = Args.hasArg(OPT_trim_egraph);    Opts.MaxNodes = Args.getLastArgIntValue(OPT_analyzer_max_nodes, 150000,Diags);    Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 4, Diags); @@ -1066,7 +1166,7 @@ static bool ParseMigratorArgs(MigratorOptions &Opts, ArgList &Args) {  static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,                               DiagnosticsEngine &Diags) { -  using namespace cc1options; +  using namespace options;    bool Success = true;    unsigned OptLevel = getOptimizationLevel(Args, IK, Diags); @@ -1083,12 +1183,18 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,      : CodeGenOptions::OnlyAlwaysInlining;    // -fno-inline-functions overrides OptimizationLevel > 1.    Opts.NoInline = Args.hasArg(OPT_fno_inline); -  Opts.Inlining = Args.hasArg(OPT_fno_inline_functions) ?  +  Opts.Inlining = Args.hasArg(OPT_fno_inline_functions) ?      CodeGenOptions::OnlyAlwaysInlining : Opts.Inlining; -  Opts.DebugInfo = Args.hasArg(OPT_g); -  Opts.LimitDebugInfo = !Args.hasArg(OPT_fno_limit_debug_info) -    || Args.hasArg(OPT_flimit_debug_info); +  if (Args.hasArg(OPT_gline_tables_only)) { +    Opts.DebugInfo = CodeGenOptions::DebugLineTablesOnly; +  } else if (Args.hasArg(OPT_g_Flag)) { +    if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, true)) +      Opts.DebugInfo = CodeGenOptions::LimitedDebugInfo; +    else +      Opts.DebugInfo = CodeGenOptions::FullDebugInfo; +  } +    Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);    Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);    Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables); @@ -1099,8 +1205,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);    Opts.NoCommon = Args.hasArg(OPT_fno_common);    Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float); -  Opts.OptimizeSize = Args.hasArg(OPT_Os); -  Opts.OptimizeSize = Args.hasArg(OPT_Oz) ? 2 : Opts.OptimizeSize; +  Opts.OptimizeSize = getOptimizationLevelSize(Args, IK, Diags);    Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||                              Args.hasArg(OPT_ffreestanding));    Opts.UnrollLoops = Args.hasArg(OPT_funroll_loops) || @@ -1108,8 +1213,6 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);    Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions); -  Opts.ObjCRuntimeHasARC = Args.hasArg(OPT_fobjc_runtime_has_arc); -  Opts.ObjCRuntimeHasTerminate = Args.hasArg(OPT_fobjc_runtime_has_terminate);    Opts.CUDAIsDevice = Args.hasArg(OPT_fcuda_is_device);    Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);    Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases); @@ -1145,6 +1248,9 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);    Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");    Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ); +  Opts.BoundsChecking = Args.getLastArgIntValue(OPT_fbounds_checking_EQ, 0, +                                                Diags); +  Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array);    Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections);    Opts.DataSections = Args.hasArg(OPT_fdata_sections); @@ -1156,6 +1262,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);    Opts.EmitGcovArcs = Args.hasArg(OPT_femit_coverage_data);    Opts.EmitGcovNotes = Args.hasArg(OPT_femit_coverage_notes); +  Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info); +  Opts.EmitMicrosoftInlineAsm = Args.hasArg(OPT_fenable_experimental_ms_inline_asm);    Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file);    Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);    Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); @@ -1180,12 +1288,28 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,      }    } +  if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) { +    StringRef Name = A->getValue(Args); +    unsigned Model = llvm::StringSwitch<unsigned>(Name) +        .Case("global-dynamic", CodeGenOptions::GeneralDynamicTLSModel) +        .Case("local-dynamic", CodeGenOptions::LocalDynamicTLSModel) +        .Case("initial-exec", CodeGenOptions::InitialExecTLSModel) +        .Case("local-exec", CodeGenOptions::LocalExecTLSModel) +        .Default(~0U); +    if (Model == ~0U) { +      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; +      Success = false; +    } else { +      Opts.DefaultTLSModel = static_cast<CodeGenOptions::TLSModel>(Model); +    } +  } +    return Success;  }  static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,                                        ArgList &Args) { -  using namespace cc1options; +  using namespace options;    Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file);    Opts.Targets = Args.getAllArgValues(OPT_MT);    Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps); @@ -1198,7 +1322,7 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,  bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,                                  DiagnosticsEngine *Diags) { -  using namespace cc1options; +  using namespace options;    bool Success = true;    Opts.DiagnosticLogFile = Args.getLastArgValue(OPT_diagnostic_log_file); @@ -1273,6 +1397,8 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);    Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);    Opts.VerifyDiagnostics = Args.hasArg(OPT_verify); +  Opts.ElideType = !Args.hasArg(OPT_fno_elide_type); +  Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);    Opts.ErrorLimit = Args.getLastArgIntValue(OPT_ferror_limit, 0, Diags);    Opts.MacroBacktraceLimit      = Args.getLastArgIntValue(OPT_fmacro_backtrace_limit, @@ -1295,16 +1421,7 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    }    Opts.MessageLength = Args.getLastArgIntValue(OPT_fmessage_length, 0, Diags);    Opts.DumpBuildInformation = Args.getLastArgValue(OPT_dump_build_information); - -  for (arg_iterator it = Args.filtered_begin(OPT_W), -         ie = Args.filtered_end(); it != ie; ++it) { -    StringRef V = (*it)->getValue(Args); -    // "-Wl," and such are not warnings options. -    if (V.startswith("l,") || V.startswith("a,") || V.startswith("p,")) -      continue; - -    Opts.Warnings.push_back(V); -  } +  addWarningArgs(Args, Opts.Warnings);    return Success;  } @@ -1315,12 +1432,14 @@ static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {  static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,                                     DiagnosticsEngine &Diags) { -  using namespace cc1options; +  using namespace options;    Opts.ProgramAction = frontend::ParseSyntaxOnly;    if (const Arg *A = Args.getLastArg(OPT_Action_Group)) {      switch (A->getOption().getID()) {      default:        llvm_unreachable("Invalid option in group!"); +    case OPT_ast_list: +      Opts.ProgramAction = frontend::ASTDeclList; break;      case OPT_ast_dump:        Opts.ProgramAction = frontend::ASTDump; break;      case OPT_ast_dump_xml: @@ -1418,11 +1537,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,    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.ShowCodePatternsInCodeCompletion -    = Args.hasArg(OPT_code_completion_patterns); -  Opts.ShowGlobalSymbolsInCodeCompletion -    = !Args.hasArg(OPT_no_code_completion_globals);    Opts.ShowStats = Args.hasArg(OPT_print_stats);    Opts.ShowTimers = Args.hasArg(OPT_ftime_report);    Opts.ShowVersion = Args.hasArg(OPT_version); @@ -1432,6 +1546,17 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,    Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings);    Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);    Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp); +  Opts.ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter); + +  Opts.CodeCompleteOpts.IncludeMacros +    = Args.hasArg(OPT_code_completion_macros); +  Opts.CodeCompleteOpts.IncludeCodePatterns +    = Args.hasArg(OPT_code_completion_patterns); +  Opts.CodeCompleteOpts.IncludeGlobals +    = !Args.hasArg(OPT_no_code_completion_globals); +  Opts.CodeCompleteOpts.IncludeBriefComments +    = Args.hasArg(OPT_code_completion_brief_comments); +    Opts.OverrideRecordLayoutsFile      = Args.getLastArgValue(OPT_foverride_record_layout_EQ);    if (const Arg *A = Args.getLastArg(OPT_arcmt_check, @@ -1535,7 +1660,7 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0,  }  static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { -  using namespace cc1options; +  using namespace options;    Opts.Sysroot = Args.getLastArgValue(OPT_isysroot, "/");    Opts.Verbose = Args.hasArg(OPT_v);    Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc); @@ -1620,6 +1745,14 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {      Opts.AddPath((*I)->getValue(Args), frontend::System,                   false, false, /*IgnoreSysRoot=*/true, /*IsInternal=*/true,                   (*I)->getOption().matches(OPT_internal_externc_isystem)); + +  // Add the path prefixes which are implicitly treated as being system headers. +  for (arg_iterator I = Args.filtered_begin(OPT_isystem_prefix, +                                            OPT_ino_system_prefix), +                    E = Args.filtered_end(); +       I != E; ++I) +    Opts.AddSystemHeaderPrefix((*I)->getValue(Args), +                               (*I)->getOption().matches(OPT_isystem_prefix));  }  void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, @@ -1677,9 +1810,22 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,    Opts.HexFloats = Std.hasHexFloats();    Opts.ImplicitInt = Std.hasImplicitInt(); -  // OpenCL has some additional defaults. +  // Set OpenCL Version.    if (LangStd == LangStandard::lang_opencl) {      Opts.OpenCL = 1; +    Opts.OpenCLVersion = 100; +  } +  else if (LangStd == LangStandard::lang_opencl11) { +      Opts.OpenCL = 1; +      Opts.OpenCLVersion = 110; +  } +  else if (LangStd == LangStandard::lang_opencl12) { +    Opts.OpenCL = 1; +    Opts.OpenCLVersion = 120; +  } +   +  // OpenCL has some additional defaults. +  if (Opts.OpenCL) {      Opts.AltiVec = 0;      Opts.CXXOperatorNames = 1;      Opts.LaxVectorConversions = 0; @@ -1751,13 +1897,24 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      }    } +  // -cl-std only applies for OpenCL language standards. +  // Override the -std option in this case.    if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) { -    if (strcmp(A->getValue(Args), "CL1.1") != 0) { +    LangStandard::Kind OpenCLLangStd +    = llvm::StringSwitch<LangStandard::Kind>(A->getValue(Args)) +    .Case("CL", LangStandard::lang_opencl) +    .Case("CL1.1", LangStandard::lang_opencl11) +    .Case("CL1.2", LangStandard::lang_opencl12) +    .Default(LangStandard::lang_unspecified); +     +    if (OpenCLLangStd == LangStandard::lang_unspecified) {        Diags.Report(diag::err_drv_invalid_value) -        << A->getAsString(Args) << A->getValue(Args); +      << A->getAsString(Args) << A->getValue(Args);      } +    else +      LangStd = OpenCLLangStd;    } - +      CompilerInvocation::setLangDefaults(Opts, IK, LangStd);    // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension @@ -1772,16 +1929,23 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      Opts.CXXOperatorNames = 0;    if (Opts.ObjC1) { +    if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) { +      StringRef value = arg->getValue(Args); +      if (Opts.ObjCRuntime.tryParse(value)) +        Diags.Report(diag::err_drv_unknown_objc_runtime) << value; +    } +      if (Args.hasArg(OPT_fobjc_gc_only))        Opts.setGC(LangOptions::GCOnly);      else if (Args.hasArg(OPT_fobjc_gc))        Opts.setGC(LangOptions::HybridGC);      else if (Args.hasArg(OPT_fobjc_arc)) {        Opts.ObjCAutoRefCount = 1; -      if (Args.hasArg(OPT_fobjc_fragile_abi)) +      if (!Opts.ObjCRuntime.isNonFragile())          Diags.Report(diag::err_arc_nonfragile_abi);      } +    Opts.ObjCRuntimeHasWeak = Opts.ObjCRuntime.hasWeak();      if (Args.hasArg(OPT_fobjc_runtime_has_weak))        Opts.ObjCRuntimeHasWeak = 1; @@ -1825,6 +1989,18 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      Diags.Report(diag::err_drv_invalid_value)        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; +  if (Arg *A = Args.getLastArg(OPT_ffp_contract)) { +    StringRef Val = A->getValue(Args); +    if (Val == "fast") +      Opts.setFPContractMode(LangOptions::FPC_Fast); +    else if (Val == "on") +      Opts.setFPContractMode(LangOptions::FPC_On); +    else if (Val == "off") +      Opts.setFPContractMode(LangOptions::FPC_Off); +    else +      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val; +  } +    if (Args.hasArg(OPT_fvisibility_inlines_hidden))      Opts.InlineVisibilityHidden = 1; @@ -1876,25 +2052,21 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    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 = Args.getLastArgIntValue(OPT_ftemplate_depth, 1024, +  Opts.InstantiationDepth = Args.getLastArgIntValue(OPT_ftemplate_depth, 512,                                                      Diags);    Opts.ConstexprCallDepth = Args.getLastArgIntValue(OPT_fconstexpr_depth, 512,                                                      Diags);    Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing); -  Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy, +  Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy_EQ,                                                      0, Diags);    Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields); -  Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);    Opts.ObjCConstantStringClass =      Args.getLastArgValue(OPT_fconstant_string_class); -  Opts.ObjCNonFragileABI = !Args.hasArg(OPT_fobjc_fragile_abi); -  if (Opts.ObjCNonFragileABI) -    Opts.ObjCNonFragileABI2 = true;    Opts.ObjCDefaultSynthProperties =      Args.hasArg(OPT_fobjc_default_synthesize_properties);    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); -  Opts.PackStruct = Args.getLastArgIntValue(OPT_fpack_struct, 0, Diags); +  Opts.PackStruct = Args.getLastArgIntValue(OPT_fpack_struct_EQ, 0, Diags);    Opts.PICLevel = Args.getLastArgIntValue(OPT_pic_level, 0, Diags);    Opts.PIELevel = Args.getLastArgIntValue(OPT_pie_level, 0, Diags);    Opts.Static = Args.hasArg(OPT_static_define); @@ -1924,9 +2096,10 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,                                   Opts.Deprecated);    // FIXME: Eliminate this dependency. -  unsigned Opt = getOptimizationLevel(Args, IK, Diags); +  unsigned Opt = getOptimizationLevel(Args, IK, Diags), +       OptSize = getOptimizationLevelSize(Args, IK, Diags);    Opts.Optimize = Opt != 0; -  Opts.OptimizeSize = Args.hasArg(OPT_Os) || Args.hasArg(OPT_Oz); +  Opts.OptimizeSize = OptSize != 0;    // This is the __NO_INLINE__ define, which just depends on things like the    // optimization level and -fno-inline, not actually whether the backend has @@ -1934,6 +2107,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.NoInlineDefine = !Opt || Args.hasArg(OPT_fno_inline);    Opts.FastMath = Args.hasArg(OPT_ffast_math); +  Opts.FiniteMathOnly = Args.hasArg(OPT_ffinite_math_only);    unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags);    switch (SSP) { @@ -1950,7 +2124,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,  static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,                                    FileManager &FileMgr,                                    DiagnosticsEngine &Diags) { -  using namespace cc1options; +  using namespace options;    Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch);    Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth);    if (const Arg *A = Args.getLastArg(OPT_token_cache)) @@ -2052,16 +2226,17 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,  static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,                                          ArgList &Args) { -  using namespace cc1options; +  using namespace options;    Opts.ShowCPP = !Args.hasArg(OPT_dM);    Opts.ShowComments = Args.hasArg(OPT_C);    Opts.ShowLineMarkers = !Args.hasArg(OPT_P);    Opts.ShowMacroComments = Args.hasArg(OPT_CC);    Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD); +  Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes);  }  static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) { -  using namespace cc1options; +  using namespace options;    Opts.ABI = Args.getLastArgValue(OPT_target_abi);    Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);    Opts.CPU = Args.getLastArgValue(OPT_target_cpu); @@ -2083,7 +2258,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,    bool Success = true;    // Parse the arguments. -  OwningPtr<OptTable> Opts(createCC1OptTable()); +  OwningPtr<OptTable> Opts(createDriverOptTable());    unsigned MissingArgIndex, MissingArgCount;    OwningPtr<InputArgList> Args(      Opts->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); @@ -2102,6 +2277,15 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,      Success = false;    } +  // Issue errors on arguments that are not valid for CC1. +  for (ArgList::iterator I = Args->begin(), E = Args->end(); +       I != E; ++I) { +    if (!(*I)->getOption().isCC1Option()) { +      Diags.Report(diag::err_drv_unknown_argument) << (*I)->getAsString(*Args); +      Success = false; +    } +  } +    Success = ParseAnalyzerArgs(Res.getAnalyzerOpts(), *Args, Diags) && Success;    Success = ParseMigratorArgs(Res.getMigratorOpts(), *Args) && Success;    ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args);  | 
