From e2ac16b09ea66ad955752381b82fb8719d003e5e Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sat, 29 Sep 2012 01:06:04 +0000 Subject: [PATCH] In the Module class, add a reference to the corresponding AST file. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164873 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Module.h | 19 +++++++++++++++++-- lib/Basic/Module.cpp | 4 ++-- lib/Frontend/CompilerInstance.cpp | 3 +++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/clang/Basic/Module.h b/include/clang/Basic/Module.h index c8027f4702..cdf993cb4a 100644 --- a/include/clang/Basic/Module.h +++ b/include/clang/Basic/Module.h @@ -63,6 +63,10 @@ private: /// \brief A mapping from the submodule name to the index into the /// \c SubModules vector at which that submodule resides. llvm::StringMap SubModuleIndex; + + /// \brief The AST file if this is a top-level module which has a + /// corresponding serialized AST file, or null otherwise. + const FileEntry *ASTFile; public: /// \brief The headers that are part of this module. @@ -158,7 +162,7 @@ public: /// \brief Construct a top-level module. explicit Module(StringRef Name, SourceLocation DefinitionLoc, bool IsFramework) - : Name(Name), DefinitionLoc(DefinitionLoc), Parent(0), Umbrella(), + : Name(Name), DefinitionLoc(DefinitionLoc), Parent(0),Umbrella(),ASTFile(0), IsAvailable(true), IsFromModuleFile(false), IsFramework(IsFramework), IsExplicit(false), IsSystem(false), InferSubmodules(false), InferExplicitSubmodules(false), @@ -227,7 +231,18 @@ public: StringRef getTopLevelModuleName() const { return getTopLevelModule()->Name; } - + + /// \brief The serialized AST file for this module, if one was created. + const FileEntry *getASTFile() const { + return getTopLevelModule()->ASTFile; + } + + /// \brief Set the serialized AST file for the top-level module of this module. + void setASTFile(const FileEntry *File) { + assert((getASTFile() == 0 || getASTFile() == File) && "file path changed"); + getTopLevelModule()->ASTFile = File; + } + /// \brief Retrieve the directory for which this module serves as the /// umbrella. const DirectoryEntry *getUmbrellaDir() const; diff --git a/lib/Basic/Module.cpp b/lib/Basic/Module.cpp index 634884074e..91b6207b55 100644 --- a/lib/Basic/Module.cpp +++ b/lib/Basic/Module.cpp @@ -23,8 +23,8 @@ using namespace clang; Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent, bool IsFramework, bool IsExplicit) - : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), - Umbrella(), IsAvailable(true), IsFromModuleFile(false), + : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), + Umbrella(), ASTFile(0), IsAvailable(true), IsFromModuleFile(false), IsFramework(IsFramework), IsExplicit(IsExplicit), IsSystem(false), InferSubmodules(false), InferExplicitSubmodules(false), InferExportWildcard(false), NameVisibility(Hidden) diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 6de153107f..4cc46b8ab7 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -980,6 +980,9 @@ Module *CompilerInstance::loadModule(SourceLocation ImportLoc, Module = PP->getHeaderSearchInfo().getModuleMap() .findModule((Path[0].first->getName())); } + + if (Module) + Module->setASTFile(ModuleFile); // Cache the result of this top-level module lookup for later. Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; -- 2.40.0