diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Driver/ToolChains.cpp | 15 | ||||
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 15 |
2 files changed, 26 insertions, 4 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index ab866a2407..c9e86334d5 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2253,6 +2253,21 @@ static void addSystemIncludes(const ArgList &DriverArgs, void Windows::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { + if (DriverArgs.hasArg(options::OPT_nostdinc)) + return; + + if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) { + // Ignore the sysroot, we *always* look for clang headers relative to + // supplied path. + llvm::sys::Path P(getDriver().ResourceDir); + P.appendComponent("include"); + CC1Args.push_back("-internal-nosysroot-isystem"); + CC1Args.push_back(DriverArgs.MakeArgString(P.str())); + } + + if (DriverArgs.hasArg(options::OPT_nostdlibinc)) + return; + std::string VSDir; std::string WindowsSDKDir; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 1829d7de0a..1bcad24ee4 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -577,8 +577,12 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts, } else { if (E.IsInternal) { assert(E.Group == frontend::System && "Unexpected header search group"); - Res.push_back(E.ImplicitExternC ? "-internal-externc-isystem" - : "-internal-isystem"); + if (E.IgnoreSysRoot) + Res.push_back("-internal-nosysroot-isystem"); + else if (E.ImplicitExternC) + Res.push_back("-internal-externc-isystem"); + else + Res.push_back("-internal-isystem"); } else { if (E.Group != frontend::Angled && E.Group != frontend::System) llvm::report_fatal_error("Invalid option set!"); @@ -1492,11 +1496,14 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { // Add the internal paths from a driver that detects standard include paths. for (arg_iterator I = Args.filtered_begin(OPT_internal_isystem, - OPT_internal_externc_isystem), + OPT_internal_externc_isystem, + OPT_internal_nosysroot_isystem), E = Args.filtered_end(); I != E; ++I) Opts.AddPath((*I)->getValue(Args), frontend::System, - false, false, false, /*IsInternal=*/true, + false, false, + (*I)->getOption().matches(OPT_internal_nosysroot_isystem), + /*IsInternal=*/true, (*I)->getOption().matches(OPT_internal_externc_isystem)); } |