Use a ContinuousRangeMap to map from the global declaration ID in the
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. llvm-svn: 135548
This commit is contained in:
parent
8957729268
commit
047d2effea
@ -474,10 +474,19 @@ private:
|
||||
/// = 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;
|
||||
|
||||
@ -2046,6 +2046,13 @@ ASTReader::ReadASTBlock(PerFileData &F) {
|
||||
}
|
||||
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: {
|
||||
@ -2522,14 +2529,13 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
|
||||
}
|
||||
|
||||
// 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;
|
||||
@ -2537,7 +2543,6 @@ ASTReader::ASTReadResult ASTReader::ReadAST(const std::string &FileName,
|
||||
}
|
||||
IdentifiersLoaded.resize(TotalNumIdentifiers);
|
||||
TypesLoaded.resize(TotalNumTypes);
|
||||
DeclsLoaded.resize(TotalNumDecls);
|
||||
MacroDefinitionsLoaded.resize(TotalNumMacroDefs);
|
||||
if (PP) {
|
||||
if (TotalNumIdentifiers > 0)
|
||||
|
||||
@ -1408,7 +1408,7 @@ static bool isConsumerInterestedIn(Decl *D) {
|
||||
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.
|
||||
@ -1416,15 +1416,10 @@ ASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) {
|
||||
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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user