diff options
Diffstat (limited to 'lib/Frontend/CompilerInvocation.cpp')
| -rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 169 | 
1 files changed, 100 insertions, 69 deletions
| diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 54025b06557a..8d3d31228a70 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -253,7 +253,7 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,      for (unsigned i = 0, e = checkers.size(); i != e; ++i)        Opts.CheckersControlList.push_back(std::make_pair(checkers[i], enable));    } -   +    // Go through the analyzer configuration options.    for (arg_iterator it = Args.filtered_begin(OPT_analyzer_config),         ie = Args.filtered_end(); it != ie; ++it) { @@ -329,11 +329,8 @@ static void parseSanitizerKinds(StringRef FlagName,                                  const std::vector<std::string> &Sanitizers,                                  DiagnosticsEngine &Diags, SanitizerSet &S) {    for (const auto &Sanitizer : Sanitizers) { -    SanitizerKind K = llvm::StringSwitch<SanitizerKind>(Sanitizer) -#define SANITIZER(NAME, ID) .Case(NAME, SanitizerKind::ID) -#include "clang/Basic/Sanitizers.def" -                          .Default(SanitizerKind::Unknown); -    if (K == SanitizerKind::Unknown) +    SanitizerMask K = parseSanitizerValue(Sanitizer, /*AllowGroups=*/false); +    if (K == 0)        Diags.Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;      else        S.set(K, true); @@ -367,6 +364,16 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.setInlining(Args.hasArg(OPT_fno_inline_functions) ?                       CodeGenOptions::OnlyAlwaysInlining : Opts.getInlining()); +  if (Arg *A = Args.getLastArg(OPT_fveclib)) { +    StringRef Name = A->getValue(); +    if (Name == "Accelerate") +      Opts.setVecLib(CodeGenOptions::Accelerate); +    else if (Name == "none") +      Opts.setVecLib(CodeGenOptions::NoLibrary); +    else +      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name; +  } +    if (Args.hasArg(OPT_gline_tables_only)) {      Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly);    } else if (Args.hasArg(OPT_g_Flag) || Args.hasArg(OPT_gdwarf_2) || @@ -395,6 +402,10 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,      // Default Dwarf version is 4 if we are generating debug information.      Opts.DwarfVersion = 4; +  if (const Arg *A = +          Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists)) +    Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists; +    Opts.DisableLLVMOpts = Args.hasArg(OPT_disable_llvm_optzns);    Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);    Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables); @@ -417,13 +428,14 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);    Opts.Autolink = !Args.hasArg(OPT_fno_autolink);    Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ); -  Opts.ProfileInstrGenerate = Args.hasArg(OPT_fprofile_instr_generate); +  Opts.ProfileInstrGenerate = Args.hasArg(OPT_fprofile_instr_generate) || +      Args.hasArg(OPT_fprofile_instr_generate_EQ);; +  Opts.InstrProfileOutput = Args.getLastArgValue(OPT_fprofile_instr_generate_EQ);    Opts.InstrProfileInput = Args.getLastArgValue(OPT_fprofile_instr_use_EQ);    Opts.CoverageMapping = Args.hasArg(OPT_fcoverage_mapping);    Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);    Opts.AsmVerbose = Args.hasArg(OPT_masm_verbose);    Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions); -  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 = getCodeModel(Args, Diags); @@ -441,11 +453,11 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,                         Args.hasArg(OPT_cl_unsafe_math_optimizations) ||                         Args.hasArg(OPT_cl_finite_math_only) ||                         Args.hasArg(OPT_cl_fast_relaxed_math)); -  Opts.NoSignedZeros = Args.hasArg(OPT_cl_no_signed_zeros); +  Opts.NoSignedZeros = Args.hasArg(OPT_fno_signed_zeros); +  Opts.ReciprocalMath = Args.hasArg(OPT_freciprocal_math);    Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_mno_zero_initialized_in_bss);    Opts.BackendOptions = Args.getAllArgValues(OPT_backend_option);    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.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);    Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks); @@ -472,8 +484,13 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,                                         OPT_fno_function_sections, false);    Opts.DataSections = Args.hasFlag(OPT_fdata_sections,                                     OPT_fno_data_sections, false); +  Opts.UniqueSectionNames = Args.hasFlag(OPT_funique_section_names, +                                         OPT_fno_unique_section_names, true); +    Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions); +  Opts.MSVolatile = Args.hasArg(OPT_fms_volatile); +    Opts.VectorizeBB = Args.hasArg(OPT_vectorize_slp_aggressive);    Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);    Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp); @@ -489,6 +506,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,      Opts.CoverageExtraChecksum = Args.hasArg(OPT_coverage_cfg_checksum);      Opts.CoverageNoFunctionNamesInData =          Args.hasArg(OPT_coverage_no_function_names_in_data); +    Opts.CoverageExitBlockBeforeBody = +        Args.hasArg(OPT_coverage_exit_block_before_body);      if (Args.hasArg(OPT_coverage_version_EQ)) {        StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);        if (CoverageVersion.size() != 4) { @@ -507,8 +526,14 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,    Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);    Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);    Opts.LinkBitcodeFile = Args.getLastArgValue(OPT_mlink_bitcode_file); -  Opts.SanitizeCoverage = -      getLastArgIntValue(Args, OPT_fsanitize_coverage, 0, Diags); +  Opts.SanitizeCoverageType = +      getLastArgIntValue(Args, OPT_fsanitize_coverage_type, 0, Diags); +  Opts.SanitizeCoverageIndirectCalls = +      Args.hasArg(OPT_fsanitize_coverage_indirect_calls); +  Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb); +  Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp); +  Opts.SanitizeCoverage8bitCounters = +      Args.hasArg(OPT_fsanitize_coverage_8bit_counters);    Opts.SanitizeMemoryTrackOrigins =        getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags);    Opts.SanitizeUndefinedTrapOnError = @@ -523,6 +548,13 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,      Opts.StackAlignment = StackAlignment;    } +  if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) { +    StringRef Val = A->getValue(); +    unsigned StackProbeSize = Opts.StackProbeSize; +    Val.getAsInteger(0, StackProbeSize); +    Opts.StackProbeSize = StackProbeSize; +  } +    if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {      StringRef Name = A->getValue();      unsigned Method = llvm::StringSwitch<unsigned>(Name) @@ -616,6 +648,9 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,                        Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,                        Opts.SanitizeRecover); +  Opts.CudaGpuBinaryFileNames = +      Args.getAllArgValues(OPT_fcuda_include_gpubinary); +    return Success;  } @@ -634,6 +669,8 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,    Opts.DOTOutputFile = Args.getLastArgValue(OPT_dependency_dot);    Opts.ModuleDependencyOutputDir =        Args.getLastArgValue(OPT_module_dependency_dir); +  if (Args.hasArg(OPT_MV)) +    Opts.OutputFormat = DependencyOutputFormat::NMake;  }  bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, @@ -702,9 +739,9 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,    if (Format == "clang")      Opts.setFormat(DiagnosticOptions::Clang);    else if (Format == "msvc") -    Opts.setFormat(DiagnosticOptions::Msvc); +    Opts.setFormat(DiagnosticOptions::MSVC);    else if (Format == "msvc-fallback") { -    Opts.setFormat(DiagnosticOptions::Msvc); +    Opts.setFormat(DiagnosticOptions::MSVC);      Opts.CLFallbackMode = true;    } else if (Format == "vi")      Opts.setFormat(DiagnosticOptions::Vi); @@ -966,6 +1003,7 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,        .Case("cpp-output", IK_PreprocessedC)        .Case("assembler-with-cpp", IK_Asm)        .Case("c++-cpp-output", IK_PreprocessedCXX) +      .Case("cuda-cpp-output", IK_PreprocessedCuda)        .Case("objective-c-cpp-output", IK_PreprocessedObjC)        .Case("objc-cpp-output", IK_PreprocessedObjC)        .Case("objective-c++-cpp-output", IK_PreprocessedObjCXX) @@ -1169,6 +1207,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,        LangStd = LangStandard::lang_opencl;        break;      case IK_CUDA: +    case IK_PreprocessedCuda:        LangStd = LangStandard::lang_cuda;        break;      case IK_Asm: @@ -1197,7 +1236,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,    Opts.CPlusPlus1z = Std.isCPlusPlus1z();    Opts.Digraphs = Std.hasDigraphs();    Opts.GNUMode = Std.isGNUMode(); -  Opts.GNUInline = !Std.isC99(); +  Opts.GNUInline = Std.isC89();    Opts.HexFloats = Std.hasHexFloats();    Opts.ImplicitInt = Std.hasImplicitInt(); @@ -1221,7 +1260,8 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,      Opts.NativeHalfType = 1;    } -  Opts.CUDA = LangStd == LangStandard::lang_cuda || IK == IK_CUDA; +  Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda || +              LangStd == LangStandard::lang_cuda;    // OpenCL and C++ both have bool, true, false keywords.    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; @@ -1236,9 +1276,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,    Opts.CXXOperatorNames = Opts.CPlusPlus;    Opts.DollarIdents = !Opts.AsmPreprocessor; - -  // C++14 onwards has sized global deallocation functions. -  Opts.SizedDeallocation = Opts.CPlusPlus14;  }  /// Attempt to parse a visibility value out of the given argument. @@ -1259,43 +1296,6 @@ static Visibility parseVisibility(Arg *arg, ArgList &args,    return DefaultVisibility;  } -static unsigned parseMSCVersion(ArgList &Args, DiagnosticsEngine &Diags) { -  auto Arg = Args.getLastArg(OPT_fms_compatibility_version); -  if (!Arg) -    return 0; - -  // The MSC versioning scheme involves four versioning components: -  //  - Major -  //  - Minor -  //  - Build -  //  - Patch -  // -  // We accept either the old style (_MSC_VER) value, or a _MSC_FULL_VER value. -  // Additionally, the value may be provided in the form of a more readable -  // MM.mm.bbbbb.pp version. -  // -  // Unfortunately, due to the bit-width limitations, we cannot currently encode -  // the value for the patch level. - -  unsigned VC[4] = {0}; -  StringRef Value = Arg->getValue(); -  SmallVector<StringRef, 4> Components; - -  Value.split(Components, ".", llvm::array_lengthof(VC)); -  for (unsigned CI = 0, -                CE = std::min(Components.size(), llvm::array_lengthof(VC)); -       CI < CE; ++CI) { -    if (Components[CI].getAsInteger(10, VC[CI])) { -      Diags.Report(diag::err_drv_invalid_value) -        << Arg->getAsString(Args) << Value; -      return 0; -    } -  } - -  // FIXME we cannot encode the patch level -  return VC[0] * 10000000 + VC[1] * 100000 + VC[2]; -} -  static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,                            DiagnosticsEngine &Diags) {    // FIXME: Cleanup per-file based stuff. @@ -1336,6 +1336,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,              << A->getAsString(Args) << "OpenCL";          break;        case IK_CUDA: +      case IK_PreprocessedCuda:          if (!Std.isCPlusPlus())            Diags.Report(diag::err_drv_argument_not_allowed_with)              << A->getAsString(Args) << "CUDA"; @@ -1381,6 +1382,12 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    if (Args.hasArg(OPT_fcuda_is_device))      Opts.CUDAIsDevice = 1; +  if (Args.hasArg(OPT_fcuda_allow_host_calls_from_host_device)) +    Opts.CUDAAllowHostCallsFromHostDevice = 1; + +  if (Args.hasArg(OPT_fcuda_disable_target_call_checks)) +    Opts.CUDADisableTargetCallChecks = 1; +    if (Opts.ObjC1) {      if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {        StringRef value = arg->getValue(); @@ -1412,8 +1419,13 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,          (Opts.ObjCRuntime.getKind() == ObjCRuntime::FragileMacOSX);    } -  if (Args.hasArg(OPT_fgnu89_inline)) -    Opts.GNUInline = 1; +  if (Args.hasArg(OPT_fgnu89_inline)) { +    if (Opts.CPlusPlus) +      Diags.Report(diag::err_drv_argument_not_allowed_with) << "-fgnu89-inline" +                                                            << "C++/ObjC++"; +    else +      Opts.GNUInline = 1; +  }    if (Args.hasArg(OPT_fapple_kext)) {      if (!Opts.CPlusPlus) @@ -1462,7 +1474,16 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);    Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);    Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt; -  Opts.MSCompatibilityVersion = parseMSCVersion(Args, Diags); +  Opts.MSCompatibilityVersion = 0; +  if (const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) { +    VersionTuple VT; +    if (VT.tryParse(A->getValue())) +      Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) +                                                << A->getValue(); +    Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 + +                                  VT.getMinor().getValueOr(0) * 100000 + +                                  VT.getSubminor().getValueOr(0); +  }    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs    // is specified, or -std is set to a conforming mode. @@ -1498,12 +1519,15 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);    Opts.ModulesDeclUse =        Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse; +  Opts.ModulesLocalVisibility = +      Args.hasArg(OPT_fmodules_local_submodule_visibility);    Opts.ModulesSearchAll = Opts.Modules &&      !Args.hasArg(OPT_fno_modules_search_all) &&      Args.hasArg(OPT_fmodules_search_all);    Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);    Opts.ModulesImplicitMaps = Args.hasFlag(OPT_fmodules_implicit_maps,                                            OPT_fno_modules_implicit_maps, true); +  Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules);    Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);    Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);    Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, false); @@ -1512,7 +1536,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    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.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation); +  Opts.ConceptsTS = Args.hasArg(OPT_fconcepts_ts);    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);    Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); @@ -1559,10 +1584,13 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);    Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);    Opts.CurrentModule = Args.getLastArgValue(OPT_fmodule_name); +  Opts.AppExt = Args.hasArg(OPT_fapplication_extension);    Opts.ImplementationOfModule =        Args.getLastArgValue(OPT_fmodule_implementation_of); -  Opts.NativeHalfType = Opts.NativeHalfType; +  Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature); +  Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);    Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns); +  Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);    if (!Opts.CurrentModule.empty() && !Opts.ImplementationOfModule.empty() &&        Opts.CurrentModule != Opts.ImplementationOfModule) { @@ -1570,6 +1598,12 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,          << Opts.CurrentModule << Opts.ImplementationOfModule;    } +  // For now, we only support local submodule visibility in C++ (because we +  // heavily depend on the ODR for merging redefinitions). +  if (Opts.ModulesLocalVisibility && !Opts.CPlusPlus) +    Diags.Report(diag::err_drv_argument_not_allowed_with) +        << "-fmodules-local-submodule-visibility" << "C"; +    if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {      switch (llvm::StringSwitch<unsigned>(A->getValue())        .Case("target", LangOptions::ASMM_Target) @@ -1610,12 +1644,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,      Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);    } -  // Check if -fopenmp= is specified. -  if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) { -    Opts.OpenMP = llvm::StringSwitch<bool>(A->getValue()) -        .Case("libiomp5", true) -        .Default(false); -  } +  // Check if -fopenmp is specified. +  Opts.OpenMP = Args.hasArg(options::OPT_fopenmp);    // Record whether the __DEPRECATED define was requested.    Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro, @@ -1660,7 +1690,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,    // -fsanitize-address-field-padding=N has to be a LangOpt, parse it here.    Opts.SanitizeAddressFieldPadding =        getLastArgIntValue(Args, OPT_fsanitize_address_field_padding, 0, Diags); -  Opts.SanitizerBlacklistFile = Args.getLastArgValue(OPT_fsanitize_blacklist); +  Opts.SanitizerBlacklistFiles = Args.getAllArgValues(OPT_fsanitize_blacklist);  }  static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, @@ -1805,6 +1835,7 @@ static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,    Opts.ShowMacroComments = Args.hasArg(OPT_CC);    Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);    Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes); +  Opts.UseLineDirectives = Args.hasArg(OPT_fuse_line_directives);  }  static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) { @@ -2002,7 +2033,7 @@ std::string CompilerInvocation::getModuleHash() const {      llvm::sys::path::append(systemVersionFile, "SystemVersion.plist");      llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> buffer = -        llvm::MemoryBuffer::getFile(systemVersionFile.str()); +        llvm::MemoryBuffer::getFile(systemVersionFile);      if (buffer) {        code = hash_combine(code, buffer.get()->getBuffer()); | 
