aboutsummaryrefslogtreecommitdiff
path: root/Driver/clang.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-12-17 06:36:45 +0000
committerChris Lattner <sabre@nondot.org>2007-12-17 06:36:45 +0000
commit822da61b74ce14e89b3fa8774db18c833aa5748b (patch)
tree94c98ef06bf1e44bd5a9bda3dbd702bc360df92b /Driver/clang.cpp
parentd66552797f9a34f5b966adbe45234111752678a0 (diff)
Step #1 in adding headermap support to clang.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45089 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'Driver/clang.cpp')
-rw-r--r--Driver/clang.cpp63
1 files changed, 42 insertions, 21 deletions
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 095eaaa6ca..4f6ea926d2 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -613,8 +613,9 @@ static std::vector<DirectoryLookup> IncludeGroup[4];
///
static void AddPath(const std::string &Path, IncludeDirGroup Group,
bool isCXXAware, bool isUserSupplied,
- bool isFramework, FileManager &FM) {
+ bool isFramework, HeaderSearch &HS) {
assert(!Path.empty() && "can't handle empty path here");
+ FileManager &FM = HS.getFileMgr();
// Compute the actual path, taking into consideration -isysroot.
llvm::SmallString<256> MappedPath;
@@ -648,6 +649,25 @@ static void AddPath(const std::string &Path, IncludeDirGroup Group,
return;
}
+ // Check to see if this is an apple-style headermap.
+ if (const FileEntry *FE = FM.getFile(&MappedPath[0],
+ &MappedPath[0]+MappedPath.size())) {
+ std::string ErrorInfo;
+ const HeaderMap *HM = HS.CreateHeaderMap(FE, ErrorInfo);
+ if (HM) {
+ IncludeGroup[Group].push_back(DirectoryLookup(HM, Type, isUserSupplied,
+ isFramework));
+ return;
+ }
+
+ // If this looked like a headermap but was corrupted, emit that error,
+ // otherwise treat it as a missing directory.
+ if (!ErrorInfo.empty()) {
+ fprintf(stderr, "%s\n", ErrorInfo.c_str());
+ return;
+ }
+ }
+
if (Verbose)
fprintf(stderr, "ignoring nonexistent directory \"%s\"\n", Path.c_str());
}
@@ -674,23 +694,23 @@ static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM,
const LangOptions &Lang) {
// Handle -F... options.
for (unsigned i = 0, e = F_dirs.size(); i != e; ++i)
- AddPath(F_dirs[i], Angled, false, true, true, FM);
+ AddPath(F_dirs[i], Angled, false, true, true, Headers);
// Handle -I... options.
for (unsigned i = 0, e = I_dirs.size(); i != e; ++i)
- AddPath(I_dirs[i], Angled, false, true, false, FM);
+ AddPath(I_dirs[i], Angled, false, true, false, Headers);
// Handle -idirafter... options.
for (unsigned i = 0, e = idirafter_dirs.size(); i != e; ++i)
- AddPath(idirafter_dirs[i], After, false, true, false, FM);
+ AddPath(idirafter_dirs[i], After, false, true, false, Headers);
// Handle -iquote... options.
for (unsigned i = 0, e = iquote_dirs.size(); i != e; ++i)
- AddPath(iquote_dirs[i], Quoted, false, true, false, FM);
+ AddPath(iquote_dirs[i], Quoted, false, true, false, Headers);
// Handle -isystem... options.
for (unsigned i = 0, e = isystem_dirs.size(); i != e; ++i)
- AddPath(isystem_dirs[i], System, false, true, false, FM);
+ AddPath(isystem_dirs[i], System, false, true, false, Headers);
// Walk the -iprefix/-iwithprefix/-iwithprefixbefore argument lists in
// parallel, processing the values in order of occurance to get the right
@@ -719,12 +739,12 @@ static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM,
iwithprefix_vals.getPosition(iwithprefix_idx) <
iwithprefixbefore_vals.getPosition(iwithprefixbefore_idx))) {
AddPath(Prefix+iwithprefix_vals[iwithprefix_idx],
- System, false, false, false, FM);
+ System, false, false, false, Headers);
++iwithprefix_idx;
iwithprefix_done = iwithprefix_idx == iwithprefix_vals.size();
} else {
AddPath(Prefix+iwithprefixbefore_vals[iwithprefixbefore_idx],
- Angled, false, false, false, FM);
+ Angled, false, false, false, Headers);
++iwithprefixbefore_idx;
iwithprefixbefore_done =
iwithprefixbefore_idx == iwithprefixbefore_vals.size();
@@ -739,34 +759,35 @@ static void InitializeIncludePaths(HeaderSearch &Headers, FileManager &FM,
// FIXME: get these from the target?
if (!nostdinc) {
if (Lang.CPlusPlus) {
- AddPath("/usr/include/c++/4.0.0", System, true, false, false, FM);
+ AddPath("/usr/include/c++/4.0.0", System, true, false, false, Headers);
AddPath("/usr/include/c++/4.0.0/i686-apple-darwin8", System, true, false,
- false, FM);
- AddPath("/usr/include/c++/4.0.0/backward", System, true, false, false,FM);
+ false, Headers);
+ AddPath("/usr/include/c++/4.0.0/backward", System, true, false, false,
+ Headers);
}
- AddPath("/usr/local/include", System, false, false, false, FM);
+ AddPath("/usr/local/include", System, false, false, false, Headers);
// leopard
AddPath("/usr/lib/gcc/i686-apple-darwin9/4.0.1/include", System,
- false, false, false, FM);
+ false, false, false, Headers);
AddPath("/usr/lib/gcc/powerpc-apple-darwin9/4.0.1/include",
- System, false, false, false, FM);
+ System, false, false, false, Headers);
AddPath("/usr/lib/gcc/powerpc-apple-darwin9/"
"4.0.1/../../../../powerpc-apple-darwin0/include",
- System, false, false, false, FM);
+ System, false, false, false, Headers);
// tiger
AddPath("/usr/lib/gcc/i686-apple-darwin8/4.0.1/include", System,
- false, false, false, FM);
+ false, false, false, Headers);
AddPath("/usr/lib/gcc/powerpc-apple-darwin8/4.0.1/include",
- System, false, false, false, FM);
+ System, false, false, false, Headers);
AddPath("/usr/lib/gcc/powerpc-apple-darwin8/"
"4.0.1/../../../../powerpc-apple-darwin8/include",
- System, false, false, false, FM);
+ System, false, false, false, Headers);
- AddPath("/usr/include", System, false, false, false, FM);
- AddPath("/System/Library/Frameworks", System, true, false, true, FM);
- AddPath("/Library/Frameworks", System, true, false, true, FM);
+ AddPath("/usr/include", System, false, false, false, Headers);
+ AddPath("/System/Library/Frameworks", System, true, false, true, Headers);
+ AddPath("/Library/Frameworks", System, true, false, true, Headers);
}
// Now that we have collected all of the include paths, merge them all