summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/include/clang/Serialization/ASTReader.h10
-rw-r--r--clang/lib/Serialization/ASTReader.cpp36
2 files changed, 27 insertions, 19 deletions
diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h
index 124f9bca2c8..418925fce2e 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -477,6 +477,7 @@ private:
typedef ContinuousRangeMap<serialization::DeclID,
std::pair<PerFileData *, int32_t>, 4>
GlobalDeclMapType;
+
/// \brief Mapping from global declaration IDs to the module in which the
/// declaration resides along with the offset that should be added to the
/// global declaration ID to produce a local ID.
@@ -553,6 +554,15 @@ private:
/// been loaded.
std::vector<IdentifierInfo *> IdentifiersLoaded;
+ typedef ContinuousRangeMap<serialization::IdentID,
+ std::pair<PerFileData *, int32_t>, 4>
+ GlobalIdentifierMapType;
+
+ /// \brief Mapping from global identifer IDs to the module in which the
+ /// identifier resides along with the offset that should be added to the
+ /// global identifier ID to produce a local ID.
+ GlobalIdentifierMapType GlobalIdentifierMap;
+
/// \brief A vector containing selectors that have already been loaded.
///
/// This vector is indexed by the Selector ID (-1). NULL selector
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 9f3d7504c7f..7d031019acb 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -2048,11 +2048,11 @@ ASTReader::ReadASTBlock(PerFileData &F) {
F.LocalNumDecls = Record[0];
// Introduce the global -> local mapping for declarations within this
+ // AST file.
GlobalDeclMap.insert(std::make_pair(getTotalNumDecls() + 1,
std::make_pair(&F,
-getTotalNumDecls())));
- DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
-
+ DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
break;
case TU_UPDATE_LEXICAL: {
@@ -2119,6 +2119,14 @@ ASTReader::ReadASTBlock(PerFileData &F) {
}
F.IdentifierOffsets = (const uint32_t *)BlobStart;
F.LocalNumIdentifiers = Record[0];
+
+ // Introduce the global -> local mapping for identifiers within this AST
+ // file
+ GlobalIdentifierMap.insert(
+ std::make_pair(getTotalNumIdentifiers() + 1,
+ std::make_pair(&F,
+ -getTotalNumIdentifiers())));
+ IdentifiersLoaded.resize(IdentifiersLoaded.size() +F.LocalNumIdentifiers);
break;
case EXTERNAL_DEFINITIONS:
@@ -2529,24 +2537,21 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
}
// Allocate space for loaded slocentries, identifiers, decls and types.
- unsigned TotalNumIdentifiers = 0, TotalNumTypes = 0,
+ unsigned TotalNumTypes = 0,
TotalNumPreallocatedPreprocessingEntities = 0, TotalNumMacroDefs = 0,
TotalNumSelectors = 0;
for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
TotalNumSLocEntries += Chain[I]->LocalNumSLocEntries;
- TotalNumIdentifiers += Chain[I]->LocalNumIdentifiers;
TotalNumTypes += Chain[I]->LocalNumTypes;
TotalNumPreallocatedPreprocessingEntities +=
Chain[I]->NumPreallocatedPreprocessingEntities;
TotalNumMacroDefs += Chain[I]->LocalNumMacroDefinitions;
TotalNumSelectors += Chain[I]->LocalNumSelectors;
}
- IdentifiersLoaded.resize(TotalNumIdentifiers);
TypesLoaded.resize(TotalNumTypes);
MacroDefinitionsLoaded.resize(TotalNumMacroDefs);
if (PP) {
- if (TotalNumIdentifiers > 0)
- PP->getHeaderSearchInfo().SetExternalLookup(this);
+ PP->getHeaderSearchInfo().SetExternalLookup(this);
if (TotalNumPreallocatedPreprocessingEntities > 0) {
if (!PP->getPreprocessingRecord())
PP->createPreprocessingRecord(true);
@@ -4602,18 +4607,11 @@ IdentifierInfo *ASTReader::DecodeIdentifierInfo(unsigned ID) {
assert(PP && "Forgot to set Preprocessor ?");
ID -= 1;
if (!IdentifiersLoaded[ID]) {
- unsigned Index = ID;
- const char *Str = 0;
- for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
- PerFileData *F = Chain[N - I - 1];
- if (Index < F->LocalNumIdentifiers) {
- uint32_t Offset = F->IdentifierOffsets[Index];
- Str = F->IdentifierTableData + Offset;
- break;
- }
- Index -= F->LocalNumIdentifiers;
- }
- assert(Str && "Broken Chain");
+ GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1);
+ assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map");
+ unsigned Index = ID + I->second.second;
+ const char *Str = I->second.first->IdentifierTableData
+ + I->second.first->IdentifierOffsets[Index];
// All of the strings in the AST file are preceded by a 16-bit length.
// Extract that 16-bit length to avoid having to execute strlen().
OpenPOWER on IntegriCloud