diff options
Diffstat (limited to 'lib/Frontend/CompilerInvocation.cpp')
| -rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 281 | 
1 files changed, 201 insertions, 80 deletions
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 42ea96f0f2ad..8db5cf1bc21a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -11,13 +11,11 @@  #include "clang/Basic/Diagnostic.h"  #include "clang/Basic/FileManager.h"  #include "clang/Basic/Version.h" -#include "clang/Driver/Arg.h" -#include "clang/Driver/ArgList.h"  #include "clang/Driver/DriverDiagnostic.h" -#include "clang/Driver/OptTable.h" -#include "clang/Driver/Option.h"  #include "clang/Driver/Options.h" +#include "clang/Driver/Util.h"  #include "clang/Frontend/LangStandard.h" +#include "clang/Frontend/Utils.h"  #include "clang/Lex/HeaderSearchOptions.h"  #include "clang/Serialization/ASTReader.h"  #include "llvm/ADT/Hashing.h" @@ -26,10 +24,17 @@  #include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringSwitch.h"  #include "llvm/ADT/Triple.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Option/OptTable.h" +#include "llvm/Option/Option.h"  #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FileSystem.h"  #include "llvm/Support/Host.h"  #include "llvm/Support/Path.h" +#include "llvm/Support/Process.h"  #include "llvm/Support/system_error.h" +#include <sys/stat.h>  using namespace clang;  //===----------------------------------------------------------------------===// @@ -56,6 +61,7 @@ CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)  using namespace clang::driver;  using namespace clang::driver::options; +using namespace llvm::opt;  // @@ -78,7 +84,7 @@ static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,      if (S == "s" || S == "z" || S.empty())        return 2; -    return Args.getLastArgIntValue(OPT_O, DefaultOpt, Diags); +    return getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags);    }    return DefaultOpt; @@ -162,7 +168,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {      StringRef Name = A->getValue();      AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name) -#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) \ +#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \        .Case(CMDFLAG, PD_##NAME)  #include "clang/StaticAnalyzer/Core/Analyses.def"        .Default(NUM_ANALYSIS_DIAG_CLIENTS); @@ -221,11 +227,12 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,    Opts.AnalyzeSpecificFunction = Args.getLastArgValue(OPT_analyze_function);    Opts.UnoptimizedCFG = Args.hasArg(OPT_analysis_UnoptimizedCFG);    Opts.TrimGraph = Args.hasArg(OPT_trim_egraph); -  Opts.maxBlockVisitOnPath = Args.getLastArgIntValue(OPT_analyzer_max_loop, 4, Diags); +  Opts.maxBlockVisitOnPath = +      getLastArgIntValue(Args, OPT_analyzer_max_loop, 4, Diags);    Opts.PrintStats = Args.hasArg(OPT_analyzer_stats);    Opts.InlineMaxStackDepth = -    Args.getLastArgIntValue(OPT_analyzer_inline_max_stack_depth, -                            Opts.InlineMaxStackDepth, Diags); +      getLastArgIntValue(Args, OPT_analyzer_inline_max_stack_depth, +                         Opts.InlineMaxStackDepth, Diags);    Opts.CheckersControlList.clear();    for (arg_iterator it = Args.filtered_begin(OPT_analyzer_checker, @@ -292,14 +299,15 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    using namespace options;    bool Success = true; -  unsigned OptLevel = getOptimizationLevel(Args, IK, Diags); -  if (OptLevel > 3) { -    Diags.Report(diag::err_drv_invalid_value) -      << Args.getLastArg(OPT_O)->getAsString(Args) << OptLevel; -    OptLevel = 3; -    Success = false; +  Opts.OptimizationLevel = getOptimizationLevel(Args, IK, Diags); +  // TODO: This could be done in Driver +  unsigned MaxOptLevel = 3; +  if (Opts.OptimizationLevel > MaxOptLevel) { +    // If the optimization level is not supported, fall back on the default optimization +    Diags.Report(diag::warn_drv_optimization_value) +        << Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel; +    Opts.OptimizationLevel = MaxOptLevel;    } -  Opts.OptimizationLevel = OptLevel;    // We must always run at least the always inlining pass.    Opts.setInlining( @@ -312,7 +320,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    if (Args.hasArg(OPT_gline_tables_only)) {      Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly); -  } else if (Args.hasArg(OPT_g_Flag)) { +  } else if (Args.hasArg(OPT_g_Flag) || Args.hasArg(OPT_gdwarf_2) || +             Args.hasArg(OPT_gdwarf_3) || Args.hasArg(OPT_gdwarf_4)) {      if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, true))        Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo);      else @@ -320,6 +329,15 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    }    Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);    Opts.SplitDwarfFile = Args.getLastArgValue(OPT_split_dwarf_file); +  if (Args.hasArg(OPT_gdwarf_2)) +    Opts.DwarfVersion = 2; +  else if (Args.hasArg(OPT_gdwarf_3)) +    Opts.DwarfVersion = 3; +  else if (Args.hasArg(OPT_gdwarf_4)) +    Opts.DwarfVersion = 4; +  else if (Opts.getDebugInfo() != CodeGenOptions::NoDebugInfo) +    // Default Dwarf version is 4 if we are generating debug information. +    Opts.DwarfVersion = 4;    Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);    Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); @@ -327,7 +345,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(      OPT_fuse_register_sized_bitfield_access);    Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing); -  Opts.StructPathTBAA = Args.hasArg(OPT_struct_path_tbaa); +  Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);    Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);    Opts.MergeAllConstants = !Args.hasArg(OPT_fno_merge_all_constants);    Opts.NoCommon = Args.hasArg(OPT_fno_common); @@ -335,10 +353,13 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.OptimizeSize = getOptimizationLevelSize(Args);    Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||                              Args.hasArg(OPT_ffreestanding)); -  Opts.UnrollLoops = Args.hasArg(OPT_funroll_loops) || -                     (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize); +  Opts.UnrollLoops = +      Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops, +                   (Opts.OptimizationLevel > 1 && !Opts.OptimizeSize)); +  Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);    Opts.Autolink = !Args.hasArg(OPT_fno_autolink); +  Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ);    Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);    Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);    Opts.CUDAIsDevice = Args.hasArg(OPT_fcuda_is_device); @@ -347,6 +368,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.CodeModel = Args.getLastArgValue(OPT_mcode_model);    Opts.DebugPass = Args.getLastArgValue(OPT_mdebug_pass);    Opts.DisableFPElim = Args.hasArg(OPT_mdisable_fp_elim); +  Opts.DisableFree = Args.hasArg(OPT_disable_free);    Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);    Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi);    Opts.HiddenWeakVTables = Args.hasArg(OPT_fhidden_weak_vtables); @@ -360,7 +382,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,                         Args.hasArg(OPT_cl_fast_relaxed_math));    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.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);    Opts.NoGlobalMerge = Args.hasArg(OPT_mno_global_merge);    Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);    Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks); @@ -379,8 +401,14 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);    Opts.UseInitArray = Args.hasArg(OPT_fuse_init_array); -  Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections); -  Opts.DataSections = Args.hasArg(OPT_fdata_sections); +  Opts.FunctionSections = Args.hasFlag(OPT_ffunction_sections, +                                       OPT_fno_function_sections, false); +  Opts.DataSections = Args.hasFlag(OPT_fdata_sections, +                                   OPT_fno_data_sections, false); + +  Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive); +  Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops); +  Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);    Opts.MainFileName = Args.getLastArgValue(OPT_main_file_name);    Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier); @@ -419,7 +447,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.SanitizeUndefinedTrapOnError =      Args.hasArg(OPT_fsanitize_undefined_trap_on_error);    Opts.SSPBufferSize = -    Args.getLastArgIntValue(OPT_stack_protector_buffer_size, 8, Diags); +      getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags);    Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);    if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {      StringRef Val = A->getValue(); @@ -472,6 +500,17 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,        Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;    } +  if (Arg *A = Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return)) { +    if (A->getOption().matches(OPT_fpcc_struct_return)) { +      Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack); +    } else { +      assert(A->getOption().matches(OPT_freg_struct_return)); +      Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs); +    } +  } + +  Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib); +    return Success;  } @@ -485,6 +524,7 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,    Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);    Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file);    Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG); +  Opts.PrintShowIncludes = Args.hasArg(OPT_show_includes);    Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);  } @@ -509,6 +549,8 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);    Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option); +  llvm::sys::Process::UseANSIEscapeCodes(Args.hasArg(OPT_fansi_escape_codes)); +    // Default behavior is to not to show note include stacks.    Opts.ShowNoteIncludeStack = false;    if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack, @@ -552,7 +594,10 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,      Opts.setFormat(DiagnosticOptions::Clang);    else if (Format == "msvc")      Opts.setFormat(DiagnosticOptions::Msvc); -  else if (Format == "vi") +  else if (Format == "msvc-fallback") { +    Opts.setFormat(DiagnosticOptions::Msvc); +    Opts.CLFallbackMode = true; +  } else if (Format == "vi")      Opts.setFormat(DiagnosticOptions::Vi);    else {      Success = false; @@ -568,19 +613,17 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    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, +  Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags); +  Opts.MacroBacktraceLimit = +      getLastArgIntValue(Args, OPT_fmacro_backtrace_limit,                           DiagnosticOptions::DefaultMacroBacktraceLimit, Diags); -  Opts.TemplateBacktraceLimit -    = Args.getLastArgIntValue(OPT_ftemplate_backtrace_limit, -                         DiagnosticOptions::DefaultTemplateBacktraceLimit, -                         Diags); -  Opts.ConstexprBacktraceLimit -    = Args.getLastArgIntValue(OPT_fconstexpr_backtrace_limit, -                         DiagnosticOptions::DefaultConstexprBacktraceLimit, -                         Diags); -  Opts.TabStop = Args.getLastArgIntValue(OPT_ftabstop, +  Opts.TemplateBacktraceLimit = getLastArgIntValue( +      Args, OPT_ftemplate_backtrace_limit, +      DiagnosticOptions::DefaultTemplateBacktraceLimit, Diags); +  Opts.ConstexprBacktraceLimit = getLastArgIntValue( +      Args, OPT_fconstexpr_backtrace_limit, +      DiagnosticOptions::DefaultConstexprBacktraceLimit, Diags); +  Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop,                                      DiagnosticOptions::DefaultTabStop, Diags);    if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {      Opts.TabStop = DiagnosticOptions::DefaultTabStop; @@ -588,7 +631,7 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,        Diags->Report(diag::warn_ignoring_ftabstop_value)        << Opts.TabStop << DiagnosticOptions::DefaultTabStop;    } -  Opts.MessageLength = Args.getLastArgIntValue(OPT_fmessage_length, 0, Diags); +  Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags);    addWarningArgs(Args, Opts.Warnings);    return Success; @@ -610,8 +653,6 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,        Opts.ProgramAction = frontend::ASTDeclList; break;      case OPT_ast_dump:        Opts.ProgramAction = frontend::ASTDump; break; -    case OPT_ast_dump_xml: -      Opts.ProgramAction = frontend::ASTDumpXML; break;      case OPT_ast_print:        Opts.ProgramAction = frontend::ASTPrint; break;      case OPT_ast_view: @@ -717,6 +758,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,    Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);    Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);    Opts.ASTDumpFilter = Args.getLastArgValue(OPT_ast_dump_filter); +  Opts.ASTDumpLookups = Args.hasArg(OPT_ast_dump_lookups);    Opts.UseGlobalModuleIndex = !Args.hasArg(OPT_fno_modules_global_index);    Opts.GenerateGlobalModuleIndex = Opts.UseGlobalModuleIndex; @@ -758,6 +800,30 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,      Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Literals;    if (Args.hasArg(OPT_objcmt_migrate_subscripting))      Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Subscripting; +  if (Args.hasArg(OPT_objcmt_migrate_property)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Property; +  if (Args.hasArg(OPT_objcmt_migrate_readonly_property)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadonlyProperty; +  if (Args.hasArg(OPT_objcmt_migrate_readwrite_property)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReadwriteProperty; +  if (Args.hasArg(OPT_objcmt_migrate_annotation)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Annotation; +  if (Args.hasArg(OPT_objcmt_returns_innerpointer_property)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ReturnsInnerPointerProperty; +  if (Args.hasArg(OPT_objcmt_migrate_instancetype)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_Instancetype; +  if (Args.hasArg(OPT_objcmt_migrate_nsmacros)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsMacros; +  if (Args.hasArg(OPT_objcmt_migrate_protocol_conformance)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_ProtocolConformance; +  if (Args.hasArg(OPT_objcmt_atomic_property)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_AtomicProperty; +  if (Args.hasArg(OPT_objcmt_ns_nonatomic_iosonly)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_NsAtomicIOSOnlyProperty; +  if (Args.hasArg(OPT_objcmt_migrate_all)) +    Opts.ObjCMTAction |= FrontendOptions::ObjCMT_MigrateDecls; + +  Opts.ObjCMTWhiteListPath = Args.getLastArgValue(OPT_objcmt_white_list_dir_path);    if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&        Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) { @@ -816,16 +882,14 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,  std::string CompilerInvocation::GetResourcesPath(const char *Argv0,                                                   void *MainAddr) { -  llvm::sys::Path P = llvm::sys::Path::GetMainExecutable(Argv0, MainAddr); +  SmallString<128> P(llvm::sys::fs::getMainExecutable(Argv0, MainAddr)); -  if (!P.isEmpty()) { -    P.eraseComponent();  // Remove /clang from foo/bin/clang -    P.eraseComponent();  // Remove /bin   from foo/bin +  if (!P.empty()) { +    llvm::sys::path::remove_filename(P); // Remove /clang from foo/bin/clang +    llvm::sys::path::remove_filename(P); // Remove /bin   from foo/bin      // Get foo/lib/clang/<version>/include -    P.appendComponent("lib"); -    P.appendComponent("clang"); -    P.appendComponent(CLANG_VERSION_STRING); +    llvm::sys::path::append(P, "lib", "clang", CLANG_VERSION_STRING);    }    return P.str(); @@ -843,15 +907,21 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {    Opts.ResourceDir = Args.getLastArgValue(OPT_resource_dir);    Opts.ModuleCachePath = Args.getLastArgValue(OPT_fmodules_cache_path);    Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash); -  Opts.ModuleCachePruneInterval -    = Args.getLastArgIntValue(OPT_fmodules_prune_interval, 7*24*60*60); -  Opts.ModuleCachePruneAfter -    = Args.getLastArgIntValue(OPT_fmodules_prune_after, 31*24*60*60); +  // -fmodules implies -fmodule-maps +  Opts.ModuleMaps = Args.hasArg(OPT_fmodule_maps) || Args.hasArg(OPT_fmodules); +  Opts.ModuleCachePruneInterval = +      getLastArgIntValue(Args, OPT_fmodules_prune_interval, 7 * 24 * 60 * 60); +  Opts.ModuleCachePruneAfter = +      getLastArgIntValue(Args, OPT_fmodules_prune_after, 31 * 24 * 60 * 60);    for (arg_iterator it = Args.filtered_begin(OPT_fmodules_ignore_macro), -       ie = Args.filtered_end(); it != ie; ++it) { +                    ie = Args.filtered_end(); +       it != ie; ++it) {      StringRef MacroDef = (*it)->getValue();      Opts.ModulesIgnoreMacros.insert(MacroDef.split('=').first);    } +  std::vector<std::string> ModuleMapFiles = +      Args.getAllArgValues(OPT_fmodule_map_file); +  Opts.ModuleMapFiles.insert(ModuleMapFiles.begin(), ModuleMapFiles.end());    // Add -I..., -F..., and -index-header-map options in order.    bool IsIndexHeaderMap = false; @@ -1032,6 +1102,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,    Opts.Trigraphs = !Opts.GNUMode;    Opts.DollarIdents = !Opts.AsmPreprocessor; + +  // C++1y onwards has sized global deallocation functions. +  Opts.SizedDeallocation = Opts.CPlusPlus1y;  }  /// Attempt to parse a visibility value out of the given argument. @@ -1157,6 +1230,10 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      if (Args.hasArg(OPT_fno_objc_infer_related_result_type))        Opts.ObjCInferRelatedResultType = 0; +     +    if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime)) +      Opts.ObjCSubscriptingLegacyRuntime = +        (Opts.ObjCRuntime.getKind() == ObjCRuntime::FragileMacOSX);    }    if (Args.hasArg(OPT_fgnu89_inline)) @@ -1217,7 +1294,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      = Args.hasArg(OPT_fms_extensions) || Args.hasArg(OPT_fms_compatibility);    Opts.MicrosoftMode = Args.hasArg(OPT_fms_compatibility);    Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt; -  Opts.MSCVersion = Args.getLastArgIntValue(OPT_fmsc_version, 0, Diags); +  Opts.MSCVersion = getLastArgIntValue(Args, OPT_fmsc_version, 0, Diags);    Opts.Borland = Args.hasArg(OPT_fborland_extensions);    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);    Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings, @@ -1236,36 +1313,43 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.Blocks = Args.hasArg(OPT_fblocks);    Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);    Opts.Modules = Args.hasArg(OPT_fmodules); -  Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); +  Opts.ModulesDeclUse = Args.hasArg(OPT_fmodules_decluse); +  Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);    Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);    Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; +  Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); +  Opts.SizedDeallocation |= Args.hasArg(OPT_fsized_deallocation);    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);    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, 256, -                                                    Diags); -  Opts.ConstexprCallDepth = Args.getLastArgIntValue(OPT_fconstexpr_depth, 512, -                                                    Diags); -  Opts.BracketDepth = Args.getLastArgIntValue(OPT_fbracket_depth, 256, Diags); +  Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno); +  Opts.InstantiationDepth = +      getLastArgIntValue(Args, OPT_ftemplate_depth, 256, Diags); +  Opts.ArrowDepth = +      getLastArgIntValue(Args, OPT_foperator_arrow_depth, 256, Diags); +  Opts.ConstexprCallDepth = +      getLastArgIntValue(Args, OPT_fconstexpr_depth, 512, Diags); +  Opts.ConstexprStepLimit = +      getLastArgIntValue(Args, OPT_fconstexpr_steps, 1048576, Diags); +  Opts.BracketDepth = getLastArgIntValue(Args, OPT_fbracket_depth, 256, Diags);    Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing); -  Opts.NumLargeByValueCopy = Args.getLastArgIntValue(OPT_Wlarge_by_value_copy_EQ, -                                                    0, Diags); +  Opts.NumLargeByValueCopy = +      getLastArgIntValue(Args, OPT_Wlarge_by_value_copy_EQ, 0, Diags);    Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);    Opts.ObjCConstantStringClass =      Args.getLastArgValue(OPT_fconstant_string_class);    Opts.ObjCDefaultSynthProperties = -    Args.hasArg(OPT_fobjc_default_synthesize_properties); +    !Args.hasArg(OPT_disable_objc_default_synthesize_properties);    Opts.EncodeExtendedBlockSig =      Args.hasArg(OPT_fencode_extended_block_signature);    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); -  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.PackStruct = getLastArgIntValue(Args, OPT_fpack_struct_EQ, 0, Diags); +  Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); +  Opts.PIELevel = getLastArgIntValue(Args, OPT_pie_level, 0, Diags);    Opts.Static = Args.hasArg(OPT_static_define);    Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);    Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple  @@ -1285,6 +1369,28 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);    Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name); +  if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) { +    switch (llvm::StringSwitch<unsigned>(A->getValue()) +      .Case("target", LangOptions::ASMM_Target) +      .Case("no", LangOptions::ASMM_Off) +      .Case("yes", LangOptions::ASMM_On) +      .Default(255)) { +    default: +      Diags.Report(diag::err_drv_invalid_value)  +        << "-faddress-space-map-mangling=" << A->getValue(); +      break; +    case LangOptions::ASMM_Target: +      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Target); +      break; +    case LangOptions::ASMM_On: +      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_On); +      break; +    case LangOptions::ASMM_Off: +      Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Off); +      break; +    } +  } +    // Check if -fopenmp is specified.    Opts.OpenMP = Args.hasArg(OPT_fopenmp); @@ -1310,7 +1416,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.RetainCommentsFromSystemHeaders =        Args.hasArg(OPT_fretain_comments_from_system_headers); -  unsigned SSP = Args.getLastArgIntValue(OPT_stack_protector, 0, Diags); +  unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);    switch (SSP) {    default:      Diags.Report(diag::err_drv_invalid_value) @@ -1454,7 +1560,6 @@ static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,    switch (Action) {    case frontend::ASTDeclList:    case frontend::ASTDump: -  case frontend::ASTDumpXML:    case frontend::ASTPrint:    case frontend::ASTView:    case frontend::EmitAssembly: @@ -1502,6 +1607,7 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {    Opts.ABI = Args.getLastArgValue(OPT_target_abi);    Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);    Opts.CPU = Args.getLastArgValue(OPT_target_cpu); +  Opts.FPMath = Args.getLastArgValue(OPT_mfpmath);    Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature);    Opts.LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);    Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); @@ -1521,9 +1627,11 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,    // Parse the arguments.    OwningPtr<OptTable> Opts(createDriverOptTable()); +  const unsigned IncludedFlagsBitmask = options::CC1Option;    unsigned MissingArgIndex, MissingArgCount;    OwningPtr<InputArgList> Args( -    Opts->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); +    Opts->ParseArgs(ArgBegin, ArgEnd, MissingArgIndex, MissingArgCount, +                    IncludedFlagsBitmask));    // Check for missing argument error.    if (MissingArgCount) { @@ -1539,15 +1647,6 @@ 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().hasFlag(options::CC1Option)) { -      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); @@ -1687,7 +1786,8 @@ std::string CompilerInvocation::getModuleHash() const {                        hsOpts.UseStandardCXXIncludes,                        hsOpts.UseLibcxx); -  // Darwin-specific hack: if we have a sysroot, use the contents of +  // Darwin-specific hack: if we have a sysroot, use the contents and +  // modification time of    //   $sysroot/System/Library/CoreServices/SystemVersion.plist    // as part of the module hash.    if (!hsOpts.Sysroot.empty()) { @@ -1698,10 +1798,31 @@ std::string CompilerInvocation::getModuleHash() const {      llvm::sys::path::append(systemVersionFile, "Library");      llvm::sys::path::append(systemVersionFile, "CoreServices");      llvm::sys::path::append(systemVersionFile, "SystemVersion.plist"); -    if (!llvm::MemoryBuffer::getFile(systemVersionFile, buffer)) { +    if (!llvm::MemoryBuffer::getFile(systemVersionFile.str(), buffer)) {        code = hash_combine(code, buffer.get()->getBuffer()); + +      struct stat statBuf; +      if (stat(systemVersionFile.c_str(), &statBuf) == 0) +        code = hash_combine(code, statBuf.st_mtime);      }    }    return llvm::APInt(64, code).toString(36, /*Signed=*/false);  } + +namespace clang { + +// Declared in clang/Frontend/Utils.h. +int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default, +                       DiagnosticsEngine *Diags) { +  int Res = Default; +  if (Arg *A = Args.getLastArg(Id)) { +    if (StringRef(A->getValue()).getAsInteger(10, Res)) { +      if (Diags) +        Diags->Report(diag::err_drv_invalid_int_value) << A->getAsString(Args) +                                                       << A->getValue(); +    } +  } +  return Res; +} +}  | 
