diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-11-05 08:30:29 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-11-05 08:30:29 +0000 |
commit | ac2bc4d220a6263be96b943e9162f4a11149e26d (patch) | |
tree | 6c0d95e3922b4fd5f50893f956b16002abc36865 /lib/Frontend/CompilerInvocation.cpp | |
parent | 6bbecd5e96c2bfe6dcb935a3ca0deb06782a5b14 (diff) | |
download | clang-ac2bc4d220a6263be96b943e9162f4a11149e26d.tar.gz |
Add two flags to the CC1 layer that I was hoping to avoid. We need to
encode the *exact* semantics which the header search paths internally
built by the Frontend layer have had, which is both non-user-provided,
and at times adding the implicit extern "C" bit to the directory entry.
There are lots of CC1 options that are very close, but none do quite
this, and they are all already overloaded for other purposes. In some
senses this makes the command lines more clean as it clearly indicates
which flags are exclusively used to implement internal detection of
"standard" header search paths.
Lots of the implementation of this is really crufty, due to the
surrounding cruft. It doesn't seem worth investing lots of time cleaning
this up as it isn't new, and hopefully *lots* of this code will melt
away as header search inside of the frontend becomes increasingly
trivial.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@143798 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | lib/Frontend/CompilerInvocation.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 399e0ca8d8..1829d7de0a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -575,10 +575,16 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts, break; } } else { - if (E.Group != frontend::Angled && E.Group != frontend::System) - llvm::report_fatal_error("Invalid option set!"); - Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" : - "-iwithprefix"); + if (E.IsInternal) { + assert(E.Group == frontend::System && "Unexpected header search group"); + Res.push_back(E.ImplicitExternC ? "-internal-externc-isystem" + : "-internal-isystem"); + } else { + if (E.Group != frontend::Angled && E.Group != frontend::System) + llvm::report_fatal_error("Invalid option set!"); + Res.push_back(E.Group == frontend::Angled ? "-iwithprefixbefore" : + "-iwithprefix"); + } } Res.push_back(E.Path); } @@ -1483,6 +1489,15 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) { ie = Args.filtered_end(); it != ie; ++it) Opts.AddPath((*it)->getValue(Args), frontend::ObjCXXSystem, true, false, true); + + // 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), + E = Args.filtered_end(); + I != E; ++I) + Opts.AddPath((*I)->getValue(Args), frontend::System, + false, false, false, /*IsInternal=*/true, + (*I)->getOption().matches(OPT_internal_externc_isystem)); } void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK, |