Under certain terrible circumstances (<rdar://problem/10805775>),

top-level frameworks can actually be symlinked over to embedded
frameworks, and accessed via the top-level framework's headers. In
this case, we need to determine that the framework was *actually* an
embedded framework, so we can load the appropriate top-level module.

llvm-svn: 164620
This commit is contained in:
Douglas Gregor 2012-09-25 18:29:14 +00:00
parent 984fee5b8f
commit 24ff3bc392
1 changed files with 13 additions and 0 deletions

View File

@ -905,7 +905,20 @@ Module *HeaderSearch::loadFrameworkModule(StringRef Name,
SubmodulePath.push_back(Name);
// Walk the directory structure to find any enclosing frameworks.
#ifdef LLVM_ON_UNIX
// Note: as an egregious but useful hack we use the real path here, because
// frameworks moving from top-level frameworks to embedded frameworks tend
// to be symlinked from the top-level location to the embedded location,
// and we need to resolve lookups as if we had found the embedded location.
char RealDirName[PATH_MAX];
StringRef DirName;
if (realpath(Dir->getName(), RealDirName))
DirName = RealDirName;
else
DirName = Dir->getName();
#else
StringRef DirName = Dir->getName();
#endif
do {
// Get the parent directory name.
DirName = llvm::sys::path::parent_path(DirName);