summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/ModuleMap.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-11-17 01:41:17 +0000
committerDouglas Gregor <dgregor@apple.com>2011-11-17 01:41:17 +0000
commit56c64013064b646c50f703615d5597ec5c8d4f72 (patch)
treed178c6948ccb9e073158acbf45f286e924f451da /clang/lib/Lex/ModuleMap.cpp
parent489c0ff4a434ca4e96cf485dc564c6310947240b (diff)
downloadbcm5719-llvm-56c64013064b646c50f703615d5597ec5c8d4f72.tar.gz
bcm5719-llvm-56c64013064b646c50f703615d5597ec5c8d4f72.zip
When we're loading a framework header, first try to turn the framework
into a module. This module can either be loaded from a module map in the framework directory (which isn't quite working yet) or inferred from an umbrella header (which does work, and replaces the existing hack). llvm-svn: 144877
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r--clang/lib/Lex/ModuleMap.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index f6751b78f1e..0c51659cab8 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -127,6 +127,34 @@ ModuleMap::Module *ModuleMap::findModule(StringRef Name) {
return 0;
}
+ModuleMap::Module *
+ModuleMap::inferFrameworkModule(StringRef ModuleName,
+ const DirectoryEntry *FrameworkDir) {
+ // Check whether we've already found this module.
+ if (Module *Module = findModule(ModuleName))
+ return Module;
+
+ // Look for an umbrella header.
+ llvm::SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
+ llvm::sys::path::append(UmbrellaName, "Headers");
+ llvm::sys::path::append(UmbrellaName, ModuleName + ".h");
+ const FileEntry *UmbrellaHeader
+ = SourceMgr->getFileManager().getFile(UmbrellaName);
+
+ // FIXME: If there's no umbrella header, we could probably scan the
+ // framework to load *everything*. But, it's not clear that this is a good
+ // idea.
+ if (!UmbrellaHeader)
+ return 0;
+
+ Module *Result = new Module(ModuleName, SourceLocation());
+ Result->UmbrellaHeader = UmbrellaHeader;
+ Headers[UmbrellaHeader] = Result;
+ UmbrellaDirs[FrameworkDir] = Result;
+ Modules[ModuleName] = Result;
+ return Result;
+}
+
static void indent(llvm::raw_ostream &OS, unsigned Spaces) {
OS << std::string(' ', Spaces);
}
OpenPOWER on IntegriCloud