summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2014-08-16 04:54:18 +0000
committerBen Langmuir <blangmuir@apple.com>2014-08-16 04:54:18 +0000
commitfe971d9894c7998595016da323665eab04471608 (patch)
tree298c8d0b1dfe63c93ef4102e6a56aab414294902 /clang/lib/Serialization
parent5ccd9e029f2b57028913cf087c49fd529f8e8e52 (diff)
downloadbcm5719-llvm-fe971d9894c7998595016da323665eab04471608.tar.gz
bcm5719-llvm-fe971d9894c7998595016da323665eab04471608.zip
When loading a module with no local entities, still bump the size of the
tables that correspond to ContinuousRangeMaps, since the keys to those maps need to be unique, or we may map to the wrong offset. This fixes a crash + malformed AST file seen when loading some modules that import Cocoa on Darwin, which is a module with no contents except imports of other modules. Unfortunately I have not been able to find a reduced test case that reproduces this problem. Also add an assert that we aren't mapping one key to multiple values in CRM. We ought to be able to say there are no duplicate keys at all, but there are a bunch of 0 -> 0 mappings that are showing up, probably coming from the source location table. llvm-svn: 215810
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r--clang/lib/Serialization/ASTReader.cpp41
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp3
2 files changed, 28 insertions, 16 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 161971b35c8..576cf84dbbf 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -2620,9 +2620,9 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.TypeRemap.insertOrReplace(
std::make_pair(LocalBaseTypeIndex,
F.BaseTypeIndex - LocalBaseTypeIndex));
-
- TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes);
}
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ TypesLoaded.resize(TypesLoaded.size() + std::max(F.LocalNumTypes, 1U));
break;
}
@@ -2650,9 +2650,10 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
// Introduce the global -> local mapping for declarations within this
// module.
F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID;
-
- DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
}
+
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ DeclsLoaded.resize(DeclsLoaded.size() + std::max(F.LocalNumDecls, 1U));
break;
}
@@ -2720,10 +2721,11 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.IdentifierRemap.insertOrReplace(
std::make_pair(LocalBaseIdentifierID,
F.BaseIdentifierID - LocalBaseIdentifierID));
-
- IdentifiersLoaded.resize(IdentifiersLoaded.size()
- + F.LocalNumIdentifiers);
}
+
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ IdentifiersLoaded.resize(IdentifiersLoaded.size() +
+ std::max(F.LocalNumIdentifiers, 1U));
break;
}
@@ -2813,9 +2815,10 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.SelectorRemap.insertOrReplace(
std::make_pair(LocalBaseSelectorID,
F.BaseSelectorID - LocalBaseSelectorID));
-
- SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors);
}
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ SelectorsLoaded.resize(SelectorsLoaded.size() +
+ std::max(F.LocalNumSelectors, 1U));
break;
}
@@ -2855,8 +2858,10 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.SLocEntryOffsets = (const uint32_t *)Blob.data();
F.LocalNumSLocEntries = Record[0];
unsigned SLocSpaceSize = Record[1];
+
+ // Increase size by >= 1 so we get a unique base index in the next module.
std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
- SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
+ SourceMgr.AllocateLoadedSLocEntries(std::max(F.LocalNumSLocEntries, 1U),
SLocSpaceSize);
// Make our entry in the range map. BaseID is negative and growing, so
// we invert it. Because we invert it, though, we need the other end of
@@ -3049,9 +3054,11 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
PP.createPreprocessingRecord();
if (!PP.getPreprocessingRecord()->getExternalSource())
PP.getPreprocessingRecord()->SetExternalSource(*this);
+
+ // Increase size by >= 1 so we get a unique base index in the next module.
StartingID
= PP.getPreprocessingRecord()
- ->allocateLoadedEntities(F.NumPreprocessedEntities);
+ ->allocateLoadedEntities(std::max(F.NumPreprocessedEntities, 1U));
F.BasePreprocessedEntityID = StartingID;
if (F.NumPreprocessedEntities > 0) {
@@ -3255,9 +3262,9 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.MacroRemap.insertOrReplace(
std::make_pair(LocalBaseMacroID,
F.BaseMacroID - LocalBaseMacroID));
-
- MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros);
}
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ MacrosLoaded.resize(MacrosLoaded.size() + std::max(F.LocalNumMacros, 1U));
break;
}
@@ -4509,9 +4516,11 @@ ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
F.SubmoduleRemap.insertOrReplace(
std::make_pair(LocalBaseSubmoduleID,
F.BaseSubmoduleID - LocalBaseSubmoduleID));
-
- SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules);
- }
+ }
+
+ // Increase size by >= 1 so we get a unique base index in the next module.
+ SubmodulesLoaded.resize(SubmodulesLoaded.size() +
+ std::max(F.LocalNumSubmodules, 1U));
break;
}
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 55b557c0471..d5824354154 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -4458,6 +4458,9 @@ void ASTWriter::WriteASTCore(Sema &SemaRef,
StringRef FileName = (*M)->FileName;
LE.write<uint16_t>(FileName.size());
Out.write(FileName.data(), FileName.size());
+
+ // These values should be unique within a chain, since they will be read
+ // as keys into ContinuousRangeMaps.
LE.write<uint32_t>((*M)->SLocEntryBaseOffset);
LE.write<uint32_t>((*M)->BaseIdentifierID);
LE.write<uint32_t>((*M)->BaseMacroID);
OpenPOWER on IntegriCloud