summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2011-08-18 19:06:24 +0000
committerChad Rosier <mcrosier@apple.com>2011-08-18 19:06:24 +0000
commit222e187e33315de3e7f373abbf11714cece9aae3 (patch)
tree7b00f9d14ed5953f05a0264d0fffac2bcceea00b /clang/lib/Serialization/ASTReader.cpp
parent3c06d7f442d21863dd4734397fc232458b735ede (diff)
downloadbcm5719-llvm-222e187e33315de3e7f373abbf11714cece9aae3.tar.gz
bcm5719-llvm-222e187e33315de3e7f373abbf11714cece9aae3.zip
Temporarily revert r137925 to appease buildbots. Original commit message:
Teach ModuleManager::addModule() to check whether a particular module has already been loaded before allocating a new Module structure. If the module has already been loaded (uniquing based on file name), then just return the existing module rather than trying to load it again. This allows us to load a DAG of modules. Introduce a simple test case that forms a diamond-shaped module graph, and illustrates that a source file importing the bottom of the diamond can see declarations in all four of the modules that make up the diamond. llvm-svn: 137971
Diffstat (limited to 'clang/lib/Serialization/ASTReader.cpp')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp53
1 files changed, 14 insertions, 39 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index b635b38c10a..d81e9d8a36a 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -2831,23 +2831,7 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
ASTReader::ASTReadResult ASTReader::ReadASTCore(StringRef FileName,
ModuleKind Type,
Module *ImportedBy) {
- Module *M;
- bool NewModule;
- llvm::tie(M, NewModule) = ModuleMgr.addModule(FileName, Type, ImportedBy);
-
- if (!M) {
- // We couldn't load the module.
- std::string Msg = "Unable to load module \"" + FileName.str() + "\"";
- Error(Msg);
- return Failure;
- }
-
- if (!NewModule) {
- // We've already loaded this module.
- return Success;
- }
-
- Module &F = *M;
+ Module &F = ModuleMgr.addModule(FileName, Type, ImportedBy);
if (FileName != "-") {
CurrentDir = llvm::sys::path::parent_path(FileName);
@@ -5725,34 +5709,25 @@ llvm::MemoryBuffer *ModuleManager::lookupBuffer(StringRef Name) {
return InMemoryBuffers[Entry];
}
-std::pair<Module *, bool>
-ModuleManager::addModule(StringRef FileName, ModuleKind Type,
- Module *ImportedBy) {
+/// \brief Creates a new module and adds it to the list of known modules
+Module &ModuleManager::addModule(StringRef FileName, ModuleKind Type,
+ Module *ImportedBy) {
+ Module *Current = new Module(Type);
+ Current->FileName = FileName.str();
+ Chain.push_back(Current);
+
const FileEntry *Entry = FileMgr.getFile(FileName);
- if (!Entry)
- return std::make_pair(static_cast<Module*>(0), false);
-
- // Check whether we already loaded this module, before
- Module *&ModuleEntry = Modules[Entry];
- bool NewModule = false;
- if (!ModuleEntry) {
- // Allocate a new module.
- Module *New = new Module(Type);
- New->FileName = FileName.str();
- Chain.push_back(New);
-
- NewModule = true;
- ModuleEntry = New;
- }
+ // FIXME: Check whether we already loaded this module, before
+ Modules[Entry] = Current;
if (ImportedBy) {
- ModuleEntry->ImportedBy.insert(ImportedBy);
- ImportedBy->Imports.insert(ModuleEntry);
+ Current->ImportedBy.insert(ImportedBy);
+ ImportedBy->Imports.insert(Current);
} else {
- ModuleEntry->DirectlyImported = true;
+ Current->DirectlyImported = true;
}
- return std::make_pair(ModuleEntry, NewModule);
+ return *Current;
}
void ModuleManager::addInMemoryBuffer(StringRef FileName,
OpenPOWER on IntegriCloud