diff options
Diffstat (limited to 'lib/Frontend/FrontendActions.cpp')
-rw-r--r-- | lib/Frontend/FrontendActions.cpp | 43 |
1 files changed, 24 insertions, 19 deletions
diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp index 5c4e447ef5..1a2df01bdf 100644 --- a/lib/Frontend/FrontendActions.cpp +++ b/lib/Frontend/FrontendActions.cpp @@ -129,32 +129,38 @@ ASTConsumer *GenerateModuleAction::CreateASTConsumer(CompilerInstance &CI, /// module. /// /// \param Module The module we're collecting includes from. -/// \param ExplicitOnly Whether we should only add headers from explicit +/// +/// \param Includes Will be augmented with the set of #includes or #imports +/// needed to load all of the named headers. static void collectModuleHeaderIncludes(const LangOptions &LangOpts, clang::Module *Module, - bool ExplicitOnly, llvm::SmallString<256> &Includes) { - if (!ExplicitOnly || Module->IsExplicit) { - // Add includes for each of these headers. - for (unsigned I = 0, N = Module->Headers.size(); I != N; ++I) { - if (LangOpts.ObjC1) - Includes += "#import \""; - else - Includes += "#include \""; - Includes += Module->Headers[I]->getName(); - Includes += "\"\n"; - } + // Add includes for each of these headers. + for (unsigned I = 0, N = Module->Headers.size(); I != N; ++I) { + if (LangOpts.ObjC1) + Includes += "#import \""; + else + Includes += "#include \""; + Includes += Module->Headers[I]->getName(); + Includes += "\"\n"; + } + + if (Module->UmbrellaHeader && Module->Parent) { + // Include the umbrella header for submodules. + if (LangOpts.ObjC1) + Includes += "#import \""; + else + Includes += "#include \""; + Includes += Module->UmbrellaHeader->getName(); + Includes += "\"\n"; } // Recurse into submodules. for (llvm::StringMap<clang::Module *>::iterator Sub = Module->SubModules.begin(), SubEnd = Module->SubModules.end(); - Sub != SubEnd; ++Sub) { - collectModuleHeaderIncludes(LangOpts, Sub->getValue(), - ExplicitOnly && !Module->IsExplicit, - Includes); - } + Sub != SubEnd; ++Sub) + collectModuleHeaderIncludes(LangOpts, Sub->getValue(), Includes); } bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI, @@ -193,8 +199,7 @@ bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI, // Collect the set of #includes we need to build the module. llvm::SmallString<256> HeaderContents; - collectModuleHeaderIncludes(CI.getLangOpts(), Module, - Module->UmbrellaHeader != 0, HeaderContents); + collectModuleHeaderIncludes(CI.getLangOpts(), Module, HeaderContents); if (Module->UmbrellaHeader && HeaderContents.empty()) { // Simple case: we have an umbrella header and there are no additional // includes, we can just parse the umbrella header directly. |