summaryrefslogtreecommitdiffstats
path: root/clang/lib/Lex/ModuleMap.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-12-06 16:17:15 +0000
committerDouglas Gregor <dgregor@apple.com>2011-12-06 16:17:15 +0000
commit930a85cc2db625e3c7a8a1622d38a4a4a7a51562 (patch)
tree1ad82c9db2ac936d1a65f31fd4846363a254548b /clang/lib/Lex/ModuleMap.cpp
parentb5188f163a5aeb3f61a40bc6c3adf1cecbb4b5f4 (diff)
downloadbcm5719-llvm-930a85cc2db625e3c7a8a1622d38a4a4a7a51562.tar.gz
bcm5719-llvm-930a85cc2db625e3c7a8a1622d38a4a4a7a51562.zip
Minor tweak to prepare for submodules with umbrella headers. No actual
functionality change yet. llvm-svn: 145938
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r--clang/lib/Lex/ModuleMap.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index 498061fc05a..198544dd517 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -103,8 +103,14 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
= UmbrellaDirs.find(Dir);
if (KnownDir != UmbrellaDirs.end()) {
Module *Result = KnownDir->second;
- Module *TopModule = Result->getTopLevelModule();
- if (TopModule->InferSubmodules) {
+
+ // Search up the module stack until we find a module with an umbrella
+ // header.
+ Module *UmbrellaModule = Result;
+ while (!UmbrellaModule->UmbrellaHeader && UmbrellaModule->Parent)
+ UmbrellaModule = UmbrellaModule->Parent;
+
+ if (UmbrellaModule->InferSubmodules) {
// Infer submodules for each of the directories we found between
// the directory of the umbrella header and the directory where
// the actual header is located.
@@ -114,32 +120,32 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
// FIXME: Should we tack on an "explicit" for PrivateHeaders? That
// might be what we want, but it feels like a hack.
unsigned LastSkippedDir = SkippedDirs.size();
- if (LastSkippedDir && TopModule->IsFramework)
+ if (LastSkippedDir && UmbrellaModule->IsFramework)
--LastSkippedDir;
for (unsigned I = LastSkippedDir; I != 0; --I) {
// Find or create the module that corresponds to this directory name.
StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
- TopModule->InferExplicitSubmodules).first;
+ UmbrellaModule->InferExplicitSubmodules).first;
// Associate the module and the directory.
UmbrellaDirs[SkippedDirs[I-1]] = Result;
// If inferred submodules export everything they import, add a
// wildcard to the set of exports.
- if (TopModule->InferExportWildcard && Result->Exports.empty())
+ if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
Result->Exports.push_back(Module::ExportDecl(0, true));
}
// Infer a submodule with the same name as this header file.
StringRef Name = llvm::sys::path::stem(File->getName());
Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
- TopModule->InferExplicitSubmodules).first;
+ UmbrellaModule->InferExplicitSubmodules).first;
// If inferred submodules export everything they import, add a
// wildcard to the set of exports.
- if (TopModule->InferExportWildcard && Result->Exports.empty())
+ if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
Result->Exports.push_back(Module::ExportDecl(0, true));
} else {
// Record each of the directories we stepped through as being part of
OpenPOWER on IntegriCloud