If the headermap maps the filename to a framework include ("Foo.h" -> "Foo/Foo.h"),
continue header lookup using the framework include as filename. This allows us to conveniently treat #import "Foo.h" as an implicit module import if we can resolve "Foo/Foo.h" as such. rdar://16042979 llvm-svn: 201419
This commit is contained in:
@@ -201,18 +201,29 @@ void HeaderMap::dump() const {
|
||||
/// this HeaderMap. If so, open it and return its FileEntry.
|
||||
const FileEntry *HeaderMap::LookupFile(
|
||||
StringRef Filename, FileManager &FM) const {
|
||||
|
||||
SmallString<1024> Path;
|
||||
StringRef Dest = lookupFilename(Filename, Path);
|
||||
if (Dest.empty())
|
||||
return 0;
|
||||
|
||||
return FM.getFile(Dest);
|
||||
}
|
||||
|
||||
StringRef HeaderMap::lookupFilename(StringRef Filename,
|
||||
SmallVectorImpl<char> &DestPath) const {
|
||||
const HMapHeader &Hdr = getHeader();
|
||||
unsigned NumBuckets = getEndianAdjustedWord(Hdr.NumBuckets);
|
||||
|
||||
// If the number of buckets is not a power of two, the headermap is corrupt.
|
||||
// Don't probe infinitely.
|
||||
if (NumBuckets & (NumBuckets-1))
|
||||
return 0;
|
||||
return StringRef();
|
||||
|
||||
// Linearly probe the hash table.
|
||||
for (unsigned Bucket = HashHMapKey(Filename);; ++Bucket) {
|
||||
HMapBucket B = getBucket(Bucket & (NumBuckets-1));
|
||||
if (B.Key == HMAP_EmptyBucketKey) return 0; // Hash miss.
|
||||
if (B.Key == HMAP_EmptyBucketKey) return StringRef(); // Hash miss.
|
||||
|
||||
// See if the key matches. If not, probe on.
|
||||
if (!Filename.equals_lower(getString(B.Key)))
|
||||
@@ -220,9 +231,11 @@ const FileEntry *HeaderMap::LookupFile(
|
||||
|
||||
// If so, we have a match in the hash table. Construct the destination
|
||||
// path.
|
||||
SmallString<1024> DestPath;
|
||||
DestPath += getString(B.Prefix);
|
||||
DestPath += getString(B.Suffix);
|
||||
return FM.getFile(DestPath.str());
|
||||
StringRef Prefix = getString(B.Prefix);
|
||||
StringRef Suffix = getString(B.Suffix);
|
||||
DestPath.clear();
|
||||
DestPath.append(Prefix.begin(), Prefix.end());
|
||||
DestPath.append(Suffix.begin(), Suffix.end());
|
||||
return StringRef(DestPath.begin(), DestPath.size());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user