AST reader down to the AST file + local ID within that file, rather
than lamely walking the PCH chain. There's no actual functionality
change now, but this is cleaner and more general.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@135548
91177308-0d34-0410-b5e6-
96231b3b80d8
/// = I + 1 has already been loaded.
std::vector<Decl *> DeclsLoaded;
+ 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.
+ GlobalDeclMapType GlobalDeclMap;
+
typedef std::pair<PerFileData *, uint64_t> FileOffset;
typedef llvm::SmallVector<FileOffset, 2> FileOffsetsTy;
typedef llvm::DenseMap<serialization::DeclID, FileOffsetsTy>
DeclUpdateOffsetsMap;
+
/// \brief Declarations that have modifications residing in a later file
/// in the chain.
DeclUpdateOffsetsMap DeclUpdateOffsets;
}
F.DeclOffsets = (const uint32_t *)BlobStart;
F.LocalNumDecls = Record[0];
+
+ // Introduce the global -> local mapping for declarations within this
+ GlobalDeclMap.insert(std::make_pair(getTotalNumDecls() + 1,
+ std::make_pair(&F,
+ -getTotalNumDecls())));
+ DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls);
+
break;
case TU_UPDATE_LEXICAL: {
}
// Allocate space for loaded slocentries, identifiers, decls and types.
- unsigned TotalNumIdentifiers = 0, TotalNumTypes = 0, TotalNumDecls = 0,
+ unsigned TotalNumIdentifiers = 0, 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;
- TotalNumDecls += Chain[I]->LocalNumDecls;
TotalNumPreallocatedPreprocessingEntities +=
Chain[I]->NumPreallocatedPreprocessingEntities;
TotalNumMacroDefs += Chain[I]->LocalNumMacroDefinitions;
}
IdentifiersLoaded.resize(TotalNumIdentifiers);
TypesLoaded.resize(TotalNumTypes);
- DeclsLoaded.resize(TotalNumDecls);
MacroDefinitionsLoaded.resize(TotalNumMacroDefs);
if (PP) {
if (TotalNumIdentifiers > 0)
return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D);
}
-/// \brief Get the correct cursor and offset for loading a type.
+/// \brief Get the correct cursor and offset for loading a declaration.
ASTReader::RecordLocation
ASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) {
// See if there's an override.
if (It != ReplacedDecls.end())
return RecordLocation(It->second.first, It->second.second);
- PerFileData *F = 0;
- for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
- F = Chain[N - I - 1];
- if (Index < F->LocalNumDecls)
- break;
- Index -= F->LocalNumDecls;
- }
- assert(F && F->LocalNumDecls > Index && "Broken chain");
- return RecordLocation(F, F->DeclOffsets[Index]);
+ GlobalDeclMapType::iterator I = GlobalDeclMap.find(ID);
+ assert(I != GlobalDeclMap.end() && "Corrupted global declaration map");
+ return RecordLocation(I->second.first,
+ I->second.first->DeclOffsets[Index + I->second.second]);
}
void ASTDeclReader::attachPreviousDecl(Decl *D, Decl *previous) {