diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-03-13 21:13:43 +0000 | 
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2013-03-13 21:13:43 +0000 | 
| commit | 3c5305c15ed6dd0413a83675d482263e125f18ac (patch) | |
| tree | 07d4ef68b8edd6009cc9df4791428e67f92fd893 /clang/lib | |
| parent | 6b72269b3dd8978816a12080b4314317801f7d70 (diff) | |
| download | bcm5719-llvm-3c5305c15ed6dd0413a83675d482263e125f18ac.tar.gz bcm5719-llvm-3c5305c15ed6dd0413a83675d482263e125f18ac.zip  | |
[Modules] Resolve top-headers of modules lazily.
This allows resolving top-header filenames of modules to FileEntries when
we need them, not eagerly.
Note that that this breaks ABI for libclang functions
clang_Module_getTopLevelHeader / clang_Module_getNumTopLevelHeaders
but this is fine because they are experimental and not widely used yet.
llvm-svn: 176975
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Basic/Module.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/Frontend/FrontendActions.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 4 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 6 | 
5 files changed, 23 insertions, 9 deletions
diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 65deac1b4af..f074391098b 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -15,6 +15,7 @@  #include "clang/Basic/FileManager.h"  #include "clang/Basic/LangOptions.h"  #include "clang/Basic/TargetInfo.h" +#include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/StringSwitch.h"  #include "llvm/Support/ErrorHandling.h" @@ -129,6 +130,19 @@ const DirectoryEntry *Module::getUmbrellaDir() const {    return Umbrella.dyn_cast<const DirectoryEntry *>();  } +ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) { +  if (!TopHeaderNames.empty()) { +    for (std::vector<std::string>::iterator +           I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) { +      if (const FileEntry *FE = FileMgr.getFile(*I)) +        TopHeaders.insert(FE); +    } +    TopHeaderNames.clear(); +  } + +  return llvm::makeArrayRef(TopHeaders.begin(), TopHeaders.end()); +} +  void Module::addRequirement(StringRef Feature, const LangOptions &LangOpts,                              const TargetInfo &Target) {    Requires.push_back(Feature); diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 965e762d79b..f3466f02342 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -173,12 +173,12 @@ static void collectModuleHeaderIncludes(const LangOptions &LangOpts,    // Add includes for each of these headers.    for (unsigned I = 0, N = Module->Headers.size(); I != N; ++I) {      const FileEntry *Header = Module->Headers[I]; -    Module->TopHeaders.insert(Header); +    Module->addTopHeader(Header);      addHeaderInclude(Header, Includes, LangOpts);    }    if (const FileEntry *UmbrellaHeader = Module->getUmbrellaHeader()) { -    Module->TopHeaders.insert(UmbrellaHeader); +    Module->addTopHeader(UmbrellaHeader);      if (Module->Parent) {        // Include the umbrella header for submodules.        addHeaderInclude(UmbrellaHeader, Includes, LangOpts); @@ -203,7 +203,7 @@ static void collectModuleHeaderIncludes(const LangOptions &LangOpts,        if (const FileEntry *Header = FileMgr.getFile(Dir->path())) {          if (ModMap.isHeaderInUnavailableModule(Header))            continue; -        Module->TopHeaders.insert(Header); +        Module->addTopHeader(Header);        }        // Include this header umbrella header for submodules. diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 81cb94de51f..f9b4e2c9474 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -202,7 +202,7 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {                             llvm::sys::path::stem(File->getName()), NameBuf);          Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,                                      Explicit).first; -        Result->TopHeaders.insert(File); +        Result->addTopHeader(File);          // If inferred submodules export everything they import, add a           // wildcard to the set of exports. diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 93ae6f1c44b..54fe424ddf6 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3546,9 +3546,7 @@ bool ASTReader::ReadSubmoduleBlock(ModuleFile &F) {        if (!CurrentModule)          break; -      // FIXME: Be more lazy about this! -      if (const FileEntry *File = PP.getFileManager().getFile(Blob)) -        CurrentModule->TopHeaders.insert(File); +      CurrentModule->addTopHeaderFilename(Blob);        break;      } diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 815cf12f117..8f48d5870af 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2170,11 +2170,13 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) {        Stream.EmitRecordWithBlob(ExcludedHeaderAbbrev, Record,                                   Mod->ExcludedHeaders[I]->getName());      } -    for (unsigned I = 0, N = Mod->TopHeaders.size(); I != N; ++I) { +    ArrayRef<const FileEntry *> +      TopHeaders = Mod->getTopHeaders(PP->getFileManager()); +    for (unsigned I = 0, N = TopHeaders.size(); I != N; ++I) {        Record.clear();        Record.push_back(SUBMODULE_TOPHEADER);        Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, -                                Mod->TopHeaders[I]->getName()); +                                TopHeaders[I]->getName());      }      // Emit the imports.   | 

