aboutsummaryrefslogtreecommitdiff
path: root/lib/Serialization
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Serialization')
-rw-r--r--lib/Serialization/ASTReader.cpp37
-rw-r--r--lib/Serialization/ASTWriter.cpp15
2 files changed, 51 insertions, 1 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp
index d8fb3113d5..26fca2290e 100644
--- a/lib/Serialization/ASTReader.cpp
+++ b/lib/Serialization/ASTReader.cpp
@@ -2533,6 +2533,19 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
Id != IdEnd; ++Id)
Id->second->setOutOfDate(true);
+ // Resolve any unresolved module exports.
+ for (unsigned I = 0, N = UnresolvedModuleExports.size(); I != N; ++I) {
+ UnresolvedModuleExport &Unresolved = UnresolvedModuleExports[I];
+ SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,
+ Unresolved.ExportedID);
+ if (Module *Exported = getSubmodule(GlobalID)) {
+ Module *Exportee = Unresolved.ModuleAndWildcard.getPointer();
+ bool Wildcard = Unresolved.ModuleAndWildcard.getInt();
+ Exportee->Exports.push_back(Module::ExportDecl(Exported, Wildcard));
+ }
+ }
+ UnresolvedModuleExports.clear();
+
InitializeContext();
if (DeserializationListener)
@@ -3050,6 +3063,30 @@ ASTReader::ASTReadResult ASTReader::ReadSubmoduleBlock(ModuleFile &F) {
}
break;
}
+
+ case SUBMODULE_EXPORTS: {
+ if (First) {
+ Error("missing submodule metadata record at beginning of block");
+ return Failure;
+ }
+
+ if (!CurrentModule)
+ break;
+
+ for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) {
+ UnresolvedModuleExport Unresolved;
+ Unresolved.File = &F;
+ Unresolved.ModuleAndWildcard.setPointer(CurrentModule);
+ Unresolved.ModuleAndWildcard.setInt(Record[Idx + 1]);
+ Unresolved.ExportedID = Record[Idx];
+ UnresolvedModuleExports.push_back(Unresolved);
+ }
+
+ // Once we've loaded the set of exports, there's no reason to keep
+ // the parsed, unresolved exports around.
+ CurrentModule->UnresolvedExports.clear();
+ break;
+ }
}
}
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp
index 6d51dbce3e..00dbfabb45 100644
--- a/lib/Serialization/ASTWriter.cpp
+++ b/lib/Serialization/ASTWriter.cpp
@@ -1893,6 +1893,7 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) {
while (!Q.empty()) {
Module *Mod = Q.front();
Q.pop();
+ assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end());
SubmoduleIDs[Mod] = NextSubmoduleID++;
// Emit the definition of the block.
@@ -1924,6 +1925,18 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) {
Mod->Headers[I]->getName());
}
+ // Emit the exports.
+ if (!Mod->Exports.empty()) {
+ Record.clear();
+ for (unsigned I = 0, N = Mod->Exports.size(); I != N; ++I) {
+ unsigned ExportedID = SubmoduleIDs[Mod->Exports[I].getPointer()];
+ assert(ExportedID && "Unknown submodule!");
+ Record.push_back(ExportedID);
+ Record.push_back(Mod->Exports[I].getInt());
+ }
+ Stream.EmitRecord(SUBMODULE_EXPORTS, Record);
+ }
+
// Queue up the submodules of this module.
llvm::SmallVector<StringRef, 2> SubModules;
@@ -3214,7 +3227,7 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls,
{
llvm::raw_svector_ostream Out(Buffer);
for (ModuleManager::ModuleConstIterator M = Chain->ModuleMgr.begin(),
- MEnd = Chain->ModuleMgr.end();
+ MEnd = Chain->ModuleMgr.end();
M != MEnd; ++M) {
StringRef FileName = (*M)->FileName;
io::Emit16(Out, FileName.size());