aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Driver/CC1Options.td6
-rw-r--r--lib/Driver/ToolChains.cpp15
-rw-r--r--lib/Frontend/CompilerInvocation.cpp15
3 files changed, 32 insertions, 4 deletions
diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td
index e8d06f994f..cc41110a09 100644
--- a/include/clang/Driver/CC1Options.td
+++ b/include/clang/Driver/CC1Options.td
@@ -670,6 +670,12 @@ def internal_externc_isystem : JoinedOrSeparate<"-internal-externc-isystem">,
"implicit extern \"C\" semantics; these are assumed to not be "
"user-provided and are used to model system and standard headers' "
"paths.">;
+def internal_nosysroot_isystem : JoinedOrSeparate<"-internal-nosysroot-isystem">,
+ MetaVarName<"<directory>">,
+ HelpText<"Add directory to the internal system include search path without "
+ "applying a sysroot to it; these are assumed to not be "
+ "user-provided and are used to model system and standard headers' "
+ "paths.">;
def iprefix : JoinedOrSeparate<"-iprefix">, MetaVarName<"<prefix>">,
HelpText<"Set the -iwithprefix/-iwithprefixbefore prefix">;
def iwithprefix : JoinedOrSeparate<"-iwithprefix">, MetaVarName<"<dir>">,
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));
}