diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:14:49 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2011-10-20 21:14:49 +0000 | 
| commit | 36981b17ed939300f6f8fc2355a255f711fcef71 (patch) | |
| tree | ee2483e98b09cac943dc93a6969d83ca737ff139 /lib/Frontend/CompilerInvocation.cpp | |
| parent | 180abc3db9ae3b4fc63cd65b15697e6ffcc8a657 (diff) | |
Notes
Diffstat (limited to 'lib/Frontend/CompilerInvocation.cpp')
| -rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 388 | 
1 files changed, 283 insertions, 105 deletions
| diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 06b72602fd18..1debf3b35318 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -60,6 +60,16 @@ static const char *getAnalysisDiagClientName(AnalysisDiagClients Kind) {    }  } +static const char *getAnalysisPurgeModeName(AnalysisPurgeMode Kind) { +  switch (Kind) { +  default: +    llvm_unreachable("Unknown analysis client!"); +#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ +  case NAME: return CMDFLAG; +#include "clang/Frontend/Analyses.def" +  } +} +  //===----------------------------------------------------------------------===//  // Serialization (to args)  //===----------------------------------------------------------------------===// @@ -68,7 +78,7 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,                                 std::vector<std::string> &Res) {    if (Opts.ShowCheckerHelp)      Res.push_back("-analyzer-checker-help"); -  if (Opts.AnalysisStoreOpt != BasicStoreModel) { +  if (Opts.AnalysisStoreOpt != RegionStoreModel) {      Res.push_back("-analyzer-store");      Res.push_back(getAnalysisStoreName(Opts.AnalysisStoreOpt));    } @@ -80,6 +90,10 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,      Res.push_back("-analyzer-output");      Res.push_back(getAnalysisDiagClientName(Opts.AnalysisDiagOpt));    } +  if (Opts.AnalysisPurgeOpt != PurgeStmt) { +    Res.push_back("-analyzer-purge"); +    Res.push_back(getAnalysisPurgeModeName(Opts.AnalysisPurgeOpt)); +  }    if (!Opts.AnalyzeSpecificFunction.empty()) {      Res.push_back("-analyze-function");      Res.push_back(Opts.AnalyzeSpecificFunction); @@ -92,8 +106,6 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts,      Res.push_back("-analyzer-opt-analyze-nested-blocks");    if (Opts.EagerlyAssume)      Res.push_back("-analyzer-eagerly-assume"); -  if (!Opts.PurgeDead) -    Res.push_back("-analyzer-no-purge-dead");    if (Opts.TrimGraph)      Res.push_back("-trim-egraph");    if (Opts.VisualizeEGDot) @@ -171,6 +183,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,      Res.push_back("-mcode-model");      Res.push_back(Opts.CodeModel);    } +  if (Opts.CUDAIsDevice) +    Res.push_back("-fcuda-is-device");    if (!Opts.CXAAtExit)      Res.push_back("-fno-use-cxa-atexit");    if (Opts.CXXCtorDtorAliases) @@ -207,6 +221,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts,      Res.push_back("-mregparm");      Res.push_back(llvm::utostr(Opts.NumRegisterParameters));    } +  if (Opts.NoGlobalMerge) +    Res.push_back("-mno-global-merge");    if (Opts.NoExecStack)      Res.push_back("-mnoexecstack");    if (Opts.RelaxAll) @@ -361,7 +377,6 @@ static const char *getActionName(frontend::ActionKind Kind) {    case frontend::ASTDumpXML:             return "-ast-dump-xml";    case frontend::ASTPrint:               return "-ast-print";    case frontend::ASTView:                return "-ast-view"; -  case frontend::CreateModule:           return "-create-module";    case frontend::DumpRawTokens:          return "-dump-raw-tokens";    case frontend::DumpTokens:             return "-dump-tokens";    case frontend::EmitAssembly:           return "-S"; @@ -372,6 +387,7 @@ static const char *getActionName(frontend::ActionKind Kind) {    case frontend::EmitCodeGenOnly:        return "-emit-codegen-only";    case frontend::EmitObj:                return "-emit-obj";    case frontend::FixIt:                  return "-fixit"; +  case frontend::GenerateModule:         return "-emit-module";    case frontend::GeneratePCH:            return "-emit-pch";    case frontend::GeneratePTH:            return "-emit-pth";    case frontend::InitOnly:               return "-init-only"; @@ -404,8 +420,6 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts,      Res.push_back("-disable-free");    if (Opts.RelocatablePCH)      Res.push_back("-relocatable-pch"); -  if (Opts.ChainedPCH) -    Res.push_back("-chained-pch");    if (Opts.ShowHelp)      Res.push_back("-help");    if (Opts.ShowMacrosInCodeCompletion) @@ -439,6 +453,12 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts,      Res.push_back("-arcmt-migrate-directory");      Res.push_back(Opts.ARCMTMigrateDir);    } +  if (!Opts.ARCMTMigrateReportOut.empty()) { +    Res.push_back("-arcmt-migrate-report-output"); +    Res.push_back(Opts.ARCMTMigrateReportOut); +  } +  if (Opts.ARCMTMigrateEmitARCErrors) +    Res.push_back("-arcmt-migrate-emit-errors");    bool NeedLang = false;    for (unsigned i = 0, e = Opts.Inputs.size(); i != e; ++i) @@ -491,10 +511,6 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts,      Res.push_back("-ast-merge");      Res.push_back(Opts.ASTMergeFiles[i]);    } -  for (unsigned i = 0, e = Opts.Modules.size(); i != e; ++i) { -    Res.push_back("-import-module"); -    Res.push_back(Opts.Modules[i]); -  }    for (unsigned i = 0, e = Opts.LLVMArgs.size(); i != e; ++i) {      Res.push_back("-mllvm");      Res.push_back(Opts.LLVMArgs[i]); @@ -514,17 +530,43 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,      if (E.IsFramework && (E.Group != frontend::Angled || !E.IsUserSupplied))        llvm::report_fatal_error("Invalid option set!");      if (E.IsUserSupplied) { -      if (E.Group == frontend::After) { +      switch (E.Group) { +      case frontend::After:          Res.push_back("-idirafter"); -      } else if (E.Group == frontend::Quoted) { +        break; +         +      case frontend::Quoted:          Res.push_back("-iquote"); -      } else if (E.Group == frontend::System) { +        break; +         +      case frontend::System:          Res.push_back("-isystem"); -      } else if (E.Group == frontend::CXXSystem) { +        break; +         +      case frontend::IndexHeaderMap: +        Res.push_back("-index-header-map"); +        Res.push_back(E.IsFramework? "-F" : "-I"); +        break; +         +      case frontend::CSystem: +        Res.push_back("-c-isystem"); +        break; + +      case frontend::CXXSystem:          Res.push_back("-cxx-isystem"); -      } else { -        assert(E.Group == frontend::Angled && "Invalid group!"); +        break; + +      case frontend::ObjCSystem: +        Res.push_back("-objc-isystem"); +        break; + +      case frontend::ObjCXXSystem: +        Res.push_back("-objcxx-isystem"); +        break; +         +      case frontend::Angled:          Res.push_back(E.IsFramework ? "-F" : "-I"); +        break;        }      } else {        if (E.Group != frontend::Angled && E.Group != frontend::System) @@ -535,32 +577,16 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,      Res.push_back(E.Path);    } -  if (!Opts.EnvIncPath.empty()) { -    // FIXME: Provide an option for this, and move env detection to driver. -    llvm::report_fatal_error("Not yet implemented!"); -  } -  if (!Opts.CEnvIncPath.empty()) { -    // FIXME: Provide an option for this, and move env detection to driver. -    llvm::report_fatal_error("Not yet implemented!"); -  } -  if (!Opts.ObjCEnvIncPath.empty()) { -    // FIXME: Provide an option for this, and move env detection to driver. -    llvm::report_fatal_error("Not yet implemented!"); -  } -  if (!Opts.CXXEnvIncPath.empty()) { -    // FIXME: Provide an option for this, and move env detection to driver. -    llvm::report_fatal_error("Not yet implemented!"); -  } -  if (!Opts.ObjCXXEnvIncPath.empty()) { -    // FIXME: Provide an option for this, and move env detection to driver. -    llvm::report_fatal_error("Not yet implemented!"); -  }    if (!Opts.ResourceDir.empty()) {      Res.push_back("-resource-dir");      Res.push_back(Opts.ResourceDir);    } -  if (!Opts.UseStandardIncludes) -    Res.push_back("-nostdinc"); +  if (!Opts.ModuleCachePath.empty()) { +    Res.push_back("-fmodule-cache-path"); +    Res.push_back(Opts.ModuleCachePath); +  } +  if (!Opts.UseStandardSystemIncludes) +    Res.push_back("-nostdsysteminc");    if (!Opts.UseStandardCXXIncludes)      Res.push_back("-nostdinc++");    if (Opts.UseLibcxx) @@ -593,16 +619,14 @@ static void LangOptsToArgs(const LangOptions &Opts,      Res.push_back("-fno-gnu-keywords");    if (!Opts.GNUMode && Opts.GNUKeywords)      Res.push_back("-fgnu-keywords"); -  if (Opts.Microsoft) +  if (Opts.MicrosoftExt)      Res.push_back("-fms-extensions");    if (Opts.MSCVersion != 0)      Res.push_back("-fmsc-version=" + llvm::utostr(Opts.MSCVersion));    if (Opts.Borland)      Res.push_back("-fborland-extensions"); -  if (Opts.ObjCNonFragileABI) -    Res.push_back("-fobjc-nonfragile-abi"); -  if (Opts.ObjCNonFragileABI2) -    Res.push_back("-fobjc-nonfragile-abi"); +  if (!Opts.ObjCNonFragileABI) +    Res.push_back("-fobjc-fragile-abi");    if (Opts.ObjCDefaultSynthProperties)      Res.push_back("-fobjc-default-synthesize-properties");    // NoInline is implicit. @@ -648,6 +672,8 @@ static void LangOptsToArgs(const LangOptions &Opts,      Res.push_back("-pthread");    if (Opts.Blocks)      Res.push_back("-fblocks"); +  if (Opts.BlocksRuntimeOptional) +    Res.push_back("-fblocks-runtime-optional");    if (Opts.EmitAllDecls)      Res.push_back("-femit-all-decls");    if (Opts.MathErrno) @@ -690,11 +716,11 @@ static void LangOptsToArgs(const LangOptions &Opts,      Res.push_back("-fshort-wchar");    if (!Opts.ElideConstructors)      Res.push_back("-fno-elide-constructors"); -  if (Opts.getGCMode() != LangOptions::NonGC) { -    if (Opts.getGCMode() == LangOptions::HybridGC) { +  if (Opts.getGC() != LangOptions::NonGC) { +    if (Opts.getGC() == LangOptions::HybridGC) {        Res.push_back("-fobjc-gc");      } else { -      assert(Opts.getGCMode() == LangOptions::GCOnly && "Invalid GC mode!"); +      assert(Opts.getGC() == LangOptions::GCOnly && "Invalid GC mode!");        Res.push_back("-fobjc-gc-only");      }    } @@ -721,9 +747,9 @@ static void LangOptsToArgs(const LangOptions &Opts,    if (Opts.InlineVisibilityHidden)      Res.push_back("-fvisibility-inlines-hidden"); -  if (Opts.getStackProtectorMode() != 0) { +  if (Opts.getStackProtector() != 0) {      Res.push_back("-stack-protector"); -    Res.push_back(llvm::utostr(Opts.getStackProtectorMode())); +    Res.push_back(llvm::utostr(Opts.getStackProtector()));    }    if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) {      Res.push_back("-ftemplate-depth"); @@ -858,7 +884,7 @@ using namespace clang::driver::cc1options;  //  static unsigned getOptimizationLevel(ArgList &Args, InputKind IK, -                                     Diagnostic &Diags) { +                                     DiagnosticsEngine &Diags) {    unsigned DefaultOpt = 0;    if (IK == IK_OpenCL && !Args.hasArg(OPT_cl_opt_disable))      DefaultOpt = 2; @@ -868,11 +894,11 @@ static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,  }  static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, -                              Diagnostic &Diags) { +                              DiagnosticsEngine &Diags) {    using namespace cc1options;    if (Arg *A = Args.getLastArg(OPT_analyzer_store)) { -    llvm::StringRef Name = A->getValue(Args); +    StringRef Name = A->getValue(Args);      AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name)  #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \        .Case(CMDFLAG, NAME##Model) @@ -887,7 +913,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    }    if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) { -    llvm::StringRef Name = A->getValue(Args); +    StringRef Name = A->getValue(Args);      AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name)  #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \        .Case(CMDFLAG, NAME##Model) @@ -902,7 +928,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    }    if (Arg *A = Args.getLastArg(OPT_analyzer_output)) { -    llvm::StringRef Name = A->getValue(Args); +    StringRef Name = A->getValue(Args);      AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)  #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) \        .Case(CMDFLAG, PD_##NAME) @@ -916,6 +942,21 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,        Opts.AnalysisDiagOpt = Value;    } +  if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) { +    StringRef Name = A->getValue(Args); +    AnalysisPurgeMode Value = llvm::StringSwitch<AnalysisPurgeMode>(Name) +#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ +      .Case(CMDFLAG, NAME) +#include "clang/Frontend/Analyses.def" +      .Default(NumPurgeModes); +    // FIXME: Error handling. +    if (Value == NumPurgeModes) +      Diags.Report(diag::err_drv_invalid_value) +        << A->getAsString(Args) << Name; +    else +      Opts.AnalysisPurgeOpt = Value; +  } +    Opts.ShowCheckerHelp = Args.hasArg(OPT_analyzer_checker_help);    Opts.VisualizeEGDot = Args.hasArg(OPT_analyzer_viz_egraph_graphviz);    Opts.VisualizeEGUbi = Args.hasArg(OPT_analyzer_viz_egraph_ubigraph); @@ -923,7 +964,6 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    Opts.AnalyzerDisplayProgress = Args.hasArg(OPT_analyzer_display_progress);    Opts.AnalyzeNestedBlocks =      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 = Args.getLastArgValue(OPT_analyze_function);    Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG); @@ -944,8 +984,8 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,      bool enable = (A->getOption().getID() == OPT_analyzer_checker);      // We can have a list of comma separated checker names, e.g:      // '-analyzer-checker=cocoa,unix' -    llvm::StringRef checkerList = A->getValue(Args); -    llvm::SmallVector<llvm::StringRef, 4> checkers; +    StringRef checkerList = A->getValue(Args); +    SmallVector<StringRef, 4> checkers;      checkerList.split(checkers, ",");      for (unsigned i = 0, e = checkers.size(); i != e; ++i)        Opts.CheckersControlList.push_back(std::make_pair(checkers[i], enable)); @@ -953,7 +993,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,  }  static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, -                             Diagnostic &Diags) { +                             DiagnosticsEngine &Diags) {    using namespace cc1options;    Opts.OptimizationLevel = getOptimizationLevel(Args, IK, Diags); @@ -990,6 +1030,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    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);    Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model); @@ -1004,6 +1045,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);    Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);    Opts.NumRegisterParameters = Args.getLastArgIntValue(OPT_mregparm, 0, Diags); +  Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);    Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);    Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);    Opts.OmitLeafFramePointer = Args.hasArg(OPT_momit_leaf_frame_pointer); @@ -1028,7 +1070,7 @@ static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.CoverageFile = Args.getLastArgValue(OPT_coverage_file);    if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) { -    llvm::StringRef Name = A->getValue(Args); +    StringRef Name = A->getValue(Args);      unsigned Method = llvm::StringSwitch<unsigned>(Name)        .Case("legacy", CodeGenOptions::Legacy)        .Case("non-legacy", CodeGenOptions::NonLegacy) @@ -1054,7 +1096,7 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,  }  static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, -                                Diagnostic &Diags) { +                                DiagnosticsEngine &Diags) {    using namespace cc1options;    Opts.DiagnosticLogFile = Args.getLastArgValue(OPT_diagnostic_log_file);    Opts.IgnoreWarnings = Args.hasArg(OPT_w); @@ -1078,18 +1120,18 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,      if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))        Opts.ShowNoteIncludeStack = true; -  llvm::StringRef ShowOverloads = +  StringRef ShowOverloads =      Args.getLastArgValue(OPT_fshow_overloads_EQ, "all");    if (ShowOverloads == "best") -    Opts.ShowOverloads = Diagnostic::Ovl_Best; +    Opts.ShowOverloads = DiagnosticsEngine::Ovl_Best;    else if (ShowOverloads == "all") -    Opts.ShowOverloads = Diagnostic::Ovl_All; +    Opts.ShowOverloads = DiagnosticsEngine::Ovl_All;    else      Diags.Report(diag::err_drv_invalid_value)        << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)        << ShowOverloads; -  llvm::StringRef ShowCategory = +  StringRef ShowCategory =      Args.getLastArgValue(OPT_fdiagnostics_show_category, "none");    if (ShowCategory == "none")      Opts.ShowCategories = 0; @@ -1102,7 +1144,7 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,        << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)        << ShowCategory; -  llvm::StringRef Format = +  StringRef Format =      Args.getLastArgValue(OPT_fdiagnostics_format, "clang");    if (Format == "clang")      Opts.Format = DiagnosticOptions::Clang; @@ -1143,13 +1185,13 @@ static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {  }  static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, -                                   Diagnostic &Diags) { +                                   DiagnosticsEngine &Diags) {    using namespace cc1options;    Opts.ProgramAction = frontend::ParseSyntaxOnly;    if (const Arg *A = Args.getLastArg(OPT_Action_Group)) {      switch (A->getOption().getID()) {      default: -      assert(0 && "Invalid option in group!"); +      llvm_unreachable("Invalid option in group!");      case OPT_ast_dump:        Opts.ProgramAction = frontend::ASTDump; break;      case OPT_ast_dump_xml: @@ -1181,6 +1223,8 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,        // fall-through!      case OPT_fixit:        Opts.ProgramAction = frontend::FixIt; break; +    case OPT_emit_module: +      Opts.ProgramAction = frontend::GenerateModule; break;      case OPT_emit_pch:        Opts.ProgramAction = frontend::GeneratePCH; break;      case OPT_emit_pth: @@ -1205,8 +1249,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,        Opts.ProgramAction = frontend::RunAnalysis; break;      case OPT_Eonly:        Opts.ProgramAction = frontend::RunPreprocessorOnly; break; -    case OPT_create_module: -      Opts.ProgramAction = frontend::CreateModule; break;      }    } @@ -1244,7 +1286,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,    Opts.OutputFile = Args.getLastArgValue(OPT_o);    Opts.Plugins = Args.getAllArgValues(OPT_load);    Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch); -  Opts.ChainedPCH = Args.hasArg(OPT_chained_pch);    Opts.ShowHelp = Args.hasArg(OPT_help);    Opts.ShowMacrosInCodeCompletion = Args.hasArg(OPT_code_completion_macros);    Opts.ShowCodePatternsInCodeCompletion @@ -1257,7 +1298,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,    Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);    Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);    Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can); -  Opts.Modules = Args.getAllArgValues(OPT_import_module);    Opts.ARCMTAction = FrontendOptions::ARCMT_None;    if (const Arg *A = Args.getLastArg(OPT_arcmt_check, @@ -1278,6 +1318,10 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,      }    }    Opts.ARCMTMigrateDir = Args.getLastArgValue(OPT_arcmt_migrate_directory); +  Opts.ARCMTMigrateReportOut +    = Args.getLastArgValue(OPT_arcmt_migrate_report_output); +  Opts.ARCMTMigrateEmitARCErrors +    = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);    InputKind DashX = IK_None;    if (const Arg *A = Args.getLastArg(OPT_x)) { @@ -1294,7 +1338,9 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,        .Case("objective-c-cpp-output", IK_PreprocessedObjC)        .Case("objc-cpp-output", IK_PreprocessedObjC)        .Case("objective-c++-cpp-output", IK_PreprocessedObjCXX) +      .Case("objc++-cpp-output", IK_PreprocessedObjCXX)        .Case("c-header", IK_C) +      .Case("cl-header", IK_OpenCL)        .Case("objective-c-header", IK_ObjC)        .Case("c++-header", IK_CXX)        .Case("objective-c++-header", IK_ObjCXX) @@ -1315,7 +1361,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,      InputKind IK = DashX;      if (IK == IK_None) {        IK = FrontendOptions::getInputKindForExtension( -        llvm::StringRef(Inputs[i]).rsplit('.').second); +        StringRef(Inputs[i]).rsplit('.').second);        // FIXME: Remove this hack.        if (i == 0)          DashX = IK; @@ -1348,20 +1394,35 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {    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.UseStandardSystemIncludes = !Args.hasArg(OPT_nostdsysteminc);    Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx);    if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ))      Opts.UseLibcxx = (strcmp(A->getValue(Args), "libc++") == 0);    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), -         ie = Args.filtered_end(); it != ie; ++it) -    Opts.AddPath((*it)->getValue(Args), frontend::Angled, true, +  Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodule_cache_path); +  Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash); +   +  // Add -I..., -F..., and -index-header-map options in order. +  bool IsIndexHeaderMap = false; +  for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F,  +                                             OPT_index_header_map), +       ie = Args.filtered_end(); it != ie; ++it) { +    if ((*it)->getOption().matches(OPT_index_header_map)) { +      // -index-header-map applies to the next -I or -F. +      IsIndexHeaderMap = true; +      continue; +    } +         +    frontend::IncludeDirGroup Group  +      = IsIndexHeaderMap? frontend::IndexHeaderMap : frontend::Angled; +     +    Opts.AddPath((*it)->getValue(Args), Group, true,                   /*IsFramework=*/ (*it)->getOption().matches(OPT_F), false); +    IsIndexHeaderMap = false; +  }    // Add -iprefix/-iwith-prefix/-iwithprefixbefore options. -  llvm::StringRef Prefix = ""; // FIXME: This isn't the correct default prefix. +  StringRef Prefix = ""; // FIXME: This isn't the correct default prefix.    for (arg_iterator it = Args.filtered_begin(OPT_iprefix, OPT_iwithprefix,                                               OPT_iwithprefixbefore),           ie = Args.filtered_end(); it != ie; ++it) { @@ -1382,14 +1443,25 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {    for (arg_iterator it = Args.filtered_begin(OPT_iquote),           ie = Args.filtered_end(); it != ie; ++it)      Opts.AddPath((*it)->getValue(Args), frontend::Quoted, true, false, false); -  for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem, OPT_isystem, +  for (arg_iterator it = Args.filtered_begin(OPT_isystem,           OPT_iwithsysroot), ie = Args.filtered_end(); it != ie; ++it) -    Opts.AddPath((*it)->getValue(Args), -                 ((*it)->getOption().matches(OPT_cxx_isystem) ? -                   frontend::CXXSystem : frontend::System), -                 true, false, !(*it)->getOption().matches(OPT_iwithsysroot)); - -  // FIXME: Need options for the various environment variables! +    Opts.AddPath((*it)->getValue(Args), frontend::System, true, false, +                 !(*it)->getOption().matches(OPT_iwithsysroot)); + +  // Add the paths for the various language specific isystem flags. +  for (arg_iterator it = Args.filtered_begin(OPT_c_isystem), +       ie = Args.filtered_end(); it != ie; ++it) +    Opts.AddPath((*it)->getValue(Args), frontend::CSystem, true, false, true); +  for (arg_iterator it = Args.filtered_begin(OPT_cxx_isystem), +       ie = Args.filtered_end(); it != ie; ++it) +    Opts.AddPath((*it)->getValue(Args), frontend::CXXSystem, true, false, true); +  for (arg_iterator it = Args.filtered_begin(OPT_objc_isystem), +       ie = Args.filtered_end(); it != ie; ++it) +    Opts.AddPath((*it)->getValue(Args), frontend::ObjCSystem, true, false,true); +  for (arg_iterator it = Args.filtered_begin(OPT_objcxx_isystem), +       ie = Args.filtered_end(); it != ie; ++it) +    Opts.AddPath((*it)->getValue(Args), frontend::ObjCXXSystem, true, false, +                 true);  }  void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, @@ -1412,7 +1484,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,      case IK_None:      case IK_AST:      case IK_LLVM_IR: -      assert(0 && "Invalid input kind!"); +      llvm_unreachable("Invalid input kind!");      case IK_OpenCL:        LangStd = LangStandard::lang_opencl;        break; @@ -1450,9 +1522,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,    // OpenCL has some additional defaults.    if (LangStd == LangStandard::lang_opencl) {      Opts.OpenCL = 1; -    Opts.AltiVec = 1; +    Opts.AltiVec = 0;      Opts.CXXOperatorNames = 1; -    Opts.LaxVectorConversions = 1; +    Opts.LaxVectorConversions = 0;      Opts.DefaultFPContract = 1;    } @@ -1473,7 +1545,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,  }  static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, -                          Diagnostic &Diags) { +                          DiagnosticsEngine &Diags) {    // FIXME: Cleanup per-file based stuff.    LangStandard::Kind LangStd = LangStandard::lang_unspecified;    if (const Arg *A = Args.getLastArg(OPT_std_EQ)) { @@ -1543,12 +1615,12 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    if (Opts.ObjC1) {      if (Args.hasArg(OPT_fobjc_gc_only)) -      Opts.setGCMode(LangOptions::GCOnly); +      Opts.setGC(LangOptions::GCOnly);      else if (Args.hasArg(OPT_fobjc_gc)) -      Opts.setGCMode(LangOptions::HybridGC); +      Opts.setGC(LangOptions::HybridGC);      else if (Args.hasArg(OPT_fobjc_arc)) {        Opts.ObjCAutoRefCount = 1; -      if (!Args.hasArg(OPT_fobjc_nonfragile_abi)) +      if (Args.hasArg(OPT_fobjc_fragile_abi))          Diags.Report(diag::err_arc_nonfragile_abi);      } @@ -1583,7 +1655,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    if (Args.hasArg(OPT_fdelayed_template_parsing))      Opts.DelayedTemplateParsing = 1; -  llvm::StringRef Vis = Args.getLastArgValue(OPT_fvisibility, "default"); +  StringRef Vis = Args.getLastArgValue(OPT_fvisibility, "default");    if (Vis == "default")      Opts.setVisibilityMode(DefaultVisibility);    else if (Vis == "hidden") @@ -1613,7 +1685,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,                                     OPT_fno_dollars_in_identifiers,                                     Opts.DollarIdents);    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); -  Opts.Microsoft = Args.hasArg(OPT_fms_extensions); +  Opts.MicrosoftExt = Args.hasArg(OPT_fms_extensions); +  Opts.MicrosoftMode = Args.hasArg(OPT_fms_compatibility);    Opts.MSCVersion = Args.getLastArgIntValue(OPT_fmsc_version, 0, Diags);    Opts.Borland = Args.hasArg(OPT_fborland_extensions);    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); @@ -1631,6 +1704,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);    Opts.Blocks = Args.hasArg(OPT_fblocks); +  Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);    Opts.ShortEnums = Args.hasArg(OPT_fshort_enums); @@ -1650,13 +1724,14 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);    Opts.ObjCConstantStringClass =      Args.getLastArgValue(OPT_fconstant_string_class); -  Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); +  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.PICLevel = Args.getLastArgIntValue(OPT_pic_level, 0, Diags);    Opts.Static = Args.hasArg(OPT_static_define);    Opts.DumpRecordLayouts = Args.hasArg(OPT_fdump_record_layouts); @@ -1693,15 +1768,15 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      Diags.Report(diag::err_drv_invalid_value)        << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;      break; -  case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; -  case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break; -  case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; +  case 0: Opts.setStackProtector(LangOptions::SSPOff); break; +  case 1: Opts.setStackProtector(LangOptions::SSPOn);  break; +  case 2: Opts.setStackProtector(LangOptions::SSPReq); break;    }  }  static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,                                    FileManager &FileMgr, -                                  Diagnostic &Diags) { +                                  DiagnosticsEngine &Diags) {    using namespace cc1options;    Opts.ImplicitPCHInclude = Args.getLastArgValue(OPT_include_pch);    Opts.ImplicitPTHInclude = Args.getLastArgValue(OPT_include_pth); @@ -1711,6 +1786,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,      Opts.TokenCache = Opts.ImplicitPTHInclude;    Opts.UsePredefines = !Args.hasArg(OPT_undef);    Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record); +  Opts.AutoModuleImport = Args.hasArg(OPT_fauto_module_import);    Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch);    Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls); @@ -1721,12 +1797,12 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,    }    if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) { -    llvm::StringRef Value(A->getValue(Args)); +    StringRef Value(A->getValue(Args));      size_t Comma = Value.find(',');      unsigned Bytes = 0;      unsigned EndOfLine = 0; -    if (Comma == llvm::StringRef::npos || +    if (Comma == StringRef::npos ||          Value.substr(0, Comma).getAsInteger(10, Bytes) ||          Value.substr(Comma + 1).getAsInteger(10, EndOfLine))        Diags.Report(diag::err_drv_preamble_format); @@ -1777,8 +1853,8 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,    for (arg_iterator it = Args.filtered_begin(OPT_remap_file),           ie = Args.filtered_end(); it != ie; ++it) {      const Arg *A = *it; -    std::pair<llvm::StringRef,llvm::StringRef> Split = -      llvm::StringRef(A->getValue(Args)).split(';'); +    std::pair<StringRef,StringRef> Split = +      StringRef(A->getValue(Args)).split(';');      if (Split.second.empty()) {        Diags.Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args); @@ -1789,7 +1865,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,    }    if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) { -    llvm::StringRef Name = A->getValue(Args); +    StringRef Name = A->getValue(Args);      unsigned Library = llvm::StringSwitch<unsigned>(Name)        .Case("libc++", ARCXX_libcxx)        .Case("libstdc++", ARCXX_libstdcxx) @@ -1831,7 +1907,7 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {  void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,                                          const char *const *ArgBegin,                                          const char *const *ArgEnd, -                                        Diagnostic &Diags) { +                                        DiagnosticsEngine &Diags) {    // Parse the arguments.    llvm::OwningPtr<OptTable> Opts(createCC1OptTable());    unsigned MissingArgIndex, MissingArgCount; @@ -1870,3 +1946,105 @@ void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,    ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args);    ParseTargetArgs(Res.getTargetOpts(), *Args);  } + +namespace { + +  class ModuleSignature { +    llvm::SmallVector<uint64_t, 16> Data; +    unsigned CurBit; +    uint64_t CurValue; +     +  public: +    ModuleSignature() : CurBit(0), CurValue(0) { } +     +    void add(uint64_t Value, unsigned Bits); +    void add(StringRef Value); +    void flush(); +     +    llvm::APInt getAsInteger() const; +  }; +} + +void ModuleSignature::add(uint64_t Value, unsigned int NumBits) { +  CurValue |= Value << CurBit; +  if (CurBit + NumBits < 64) { +    CurBit += NumBits; +    return; +  } +   +  // Add the current word. +  Data.push_back(CurValue); +   +  if (CurBit) +    CurValue = Value >> (64-CurBit); +  else +    CurValue = 0; +  CurBit = (CurBit+NumBits) & 63; +} + +void ModuleSignature::flush() { +  if (CurBit == 0) +    return; +   +  Data.push_back(CurValue); +  CurBit = 0; +  CurValue = 0; +} + +void ModuleSignature::add(StringRef Value) { +  for (StringRef::iterator I = Value.begin(), IEnd = Value.end(); I != IEnd;++I) +    add(*I, 8); +} + +llvm::APInt ModuleSignature::getAsInteger() const { +  return llvm::APInt(Data.size() * 64, Data); +} + +std::string CompilerInvocation::getModuleHash() const { +  ModuleSignature Signature; +   +  // Start the signature with the compiler version. +  Signature.add(getClangFullRepositoryVersion()); +   +  // Extend the signature with the language options +#define LANGOPT(Name, Bits, Default, Description) \ +  Signature.add(LangOpts.Name, Bits); +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ +  Signature.add(static_cast<unsigned>(LangOpts.get##Name()), Bits); +#define BENIGN_LANGOPT(Name, Bits, Default, Description) +#define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) +#include "clang/Basic/LangOptions.def" +   +  // Extend the signature with the target triple +  llvm::Triple T(TargetOpts.Triple); +  Signature.add((unsigned)T.getArch(), 5); +  Signature.add((unsigned)T.getVendor(), 4); +  Signature.add((unsigned)T.getOS(), 5); +  Signature.add((unsigned)T.getEnvironment(), 4); + +  // Extend the signature with preprocessor options. +  Signature.add(getPreprocessorOpts().UsePredefines, 1); +  Signature.add(getPreprocessorOpts().DetailedRecord, 1); +   +  // Hash the preprocessor defines. +  // FIXME: This is terrible. Use an MD5 sum of the preprocessor defines. +  std::vector<StringRef> MacroDefs; +  for (std::vector<std::pair<std::string, bool/*isUndef*/> >::const_iterator  +            I = getPreprocessorOpts().Macros.begin(), +         IEnd = getPreprocessorOpts().Macros.end(); +       I != IEnd; ++I) { +    if (!I->second) +      MacroDefs.push_back(I->first); +  } +  llvm::array_pod_sort(MacroDefs.begin(), MacroDefs.end()); +        +  unsigned PPHashResult = 0; +  for (unsigned I = 0, N = MacroDefs.size(); I != N; ++I) +    PPHashResult = llvm::HashString(MacroDefs[I], PPHashResult); +  Signature.add(PPHashResult, 32); +   +  // We've generated the signature. Treat it as one large APInt that we'll +  // encode in base-36 and return. +  Signature.flush(); +  return Signature.getAsInteger().toString(36, /*Signed=*/false); +} | 
